From f8ad84d069434f8aed58bc398564bb849f708e7c Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Sat, 24 Mar 2018 09:48:50 +0200 Subject: [PATCH 001/327] Add gitignore. --- .gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..485dee64b --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea From b11f66fdfcaae0d9b2bfbc702307f91179be2eaa Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Sat, 24 Mar 2018 09:49:25 +0200 Subject: [PATCH 002/327] Add README. --- README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 000000000..c73ca1608 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# Data Structures From d72dec9f5243a7e02fed8cc7d617d81f4e69468f Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Sun, 25 Mar 2018 23:28:32 +0300 Subject: [PATCH 003/327] Add linked_list. --- .babelrc | 11 + .editorconfig | 8 + .gitignore | 2 + README.md | 4 + package-lock.json | 2522 +++++++++++++++++++++++++++++++++ package.json | 25 + src/linked_list/LinkedList.js | 51 + src/linked_list/Node.js | 6 + src/linked_list/index.js | 11 + 9 files changed, 2640 insertions(+) create mode 100644 .babelrc create mode 100644 .editorconfig create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/linked_list/LinkedList.js create mode 100644 src/linked_list/Node.js create mode 100644 src/linked_list/index.js diff --git a/.babelrc b/.babelrc new file mode 100644 index 000000000..04c9b67b1 --- /dev/null +++ b/.babelrc @@ -0,0 +1,11 @@ +{ + "presets": [ + [ + "env", { + "targets": { + "node": "current" + } + } + ] + ] +} diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..78c6ddee2 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,8 @@ +root = true + +[*] +end_of_line = lf +insert_final_newline = true +charset = utf-8 +indent_style = space +indent_size = 2 diff --git a/.gitignore b/.gitignore index 485dee64b..d31e1cc56 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ +node_modules +build .idea diff --git a/README.md b/README.md index c73ca1608..033b2daa7 100644 --- a/README.md +++ b/README.md @@ -1 +1,5 @@ # Data Structures + +``` +npm run babel-node --silent ./src/linked_list +``` diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..249e19bb3 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2522 @@ +{ + "name": "data-structures", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "optional": true, + "requires": { + "micromatch": "2.3.11", + "normalize-path": "2.1.1" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "optional": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true, + "optional": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true, + "optional": true + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true, + "optional": true + }, + "babel-cli": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.26.0.tgz", + "integrity": "sha1-UCq1SHTX24itALiHoGODzgPQAvE=", + "dev": true, + "requires": { + "babel-core": "6.26.0", + "babel-polyfill": "6.26.0", + "babel-register": "6.26.0", + "babel-runtime": "6.26.0", + "chokidar": "1.7.0", + "commander": "2.15.1", + "convert-source-map": "1.5.1", + "fs-readdir-recursive": "1.1.0", + "glob": "7.1.2", + "lodash": "4.17.5", + "output-file-sync": "1.1.2", + "path-is-absolute": "1.0.1", + "slash": "1.0.0", + "source-map": "0.5.7", + "v8flags": "2.1.1" + } + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + } + }, + "babel-core": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", + "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-generator": "6.26.1", + "babel-helpers": "6.24.1", + "babel-messages": "6.23.0", + "babel-register": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "convert-source-map": "1.5.1", + "debug": "2.6.9", + "json5": "0.5.1", + "lodash": "4.17.5", + "minimatch": "3.0.4", + "path-is-absolute": "1.0.1", + "private": "0.1.8", + "slash": "1.0.0", + "source-map": "0.5.7" + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "requires": { + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "detect-indent": "4.0.0", + "jsesc": "1.3.0", + "lodash": "4.17.5", + "source-map": "0.5.7", + "trim-right": "1.0.1" + } + }, + "babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "dev": true, + "requires": { + "babel-helper-explode-assignable-expression": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "dev": true, + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.5" + } + }, + "babel-helper-explode-assignable-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "dev": true, + "requires": { + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.5" + } + }, + "babel-helper-remap-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", + "dev": true, + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "dev": true, + "requires": { + "babel-helper-optimise-call-expression": "6.24.1", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", + "dev": true + }, + "babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", + "dev": true + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", + "dev": true + }, + "babel-plugin-transform-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", + "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "dev": true, + "requires": { + "babel-helper-remap-async-to-generator": "6.24.1", + "babel-plugin-syntax-async-functions": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.5" + } + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "dev": true, + "requires": { + "babel-helper-define-map": "6.26.0", + "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.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "dev": true, + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", + "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", + "dev": true, + "requires": { + "babel-plugin-transform-strict-mode": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "dev": true, + "requires": { + "babel-helper-replace-supers": "6.24.1", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "dev": true, + "requires": { + "babel-helper-call-delegate": "6.24.1", + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "dev": true, + "requires": { + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "dev": true, + "requires": { + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "regexpu-core": "2.0.0" + } + }, + "babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "dev": true, + "requires": { + "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", + "babel-plugin-syntax-exponentiation-operator": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "dev": true, + "requires": { + "regenerator-transform": "0.10.1" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-polyfill": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", + "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "core-js": "2.5.3", + "regenerator-runtime": "0.10.5" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", + "dev": true + } + } + }, + "babel-preset-env": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.1.tgz", + "integrity": "sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA==", + "dev": true, + "requires": { + "babel-plugin-check-es2015-constants": "6.22.0", + "babel-plugin-syntax-trailing-function-commas": "6.22.0", + "babel-plugin-transform-async-to-generator": "6.24.1", + "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.26.0", + "babel-plugin-transform-es2015-classes": "6.24.1", + "babel-plugin-transform-es2015-computed-properties": "6.24.1", + "babel-plugin-transform-es2015-destructuring": "6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", + "babel-plugin-transform-es2015-for-of": "6.23.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.26.0", + "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.23.0", + "babel-plugin-transform-es2015-unicode-regex": "6.24.1", + "babel-plugin-transform-exponentiation-operator": "6.24.1", + "babel-plugin-transform-regenerator": "6.26.0", + "browserslist": "2.11.3", + "invariant": "2.2.4", + "semver": "5.5.0" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "requires": { + "babel-core": "6.26.0", + "babel-runtime": "6.26.0", + "core-js": "2.5.3", + "home-or-tmp": "2.0.0", + "lodash": "4.17.5", + "mkdirp": "0.5.1", + "source-map-support": "0.4.18" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "2.5.3", + "regenerator-runtime": "0.11.1" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "lodash": "4.17.5" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "debug": "2.6.9", + "globals": "9.18.0", + "invariant": "2.2.4", + "lodash": "4.17.5" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "esutils": "2.0.2", + "lodash": "4.17.5", + "to-fast-properties": "1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "binary-extensions": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "optional": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "browserslist": { + "version": "2.11.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", + "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", + "dev": true, + "requires": { + "caniuse-lite": "1.0.30000820", + "electron-to-chromium": "1.3.40" + } + }, + "caniuse-lite": { + "version": "1.0.30000820", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000820.tgz", + "integrity": "sha512-E0dpVjnt1XTNmWlGgdiae/tOF0jrJ/s+dOnwk8PLmPdu5uSu8wTLJhhbhcgUWU4aO9Iy5yUMZYxT60JS259sbQ==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "optional": true, + "requires": { + "anymatch": "1.3.2", + "async-each": "1.0.1", + "fsevents": "1.1.3", + "glob-parent": "2.0.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0" + } + }, + "commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "convert-source-map": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", + "dev": true + }, + "core-js": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", + "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "electron-to-chromium": { + "version": "1.3.40", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.40.tgz", + "integrity": "sha1-H71tl779crim+SHcONIkE9L2/d8=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "optional": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "optional": true, + "requires": { + "fill-range": "2.2.3" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true, + "optional": true + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "optional": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true, + "optional": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "optional": true, + "requires": { + "for-in": "1.0.2" + } + }, + "fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", + "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", + "dev": true, + "optional": true, + "requires": { + "nan": "2.10.0", + "node-pre-gyp": "0.6.39" + }, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "ajv": { + "version": "4.11.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.2.9" + } + }, + "asn1": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws4": { + "version": "1.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "balanced-match": { + "version": "0.4.2", + "bundled": true, + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "boom": { + "version": "2.10.1", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.7", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "0.4.2", + "concat-map": "0.0.1" + } + }, + "buffer-shims": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true + }, + "co": { + "version": "4.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "cryptiles": { + "version": "2.0.5", + "bundled": true, + "dev": true, + "requires": { + "boom": "2.10.1" + } + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "debug": { + "version": "2.6.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "bundled": true, + "dev": true, + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "extend": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true, + "dev": true, + "optional": true + }, + "form-data": { + "version": "2.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.15" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "fstream": { + "version": "1.0.11", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.1" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fstream": "1.0.11", + "inherits": "2.0.3", + "minimatch": "3.0.4" + } + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "1.1.1", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true, + "dev": true + }, + "har-schema": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "hawk": { + "version": "3.1.3", + "bundled": true, + "dev": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "bundled": true, + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.0", + "sshpk": "1.13.0" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.4", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "jsonify": { + "version": "0.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "jsprim": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "mime-db": { + "version": "1.27.0", + "bundled": true, + "dev": true + }, + "mime-types": { + "version": "2.1.15", + "bundled": true, + "dev": true, + "requires": { + "mime-db": "1.27.0" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.39", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "1.0.2", + "hawk": "3.1.3", + "mkdirp": "0.5.1", + "nopt": "4.0.1", + "npmlog": "4.1.0", + "rc": "1.2.1", + "request": "2.81.0", + "rimraf": "2.6.1", + "semver": "5.3.0", + "tar": "2.2.1", + "tar-pack": "3.4.0" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1.1.0", + "osenv": "0.1.4" + } + }, + "npmlog": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "performance-now": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true, + "dev": true + }, + "punycode": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true + }, + "qs": { + "version": "6.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.2.9", + "bundled": true, + "dev": true, + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.1", + "util-deprecate": "1.0.2" + } + }, + "request": { + "version": "2.81.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.15", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.0.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.2", + "tunnel-agent": "0.6.0", + "uuid": "3.0.1" + } + }, + "rimraf": { + "version": "2.6.1", + "bundled": true, + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "semver": { + "version": "5.3.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sntp": { + "version": "1.0.9", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "sshpk": { + "version": "1.13.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jodid25519": "1.0.2", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "stringstream": { + "version": "0.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "dev": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "tar-pack": { + "version": "3.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "2.6.8", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "once": "1.4.0", + "readable-stream": "2.2.9", + "rimraf": "2.6.1", + "tar": "2.2.1", + "uid-number": "0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "dev": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "uuid": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "verror": { + "version": "1.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + } + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "optional": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "1.3.1" + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "1.11.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true, + "optional": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "optional": true, + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "optional": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "optional": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true, + "optional": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true, + "optional": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "optional": true, + "requires": { + "isarray": "1.0.0" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + }, + "lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", + "dev": true + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "dev": true, + "requires": { + "js-tokens": "3.0.2" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "optional": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "nan": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", + "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", + "dev": true, + "optional": true + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "optional": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "output-file-sync": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", + "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "mkdirp": "0.5.1", + "object-assign": "4.1.1" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "optional": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true, + "optional": true + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true, + "optional": true + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "dev": true, + "optional": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "optional": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "optional": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "optional": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "readable-stream": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.5.tgz", + "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "readable-stream": "2.3.5", + "set-immediate-shim": "1.0.1" + } + }, + "regenerate": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", + "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "private": "0.1.8" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "optional": true, + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "dev": true, + "requires": { + "regenerate": "1.3.3", + "regjsgen": "0.2.0", + "regjsparser": "0.1.5" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true, + "optional": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true, + "optional": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "0.5.7" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "user-home": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true, + "optional": true + }, + "v8flags": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", + "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", + "dev": true, + "requires": { + "user-home": "1.1.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 000000000..9c77d9b65 --- /dev/null +++ b/package.json @@ -0,0 +1,25 @@ +{ + "name": "data-structures", + "version": "1.0.0", + "description": "Data structures on JavaScript", + "main": "index.js", + "scripts": { + "build": "babel src -d build", + "babel-node": "babel-node" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/trekhleb/data-structures.git" + }, + "keywords": [], + "author": "Oleksii Trekhleb (https://www.linkedin.com/in/trekhleb/)", + "license": "ISC", + "bugs": { + "url": "https://github.com/trekhleb/data-structures/issues" + }, + "homepage": "https://github.com/trekhleb/data-structures#readme", + "devDependencies": { + "babel-cli": "^6.26.0", + "babel-preset-env": "^1.6.1" + } +} diff --git a/src/linked_list/LinkedList.js b/src/linked_list/LinkedList.js new file mode 100644 index 000000000..2834c6ae6 --- /dev/null +++ b/src/linked_list/LinkedList.js @@ -0,0 +1,51 @@ +import { Node } from './Node'; + +export class LinkedList { + constructor() { + this.head = null; + } + + append(value) { + const newNode = new Node(value); + + // If there is no head yet let's make new node a head. + if (!this.head) { + this.head = newNode; + + return newNode; + } + + // Rewind to last node. + let currentNode = this.head; + while (currentNode.nextNode !== null) { + currentNode = currentNode.nextNode; + } + + // Attach new node to the end of linked list. + currentNode.nextNode = newNode; + + return newNode; + } + + prepend(value) { + this.head = new Node(value, this.head); + } + + deleteWithValue(value) { + + } + + render() { + let currentNode = this.head; + let index = 0; + + while(currentNode.nextNode !== null) { + console.log(`Node #${index} data: ${currentNode.value}`); + currentNode = currentNode.nextNode; + index++; + } + + // Print the tail. + console.log(`Node #${index} data: ${currentNode.value}`); + } +} diff --git a/src/linked_list/Node.js b/src/linked_list/Node.js new file mode 100644 index 000000000..ffcbeaf80 --- /dev/null +++ b/src/linked_list/Node.js @@ -0,0 +1,6 @@ +export class Node { + constructor(value, nextNode = null) { + this.value = value; + this.nextNode = nextNode; + } +} diff --git a/src/linked_list/index.js b/src/linked_list/index.js new file mode 100644 index 000000000..bc8558c01 --- /dev/null +++ b/src/linked_list/index.js @@ -0,0 +1,11 @@ +import { LinkedList } from "./LinkedList"; + +const linkedList = new LinkedList(); + +linkedList.append(1); +linkedList.append(2); +linkedList.append(3); +linkedList.prepend(4); +linkedList.prepend(5); + +linkedList.render(); From 11f2710fc7caa9ea494a3231b32f9d9035c62649 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Tue, 27 Mar 2018 11:55:43 +0300 Subject: [PATCH 004/327] Refactor directory structure. --- src/{ => data_structures}/linked_list/LinkedList.js | 0 src/{ => data_structures}/linked_list/Node.js | 0 src/{ => data_structures}/linked_list/index.js | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename src/{ => data_structures}/linked_list/LinkedList.js (100%) rename src/{ => data_structures}/linked_list/Node.js (100%) rename src/{ => data_structures}/linked_list/index.js (100%) diff --git a/src/linked_list/LinkedList.js b/src/data_structures/linked_list/LinkedList.js similarity index 100% rename from src/linked_list/LinkedList.js rename to src/data_structures/linked_list/LinkedList.js diff --git a/src/linked_list/Node.js b/src/data_structures/linked_list/Node.js similarity index 100% rename from src/linked_list/Node.js rename to src/data_structures/linked_list/Node.js diff --git a/src/linked_list/index.js b/src/data_structures/linked_list/index.js similarity index 100% rename from src/linked_list/index.js rename to src/data_structures/linked_list/index.js From 2c012b54b4b5ee31e8d184c3b76a01dc9472b933 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Tue, 27 Mar 2018 13:03:44 +0300 Subject: [PATCH 005/327] Add jest tests. --- .babelrc | 10 +- .eslintrc | 8 + .gitignore | 1 - package-lock.json | 7373 +++++++++++++++-- package.json | 14 +- .../linked-list}/LinkedList.js | 32 +- src/data-structures/linked-list/Node.js | 6 + .../linked-list/__test__/LinkedList.test.js | 23 + .../linked-list/__test__/Node.test.js | 9 + src/data_structures/linked_list/Node.js | 6 - src/data_structures/linked_list/index.js | 11 - 11 files changed, 6561 insertions(+), 932 deletions(-) create mode 100644 .eslintrc rename src/{data_structures/linked_list => data-structures/linked-list}/LinkedList.js (50%) create mode 100644 src/data-structures/linked-list/Node.js create mode 100644 src/data-structures/linked-list/__test__/LinkedList.test.js create mode 100644 src/data-structures/linked-list/__test__/Node.test.js delete mode 100644 src/data_structures/linked_list/Node.js delete mode 100644 src/data_structures/linked_list/index.js diff --git a/.babelrc b/.babelrc index 04c9b67b1..002b4aa0d 100644 --- a/.babelrc +++ b/.babelrc @@ -1,11 +1,3 @@ { - "presets": [ - [ - "env", { - "targets": { - "node": "current" - } - } - ] - ] + "presets": ["env"] } diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 000000000..634529e04 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,8 @@ +{ + "root": true, + "extends": "airbnb", + "plugins": ["jest"], + "env": { + "jest/globals": true + } +} diff --git a/.gitignore b/.gitignore index d31e1cc56..eb79dd5fc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,2 @@ node_modules -build .idea diff --git a/package-lock.json b/package-lock.json index 249e19bb3..20c4bc1b5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,142 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@babel/code-frame": { + "version": "7.0.0-beta.42", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.42.tgz", + "integrity": "sha512-L8i94FLSyaLQpRfDo/qqSm8Ndb44zMtXParXo0MebJICG1zoCCL4+GkzUOlB4BNTRSXXQdb3feam/qw7bKPipQ==", + "dev": true, + "requires": { + "@babel/highlight": "7.0.0-beta.42" + } + }, + "@babel/highlight": { + "version": "7.0.0-beta.42", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.42.tgz", + "integrity": "sha512-X3Ur/A/lIbbP8W0pmwgqtDXIxhQmxPaiwY9SKP7kF9wvZfjZRwMvbJE92ozUhF3UDK3DCKaV7oGqmI1rP/zqWA==", + "dev": true, + "requires": { + "chalk": "2.3.2", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.3.0" + } + }, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "@types/jest": { + "version": "22.2.2", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-22.2.2.tgz", + "integrity": "sha512-Dt7aifQmvMPTLVimzvfQ99qUn4zeSDCQarFNV4otfDLYu0RFdSRBnqSLgksoAnsRL88xJ/UBKbd66iP2XIab0w==", + "dev": true + }, + "abab": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", + "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=", + "dev": true + }, + "acorn": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", + "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==", + "dev": true + }, + "acorn-globals": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.1.0.tgz", + "integrity": "sha512-KjZwU26uG3u6eZcfGbTULzFcsoz6pegNKtHPksZPOUsiKo5bUmiBPa38FuHZ/Eun+XYh/JCCkS9AS3Lu4McQOQ==", + "dev": true, + "requires": { + "acorn": "5.5.3" + } + }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "requires": { + "acorn": "3.3.0" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } + } + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "ajv-keywords": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", + "dev": true + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-escapes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", + "dev": true + }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", @@ -27,12 +163,39 @@ "normalize-path": "2.1.1" } }, + "append-transform": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", + "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "dev": true, + "requires": { + "default-require-extensions": "1.0.0" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "1.0.3" + } + }, + "aria-query": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-0.7.1.tgz", + "integrity": "sha1-Jsu1r/ZBRLCoJb4YRuCxbPoAsR4=", + "dev": true, + "requires": { + "ast-types-flow": "0.0.7", + "commander": "2.15.1" + } + }, "arr-diff": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "dev": true, - "optional": true, "requires": { "arr-flatten": "1.1.0" } @@ -41,15 +204,101 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", + "dev": true + }, + "array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", "dev": true, - "optional": true + "requires": { + "define-properties": "1.1.2", + "es-abstract": "1.11.0" + } + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true }, "array-unique": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", "dev": true, - "optional": true + "requires": { + "lodash": "4.17.5" + } }, "async-each": { "version": "1.0.1", @@ -58,6 +307,45 @@ "dev": true, "optional": true }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.0.3.tgz", + "integrity": "sha1-GcenYEc3dEaPILLS0DNyrX1Mv10=", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "dev": true + }, + "axobject-query": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-0.1.0.tgz", + "integrity": "sha1-YvWdvFnJ+SQnWco0mWDnov48NsA=", + "dev": true, + "requires": { + "ast-types-flow": "0.0.7" + } + }, "babel-cli": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.26.0.tgz", @@ -272,6 +560,16 @@ "babel-template": "6.26.0" } }, + "babel-jest": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-22.4.3.tgz", + "integrity": "sha512-BgSjmtl3mW3i+VeVHEr9d2zFSAT66G++pJcHQiUjd00pkW+voYXFctIm/indcqOWWXw5a1nUpR1XWszD9fJ1qg==", + "dev": true, + "requires": { + "babel-plugin-istanbul": "4.1.5", + "babel-preset-jest": "22.4.3" + } + }, "babel-messages": { "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", @@ -290,6 +588,34 @@ "babel-runtime": "6.26.0" } }, + "babel-plugin-istanbul": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.5.tgz", + "integrity": "sha1-Z2DN2Xf0EdPhdbsGTyvDJ9mbK24=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "istanbul-lib-instrument": "1.10.1", + "test-exclude": "4.2.1" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + } + } + }, + "babel-plugin-jest-hoist": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.4.3.tgz", + "integrity": "sha512-zhvv4f6OTWy2bYevcJftwGCWXMFe7pqoz41IhMi4xna7xNsX5NygdagsrE0y6kkfuXq8UalwvPwKTyAxME2E/g==", + "dev": true + }, "babel-plugin-syntax-async-functions": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", @@ -302,6 +628,12 @@ "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", "dev": true }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "dev": true + }, "babel-plugin-syntax-trailing-function-commas": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", @@ -640,6 +972,16 @@ "semver": "5.5.0" } }, + "babel-preset-jest": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-22.4.3.tgz", + "integrity": "sha512-a+M3LTEXTq3gxv0uBN9Qm6ahUl7a8pj923nFbCUdqFUSsf3YrX8Uc+C3MEwji5Af3LiQjSC7w4ooYewlz8HRTA==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "22.4.3", + "babel-plugin-syntax-object-rest-spread": "6.13.0" + } + }, "babel-register": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", @@ -719,6 +1061,48 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.2.1", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.1", + "pascalcase": "0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, "binary-extensions": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", @@ -726,6 +1110,15 @@ "dev": true, "optional": true }, + "boom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", + "dev": true, + "requires": { + "hoek": "4.2.1" + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -741,13 +1134,35 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "dev": true, - "optional": true, "requires": { "expand-range": "1.8.2", "preserve": "0.2.0", "repeat-element": "1.1.2" } }, + "browser-process-hrtime": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz", + "integrity": "sha1-Ql1opY00R/AqBKqJQYf86K+Le44=", + "dev": true + }, + "browser-resolve": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", + "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", + "dev": true, + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, "browserslist": { "version": "2.11.3", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", @@ -758,12 +1173,97 @@ "electron-to-chromium": "1.3.40" } }, + "bser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", + "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", + "dev": true, + "requires": { + "node-int64": "0.4.0" + } + }, + "buffer-from": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", + "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "1.0.0", + "component-emitter": "1.2.1", + "get-value": "2.0.6", + "has-value": "1.0.0", + "isobject": "3.0.1", + "set-value": "2.0.0", + "to-object-path": "0.3.0", + "union-value": "1.0.0", + "unset-value": "1.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "0.2.0" + } + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true, + "optional": true + }, "caniuse-lite": { "version": "1.0.30000820", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000820.tgz", "integrity": "sha512-E0dpVjnt1XTNmWlGgdiae/tOF0jrJ/s+dOnwk8PLmPdu5uSu8wTLJhhbhcgUWU4aO9Iy5yUMZYxT60JS259sbQ==", "dev": true }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "optional": true, + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } + }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", @@ -777,6 +1277,12 @@ "supports-color": "2.0.0" } }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true + }, "chokidar": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", @@ -795,357 +1301,1337 @@ "readdirp": "2.1.0" } }, - "commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "convert-source-map": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", + "ci-info": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz", + "integrity": "sha512-SK/846h/Rcy8q9Z9CAwGBLfCJ6EkjJWdpelWDufQpqVDYq2Wnnv8zlSO6AMQap02jvhVruKKpEtQOufo3pFhLg==", "dev": true }, - "core-js": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", - "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=", + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", "dev": true }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, - "optional": true + "requires": { + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", "dev": true, "requires": { - "ms": "2.0.0" + "restore-cursor": "2.0.0" } }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", "dev": true, + "optional": true, "requires": { - "repeating": "2.0.1" + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true, + "optional": true + } } }, - "electron-to-chromium": { - "version": "1.3.40", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.40.tgz", - "integrity": "sha1-H71tl779crim+SHcONIkE9L2/d8=", + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "1.0.0", + "object-visit": "1.0.1" + } + }, + "color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "dev": true, - "optional": true, "requires": { - "is-posix-bracket": "0.1.1" + "delayed-stream": "1.0.0" } }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true + }, + "compare-versions": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.1.0.tgz", + "integrity": "sha512-4hAxDSBypT/yp2ySFD346So6Ragw5xmBn/e/agIGl3bZr6DLUqnoRZPusxKrXdYRZpgexO9daejmIenlq/wrIQ==", + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, - "optional": true, "requires": { - "fill-range": "2.2.3" + "buffer-from": "1.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.5", + "typedarray": "0.0.6" } }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "content-type-parser": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.2.tgz", + "integrity": "sha512-lM4l4CnMEwOLHAHr/P6MEZwZFPJFtAAKgL6pogbXmVZggIqXhdB6RbBtPOTsw2FcXwYhehRGERJmRrjOiIB8pQ==", + "dev": true + }, + "convert-source-map": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", + "dev": true + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", + "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, - "optional": true, "requires": { - "is-extglob": "1.0.0" + "lru-cache": "4.1.2", + "shebang-command": "1.2.0", + "which": "1.3.0" } }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "cryptiles": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", + "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", "dev": true, - "optional": true + "requires": { + "boom": "5.2.0" + }, + "dependencies": { + "boom": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", + "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", + "dev": true, + "requires": { + "hoek": "4.2.1" + } + } + } }, - "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "cssom": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz", + "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=", + "dev": true + }, + "cssstyle": { + "version": "0.2.37", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", + "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", "dev": true, - "optional": true, "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" + "cssom": "0.3.2" } }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "damerau-levenshtein": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz", + "integrity": "sha1-AxkcQyy27qFou3fzpV/9zLiXhRQ=", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, - "optional": true + "requires": { + "assert-plus": "1.0.0" + } }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "optional": true, "requires": { - "for-in": "1.0.2" + "ms": "2.0.0" } }, - "fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, - "fsevents": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", - "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "default-require-extensions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", "dev": true, - "optional": true, "requires": { - "nan": "2.10.0", - "node-pre-gyp": "0.6.39" + "strip-bom": "2.0.0" }, "dependencies": { - "abbrev": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "ajv": { - "version": "4.11.8", - "bundled": true, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, - "optional": true, "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" + "is-utf8": "0.2.1" } + } + } + }, + "define-properties": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "dev": true, + "requires": { + "foreach": "2.0.5", + "object-keys": "1.0.11" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "1.0.2", + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "5.0.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.1", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "rimraf": "2.6.2" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "2.0.2" + } + }, + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "dev": true, + "requires": { + "webidl-conversions": "4.0.2" + } + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "electron-to-chromium": { + "version": "1.3.40", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.40.tgz", + "integrity": "sha1-H71tl779crim+SHcONIkE9L2/d8=", + "dev": true + }, + "emoji-regex": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.5.1.tgz", + "integrity": "sha512-PAHp6TxrCy7MGMFidro8uikr+zlJJKJ/Q6mm2ExZ7HwkyR9lSVFfE3kt36qcwa24BQL7y0G9axycGjK1A/0uNQ==", + "dev": true + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "dev": true, + "requires": { + "iconv-lite": "0.4.19" + } + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "es-abstract": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.11.0.tgz", + "integrity": "sha512-ZnQrE/lXTTQ39ulXZ+J1DTFazV9qBy61x2bY071B+qGco8Z8q1QddsLdt/EF8Ai9hcWH72dWS0kFqXLxOxqslA==", + "dev": true, + "requires": { + "es-to-primitive": "1.1.1", + "function-bind": "1.1.1", + "has": "1.0.1", + "is-callable": "1.1.3", + "is-regex": "1.0.4" + } + }, + "es-to-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "dev": true, + "requires": { + "is-callable": "1.1.3", + "is-date-object": "1.0.1", + "is-symbol": "1.0.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escodegen": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz", + "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==", + "dev": true, + "requires": { + "esprima": "3.1.3", + "estraverse": "4.2.0", + "esutils": "2.0.2", + "optionator": "0.8.2", + "source-map": "0.6.1" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "aproba": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.2.9" - } - }, - "asn1": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, - "assert-plus": { - "version": "0.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws-sign2": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws4": { - "version": "1.6.0", - "bundled": true, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "optional": true - }, - "balanced-match": { - "version": "0.4.2", - "bundled": true, + } + } + }, + "eslint": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", + "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", + "dev": true, + "requires": { + "ajv": "5.5.2", + "babel-code-frame": "6.26.0", + "chalk": "2.3.2", + "concat-stream": "1.6.2", + "cross-spawn": "5.1.0", + "debug": "3.1.0", + "doctrine": "2.1.0", + "eslint-scope": "3.7.1", + "eslint-visitor-keys": "1.0.0", + "espree": "3.5.4", + "esquery": "1.0.0", + "esutils": "2.0.2", + "file-entry-cache": "2.0.0", + "functional-red-black-tree": "1.0.1", + "glob": "7.1.2", + "globals": "11.4.0", + "ignore": "3.3.7", + "imurmurhash": "0.1.4", + "inquirer": "3.3.0", + "is-resolvable": "1.1.0", + "js-yaml": "3.11.0", + "json-stable-stringify-without-jsonify": "1.0.1", + "levn": "0.3.0", + "lodash": "4.17.5", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "natural-compare": "1.4.0", + "optionator": "0.8.2", + "path-is-inside": "1.0.2", + "pluralize": "7.0.0", + "progress": "2.0.0", + "regexpp": "1.0.1", + "require-uncached": "1.0.3", + "semver": "5.5.0", + "strip-ansi": "4.0.0", + "strip-json-comments": "2.0.1", + "table": "4.0.2", + "text-table": "0.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "block-stream": { - "version": "0.0.9", - "bundled": true, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "inherits": "2.0.3" + "color-convert": "1.9.1" } }, - "boom": { - "version": "2.10.1", - "bundled": true, + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", "dev": true, "requires": { - "hoek": "2.16.3" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.3.0" } }, - "brace-expansion": { - "version": "1.1.7", - "bundled": true, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { - "balanced-match": "0.4.2", - "concat-map": "0.0.1" + "ms": "2.0.0" } }, - "buffer-shims": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "caseless": { - "version": "0.12.0", - "bundled": true, - "dev": true, - "optional": true - }, - "co": { - "version": "4.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, + "globals": { + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.4.0.tgz", + "integrity": "sha512-Dyzmifil8n/TmSqYDEXbm+C8yitzJQqQIlJQLNRMwa+BOUJpRC19pyVeN12JAjt61xonvXjtff+hJruTRXn5HA==", "dev": true }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "delayed-stream": "1.0.0" + "ansi-regex": "3.0.0" } }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "cryptiles": { - "version": "2.0.5", - "bundled": true, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", "dev": true, "requires": { - "boom": "2.10.1" + "has-flag": "3.0.0" } - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, + } + } + }, + "eslint-config-airbnb": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-16.1.0.tgz", + "integrity": "sha512-zLyOhVWhzB/jwbz7IPSbkUuj7X2ox4PHXTcZkEmDqTvd0baJmJyuxlFPDlZOE/Y5bC+HQRaEkT3FoHo9wIdRiw==", + "dev": true, + "requires": { + "eslint-config-airbnb-base": "12.1.0" + } + }, + "eslint-config-airbnb-base": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-12.1.0.tgz", + "integrity": "sha512-/vjm0Px5ZCpmJqnjIzcFb9TKZrKWz0gnuG/7Gfkt0Db1ELJR51xkZth+t14rYdqWgX836XbuxtArbIHlVhbLBA==", + "dev": true, + "requires": { + "eslint-restricted-globals": "0.1.1" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", + "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", + "dev": true, + "requires": { + "debug": "2.6.9", + "resolve": "1.6.0" + } + }, + "eslint-module-utils": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz", + "integrity": "sha512-jDI/X5l/6D1rRD/3T43q8Qgbls2nq5km5KSqiwlyUbGo5+04fXhMKdCPhjwbqAa6HXWaMxj8Q4hQDIh7IadJQw==", + "dev": true, + "requires": { + "debug": "2.6.9", + "pkg-dir": "1.0.0" + } + }, + "eslint-plugin-import": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.9.0.tgz", + "integrity": "sha1-JgAu+/ylmJtyiKwEdQi9JPIXsWk=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1", + "contains-path": "0.1.0", + "debug": "2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "0.3.2", + "eslint-module-utils": "2.1.1", + "has": "1.0.1", + "lodash": "4.17.5", + "minimatch": "3.0.4", + "read-pkg-up": "2.0.0" + }, + "dependencies": { + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "dev": true, - "optional": true, "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } + "esutils": "2.0.2", + "isarray": "1.0.0" } - }, - "debug": { - "version": "2.6.8", - "bundled": true, + } + } + }, + "eslint-plugin-jest": { + "version": "21.15.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-21.15.0.tgz", + "integrity": "sha512-Qe1egBnn0obmFQ9quZiJwwsf1H6oBXrJBku7OUt8XdCSwKL6h7xC4OKyg2px9jQXxv7YcTNUIFAGk2OUpPfDOA==", + "dev": true + }, + "eslint-plugin-jsx-a11y": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.0.3.tgz", + "integrity": "sha1-VFg9GuRCSDFi4EDhPMMYZUZRAOU=", + "dev": true, + "requires": { + "aria-query": "0.7.1", + "array-includes": "3.0.3", + "ast-types-flow": "0.0.7", + "axobject-query": "0.1.0", + "damerau-levenshtein": "1.0.4", + "emoji-regex": "6.5.1", + "jsx-ast-utils": "2.0.1" + } + }, + "eslint-plugin-react": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.7.0.tgz", + "integrity": "sha512-KC7Snr4YsWZD5flu6A5c0AcIZidzW3Exbqp7OT67OaD2AppJtlBr/GuPrW/vaQM/yfZotEvKAdrxrO+v8vwYJA==", + "dev": true, + "requires": { + "doctrine": "2.1.0", + "has": "1.0.1", + "jsx-ast-utils": "2.0.1", + "prop-types": "15.6.1" + } + }, + "eslint-restricted-globals": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz", + "integrity": "sha1-NfDVy8ZMLj7WLpO0saevBbp+1Nc=", + "dev": true + }, + "eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "dev": true, + "requires": { + "esrecurse": "4.2.1", + "estraverse": "4.2.0" + } + }, + "eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "dev": true + }, + "espree": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", + "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", + "dev": true, + "requires": { + "acorn": "5.5.3", + "acorn-jsx": "3.0.1" + } + }, + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "dev": true + }, + "esquery": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", + "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", + "dev": true, + "requires": { + "estraverse": "4.2.0" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "4.2.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "exec-sh": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.1.tgz", + "integrity": "sha512-aLt95pexaugVtQerpmE51+4QfWrNc304uez7jvj6fWnN8GeEHpttB8F36n8N7uVhUMbH/1enbxQ9HImZ4w/9qg==", + "dev": true, + "requires": { + "merge": "1.2.0" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "2.2.3" + } + }, + "expect": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/expect/-/expect-22.4.3.tgz", + "integrity": "sha512-XcNXEPehqn8b/jm8FYotdX0YrXn36qp4HWlrVT4ktwQas1l1LPxiVWncYnnL2eyMtKAmVIaG0XAp0QlrqJaxaA==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "jest-diff": "22.4.3", + "jest-get-type": "22.4.3", + "jest-matcher-utils": "22.4.3", + "jest-message-util": "22.4.3", + "jest-regex-util": "22.4.3" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "optional": true, "requires": { - "ms": "2.0.0" + "color-convert": "1.9.1" } - }, - "deep-extend": { - "version": "0.4.2", + } + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "external-editor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", + "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", + "dev": true, + "requires": { + "chardet": "0.4.2", + "iconv-lite": "0.4.19", + "tmp": "0.0.33" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fb-watchman": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", + "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", + "dev": true, + "requires": { + "bser": "2.0.0" + } + }, + "fbjs": { + "version": "0.8.16", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", + "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", + "dev": true, + "requires": { + "core-js": "1.2.7", + "isomorphic-fetch": "2.2.1", + "loose-envify": "1.3.1", + "object-assign": "4.1.1", + "promise": "7.3.1", + "setimmediate": "1.0.5", + "ua-parser-js": "0.7.17" + }, + "dependencies": { + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", + "dev": true + } + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "1.3.0", + "object-assign": "4.1.1" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "7.1.2", + "minimatch": "3.0.4" + } + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "flat-cache": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", + "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "dev": true, + "requires": { + "circular-json": "0.3.3", + "del": "2.2.2", + "graceful-fs": "4.1.11", + "write": "0.2.1" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.6", + "mime-types": "2.1.18" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "0.2.2" + } + }, + "fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", + "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", + "dev": true, + "optional": true, + "requires": { + "nan": "2.10.0", + "node-pre-gyp": "0.6.39" + }, + "dependencies": { + "abbrev": { + "version": "1.1.0", "bundled": true, "dev": true, "optional": true }, - "delayed-stream": { - "version": "1.0.0", + "ajv": { + "version": "4.11.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.2.9" + } + }, + "asn1": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws4": { + "version": "1.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "balanced-match": { + "version": "0.4.2", + "bundled": true, + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "boom": { + "version": "2.10.1", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.7", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "0.4.2", + "concat-map": "0.0.1" + } + }, + "buffer-shims": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true + }, + "co": { + "version": "4.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "cryptiles": { + "version": "2.0.5", + "bundled": true, + "dev": true, + "requires": { + "boom": "2.10.1" + } + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "debug": { + "version": "2.6.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "bundled": true, + "dev": true, + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", "bundled": true, "dev": true }, @@ -1604,919 +3090,5036 @@ "version": "1.2.0", "bundled": true, "dev": true, - "optional": true + "optional": true + } + } + }, + "readable-stream": { + "version": "2.2.9", + "bundled": true, + "dev": true, + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.1", + "util-deprecate": "1.0.2" + } + }, + "request": { + "version": "2.81.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.15", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.0.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.2", + "tunnel-agent": "0.6.0", + "uuid": "3.0.1" + } + }, + "rimraf": { + "version": "2.6.1", + "bundled": true, + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "semver": { + "version": "5.3.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sntp": { + "version": "1.0.9", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "sshpk": { + "version": "1.13.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jodid25519": "1.0.2", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "stringstream": { + "version": "0.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "dev": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "tar-pack": { + "version": "3.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "2.6.8", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "once": "1.4.0", + "readable-stream": "2.2.9", + "rimraf": "2.6.1", + "tar": "2.2.1", + "uid-number": "0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "dev": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "uuid": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "verror": { + "version": "1.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "arrify": "1.0.1", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, + "handlebars": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", + "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", + "dev": true, + "requires": { + "async": "1.5.2", + "optimist": "0.6.1", + "source-map": "0.4.4", + "uglify-js": "2.8.29" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "dev": true, + "requires": { + "ajv": "5.5.2", + "har-schema": "2.0.0" + } + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "dev": true, + "requires": { + "function-bind": "1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "hawk": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", + "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", + "dev": true, + "requires": { + "boom": "4.3.1", + "cryptiles": "3.1.2", + "hoek": "4.2.1", + "sntp": "2.1.0" + } + }, + "hoek": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", + "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==", + "dev": true + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "hosted-git-info": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", + "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", + "dev": true + }, + "html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dev": true, + "requires": { + "whatwg-encoding": "1.0.3" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.14.1" + } + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "dev": true + }, + "ignore": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", + "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", + "dev": true + }, + "import-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "dev": true, + "requires": { + "pkg-dir": "2.0.0", + "resolve-cwd": "2.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "2.1.0" + } + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "dev": true, + "requires": { + "ansi-escapes": "3.1.0", + "chalk": "2.3.2", + "cli-cursor": "2.1.0", + "cli-width": "2.2.0", + "external-editor": "2.1.0", + "figures": "2.0.0", + "lodash": "4.17.5", + "mute-stream": "0.0.7", + "run-async": "2.3.0", + "rx-lite": "4.0.8", + "rx-lite-aggregates": "4.0.8", + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "through": "2.3.8" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.3.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + }, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "1.3.1" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "1.11.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-callable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", + "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", + "dev": true + }, + "is-ci": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz", + "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==", + "dev": true, + "requires": { + "ci-info": "1.1.3" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-generator-fn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-1.0.0.tgz", + "integrity": "sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-odd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", + "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", + "dev": true, + "requires": { + "is-number": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "requires": { + "is-path-inside": "1.0.1" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "1.0.1" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "dev": true, + "requires": { + "node-fetch": "1.7.3", + "whatwg-fetch": "2.0.3" + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul-api": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.1.tgz", + "integrity": "sha512-duj6AlLcsWNwUpfyfHt0nWIeRiZpuShnP40YTxOGQgtaN8fd6JYSxsvxUphTDy8V5MfDXo4s/xVCIIvVCO808g==", + "dev": true, + "requires": { + "async": "2.6.0", + "compare-versions": "3.1.0", + "fileset": "2.0.3", + "istanbul-lib-coverage": "1.2.0", + "istanbul-lib-hook": "1.2.0", + "istanbul-lib-instrument": "1.10.1", + "istanbul-lib-report": "1.1.4", + "istanbul-lib-source-maps": "1.2.4", + "istanbul-reports": "1.3.0", + "js-yaml": "3.11.0", + "mkdirp": "0.5.1", + "once": "1.4.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "istanbul-lib-source-maps": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.4.tgz", + "integrity": "sha512-UzuK0g1wyQijiaYQxj/CdNycFhAd2TLtO2obKQMTZrZ1jzEMRY3rvpASEKkaxbRR6brvdovfA03znPa/pXcejg==", + "dev": true, + "requires": { + "debug": "3.1.0", + "istanbul-lib-coverage": "1.2.0", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "source-map": "0.5.7" + } + } + } + }, + "istanbul-lib-coverage": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz", + "integrity": "sha512-GvgM/uXRwm+gLlvkWHTjDAvwynZkL9ns15calTrmhGgowlwJBbWMYzWbKqE2DT6JDP1AFXKa+Zi0EkqNCUqY0A==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.0.tgz", + "integrity": "sha512-p3En6/oGkFQV55Up8ZPC2oLxvgSxD8CzA0yBrhRZSh3pfv3OFj9aSGVC0yoerAi/O4u7jUVnOGVX1eVFM+0tmQ==", + "dev": true, + "requires": { + "append-transform": "0.4.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz", + "integrity": "sha512-1dYuzkOCbuR5GRJqySuZdsmsNKPL3PTuyPevQfoCXJePT9C8y1ga75neU+Tuy9+yS3G/dgx8wgOmp2KLpgdoeQ==", + "dev": true, + "requires": { + "babel-generator": "6.26.1", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "istanbul-lib-coverage": "1.2.0", + "semver": "5.5.0" + } + }, + "istanbul-lib-report": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.4.tgz", + "integrity": "sha512-Azqvq5tT0U09nrncK3q82e/Zjkxa4tkFZv7E6VcqP0QCPn6oNljDPfrZEC/umNXds2t7b8sRJfs6Kmpzt8m2kA==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "1.2.0", + "mkdirp": "0.5.1", + "path-parse": "1.0.5", + "supports-color": "3.2.3" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.3.tgz", + "integrity": "sha512-fDa0hwU/5sDXwAklXgAoCJCOsFsBplVQ6WBldz5UwaqOzmDhUK4nfuR7/G//G2lERlblUNJB8P6e8cXq3a7MlA==", + "dev": true, + "requires": { + "debug": "3.1.0", + "istanbul-lib-coverage": "1.2.0", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "source-map": "0.5.7" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "istanbul-reports": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.3.0.tgz", + "integrity": "sha512-y2Z2IMqE1gefWUaVjrBm0mSKvUkaBy9Vqz8iwr/r40Y9hBbIteH5wqHG/9DLTfJ9xUnUT2j7A3+VVJ6EaYBllA==", + "dev": true, + "requires": { + "handlebars": "4.0.11" + } + }, + "jest": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest/-/jest-22.4.3.tgz", + "integrity": "sha512-FFCdU/pXOEASfHxFDOWUysI/+FFoqiXJADEIXgDKuZyqSmBD3tZ4BEGH7+M79v7czj7bbkhwtd2LaEDcJiM/GQ==", + "dev": true, + "requires": { + "import-local": "1.0.0", + "jest-cli": "22.4.3" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.3.0" + } + }, + "jest-cli": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-22.4.3.tgz", + "integrity": "sha512-IiHybF0DJNqZPsbjn4Cy4vcqcmImpoFwNFnkehzVw8lTUSl4axZh5DHewu5bdpZF2Y5gUqFKYzH0FH4Qx2k+UA==", + "dev": true, + "requires": { + "ansi-escapes": "3.1.0", + "chalk": "2.3.2", + "exit": "0.1.2", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "import-local": "1.0.0", + "is-ci": "1.1.0", + "istanbul-api": "1.3.1", + "istanbul-lib-coverage": "1.2.0", + "istanbul-lib-instrument": "1.10.1", + "istanbul-lib-source-maps": "1.2.3", + "jest-changed-files": "22.4.3", + "jest-config": "22.4.3", + "jest-environment-jsdom": "22.4.3", + "jest-get-type": "22.4.3", + "jest-haste-map": "22.4.3", + "jest-message-util": "22.4.3", + "jest-regex-util": "22.4.3", + "jest-resolve-dependencies": "22.4.3", + "jest-runner": "22.4.3", + "jest-runtime": "22.4.3", + "jest-snapshot": "22.4.3", + "jest-util": "22.4.3", + "jest-validate": "22.4.3", + "jest-worker": "22.4.3", + "micromatch": "2.3.11", + "node-notifier": "5.2.1", + "realpath-native": "1.0.0", + "rimraf": "2.6.2", + "slash": "1.0.0", + "string-length": "2.0.0", + "strip-ansi": "4.0.0", + "which": "1.3.0", + "yargs": "10.1.2" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + }, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "jest-changed-files": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-22.4.3.tgz", + "integrity": "sha512-83Dh0w1aSkUNFhy5d2dvqWxi/y6weDwVVLU6vmK0cV9VpRxPzhTeGimbsbRDSnEoszhF937M4sDLLeS7Cu/Tmw==", + "dev": true, + "requires": { + "throat": "4.1.0" + } + }, + "jest-config": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-22.4.3.tgz", + "integrity": "sha512-KSg3EOToCgkX+lIvenKY7J8s426h6ahXxaUFJxvGoEk0562Z6inWj1TnKoGycTASwiLD+6kSYFALcjdosq9KIQ==", + "dev": true, + "requires": { + "chalk": "2.3.2", + "glob": "7.1.2", + "jest-environment-jsdom": "22.4.3", + "jest-environment-node": "22.4.3", + "jest-get-type": "22.4.3", + "jest-jasmine2": "22.4.3", + "jest-regex-util": "22.4.3", + "jest-resolve": "22.4.3", + "jest-util": "22.4.3", + "jest-validate": "22.4.3", + "pretty-format": "22.4.3" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.3.0" + } + }, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "jest-diff": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-22.4.3.tgz", + "integrity": "sha512-/QqGvCDP5oZOF6PebDuLwrB2BMD8ffJv6TAGAdEVuDx1+uEgrHpSFrfrOiMRx2eJ1hgNjlQrOQEHetVwij90KA==", + "dev": true, + "requires": { + "chalk": "2.3.2", + "diff": "3.5.0", + "jest-get-type": "22.4.3", + "pretty-format": "22.4.3" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.3.0" + } + }, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "jest-docblock": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-22.4.3.tgz", + "integrity": "sha512-uPKBEAw7YrEMcXueMKZXn/rbMxBiSv48fSqy3uEnmgOlQhSX+lthBqHb1fKWNVmFqAp9E/RsSdBfiV31LbzaOg==", + "dev": true, + "requires": { + "detect-newline": "2.1.0" + } + }, + "jest-environment-jsdom": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-22.4.3.tgz", + "integrity": "sha512-FviwfR+VyT3Datf13+ULjIMO5CSeajlayhhYQwpzgunswoaLIPutdbrnfUHEMyJCwvqQFaVtTmn9+Y8WCt6n1w==", + "dev": true, + "requires": { + "jest-mock": "22.4.3", + "jest-util": "22.4.3", + "jsdom": "11.6.2" + } + }, + "jest-environment-node": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-22.4.3.tgz", + "integrity": "sha512-reZl8XF6t/lMEuPWwo9OLfttyC26A5AMgDyEQ6DBgZuyfyeNUzYT8BFo6uxCCP/Av/b7eb9fTi3sIHFPBzmlRA==", + "dev": true, + "requires": { + "jest-mock": "22.4.3", + "jest-util": "22.4.3" + } + }, + "jest-get-type": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", + "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", + "dev": true + }, + "jest-haste-map": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-22.4.3.tgz", + "integrity": "sha512-4Q9fjzuPVwnaqGKDpIsCSoTSnG3cteyk2oNVjBX12HHOaF1oxql+uUiqZb5Ndu7g/vTZfdNwwy4WwYogLh29DQ==", + "dev": true, + "requires": { + "fb-watchman": "2.0.0", + "graceful-fs": "4.1.11", + "jest-docblock": "22.4.3", + "jest-serializer": "22.4.3", + "jest-worker": "22.4.3", + "micromatch": "2.3.11", + "sane": "2.5.0" + } + }, + "jest-jasmine2": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-22.4.3.tgz", + "integrity": "sha512-yZCPCJUcEY6R5KJB/VReo1AYI2b+5Ky+C+JA1v34jndJsRcLpU4IZX4rFJn7yDTtdNbO/nNqg+3SDIPNH2ecnw==", + "dev": true, + "requires": { + "chalk": "2.3.2", + "co": "4.6.0", + "expect": "22.4.3", + "graceful-fs": "4.1.11", + "is-generator-fn": "1.0.0", + "jest-diff": "22.4.3", + "jest-matcher-utils": "22.4.3", + "jest-message-util": "22.4.3", + "jest-snapshot": "22.4.3", + "jest-util": "22.4.3", + "source-map-support": "0.5.4" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.3.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.4.tgz", + "integrity": "sha512-PETSPG6BjY1AHs2t64vS2aqAgu6dMIMXJULWFBGbh2Gr8nVLbCFDo6i/RMMvviIQ2h1Z8+5gQhVKSn2je9nmdg==", + "dev": true, + "requires": { + "source-map": "0.6.1" + } + }, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "jest-leak-detector": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-22.4.3.tgz", + "integrity": "sha512-NZpR/Ls7+ndO57LuXROdgCGz2RmUdC541tTImL9bdUtU3WadgFGm0yV+Ok4Fuia/1rLAn5KaJ+i76L6e3zGJYQ==", + "dev": true, + "requires": { + "pretty-format": "22.4.3" + } + }, + "jest-matcher-utils": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz", + "integrity": "sha512-lsEHVaTnKzdAPR5t4B6OcxXo9Vy4K+kRRbG5gtddY8lBEC+Mlpvm1CJcsMESRjzUhzkz568exMV1hTB76nAKbA==", + "dev": true, + "requires": { + "chalk": "2.3.2", + "jest-get-type": "22.4.3", + "pretty-format": "22.4.3" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.3.0" + } + }, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "jest-message-util": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-22.4.3.tgz", + "integrity": "sha512-iAMeKxhB3Se5xkSjU0NndLLCHtP4n+GtCqV0bISKA5dmOXQfEbdEmYiu2qpnWBDCQdEafNDDU6Q+l6oBMd/+BA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.42", + "chalk": "2.3.2", + "micromatch": "2.3.11", + "slash": "1.0.0", + "stack-utils": "1.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.3.0" + } + }, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "jest-mock": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-22.4.3.tgz", + "integrity": "sha512-+4R6mH5M1G4NK16CKg9N1DtCaFmuxhcIqF4lQK/Q1CIotqMs/XBemfpDPeVZBFow6iyUNu6EBT9ugdNOTT5o5Q==", + "dev": true + }, + "jest-regex-util": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-22.4.3.tgz", + "integrity": "sha512-LFg1gWr3QinIjb8j833bq7jtQopiwdAs67OGfkPrvy7uNUbVMfTXXcOKXJaeY5GgjobELkKvKENqq1xrUectWg==", + "dev": true + }, + "jest-resolve": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-22.4.3.tgz", + "integrity": "sha512-u3BkD/MQBmwrOJDzDIaxpyqTxYH+XqAXzVJP51gt29H8jpj3QgKof5GGO2uPGKGeA1yTMlpbMs1gIQ6U4vcRhw==", + "dev": true, + "requires": { + "browser-resolve": "1.11.2", + "chalk": "2.3.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.3.0" + } + }, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "jest-resolve-dependencies": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-22.4.3.tgz", + "integrity": "sha512-06czCMVToSN8F2U4EvgSB1Bv/56gc7MpCftZ9z9fBgUQM7dzHGCMBsyfVA6dZTx8v0FDcnALf7hupeQxaBCvpA==", + "dev": true, + "requires": { + "jest-regex-util": "22.4.3" + } + }, + "jest-runner": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-22.4.3.tgz", + "integrity": "sha512-U7PLlQPRlWNbvOHWOrrVay9sqhBJmiKeAdKIkvX4n1G2tsvzLlf77nBD28GL1N6tGv4RmuTfI8R8JrkvCa+IBg==", + "dev": true, + "requires": { + "exit": "0.1.2", + "jest-config": "22.4.3", + "jest-docblock": "22.4.3", + "jest-haste-map": "22.4.3", + "jest-jasmine2": "22.4.3", + "jest-leak-detector": "22.4.3", + "jest-message-util": "22.4.3", + "jest-runtime": "22.4.3", + "jest-util": "22.4.3", + "jest-worker": "22.4.3", + "throat": "4.1.0" + } + }, + "jest-runtime": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-22.4.3.tgz", + "integrity": "sha512-Eat/esQjevhx9BgJEC8udye+FfoJ2qvxAZfOAWshYGS22HydHn5BgsvPdTtt9cp0fSl5LxYOFA1Pja9Iz2Zt8g==", + "dev": true, + "requires": { + "babel-core": "6.26.0", + "babel-jest": "22.4.3", + "babel-plugin-istanbul": "4.1.5", + "chalk": "2.3.2", + "convert-source-map": "1.5.1", + "exit": "0.1.2", + "graceful-fs": "4.1.11", + "jest-config": "22.4.3", + "jest-haste-map": "22.4.3", + "jest-regex-util": "22.4.3", + "jest-resolve": "22.4.3", + "jest-util": "22.4.3", + "jest-validate": "22.4.3", + "json-stable-stringify": "1.0.1", + "micromatch": "2.3.11", + "realpath-native": "1.0.0", + "slash": "1.0.0", + "strip-bom": "3.0.0", + "write-file-atomic": "2.3.0", + "yargs": "10.1.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.3.0" + } + }, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "jest-serializer": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-22.4.3.tgz", + "integrity": "sha512-uPaUAppx4VUfJ0QDerpNdF43F68eqKWCzzhUlKNDsUPhjOon7ZehR4C809GCqh765FoMRtTVUVnGvIoskkYHiw==", + "dev": true + }, + "jest-snapshot": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-22.4.3.tgz", + "integrity": "sha512-JXA0gVs5YL0HtLDCGa9YxcmmV2LZbwJ+0MfyXBBc5qpgkEYITQFJP7XNhcHFbUvRiniRpRbGVfJrOoYhhGE0RQ==", + "dev": true, + "requires": { + "chalk": "2.3.2", + "jest-diff": "22.4.3", + "jest-matcher-utils": "22.4.3", + "mkdirp": "0.5.1", + "natural-compare": "1.4.0", + "pretty-format": "22.4.3" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.3.0" + } + }, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "jest-util": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-22.4.3.tgz", + "integrity": "sha512-rfDfG8wyC5pDPNdcnAlZgwKnzHvZDu8Td2NJI/jAGKEGxJPYiE4F0ss/gSAkG4778Y23Hvbz+0GMrDJTeo7RjQ==", + "dev": true, + "requires": { + "callsites": "2.0.0", + "chalk": "2.3.2", + "graceful-fs": "4.1.11", + "is-ci": "1.1.0", + "jest-message-util": "22.4.3", + "mkdirp": "0.5.1", + "source-map": "0.6.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.3.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "jest-validate": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-22.4.3.tgz", + "integrity": "sha512-CfFM18W3GSP/xgmA4UouIx0ljdtfD2mjeBC6c89Gg17E44D4tQhAcTrZmf9djvipwU30kSTnk6CzcxdCCeSXfA==", + "dev": true, + "requires": { + "chalk": "2.3.2", + "jest-config": "22.4.3", + "jest-get-type": "22.4.3", + "leven": "2.1.0", + "pretty-format": "22.4.3" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.3.0" + } + }, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "jest-worker": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-22.4.3.tgz", + "integrity": "sha512-B1ucW4fI8qVAuZmicFxI1R3kr2fNeYJyvIQ1rKcuLYnenFV5K5aMbxFj6J0i00Ju83S8jP2d7Dz14+AvbIHRYQ==", + "dev": true, + "requires": { + "merge-stream": "1.0.1" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", + "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", + "dev": true, + "requires": { + "argparse": "1.0.10", + "esprima": "4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "jsdom": { + "version": "11.6.2", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.6.2.tgz", + "integrity": "sha512-pAeZhpbSlUp5yQcS6cBQJwkbzmv4tWFaYxHbFVSxzXefqjvtRA851Z5N2P+TguVG9YeUDcgb8pdeVQRJh0XR3Q==", + "dev": true, + "requires": { + "abab": "1.0.4", + "acorn": "5.5.3", + "acorn-globals": "4.1.0", + "array-equal": "1.0.0", + "browser-process-hrtime": "0.1.2", + "content-type-parser": "1.0.2", + "cssom": "0.3.2", + "cssstyle": "0.2.37", + "domexception": "1.0.1", + "escodegen": "1.9.1", + "html-encoding-sniffer": "1.0.2", + "left-pad": "1.2.0", + "nwmatcher": "1.4.4", + "parse5": "4.0.0", + "pn": "1.1.0", + "request": "2.85.0", + "request-promise-native": "1.0.5", + "sax": "1.2.4", + "symbol-tree": "3.2.2", + "tough-cookie": "2.3.4", + "w3c-hr-time": "1.0.1", + "webidl-conversions": "4.0.2", + "whatwg-encoding": "1.0.3", + "whatwg-url": "6.4.0", + "ws": "4.1.0", + "xml-name-validator": "3.0.0" + } + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jsx-ast-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz", + "integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=", + "dev": true, + "requires": { + "array-includes": "3.0.3" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true, + "optional": true + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "1.0.0" + } + }, + "left-pad": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.2.0.tgz", + "integrity": "sha1-0wpzxrggHY99jnlWupYWCHpo4O4=", + "dev": true + }, + "leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2", + "type-check": "0.3.2" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", + "dev": true + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "dev": true, + "requires": { + "js-tokens": "3.0.2" + } + }, + "lru-cache": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", + "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "requires": { + "tmpl": "1.0.4" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "1.0.1" + } + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "1.2.0" + } + }, + "merge": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", + "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=", + "dev": true + }, + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "dev": true, + "requires": { + "readable-stream": "2.3.5" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "dev": true + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "dev": true, + "requires": { + "mime-db": "1.33.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "1.0.2", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "nan": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", + "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", + "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "fragment-cache": "0.2.1", + "is-odd": "2.0.0", + "is-windows": "1.0.2", + "kind-of": "6.0.2", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "dev": true, + "requires": { + "encoding": "0.1.12", + "is-stream": "1.1.0" + } + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-notifier": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.2.1.tgz", + "integrity": "sha512-MIBs+AAd6dJ2SklbbE8RUDRlIVhU8MaNLh1A9SUZDUHPiZkWLFde6UNwG41yQHZEToHgJMXqyVZ9UcS/ReOVTg==", + "dev": true, + "requires": { + "growly": "1.3.0", + "semver": "5.5.0", + "shellwords": "0.1.1", + "which": "1.3.0" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "2.6.0", + "is-builtin-module": "1.0.0", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.3" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "2.0.1" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "nwmatcher": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz", + "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==", + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + } + } + }, + "object-keys": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", + "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "es-abstract": "1.11.0" + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "1.2.0" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "0.0.8", + "wordwrap": "0.0.3" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + } + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "0.1.3", + "fast-levenshtein": "2.0.6", + "levn": "0.3.0", + "prelude-ls": "1.1.2", + "type-check": "0.3.2", + "wordwrap": "1.0.0" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "output-file-sync": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", + "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "mkdirp": "0.5.1", + "object-assign": "4.1.1" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", + "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", + "dev": true, + "requires": { + "p-try": "1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "1.2.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "2.3.0" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "1.1.2" + } + }, + "pluralize": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", + "dev": true + }, + "pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "dev": true + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "pretty-format": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", + "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", + "dev": true, + "requires": { + "ansi-regex": "3.0.0", + "ansi-styles": "3.2.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + } + } + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "progress": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", + "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", + "dev": true + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "requires": { + "asap": "2.0.6" + } + }, + "prop-types": { + "version": "15.6.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.1.tgz", + "integrity": "sha512-4ec7bY1Y66LymSUOH/zARVYObB23AT2h8cf6e/O6ZALB/N0sqZFEx7rq6EYPX2MkOdKORuooI/H5k9TlR4q7kQ==", + "dev": true, + "requires": { + "fbjs": "0.8.16", + "loose-envify": "1.3.1", + "object-assign": "4.1.1" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "dev": true + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } } } }, - "readable-stream": { - "version": "2.2.9", - "bundled": true, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { - "buffer-shims": "1.0.0", - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "1.0.1", - "util-deprecate": "1.0.2" + "is-buffer": "1.1.6" } - }, - "request": { - "version": "2.81.0", - "bundled": true, + } + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "2.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, - "optional": true, "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.15", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.0.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.0.1" + "locate-path": "2.0.0" } - }, - "rimraf": { - "version": "2.6.1", - "bundled": true, + } + } + }, + "readable-stream": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.5.tgz", + "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "readable-stream": "2.3.5", + "set-immediate-shim": "1.0.1" + } + }, + "realpath-native": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.0.0.tgz", + "integrity": "sha512-XJtlRJ9jf0E1H1SLeJyQ9PGzQD7S65h1pRXEcAeK48doKOnKxcgPeNohJvD5u/2sI9J1oke6E8bZHS/fmW1UiQ==", + "dev": true, + "requires": { + "util.promisify": "1.0.0" + } + }, + "regenerate": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", + "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "private": "0.1.8" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "3.0.2", + "safe-regex": "1.1.0" + } + }, + "regexpp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.0.1.tgz", + "integrity": "sha512-8Ph721maXiOYSLtaDGKVmDn5wdsNaF6Px85qFNeMPQq0r8K5Y10tgP6YuR65Ws35n4DvzFcCxEnRNBIXQunzLw==", + "dev": true + }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "dev": true, + "requires": { + "regenerate": "1.3.3", + "regjsgen": "0.2.0", + "regjsparser": "0.1.5" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + }, + "request": { + "version": "2.85.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz", + "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==", + "dev": true, + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.6", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.3.2", + "har-validator": "5.0.3", + "hawk": "6.0.2", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.18", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.1", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.4", + "tunnel-agent": "0.6.0", + "uuid": "3.2.1" + } + }, + "request-promise-core": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz", + "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", + "dev": true, + "requires": { + "lodash": "4.17.5" + } + }, + "request-promise-native": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz", + "integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=", + "dev": true, + "requires": { + "request-promise-core": "1.1.1", + "stealthy-require": "1.1.1", + "tough-cookie": "2.3.4" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "0.1.0", + "resolve-from": "1.0.1" + } + }, + "resolve": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.6.0.tgz", + "integrity": "sha512-mw7JQNu5ExIkcw4LPih0owX/TZXjD/ZUF/ZQ/pDnkw3ZKhDcZZw5klmBlj6gVMwjQ3Pz5Jgu7F3d0jcDVuEWdw==", + "dev": true, + "requires": { + "path-parse": "1.0.5" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "2.0.1", + "signal-exit": "3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "optional": true, + "requires": { + "align-text": "0.1.4" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "2.1.0" + } + }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "dev": true + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dev": true, + "requires": { + "rx-lite": "4.0.8" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "0.1.15" + } + }, + "sane": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-2.5.0.tgz", + "integrity": "sha512-glfKd7YH4UCrh/7dD+UESsr8ylKWRE7UQPoXuz28FgmcF0ViJQhCTCCZHICRKxf8G8O1KdLEn20dcICK54c7ew==", + "dev": true, + "requires": { + "anymatch": "2.0.0", + "exec-sh": "0.2.1", + "fb-watchman": "2.0.0", + "fsevents": "1.1.3", + "micromatch": "3.1.10", + "minimist": "1.2.0", + "walker": "1.0.7", + "watch": "0.18.0" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { - "glob": "7.1.2" + "micromatch": "3.1.10", + "normalize-path": "2.1.1" } }, - "safe-buffer": { - "version": "5.0.1", - "bundled": true, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", "dev": true }, - "semver": { - "version": "5.3.0", - "bundled": true, - "dev": true, - "optional": true + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, + "braces": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz", + "integrity": "sha512-SO5lYHA3vO6gz66erVvedSCkp7AKWdv6VcQ2N4ysXfPxdAlxAMMAdwegGGcv1Bqwm7naF1hNdk5d6AAIEHV2nQ==", "dev": true, - "optional": true + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "define-property": "1.0.0", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "kind-of": "6.0.2", + "repeat-element": "1.1.2", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, - "optional": true + "requires": { + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } }, - "sntp": { - "version": "1.0.9", - "bundled": true, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "hoek": "2.16.3" + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } } }, - "sshpk": { - "version": "1.13.0", - "bundled": true, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, - "optional": true, "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jodid25519": "1.0.2", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" }, "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, - "optional": true + "requires": { + "is-extendable": "0.1.1" + } } } }, - "string-width": { - "version": "1.0.2", - "bundled": true, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } } }, - "string_decoder": { - "version": "1.0.1", - "bundled": true, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "safe-buffer": "5.0.1" + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } } }, - "stringstream": { - "version": "0.0.5", - "bundled": true, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, - "optional": true + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } }, - "strip-ansi": { + "isobject": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.1", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.9", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" } }, - "strip-json-comments": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true, + "optional": true + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.1.0" + }, + "dependencies": { + "extend-shallow": { "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "2.2.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" + "is-extendable": "0.1.1" } - }, - "tar-pack": { - "version": "3.4.0", - "bundled": true, + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "slice-ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0" + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "0.11.2", + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.1", + "use": "3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, - "optional": true, "requires": { - "debug": "2.6.8", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.2.9", - "rimraf": "2.6.1", - "tar": "2.2.1", - "uid-number": "0.0.6" + "is-descriptor": "0.1.6" } }, - "tough-cookie": { - "version": "2.3.2", - "bundled": true, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, - "optional": true, "requires": { - "punycode": "1.4.1" + "is-extendable": "0.1.1" } }, - "tunnel-agent": { - "version": "0.6.0", - "bundled": true, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, - "optional": true, "requires": { - "safe-buffer": "5.0.1" + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } } }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "dev": true, - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "bundled": true, - "dev": true, - "optional": true - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "uuid": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "verror": { - "version": "1.3.6", - "bundled": true, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, - "optional": true, "requires": { - "extsprintf": "1.0.2" + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } } }, - "wide-align": { - "version": "1.1.2", - "bundled": true, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, - "optional": true, "requires": { - "string-width": "1.0.2" + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" } }, - "wrappy": { - "version": "1.0.2", - "bundled": true, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true } } }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "define-property": "1.0.0", + "isobject": "3.0.1", + "snapdragon-util": "3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } } }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, - "optional": true, "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" + "kind-of": "3.2.2" } }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "sntp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", + "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", "dev": true, "requires": { - "is-glob": "2.0.1" + "hoek": "4.2.1" } }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "source-map-resolve": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", + "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "atob": "2.0.3", + "decode-uri-component": "0.2.0", + "resolve-url": "0.2.1", + "source-map-url": "0.4.0", + "urix": "0.1.0" } }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "dev": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "source-map": "0.5.7" } }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spdx-correct": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", "dev": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "spdx-expression-parse": "3.0.0", + "spdx-license-ids": "3.0.0" } }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", "dev": true }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "dev": true, "requires": { - "loose-envify": "1.3.1" + "spdx-exceptions": "2.1.0", + "spdx-license-ids": "3.0.0" } }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "spdx-license-ids": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, - "optional": true, "requires": { - "binary-extensions": "1.11.0" + "extend-shallow": "3.0.2" } }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-dotfile": { + "sprintf-js": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true, - "optional": true + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "sshpk": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", + "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", "dev": true, - "optional": true, "requires": { - "is-primitive": "2.0.0" + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" } }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha1-1PM6tU6OOHeLDKXP07OvsS22hiA=", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, - "optional": true + "requires": { + "define-property": "0.2.5", + "object-copy": "0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", "dev": true }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "string-length": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", + "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "astral-regex": "1.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } } }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } } }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "dev": true, - "optional": true, "requires": { - "kind-of": "3.2.2" + "safe-buffer": "5.1.1" } }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true, - "optional": true + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "dev": true }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, - "optional": true + "requires": { + "ansi-regex": "2.1.1" + } }, - "isarray": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-eof": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "symbol-tree": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", + "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", + "dev": true + }, + "table": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", + "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", "dev": true, - "optional": true, "requires": { - "isarray": "1.0.0" + "ajv": "5.5.2", + "ajv-keywords": "2.1.1", + "chalk": "2.3.2", + "lodash": "4.17.5", + "slice-ansi": "1.0.0", + "string-width": "2.1.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.3.0" + } + }, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "test-exclude": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.1.tgz", + "integrity": "sha512-qpqlP/8Zl+sosLxBcVKl9vYy26T9NPalxSzzCP/OY6K7j938ui2oKgo+kRZYfxAeIpLqpbVnsHq1tyV70E4lWQ==", + "dev": true, + "requires": { + "arrify": "1.0.1", + "micromatch": "3.1.10", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "require-main-filename": "1.0.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz", + "integrity": "sha512-SO5lYHA3vO6gz66erVvedSCkp7AKWdv6VcQ2N4ysXfPxdAlxAMMAdwegGGcv1Bqwm7naF1hNdk5d6AAIEHV2nQ==", + "dev": true, + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "define-property": "1.0.0", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "kind-of": "6.0.2", + "repeat-element": "1.1.2", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.1", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.9", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + } } }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "throat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", + "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", "dev": true }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "requires": { - "is-buffer": "1.1.6" + "os-tmpdir": "1.0.2" } }, - "lodash": { - "version": "4.17.5", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", - "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", "dev": true }, - "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dev": true, "requires": { - "js-tokens": "3.0.2" + "kind-of": "3.2.2" } }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "dev": true, - "optional": true, "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "regex-not": "1.0.2", + "safe-regex": "1.1.0" } }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "requires": { - "brace-expansion": "1.1.11" + "is-number": "3.0.0", + "repeat-string": "1.6.1" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + } } }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "dev": true, "requires": { - "minimist": "0.0.8" + "punycode": "1.4.1" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "nan": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", - "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", - "dev": true, - "optional": true - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", "dev": true, "requires": { - "remove-trailing-separator": "1.1.0" + "punycode": "2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", + "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=", + "dev": true + } } }, - "number-is-nan": { + "trim-right": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", "dev": true }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, - "optional": true, "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" + "safe-buffer": "5.1.1" } }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, "requires": { - "wrappy": "1.0.2" + "prelude-ls": "1.1.2" } }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "ua-parser-js": { + "version": "0.7.17", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz", + "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g==", "dev": true }, - "output-file-sync": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", - "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "mkdirp": "0.5.1", - "object-assign": "4.1.1" - } - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", "dev": true, "optional": true, "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "optional": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } } }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", "dev": true, "optional": true }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", "dev": true, - "optional": true + "requires": { + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "to-object-path": "0.3.0" + } + } + } }, - "randomatic": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dev": true, - "optional": true, "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" + "has-value": "0.3.1", + "isobject": "3.0.1" }, "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "dev": true, - "optional": true, "requires": { - "kind-of": "3.2.2" + "get-value": "2.0.6", + "has-values": "0.1.4", + "isobject": "2.1.0" }, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", "dev": true, - "optional": true, "requires": { - "is-buffer": "1.1.6" + "isarray": "1.0.0" } } } }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "1.1.6" - } + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true } } }, - "readable-stream": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.5.tgz", - "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==", + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "use": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", + "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", "dev": true, - "optional": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "kind-of": "6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } } }, - "readdirp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", - "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "user-home": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", "dev": true, - "optional": true, "requires": { - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "readable-stream": "2.3.5", - "set-immediate-shim": "1.0.1" + "define-properties": "1.1.2", + "object.getownpropertydescriptors": "2.0.3" } }, - "regenerate": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", - "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", "dev": true }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true + "v8flags": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", + "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", + "dev": true, + "requires": { + "user-home": "1.1.1" + } }, - "regenerator-transform": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "validate-npm-package-license": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", + "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "private": "0.1.8" + "spdx-correct": "3.0.0", + "spdx-expression-parse": "3.0.0" } }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "dev": true, - "optional": true, "requires": { - "is-equal-shallow": "0.1.3" + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" } }, - "regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "w3c-hr-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", + "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", "dev": true, "requires": { - "regenerate": "1.3.3", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" + "browser-process-hrtime": "0.1.2" } }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.11" + } }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "watch": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz", + "integrity": "sha1-KAlUdsbffJDJYxOJkMClQj60uYY=", "dev": true, "requires": { - "jsesc": "0.5.0" + "exec-sh": "0.2.1", + "minimist": "1.2.0" }, "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } } }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", "dev": true }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "whatwg-encoding": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz", + "integrity": "sha512-jLBwwKUhi8WtBfsMQlL4bUUcT8sMkAtQinscJAe/M4KHCkHuUJAF6vuB0tueNIw4c8ziO6AkRmgY+jL3a0iiPw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.19" + } + }, + "whatwg-fetch": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", + "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=", "dev": true }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "whatwg-url": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.0.tgz", + "integrity": "sha512-Z0CVh/YE217Foyb488eo+iBv+r7eAQ0wSTyApi9n06jhcA3z6Nidg/EGvl0UFkg7kMdKxfBzzr+o9JF+cevgMg==", "dev": true, - "optional": true + "requires": { + "lodash.sortby": "4.7.0", + "tr46": "1.0.1", + "webidl-conversions": "4.0.2" + } }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", "dev": true, "requires": { - "is-finite": "1.0.2" + "isexe": "2.0.0" } }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true - }, - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", "dev": true, "optional": true }, - "slash": { + "wordwrap": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", "dev": true, "requires": { - "source-map": "0.5.7" + "mkdirp": "0.5.1" } }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "write-file-atomic": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", "dev": true, - "optional": true, "requires": { - "safe-buffer": "5.1.1" + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "signal-exit": "3.0.2" } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "ws": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-4.1.0.tgz", + "integrity": "sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "async-limiter": "1.0.0", + "safe-buffer": "5.1.1" } }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", "dev": true }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", "dev": true }, - "user-home": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", "dev": true }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "yargs": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", + "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", "dev": true, - "optional": true + "requires": { + "cliui": "4.0.0", + "decamelize": "1.2.0", + "find-up": "2.1.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "8.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "cliui": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.0.0.tgz", + "integrity": "sha512-nY3W5Gu2racvdDk//ELReY+dHjb9PlIcVDFXP72nVIhq2Gy3LuVXYwJoPVudwQnv1shtohpgkdCKT2YaKY0CKw==", + "dev": true, + "requires": { + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "wrap-ansi": "2.1.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } }, - "v8flags": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", - "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", + "yargs-parser": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", + "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", "dev": true, "requires": { - "user-home": "1.1.1" + "camelcase": "4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true } } } diff --git a/package.json b/package.json index 9c77d9b65..763b48091 100644 --- a/package.json +++ b/package.json @@ -4,8 +4,8 @@ "description": "Data structures on JavaScript", "main": "index.js", "scripts": { - "build": "babel src -d build", - "babel-node": "babel-node" + "lint": "eslint ./src/*", + "test": "jest" }, "repository": { "type": "git", @@ -19,7 +19,15 @@ }, "homepage": "https://github.com/trekhleb/data-structures#readme", "devDependencies": { + "@types/jest": "^22.2.2", "babel-cli": "^6.26.0", - "babel-preset-env": "^1.6.1" + "babel-preset-env": "^1.6.1", + "eslint": "^4.19.1", + "eslint-config-airbnb": "^16.1.0", + "eslint-plugin-import": "^2.9.0", + "eslint-plugin-jest": "^21.15.0", + "eslint-plugin-jsx-a11y": "^6.0.3", + "eslint-plugin-react": "^7.7.0", + "jest": "^22.4.3" } } diff --git a/src/data_structures/linked_list/LinkedList.js b/src/data-structures/linked-list/LinkedList.js similarity index 50% rename from src/data_structures/linked_list/LinkedList.js rename to src/data-structures/linked-list/LinkedList.js index 2834c6ae6..3d2ccb463 100644 --- a/src/data_structures/linked_list/LinkedList.js +++ b/src/data-structures/linked-list/LinkedList.js @@ -1,6 +1,6 @@ -import { Node } from './Node'; +import Node from './Node'; -export class LinkedList { +export default class LinkedList { constructor() { this.head = null; } @@ -17,12 +17,12 @@ export class LinkedList { // Rewind to last node. let currentNode = this.head; - while (currentNode.nextNode !== null) { - currentNode = currentNode.nextNode; + while (currentNode.next !== null) { + currentNode = currentNode.next; } // Attach new node to the end of linked list. - currentNode.nextNode = newNode; + currentNode.next = newNode; return newNode; } @@ -31,21 +31,19 @@ export class LinkedList { this.head = new Node(value, this.head); } - deleteWithValue(value) { - - } - - render() { + toArray() { + const listArray = []; let currentNode = this.head; - let index = 0; - while(currentNode.nextNode !== null) { - console.log(`Node #${index} data: ${currentNode.value}`); - currentNode = currentNode.nextNode; - index++; + while (currentNode) { + listArray.push(currentNode.value); + currentNode = currentNode.next; } - // Print the tail. - console.log(`Node #${index} data: ${currentNode.value}`); + return listArray; + } + + toString() { + return this.toArray().toString(); } } diff --git a/src/data-structures/linked-list/Node.js b/src/data-structures/linked-list/Node.js new file mode 100644 index 000000000..4556a9436 --- /dev/null +++ b/src/data-structures/linked-list/Node.js @@ -0,0 +1,6 @@ +export default class Node { + constructor(value, next = null) { + this.value = value; + this.next = next; + } +} diff --git a/src/data-structures/linked-list/__test__/LinkedList.test.js b/src/data-structures/linked-list/__test__/LinkedList.test.js new file mode 100644 index 000000000..37a1ce4cf --- /dev/null +++ b/src/data-structures/linked-list/__test__/LinkedList.test.js @@ -0,0 +1,23 @@ +import LinkedList from '../LinkedList'; + +describe('LinkedList', () => { + it('should create empty linked list', () => { + const linkedList = new LinkedList(); + expect(linkedList).toBeDefined(); + }); + + it('should append node to linked list', () => { + const linkedList = new LinkedList(); + linkedList.append(1); + linkedList.append(2); + expect(linkedList.toString()).toBe('1,2'); + }); + + it('should prepend node to linked list', () => { + const linkedList = new LinkedList(); + linkedList.append(1); + linkedList.append(2); + linkedList.prepend(3); + expect(linkedList.toString()).toBe('3,1,2'); + }); +}); diff --git a/src/data-structures/linked-list/__test__/Node.test.js b/src/data-structures/linked-list/__test__/Node.test.js new file mode 100644 index 000000000..94f333e92 --- /dev/null +++ b/src/data-structures/linked-list/__test__/Node.test.js @@ -0,0 +1,9 @@ +import Node from '../Node'; + +describe('Node', () => { + it('should create list node with value', () => { + const node = new Node(1); + expect(node.value).toBe(1); + expect(node.next).toBeNull(); + }); +}); diff --git a/src/data_structures/linked_list/Node.js b/src/data_structures/linked_list/Node.js deleted file mode 100644 index ffcbeaf80..000000000 --- a/src/data_structures/linked_list/Node.js +++ /dev/null @@ -1,6 +0,0 @@ -export class Node { - constructor(value, nextNode = null) { - this.value = value; - this.nextNode = nextNode; - } -} diff --git a/src/data_structures/linked_list/index.js b/src/data_structures/linked_list/index.js deleted file mode 100644 index bc8558c01..000000000 --- a/src/data_structures/linked_list/index.js +++ /dev/null @@ -1,11 +0,0 @@ -import { LinkedList } from "./LinkedList"; - -const linkedList = new LinkedList(); - -linkedList.append(1); -linkedList.append(2); -linkedList.append(3); -linkedList.prepend(4); -linkedList.prepend(5); - -linkedList.render(); From df46c770ec15360d2302af40c109b17cf977a90d Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Tue, 27 Mar 2018 14:43:15 +0300 Subject: [PATCH 006/327] Update README. --- README.md | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 033b2daa7..4ea678ad6 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,18 @@ -# Data Structures +# JavaScript Algorithms and Data Structures +### Running Tests + +**Run all tests** +``` +npm test +``` + +**Run tests by name** +``` +npm test -- -t 'LinkedList' +``` + +**Run tests from specific file** ``` -npm run babel-node --silent ./src/linked_list +npm test -- ./src/data-structures/linked-list/__test__/LinkedList.test.js ``` From 702fe2d126fa253f3d378b69cc203ab6841562a0 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Tue, 27 Mar 2018 15:12:44 +0300 Subject: [PATCH 007/327] Add LinkedList. --- src/data-structures/linked-list/LinkedList.js | 28 +++++++++++++ .../linked-list/__test__/LinkedList.test.js | 40 ++++++++++++++++--- 2 files changed, 63 insertions(+), 5 deletions(-) diff --git a/src/data-structures/linked-list/LinkedList.js b/src/data-structures/linked-list/LinkedList.js index 3d2ccb463..2622fdfa6 100644 --- a/src/data-structures/linked-list/LinkedList.js +++ b/src/data-structures/linked-list/LinkedList.js @@ -28,7 +28,35 @@ export default class LinkedList { } prepend(value) { + const newNode = new Node(value); this.head = new Node(value, this.head); + + return newNode; + } + + delete(value) { + if (!this.head) { + return null; + } + + let deletedNode = null; + + if (this.head.value === value) { + deletedNode = this.head; + this.head = this.head.next; + } + + let currentNode = this.head; + + while (currentNode.next) { + if (currentNode.next.value === value) { + deletedNode = currentNode.next; + currentNode.next = currentNode.next.next; + } + currentNode = currentNode.next; + } + + return deletedNode; } toArray() { diff --git a/src/data-structures/linked-list/__test__/LinkedList.test.js b/src/data-structures/linked-list/__test__/LinkedList.test.js index 37a1ce4cf..0731ca5f1 100644 --- a/src/data-structures/linked-list/__test__/LinkedList.test.js +++ b/src/data-structures/linked-list/__test__/LinkedList.test.js @@ -3,21 +3,51 @@ import LinkedList from '../LinkedList'; describe('LinkedList', () => { it('should create empty linked list', () => { const linkedList = new LinkedList(); - expect(linkedList).toBeDefined(); + expect(linkedList.toString()).toBe(''); }); it('should append node to linked list', () => { const linkedList = new LinkedList(); - linkedList.append(1); - linkedList.append(2); + + const node1 = linkedList.append(1); + const node2 = linkedList.append(2); + + expect(node1.value).toBe(1); + expect(node2.value).toBe(2); + expect(linkedList.toString()).toBe('1,2'); }); it('should prepend node to linked list', () => { const linkedList = new LinkedList(); + + const node1 = linkedList.append(1); + const node2 = linkedList.prepend(2); + + expect(node1.value).toBe(1); + expect(node2.value).toBe(2); + + expect(linkedList.toString()).toBe('2,1'); + }); + + it('should delete node by value from linked list', () => { + const linkedList = new LinkedList(); + linkedList.append(1); linkedList.append(2); - linkedList.prepend(3); - expect(linkedList.toString()).toBe('3,1,2'); + linkedList.append(3); + linkedList.append(3); + linkedList.append(4); + linkedList.append(5); + + const deletedNode = linkedList.delete(3); + expect(deletedNode.value).toBe(3); + expect(linkedList.toString()).toBe('1,2,3,4,5'); + + linkedList.delete(3); + expect(linkedList.toString()).toBe('1,2,4,5'); + + linkedList.delete(1); + expect(linkedList.toString()).toBe('2,4,5'); }); }); From f2c00df33349857a33ec4c978c86f938d4f7d389 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Tue, 27 Mar 2018 15:14:57 +0300 Subject: [PATCH 008/327] Add LinkedList. --- README.md | 4 ++++ src/data-structures/linked-list/README.md | 2 ++ 2 files changed, 6 insertions(+) create mode 100644 src/data-structures/linked-list/README.md diff --git a/README.md b/README.md index 4ea678ad6..434c28cde 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,9 @@ # JavaScript Algorithms and Data Structures +## Data Structures + +- [Linked List](Linked List) + ### Running Tests **Run all tests** diff --git a/src/data-structures/linked-list/README.md b/src/data-structures/linked-list/README.md new file mode 100644 index 000000000..b80bcc9ef --- /dev/null +++ b/src/data-structures/linked-list/README.md @@ -0,0 +1,2 @@ +# Linked List + From aa802694019facbba7b72362d9ec8023d7670ddd Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Tue, 27 Mar 2018 15:15:41 +0300 Subject: [PATCH 009/327] Add LinkedList. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 434c28cde..85675ad02 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ## Data Structures -- [Linked List](Linked List) +- [Linked List](/tree/master/src/data-structures/linked-list) ### Running Tests From e5300cf8d41c6c58eeddc0867ba7d9abc93fa5f3 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Tue, 27 Mar 2018 15:16:16 +0300 Subject: [PATCH 010/327] Add LinkedList. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 85675ad02..83c63cdee 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ## Data Structures -- [Linked List](/tree/master/src/data-structures/linked-list) +- [Linked List](tree/master/src/data-structures/linked-list) ### Running Tests From eb7f364a2f162541e8cc7ed4797f588c2152741c Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Tue, 27 Mar 2018 15:18:04 +0300 Subject: [PATCH 011/327] Add LinkedList. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 83c63cdee..1bfbd70a5 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ## Data Structures -- [Linked List](tree/master/src/data-structures/linked-list) +- [Linked List](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/linked-list) ### Running Tests From 678305def4d937db49137cc5026025dc03dcb691 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Tue, 27 Mar 2018 15:18:28 +0300 Subject: [PATCH 012/327] Add LinkedList. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1bfbd70a5..b310af6b7 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ - [Linked List](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/linked-list) -### Running Tests +## Running Tests **Run all tests** ``` From add9826dc7b7cd4723c4f0d966521cbb417d27da Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Tue, 27 Mar 2018 15:20:46 +0300 Subject: [PATCH 013/327] Add LinkedList. --- src/data-structures/linked-list/LinkedList.js | 8 ++++---- .../linked-list/{Node.js => LinkedListNode.js} | 2 +- .../__test__/{Node.test.js => LinkedListNode.test.js} | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) rename src/data-structures/linked-list/{Node.js => LinkedListNode.js} (69%) rename src/data-structures/linked-list/__test__/{Node.test.js => LinkedListNode.test.js} (50%) diff --git a/src/data-structures/linked-list/LinkedList.js b/src/data-structures/linked-list/LinkedList.js index 2622fdfa6..8ec15358e 100644 --- a/src/data-structures/linked-list/LinkedList.js +++ b/src/data-structures/linked-list/LinkedList.js @@ -1,4 +1,4 @@ -import Node from './Node'; +import LinkedListNode from './LinkedListNode'; export default class LinkedList { constructor() { @@ -6,7 +6,7 @@ export default class LinkedList { } append(value) { - const newNode = new Node(value); + const newNode = new LinkedListNode(value); // If there is no head yet let's make new node a head. if (!this.head) { @@ -28,8 +28,8 @@ export default class LinkedList { } prepend(value) { - const newNode = new Node(value); - this.head = new Node(value, this.head); + const newNode = new LinkedListNode(value, this.head); + this.head = newNode; return newNode; } diff --git a/src/data-structures/linked-list/Node.js b/src/data-structures/linked-list/LinkedListNode.js similarity index 69% rename from src/data-structures/linked-list/Node.js rename to src/data-structures/linked-list/LinkedListNode.js index 4556a9436..f45ef1acb 100644 --- a/src/data-structures/linked-list/Node.js +++ b/src/data-structures/linked-list/LinkedListNode.js @@ -1,4 +1,4 @@ -export default class Node { +export default class LinkedListNode { constructor(value, next = null) { this.value = value; this.next = next; diff --git a/src/data-structures/linked-list/__test__/Node.test.js b/src/data-structures/linked-list/__test__/LinkedListNode.test.js similarity index 50% rename from src/data-structures/linked-list/__test__/Node.test.js rename to src/data-structures/linked-list/__test__/LinkedListNode.test.js index 94f333e92..db5b4d7ac 100644 --- a/src/data-structures/linked-list/__test__/Node.test.js +++ b/src/data-structures/linked-list/__test__/LinkedListNode.test.js @@ -1,8 +1,8 @@ -import Node from '../Node'; +import LinkedListNode from '../LinkedListNode'; -describe('Node', () => { +describe('LinkedListNode', () => { it('should create list node with value', () => { - const node = new Node(1); + const node = new LinkedListNode(1); expect(node.value).toBe(1); expect(node.next).toBeNull(); }); From ba6d6b75a2bf747c42c2b0e2a404e83f3be60dd7 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Tue, 27 Mar 2018 15:41:26 +0300 Subject: [PATCH 014/327] Add LinkedList. --- src/data-structures/linked-list/README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/data-structures/linked-list/README.md b/src/data-structures/linked-list/README.md index b80bcc9ef..2b3ab50c7 100644 --- a/src/data-structures/linked-list/README.md +++ b/src/data-structures/linked-list/README.md @@ -1,2 +1,8 @@ # Linked List +|Operation |Complaxity | +|---------------------------|-------------------| +|Indexing |O(n) | +|Insert/delete at beginning |O(1) | +|Insert/delete in middle |O(1) + search time | +|Insert/delete at end |O(1) + search time | From c2e5b8812d65f079e5d3d39d4f45d9c2450801ed Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Tue, 27 Mar 2018 15:41:50 +0300 Subject: [PATCH 015/327] Add LinkedList. --- src/data-structures/linked-list/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data-structures/linked-list/README.md b/src/data-structures/linked-list/README.md index 2b3ab50c7..9b541d178 100644 --- a/src/data-structures/linked-list/README.md +++ b/src/data-structures/linked-list/README.md @@ -1,6 +1,6 @@ # Linked List -|Operation |Complaxity | +|Operation |Complexity | |---------------------------|-------------------| |Indexing |O(n) | |Insert/delete at beginning |O(1) | From c978ec7280727a60a4ee613b9f66fc82696cd67c Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Wed, 28 Mar 2018 09:29:47 +0300 Subject: [PATCH 016/327] Add HashTable. --- README.md | 1 + src/data-structures/hash-table/HashTable.js | 36 ++++++++ src/data-structures/hash-table/README.md | 9 ++ .../hash-table/__test__/HashTable.test.js | 49 ++++++++++ src/data-structures/linked-list/LinkedList.js | 90 +++++++++++++++++-- .../linked-list/LinkedListNode.js | 13 ++- src/data-structures/linked-list/README.md | 2 +- .../linked-list/__test__/LinkedList.test.js | 61 ++++++++++--- .../__test__/LinkedListNode.test.js | 13 ++- 9 files changed, 250 insertions(+), 24 deletions(-) create mode 100644 src/data-structures/hash-table/HashTable.js create mode 100644 src/data-structures/hash-table/README.md create mode 100644 src/data-structures/hash-table/__test__/HashTable.test.js diff --git a/README.md b/README.md index b310af6b7..9ad517016 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ ## Data Structures - [Linked List](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/linked-list) +- [Hash Table](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/hash-table) ## Running Tests diff --git a/src/data-structures/hash-table/HashTable.js b/src/data-structures/hash-table/HashTable.js new file mode 100644 index 000000000..f8fec1cdc --- /dev/null +++ b/src/data-structures/hash-table/HashTable.js @@ -0,0 +1,36 @@ +import LinkedList from '../linked-list/LinkedList'; + +const defaultHashTableSize = 32; + +export default class HashTable { + constructor(hashTableSize = defaultHashTableSize) { + // Create hash table of certain size and fill each bucket with empty linked list. + this.buckets = Array(hashTableSize).fill(null).map(() => new LinkedList()); + } + + // Converts key string to hash number. + hash(key) { + const hash = Array.from(key).reduce( + (hashAccumulator, keySymbol) => (hashAccumulator + keySymbol.charCodeAt(0)), + 0, + ); + + // Reduce hash number so it would fit hash table size. + return hash % this.buckets.length; + } + + insert(key, value) { + const bucketLinkedList = this.buckets[this.hash(key)]; + bucketLinkedList.appendUnique({ key, value }); + } + + delete(key) { + const bucketLinkedList = this.buckets[this.hash(key)]; + return bucketLinkedList.deleteByKey(key); + } + + get(key) { + const bucketLinkedList = this.buckets[this.hash(key)]; + return bucketLinkedList.findByKey(key); + } +} diff --git a/src/data-structures/hash-table/README.md b/src/data-structures/hash-table/README.md new file mode 100644 index 000000000..16837c3c7 --- /dev/null +++ b/src/data-structures/hash-table/README.md @@ -0,0 +1,9 @@ +# Hashed Table + +|Operation |Complexity | +|---------------------------|-------------------| +|Find |O(1)* | +|Insert |O(1)* | +|Delete |O(1)* | + +* - assuming that we have "good" hash function and big enough hash table size so that collisions are rare. diff --git a/src/data-structures/hash-table/__test__/HashTable.test.js b/src/data-structures/hash-table/__test__/HashTable.test.js new file mode 100644 index 000000000..71e18cb82 --- /dev/null +++ b/src/data-structures/hash-table/__test__/HashTable.test.js @@ -0,0 +1,49 @@ +import HashTable from '../HashTable'; + +describe('HashTable', () => { + it('should create hash table of certain size', () => { + const defaultHashTable = new HashTable(); + expect(defaultHashTable.buckets.length).toBe(32); + + const biggerHashTable = new HashTable(64); + expect(biggerHashTable.buckets.length).toBe(64); + }); + + it('should generate proper hash for specified keys', () => { + const hashTable = new HashTable(); + + expect(hashTable.hash('a')).toBe(1); + expect(hashTable.hash('b')).toBe(2); + expect(hashTable.hash('abc')).toBe(6); + }); + + it('should insert, read and delete data with collisions', () => { + const hashTable = new HashTable(3); + + expect(hashTable.hash('a')).toBe(1); + expect(hashTable.hash('b')).toBe(2); + expect(hashTable.hash('c')).toBe(0); + expect(hashTable.hash('d')).toBe(1); + + hashTable.insert('a', 'sky-old'); + hashTable.insert('a', 'sky'); + hashTable.insert('b', 'sea'); + hashTable.insert('c', 'earth'); + hashTable.insert('d', 'ocean'); + + expect(hashTable.buckets[0].toString()).toBe('c:earth'); + expect(hashTable.buckets[1].toString()).toBe('a:sky,d:ocean'); + expect(hashTable.buckets[2].toString()).toBe('b:sea'); + + expect(hashTable.get('a').value).toBe('sky'); + expect(hashTable.get('d').value).toBe('ocean'); + + hashTable.delete('a'); + + expect(hashTable.get('a')).toBeNull(); + expect(hashTable.get('d').value).toBe('ocean'); + + hashTable.insert('d', 'ocean-new'); + expect(hashTable.get('d').value).toBe('ocean-new'); + }); +}); diff --git a/src/data-structures/linked-list/LinkedList.js b/src/data-structures/linked-list/LinkedList.js index 8ec15358e..829373015 100644 --- a/src/data-structures/linked-list/LinkedList.js +++ b/src/data-structures/linked-list/LinkedList.js @@ -5,8 +5,8 @@ export default class LinkedList { this.head = null; } - append(value) { - const newNode = new LinkedListNode(value); + append({ value, key = null }) { + const newNode = new LinkedListNode({ value, key }); // If there is no head yet let's make new node a head. if (!this.head) { @@ -27,20 +27,57 @@ export default class LinkedList { return newNode; } - prepend(value) { - const newNode = new LinkedListNode(value, this.head); + prepend({ value, key = null }) { + const newNode = new LinkedListNode({ value, key, next: this.head }); + + // Make new node to be a head. this.head = newNode; return newNode; } - delete(value) { + appendUnique({ value, key = null }) { + const newNode = new LinkedListNode({ value, key }); + + // If there is no head yet let's make new node a head. + if (!this.head) { + this.head = newNode; + + return newNode; + } + + // Rewind to last node. + let currentNode = this.head; + while (currentNode.next !== null) { + // If there is a node with specified key exists then update it instead of adding new one. + if (key && currentNode.key === key) { + currentNode.value = value; + return currentNode; + } + + currentNode = currentNode.next; + } + + // If there is a node with specified key exists then update it instead of adding new one. + if (key && currentNode.key === key) { + currentNode.value = value; + return currentNode; + } + + // Attach new node to the end of linked list. + currentNode.next = newNode; + + return newNode; + } + + deleteByValue(value) { if (!this.head) { return null; } let deletedNode = null; + // If the head must be deleted then make 2nd node to be a head. if (this.head.value === value) { deletedNode = this.head; this.head = this.head.next; @@ -48,6 +85,7 @@ export default class LinkedList { let currentNode = this.head; + // If next node must be deleted then make next node to be a next next one. while (currentNode.next) { if (currentNode.next.value === value) { deletedNode = currentNode.next; @@ -59,12 +97,52 @@ export default class LinkedList { return deletedNode; } + deleteByKey(key) { + if (!this.head) { + return null; + } + + let deletedNode = null; + + // If the head must be deleted then make 2nd node to be a head. + if (this.head.key === key) { + deletedNode = this.head; + this.head = this.head.next; + } + + let currentNode = this.head; + + // If next node must be deleted then make next node to be a next next one. + while (currentNode.next) { + if (currentNode.next.key === key) { + deletedNode = currentNode.next; + currentNode.next = currentNode.next.next; + } + currentNode = currentNode.next; + } + + return deletedNode; + } + + findByKey(key) { + let currentNode = this.head; + + while (currentNode) { + if (currentNode.key === key) { + return currentNode; + } + currentNode = currentNode.next; + } + + return null; + } + toArray() { const listArray = []; let currentNode = this.head; while (currentNode) { - listArray.push(currentNode.value); + listArray.push(currentNode.toString()); currentNode = currentNode.next; } diff --git a/src/data-structures/linked-list/LinkedListNode.js b/src/data-structures/linked-list/LinkedListNode.js index f45ef1acb..58d900db9 100644 --- a/src/data-structures/linked-list/LinkedListNode.js +++ b/src/data-structures/linked-list/LinkedListNode.js @@ -1,6 +1,17 @@ export default class LinkedListNode { - constructor(value, next = null) { + constructor({ value, next = null, key = null }) { this.value = value; this.next = next; + + // Key is added to make this linked list nodes to be reusable in hash tables. + this.key = key; + } + + toString() { + if (this.key) { + return `${this.key}:${this.value}`; + } + + return `${this.value}`; } } diff --git a/src/data-structures/linked-list/README.md b/src/data-structures/linked-list/README.md index 9b541d178..c7e662f73 100644 --- a/src/data-structures/linked-list/README.md +++ b/src/data-structures/linked-list/README.md @@ -2,7 +2,7 @@ |Operation |Complexity | |---------------------------|-------------------| -|Indexing |O(n) | +|Find |O(n) | |Insert/delete at beginning |O(1) | |Insert/delete in middle |O(1) + search time | |Insert/delete at end |O(1) + search time | diff --git a/src/data-structures/linked-list/__test__/LinkedList.test.js b/src/data-structures/linked-list/__test__/LinkedList.test.js index 0731ca5f1..ff6ddefba 100644 --- a/src/data-structures/linked-list/__test__/LinkedList.test.js +++ b/src/data-structures/linked-list/__test__/LinkedList.test.js @@ -9,20 +9,21 @@ describe('LinkedList', () => { it('should append node to linked list', () => { const linkedList = new LinkedList(); - const node1 = linkedList.append(1); - const node2 = linkedList.append(2); + const node1 = linkedList.append({ value: 1 }); + const node2 = linkedList.append({ value: 2, key: 'test' }); expect(node1.value).toBe(1); expect(node2.value).toBe(2); + expect(node2.key).toBe('test'); - expect(linkedList.toString()).toBe('1,2'); + expect(linkedList.toString()).toBe('1,test:2'); }); it('should prepend node to linked list', () => { const linkedList = new LinkedList(); - const node1 = linkedList.append(1); - const node2 = linkedList.prepend(2); + const node1 = linkedList.append({ value: 1 }); + const node2 = linkedList.prepend({ value: 2 }); expect(node1.value).toBe(1); expect(node2.value).toBe(2); @@ -33,21 +34,53 @@ describe('LinkedList', () => { it('should delete node by value from linked list', () => { const linkedList = new LinkedList(); - linkedList.append(1); - linkedList.append(2); - linkedList.append(3); - linkedList.append(3); - linkedList.append(4); - linkedList.append(5); + linkedList.append({ value: 1 }); + linkedList.append({ value: 2 }); + linkedList.append({ value: 3 }); + linkedList.append({ value: 3 }); + linkedList.append({ value: 4 }); + linkedList.append({ value: 5 }); - const deletedNode = linkedList.delete(3); + const deletedNode = linkedList.deleteByValue(3); expect(deletedNode.value).toBe(3); expect(linkedList.toString()).toBe('1,2,3,4,5'); - linkedList.delete(3); + linkedList.deleteByValue(3); expect(linkedList.toString()).toBe('1,2,4,5'); - linkedList.delete(1); + linkedList.deleteByValue(1); expect(linkedList.toString()).toBe('2,4,5'); }); + + it('should delete node by key from linked list', () => { + const linkedList = new LinkedList(); + + linkedList.append({ value: 1, key: 'test1' }); + linkedList.append({ value: 2, key: 'test2' }); + linkedList.append({ value: 3, key: 'test3' }); + + const deletedNode = linkedList.deleteByKey('test2'); + expect(deletedNode.key).toBe('test2'); + expect(linkedList.toString()).toBe('test1:1,test3:3'); + }); + + it('should append unique nodes', () => { + const linkedList = new LinkedList(); + + linkedList.appendUnique({ value: 1, key: 'test1' }); + linkedList.appendUnique({ value: 2, key: 'test2' }); + linkedList.appendUnique({ value: 3, key: 'test2' }); + + expect(linkedList.toString()).toBe('test1:1,test2:3'); + }); + + it('should find node by its key', () => { + const linkedList = new LinkedList(); + + linkedList.appendUnique({ value: 1, key: 'test1' }); + linkedList.appendUnique({ value: 2, key: 'test2' }); + linkedList.appendUnique({ value: 3, key: 'test3' }); + + expect(linkedList.findByKey('test3').toString()).toBe('test3:3'); + }); }); diff --git a/src/data-structures/linked-list/__test__/LinkedListNode.test.js b/src/data-structures/linked-list/__test__/LinkedListNode.test.js index db5b4d7ac..19bf3c9b2 100644 --- a/src/data-structures/linked-list/__test__/LinkedListNode.test.js +++ b/src/data-structures/linked-list/__test__/LinkedListNode.test.js @@ -1,9 +1,18 @@ import LinkedListNode from '../LinkedListNode'; describe('LinkedListNode', () => { - it('should create list node with value', () => { - const node = new LinkedListNode(1); + it('should create list node with kay and value', () => { + const node = new LinkedListNode({ value: 1, key: 'test' }); expect(node.value).toBe(1); + expect(node.key).toBe('test'); expect(node.next).toBeNull(); }); + + it('should convert node to string', () => { + const node = new LinkedListNode({ value: 1 }); + const nodeWithKey = new LinkedListNode({ value: 1, key: 'test' }); + + expect(node.toString()).toBe('1'); + expect(nodeWithKey.toString()).toBe('test:1'); + }); }); From 247ea734a829f0112beddddd9f2ad555ff879eff Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Wed, 28 Mar 2018 09:30:30 +0300 Subject: [PATCH 017/327] Add HashTable. --- src/data-structures/hash-table/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data-structures/hash-table/README.md b/src/data-structures/hash-table/README.md index 16837c3c7..6b5ba3e92 100644 --- a/src/data-structures/hash-table/README.md +++ b/src/data-structures/hash-table/README.md @@ -6,4 +6,4 @@ |Insert |O(1)* | |Delete |O(1)* | -* - assuming that we have "good" hash function and big enough hash table size so that collisions are rare. +* assuming that we have "good" hash function and big enough hash table size so that collisions are rare. From 491c9b8ff2fcf108d57fb721b1ae7a39bf945ab5 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Wed, 28 Mar 2018 09:36:06 +0300 Subject: [PATCH 018/327] Add Travis support. --- .travis.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 000000000..587bd3e03 --- /dev/null +++ b/.travis.yml @@ -0,0 +1 @@ +language: node_js From 4d3f15a858eebe6f1c7e398116d2cfaf541eb972 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Wed, 28 Mar 2018 09:41:20 +0300 Subject: [PATCH 019/327] Add Travis support. --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 9ad517016..fc183a09b 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # JavaScript Algorithms and Data Structures +[![Build Status](https://travis-ci.org/trekhleb/javascript-algorithms.svg?branch=master)](https://travis-ci.org/trekhleb/javascript-algorithms) + ## Data Structures - [Linked List](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/linked-list) From 1d3d7756b4001c943a9290867ccf9c4cfce2642e Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Wed, 28 Mar 2018 09:42:02 +0300 Subject: [PATCH 020/327] Add Travis support. --- README.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/README.md b/README.md index fc183a09b..f6ac548f7 100644 --- a/README.md +++ b/README.md @@ -18,8 +18,3 @@ npm test ``` npm test -- -t 'LinkedList' ``` - -**Run tests from specific file** -``` -npm test -- ./src/data-structures/linked-list/__test__/LinkedList.test.js -``` From 1fca7f0b7cc56400b8b8bc0511f0fc38ab524193 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Wed, 28 Mar 2018 15:53:12 +0300 Subject: [PATCH 021/327] Add Queue. --- README.md | 1 + package-lock.json | 3855 +++++++++++++++++ package.json | 3 + src/data-structures/linked-list/LinkedList.js | 72 +- .../linked-list/__test__/LinkedList.test.js | 54 +- src/data-structures/queue/Queue.js | 28 + src/data-structures/queue/README.md | 8 + .../queue/__test__/Queue.test.js | 51 + 8 files changed, 4053 insertions(+), 19 deletions(-) create mode 100644 src/data-structures/queue/Queue.js create mode 100644 src/data-structures/queue/README.md create mode 100644 src/data-structures/queue/__test__/Queue.test.js diff --git a/README.md b/README.md index f6ac548f7..7486af980 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ - [Linked List](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/linked-list) - [Hash Table](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/hash-table) +- [Queue](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/queue) ## Running Tests diff --git a/package-lock.json b/package-lock.json index 20c4bc1b5..38d1d3520 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5436,6 +5436,3861 @@ "remove-trailing-separator": "1.1.0" } }, + "npm": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/npm/-/npm-5.8.0.tgz", + "integrity": "sha512-DowXzQwtSWDtbAjuWecuEiismR0VdNEYaL3VxNTYTdW6AGkYxfGk9LUZ/rt6etEyiH4IEk95HkJeGfXE5Rz9xQ==", + "requires": { + "JSONStream": "1.3.2", + "abbrev": "1.1.1", + "ansi-regex": "3.0.0", + "ansicolors": "0.3.2", + "ansistyles": "0.1.3", + "aproba": "1.2.0", + "archy": "1.0.0", + "bin-links": "1.1.0", + "bluebird": "3.5.1", + "cacache": "10.0.4", + "call-limit": "1.1.0", + "chownr": "1.0.1", + "cli-table2": "0.2.0", + "cmd-shim": "2.0.2", + "columnify": "1.5.4", + "config-chain": "1.1.11", + "debuglog": "1.0.1", + "detect-indent": "5.0.0", + "detect-newline": "2.1.0", + "dezalgo": "1.0.3", + "editor": "1.0.0", + "find-npm-prefix": "1.0.2", + "fs-vacuum": "1.2.10", + "fs-write-stream-atomic": "1.0.10", + "gentle-fs": "2.0.1", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "has-unicode": "2.0.1", + "hosted-git-info": "2.6.0", + "iferr": "0.1.5", + "imurmurhash": "0.1.4", + "inflight": "1.0.6", + "inherits": "2.0.3", + "ini": "1.3.5", + "init-package-json": "1.10.3", + "is-cidr": "1.0.0", + "json-parse-better-errors": "1.0.1", + "lazy-property": "1.0.0", + "libcipm": "1.6.0", + "libnpx": "10.0.1", + "lockfile": "1.0.3", + "lodash._baseindexof": "3.1.0", + "lodash._baseuniq": "4.6.0", + "lodash._bindcallback": "3.0.1", + "lodash._cacheindexof": "3.0.2", + "lodash._createcache": "3.1.2", + "lodash._getnative": "3.9.1", + "lodash.clonedeep": "4.5.0", + "lodash.restparam": "3.6.1", + "lodash.union": "4.6.0", + "lodash.uniq": "4.5.0", + "lodash.without": "4.4.0", + "lru-cache": "4.1.1", + "meant": "1.0.1", + "mississippi": "3.0.0", + "mkdirp": "0.5.1", + "move-concurrently": "1.0.1", + "nopt": "4.0.1", + "normalize-package-data": "2.4.0", + "npm-cache-filename": "1.0.2", + "npm-install-checks": "3.0.0", + "npm-lifecycle": "2.0.1", + "npm-package-arg": "6.0.0", + "npm-packlist": "1.1.10", + "npm-profile": "3.0.1", + "npm-registry-client": "8.5.1", + "npm-user-validate": "1.0.0", + "npmlog": "4.1.2", + "once": "1.4.0", + "opener": "1.4.3", + "osenv": "0.1.5", + "pacote": "7.6.1", + "path-is-inside": "1.0.2", + "promise-inflight": "1.0.1", + "qrcode-terminal": "0.11.0", + "query-string": "5.1.0", + "qw": "1.0.1", + "read": "1.0.7", + "read-cmd-shim": "1.0.1", + "read-installed": "4.0.3", + "read-package-json": "2.0.13", + "read-package-tree": "5.1.6", + "readable-stream": "2.3.5", + "readdir-scoped-modules": "1.0.2", + "request": "2.83.0", + "retry": "0.10.1", + "rimraf": "2.6.2", + "safe-buffer": "5.1.1", + "semver": "5.5.0", + "sha": "2.0.1", + "slide": "1.1.6", + "sorted-object": "2.0.1", + "sorted-union-stream": "2.1.3", + "ssri": "5.2.4", + "strip-ansi": "4.0.0", + "tar": "4.4.0", + "text-table": "0.2.0", + "uid-number": "0.0.6", + "umask": "1.1.0", + "unique-filename": "1.1.0", + "unpipe": "1.0.0", + "update-notifier": "2.3.0", + "uuid": "3.2.1", + "validate-npm-package-license": "3.0.1", + "validate-npm-package-name": "3.0.0", + "which": "1.3.0", + "worker-farm": "1.5.4", + "wrappy": "1.0.2", + "write-file-atomic": "2.3.0" + }, + "dependencies": { + "JSONStream": { + "version": "1.3.2", + "bundled": true, + "requires": { + "jsonparse": "1.3.1", + "through": "2.3.8" + }, + "dependencies": { + "jsonparse": { + "version": "1.3.1", + "bundled": true + }, + "through": { + "version": "2.3.8", + "bundled": true + } + } + }, + "abbrev": { + "version": "1.1.1", + "bundled": true + }, + "ansi-regex": { + "version": "3.0.0", + "bundled": true + }, + "ansicolors": { + "version": "0.3.2", + "bundled": true + }, + "ansistyles": { + "version": "0.1.3", + "bundled": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true + }, + "archy": { + "version": "1.0.0", + "bundled": true + }, + "bin-links": { + "version": "1.1.0", + "bundled": true, + "requires": { + "bluebird": "3.5.1", + "cmd-shim": "2.0.2", + "fs-write-stream-atomic": "1.0.10", + "gentle-fs": "2.0.1", + "graceful-fs": "4.1.11", + "slide": "1.1.6" + } + }, + "bluebird": { + "version": "3.5.1", + "bundled": true + }, + "cacache": { + "version": "10.0.4", + "bundled": true, + "requires": { + "bluebird": "3.5.1", + "chownr": "1.0.1", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "lru-cache": "4.1.1", + "mississippi": "2.0.0", + "mkdirp": "0.5.1", + "move-concurrently": "1.0.1", + "promise-inflight": "1.0.1", + "rimraf": "2.6.2", + "ssri": "5.2.4", + "unique-filename": "1.1.0", + "y18n": "4.0.0" + }, + "dependencies": { + "mississippi": { + "version": "2.0.0", + "bundled": true, + "requires": { + "concat-stream": "1.6.1", + "duplexify": "3.5.4", + "end-of-stream": "1.4.1", + "flush-write-stream": "1.0.2", + "from2": "2.3.0", + "parallel-transform": "1.1.0", + "pump": "2.0.1", + "pumpify": "1.4.0", + "stream-each": "1.2.2", + "through2": "2.0.3" + }, + "dependencies": { + "concat-stream": { + "version": "1.6.1", + "bundled": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.5", + "typedarray": "0.0.6" + }, + "dependencies": { + "typedarray": { + "version": "0.0.6", + "bundled": true + } + } + }, + "duplexify": { + "version": "3.5.4", + "bundled": true, + "requires": { + "end-of-stream": "1.4.1", + "inherits": "2.0.3", + "readable-stream": "2.3.5", + "stream-shift": "1.0.0" + }, + "dependencies": { + "stream-shift": { + "version": "1.0.0", + "bundled": true + } + } + }, + "end-of-stream": { + "version": "1.4.1", + "bundled": true, + "requires": { + "once": "1.4.0" + } + }, + "flush-write-stream": { + "version": "1.0.2", + "bundled": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.5" + } + }, + "from2": { + "version": "2.3.0", + "bundled": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.5" + } + }, + "parallel-transform": { + "version": "1.1.0", + "bundled": true, + "requires": { + "cyclist": "0.2.2", + "inherits": "2.0.3", + "readable-stream": "2.3.5" + }, + "dependencies": { + "cyclist": { + "version": "0.2.2", + "bundled": true + } + } + }, + "pump": { + "version": "2.0.1", + "bundled": true, + "requires": { + "end-of-stream": "1.4.1", + "once": "1.4.0" + } + }, + "pumpify": { + "version": "1.4.0", + "bundled": true, + "requires": { + "duplexify": "3.5.4", + "inherits": "2.0.3", + "pump": "2.0.1" + } + }, + "stream-each": { + "version": "1.2.2", + "bundled": true, + "requires": { + "end-of-stream": "1.4.1", + "stream-shift": "1.0.0" + }, + "dependencies": { + "stream-shift": { + "version": "1.0.0", + "bundled": true + } + } + }, + "through2": { + "version": "2.0.3", + "bundled": true, + "requires": { + "readable-stream": "2.3.5", + "xtend": "4.0.1" + }, + "dependencies": { + "xtend": { + "version": "4.0.1", + "bundled": true + } + } + } + } + }, + "y18n": { + "version": "4.0.0", + "bundled": true + } + } + }, + "call-limit": { + "version": "1.1.0", + "bundled": true + }, + "chownr": { + "version": "1.0.1", + "bundled": true + }, + "cli-table2": { + "version": "0.2.0", + "bundled": true, + "requires": { + "colors": "1.1.2", + "lodash": "3.10.1", + "string-width": "1.0.2" + }, + "dependencies": { + "colors": { + "version": "1.1.2", + "bundled": true, + "optional": true + }, + "lodash": { + "version": "3.10.1", + "bundled": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "1.0.1" + }, + "dependencies": { + "number-is-nan": { + "version": "1.0.1", + "bundled": true + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "bundled": true + } + } + } + } + } + } + }, + "cmd-shim": { + "version": "2.0.2", + "bundled": true, + "requires": { + "graceful-fs": "4.1.11", + "mkdirp": "0.5.1" + } + }, + "columnify": { + "version": "1.5.4", + "bundled": true, + "requires": { + "strip-ansi": "3.0.1", + "wcwidth": "1.0.1" + }, + "dependencies": { + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "bundled": true + } + } + }, + "wcwidth": { + "version": "1.0.1", + "bundled": true, + "requires": { + "defaults": "1.0.3" + }, + "dependencies": { + "defaults": { + "version": "1.0.3", + "bundled": true, + "requires": { + "clone": "1.0.2" + }, + "dependencies": { + "clone": { + "version": "1.0.2", + "bundled": true + } + } + } + } + } + } + }, + "config-chain": { + "version": "1.1.11", + "bundled": true, + "requires": { + "ini": "1.3.5", + "proto-list": "1.2.4" + }, + "dependencies": { + "proto-list": { + "version": "1.2.4", + "bundled": true + } + } + }, + "debuglog": { + "version": "1.0.1", + "bundled": true + }, + "detect-indent": { + "version": "5.0.0", + "bundled": true + }, + "detect-newline": { + "version": "2.1.0", + "bundled": true + }, + "dezalgo": { + "version": "1.0.3", + "bundled": true, + "requires": { + "asap": "2.0.5", + "wrappy": "1.0.2" + }, + "dependencies": { + "asap": { + "version": "2.0.5", + "bundled": true + } + } + }, + "editor": { + "version": "1.0.0", + "bundled": true + }, + "find-npm-prefix": { + "version": "1.0.2", + "bundled": true + }, + "fs-vacuum": { + "version": "1.2.10", + "bundled": true, + "requires": { + "graceful-fs": "4.1.11", + "path-is-inside": "1.0.2", + "rimraf": "2.6.2" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "bundled": true, + "requires": { + "graceful-fs": "4.1.11", + "iferr": "0.1.5", + "imurmurhash": "0.1.4", + "readable-stream": "2.3.5" + } + }, + "gentle-fs": { + "version": "2.0.1", + "bundled": true, + "requires": { + "aproba": "1.2.0", + "fs-vacuum": "1.2.10", + "graceful-fs": "4.1.11", + "iferr": "0.1.5", + "mkdirp": "0.5.1", + "path-is-inside": "1.0.2", + "read-cmd-shim": "1.0.1", + "slide": "1.1.6" + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + }, + "dependencies": { + "fs.realpath": { + "version": "1.0.0", + "bundled": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "1.1.8" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.8", + "bundled": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "1.0.0", + "bundled": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + } + } + } + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true + } + } + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true + }, + "hosted-git-info": { + "version": "2.6.0", + "bundled": true + }, + "iferr": { + "version": "0.1.5", + "bundled": true + }, + "imurmurhash": { + "version": "0.1.4", + "bundled": true + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true + }, + "ini": { + "version": "1.3.5", + "bundled": true + }, + "init-package-json": { + "version": "1.10.3", + "bundled": true, + "requires": { + "glob": "7.1.2", + "npm-package-arg": "6.0.0", + "promzard": "0.3.0", + "read": "1.0.7", + "read-package-json": "2.0.13", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.1", + "validate-npm-package-name": "3.0.0" + }, + "dependencies": { + "promzard": { + "version": "0.3.0", + "bundled": true, + "requires": { + "read": "1.0.7" + } + } + } + }, + "is-cidr": { + "version": "1.0.0", + "bundled": true, + "requires": { + "cidr-regex": "1.0.6" + }, + "dependencies": { + "cidr-regex": { + "version": "1.0.6", + "bundled": true + } + } + }, + "json-parse-better-errors": { + "version": "1.0.1", + "bundled": true + }, + "lazy-property": { + "version": "1.0.0", + "bundled": true + }, + "libcipm": { + "version": "1.6.0", + "bundled": true, + "requires": { + "bin-links": "1.1.0", + "bluebird": "3.5.1", + "find-npm-prefix": "1.0.2", + "graceful-fs": "4.1.11", + "lock-verify": "2.0.0", + "npm-lifecycle": "2.0.1", + "npm-logical-tree": "1.2.1", + "npm-package-arg": "6.0.0", + "pacote": "7.6.1", + "protoduck": "5.0.0", + "read-package-json": "2.0.13", + "rimraf": "2.6.2", + "worker-farm": "1.5.4" + }, + "dependencies": { + "lock-verify": { + "version": "2.0.0", + "bundled": true, + "requires": { + "npm-package-arg": "5.1.2", + "semver": "5.5.0" + }, + "dependencies": { + "npm-package-arg": { + "version": "5.1.2", + "bundled": true, + "requires": { + "hosted-git-info": "2.6.0", + "osenv": "0.1.5", + "semver": "5.5.0", + "validate-npm-package-name": "3.0.0" + } + } + } + }, + "npm-logical-tree": { + "version": "1.2.1", + "bundled": true + }, + "protoduck": { + "version": "5.0.0", + "bundled": true, + "requires": { + "genfun": "4.0.1" + }, + "dependencies": { + "genfun": { + "version": "4.0.1", + "bundled": true + } + } + }, + "worker-farm": { + "version": "1.5.4", + "bundled": true, + "requires": { + "errno": "0.1.7", + "xtend": "4.0.1" + }, + "dependencies": { + "errno": { + "version": "0.1.7", + "bundled": true, + "requires": { + "prr": "1.0.1" + }, + "dependencies": { + "prr": { + "version": "1.0.1", + "bundled": true + } + } + }, + "xtend": { + "version": "4.0.1", + "bundled": true + } + } + } + } + }, + "libnpx": { + "version": "10.0.1", + "bundled": true, + "requires": { + "dotenv": "5.0.1", + "npm-package-arg": "6.0.0", + "rimraf": "2.6.2", + "safe-buffer": "5.1.1", + "update-notifier": "2.3.0", + "which": "1.3.0", + "y18n": "4.0.0", + "yargs": "11.0.0" + }, + "dependencies": { + "dotenv": { + "version": "5.0.1", + "bundled": true + }, + "y18n": { + "version": "4.0.0", + "bundled": true + }, + "yargs": { + "version": "11.0.0", + "bundled": true, + "requires": { + "cliui": "4.0.0", + "decamelize": "1.2.0", + "find-up": "2.1.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "9.0.2" + }, + "dependencies": { + "cliui": { + "version": "4.0.0", + "bundled": true, + "requires": { + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "wrap-ansi": "2.1.0" + }, + "dependencies": { + "wrap-ansi": { + "version": "2.1.0", + "bundled": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "1.0.1" + }, + "dependencies": { + "number-is-nan": { + "version": "1.0.1", + "bundled": true + } + } + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "bundled": true + } + } + } + } + } + } + }, + "decamelize": { + "version": "1.2.0", + "bundled": true + }, + "find-up": { + "version": "2.1.0", + "bundled": true, + "requires": { + "locate-path": "2.0.0" + }, + "dependencies": { + "locate-path": { + "version": "2.0.0", + "bundled": true, + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + }, + "dependencies": { + "p-locate": { + "version": "2.0.0", + "bundled": true, + "requires": { + "p-limit": "1.2.0" + }, + "dependencies": { + "p-limit": { + "version": "1.2.0", + "bundled": true, + "requires": { + "p-try": "1.0.0" + }, + "dependencies": { + "p-try": { + "version": "1.0.0", + "bundled": true + } + } + } + } + }, + "path-exists": { + "version": "3.0.0", + "bundled": true + } + } + } + } + }, + "get-caller-file": { + "version": "1.0.2", + "bundled": true + }, + "os-locale": { + "version": "2.1.0", + "bundled": true, + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + }, + "dependencies": { + "execa": { + "version": "0.7.0", + "bundled": true, + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "bundled": true, + "requires": { + "lru-cache": "4.1.1", + "shebang-command": "1.2.0", + "which": "1.3.0" + }, + "dependencies": { + "shebang-command": { + "version": "1.2.0", + "bundled": true, + "requires": { + "shebang-regex": "1.0.0" + }, + "dependencies": { + "shebang-regex": { + "version": "1.0.0", + "bundled": true + } + } + } + } + }, + "get-stream": { + "version": "3.0.0", + "bundled": true + }, + "is-stream": { + "version": "1.1.0", + "bundled": true + }, + "npm-run-path": { + "version": "2.0.2", + "bundled": true, + "requires": { + "path-key": "2.0.1" + }, + "dependencies": { + "path-key": { + "version": "2.0.1", + "bundled": true + } + } + }, + "p-finally": { + "version": "1.0.0", + "bundled": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true + }, + "strip-eof": { + "version": "1.0.0", + "bundled": true + } + } + }, + "lcid": { + "version": "1.0.0", + "bundled": true, + "requires": { + "invert-kv": "1.0.0" + }, + "dependencies": { + "invert-kv": { + "version": "1.0.0", + "bundled": true + } + } + }, + "mem": { + "version": "1.1.0", + "bundled": true, + "requires": { + "mimic-fn": "1.2.0" + }, + "dependencies": { + "mimic-fn": { + "version": "1.2.0", + "bundled": true + } + } + } + } + }, + "require-directory": { + "version": "2.1.1", + "bundled": true + }, + "require-main-filename": { + "version": "1.0.1", + "bundled": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true + }, + "string-width": { + "version": "2.1.1", + "bundled": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "bundled": true + } + } + }, + "which-module": { + "version": "2.0.0", + "bundled": true + }, + "y18n": { + "version": "3.2.1", + "bundled": true + }, + "yargs-parser": { + "version": "9.0.2", + "bundled": true, + "requires": { + "camelcase": "4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "bundled": true + } + } + } + } + } + } + }, + "lockfile": { + "version": "1.0.3", + "bundled": true + }, + "lodash._baseindexof": { + "version": "3.1.0", + "bundled": true + }, + "lodash._baseuniq": { + "version": "4.6.0", + "bundled": true, + "requires": { + "lodash._createset": "4.0.3", + "lodash._root": "3.0.1" + }, + "dependencies": { + "lodash._createset": { + "version": "4.0.3", + "bundled": true + }, + "lodash._root": { + "version": "3.0.1", + "bundled": true + } + } + }, + "lodash._bindcallback": { + "version": "3.0.1", + "bundled": true + }, + "lodash._cacheindexof": { + "version": "3.0.2", + "bundled": true + }, + "lodash._createcache": { + "version": "3.1.2", + "bundled": true, + "requires": { + "lodash._getnative": "3.9.1" + } + }, + "lodash._getnative": { + "version": "3.9.1", + "bundled": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "bundled": true + }, + "lodash.restparam": { + "version": "3.6.1", + "bundled": true + }, + "lodash.union": { + "version": "4.6.0", + "bundled": true + }, + "lodash.uniq": { + "version": "4.5.0", + "bundled": true + }, + "lodash.without": { + "version": "4.4.0", + "bundled": true + }, + "lru-cache": { + "version": "4.1.1", + "bundled": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + }, + "dependencies": { + "pseudomap": { + "version": "1.0.2", + "bundled": true + }, + "yallist": { + "version": "2.1.2", + "bundled": true + } + } + }, + "meant": { + "version": "1.0.1", + "bundled": true + }, + "mississippi": { + "version": "3.0.0", + "bundled": true, + "requires": { + "concat-stream": "1.6.1", + "duplexify": "3.5.4", + "end-of-stream": "1.4.1", + "flush-write-stream": "1.0.2", + "from2": "2.3.0", + "parallel-transform": "1.1.0", + "pump": "3.0.0", + "pumpify": "1.4.0", + "stream-each": "1.2.2", + "through2": "2.0.3" + }, + "dependencies": { + "concat-stream": { + "version": "1.6.1", + "bundled": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.5", + "typedarray": "0.0.6" + }, + "dependencies": { + "typedarray": { + "version": "0.0.6", + "bundled": true + } + } + }, + "duplexify": { + "version": "3.5.4", + "bundled": true, + "requires": { + "end-of-stream": "1.4.1", + "inherits": "2.0.3", + "readable-stream": "2.3.5", + "stream-shift": "1.0.0" + }, + "dependencies": { + "stream-shift": { + "version": "1.0.0", + "bundled": true + } + } + }, + "end-of-stream": { + "version": "1.4.1", + "bundled": true, + "requires": { + "once": "1.4.0" + } + }, + "flush-write-stream": { + "version": "1.0.2", + "bundled": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.5" + } + }, + "from2": { + "version": "2.3.0", + "bundled": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.5" + } + }, + "parallel-transform": { + "version": "1.1.0", + "bundled": true, + "requires": { + "cyclist": "0.2.2", + "inherits": "2.0.3", + "readable-stream": "2.3.5" + }, + "dependencies": { + "cyclist": { + "version": "0.2.2", + "bundled": true + } + } + }, + "pump": { + "version": "3.0.0", + "bundled": true, + "requires": { + "end-of-stream": "1.4.1", + "once": "1.4.0" + } + }, + "pumpify": { + "version": "1.4.0", + "bundled": true, + "requires": { + "duplexify": "3.5.4", + "inherits": "2.0.3", + "pump": "2.0.1" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "bundled": true, + "requires": { + "end-of-stream": "1.4.1", + "once": "1.4.0" + } + } + } + }, + "stream-each": { + "version": "1.2.2", + "bundled": true, + "requires": { + "end-of-stream": "1.4.1", + "stream-shift": "1.0.0" + }, + "dependencies": { + "stream-shift": { + "version": "1.0.0", + "bundled": true + } + } + }, + "through2": { + "version": "2.0.3", + "bundled": true, + "requires": { + "readable-stream": "2.3.5", + "xtend": "4.0.1" + }, + "dependencies": { + "xtend": { + "version": "4.0.1", + "bundled": true + } + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "bundled": true + } + } + }, + "move-concurrently": { + "version": "1.0.1", + "bundled": true, + "requires": { + "aproba": "1.2.0", + "copy-concurrently": "1.0.5", + "fs-write-stream-atomic": "1.0.10", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "run-queue": "1.0.3" + }, + "dependencies": { + "copy-concurrently": { + "version": "1.0.5", + "bundled": true, + "requires": { + "aproba": "1.2.0", + "fs-write-stream-atomic": "1.0.10", + "iferr": "0.1.5", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "run-queue": "1.0.3" + } + }, + "run-queue": { + "version": "1.0.3", + "bundled": true, + "requires": { + "aproba": "1.2.0" + } + } + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "requires": { + "abbrev": "1.1.1", + "osenv": "0.1.5" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "bundled": true, + "requires": { + "hosted-git-info": "2.6.0", + "is-builtin-module": "1.0.0", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.1" + }, + "dependencies": { + "is-builtin-module": { + "version": "1.0.0", + "bundled": true, + "requires": { + "builtin-modules": "1.1.1" + }, + "dependencies": { + "builtin-modules": { + "version": "1.1.1", + "bundled": true + } + } + } + } + }, + "npm-cache-filename": { + "version": "1.0.2", + "bundled": true + }, + "npm-install-checks": { + "version": "3.0.0", + "bundled": true, + "requires": { + "semver": "5.5.0" + } + }, + "npm-lifecycle": { + "version": "2.0.1", + "bundled": true, + "requires": { + "byline": "5.0.0", + "graceful-fs": "4.1.11", + "node-gyp": "3.6.2", + "resolve-from": "4.0.0", + "slide": "1.1.6", + "uid-number": "0.0.6", + "umask": "1.1.0", + "which": "1.3.0" + }, + "dependencies": { + "byline": { + "version": "5.0.0", + "bundled": true + }, + "node-gyp": { + "version": "3.6.2", + "bundled": true, + "requires": { + "fstream": "1.0.11", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "nopt": "3.0.6", + "npmlog": "4.1.2", + "osenv": "0.1.5", + "request": "2.83.0", + "rimraf": "2.6.2", + "semver": "5.3.0", + "tar": "2.2.1", + "which": "1.3.0" + }, + "dependencies": { + "fstream": { + "version": "1.0.11", + "bundled": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.2" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "1.1.11" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "1.0.0", + "bundled": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + } + } + } + } + }, + "nopt": { + "version": "3.0.6", + "bundled": true, + "requires": { + "abbrev": "1.1.1" + } + }, + "semver": { + "version": "5.3.0", + "bundled": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + }, + "dependencies": { + "block-stream": { + "version": "0.0.9", + "bundled": true, + "requires": { + "inherits": "2.0.3" + } + } + } + } + } + }, + "resolve-from": { + "version": "4.0.0", + "bundled": true + } + } + }, + "npm-package-arg": { + "version": "6.0.0", + "bundled": true, + "requires": { + "hosted-git-info": "2.6.0", + "osenv": "0.1.5", + "semver": "5.5.0", + "validate-npm-package-name": "3.0.0" + } + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "requires": { + "ignore-walk": "3.0.1", + "npm-bundled": "1.0.3" + }, + "dependencies": { + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "requires": { + "minimatch": "3.0.4" + }, + "dependencies": { + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "1.1.8" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.8", + "bundled": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "1.0.0", + "bundled": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + } + } + } + } + } + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true + } + } + }, + "npm-profile": { + "version": "3.0.1", + "bundled": true, + "requires": { + "aproba": "1.2.0", + "make-fetch-happen": "2.6.0" + }, + "dependencies": { + "make-fetch-happen": { + "version": "2.6.0", + "bundled": true, + "requires": { + "agentkeepalive": "3.3.0", + "cacache": "10.0.4", + "http-cache-semantics": "3.8.1", + "http-proxy-agent": "2.0.0", + "https-proxy-agent": "2.1.1", + "lru-cache": "4.1.1", + "mississippi": "1.3.1", + "node-fetch-npm": "2.0.2", + "promise-retry": "1.1.1", + "socks-proxy-agent": "3.0.1", + "ssri": "5.2.4" + }, + "dependencies": { + "agentkeepalive": { + "version": "3.3.0", + "bundled": true, + "requires": { + "humanize-ms": "1.2.1" + }, + "dependencies": { + "humanize-ms": { + "version": "1.2.1", + "bundled": true, + "requires": { + "ms": "2.1.1" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "bundled": true + } + } + } + } + }, + "http-cache-semantics": { + "version": "3.8.1", + "bundled": true + }, + "http-proxy-agent": { + "version": "2.0.0", + "bundled": true, + "requires": { + "agent-base": "4.2.0", + "debug": "2.6.9" + }, + "dependencies": { + "agent-base": { + "version": "4.2.0", + "bundled": true, + "requires": { + "es6-promisify": "5.0.0" + }, + "dependencies": { + "es6-promisify": { + "version": "5.0.0", + "bundled": true, + "requires": { + "es6-promise": "4.2.4" + }, + "dependencies": { + "es6-promise": { + "version": "4.2.4", + "bundled": true + } + } + } + } + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "bundled": true + } + } + } + } + }, + "https-proxy-agent": { + "version": "2.1.1", + "bundled": true, + "requires": { + "agent-base": "4.2.0", + "debug": "3.1.0" + }, + "dependencies": { + "agent-base": { + "version": "4.2.0", + "bundled": true, + "requires": { + "es6-promisify": "5.0.0" + }, + "dependencies": { + "es6-promisify": { + "version": "5.0.0", + "bundled": true, + "requires": { + "es6-promise": "4.2.4" + }, + "dependencies": { + "es6-promise": { + "version": "4.2.4", + "bundled": true + } + } + } + } + }, + "debug": { + "version": "3.1.0", + "bundled": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "bundled": true + } + } + } + } + }, + "mississippi": { + "version": "1.3.1", + "bundled": true, + "requires": { + "concat-stream": "1.6.0", + "duplexify": "3.5.3", + "end-of-stream": "1.4.1", + "flush-write-stream": "1.0.2", + "from2": "2.3.0", + "parallel-transform": "1.1.0", + "pump": "1.0.3", + "pumpify": "1.4.0", + "stream-each": "1.2.2", + "through2": "2.0.3" + }, + "dependencies": { + "concat-stream": { + "version": "1.6.0", + "bundled": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.5", + "typedarray": "0.0.6" + }, + "dependencies": { + "typedarray": { + "version": "0.0.6", + "bundled": true + } + } + }, + "duplexify": { + "version": "3.5.3", + "bundled": true, + "requires": { + "end-of-stream": "1.4.1", + "inherits": "2.0.3", + "readable-stream": "2.3.5", + "stream-shift": "1.0.0" + }, + "dependencies": { + "stream-shift": { + "version": "1.0.0", + "bundled": true + } + } + }, + "end-of-stream": { + "version": "1.4.1", + "bundled": true, + "requires": { + "once": "1.4.0" + } + }, + "flush-write-stream": { + "version": "1.0.2", + "bundled": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.5" + } + }, + "from2": { + "version": "2.3.0", + "bundled": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.5" + } + }, + "parallel-transform": { + "version": "1.1.0", + "bundled": true, + "requires": { + "cyclist": "0.2.2", + "inherits": "2.0.3", + "readable-stream": "2.3.5" + }, + "dependencies": { + "cyclist": { + "version": "0.2.2", + "bundled": true + } + } + }, + "pump": { + "version": "1.0.3", + "bundled": true, + "requires": { + "end-of-stream": "1.4.1", + "once": "1.4.0" + } + }, + "pumpify": { + "version": "1.4.0", + "bundled": true, + "requires": { + "duplexify": "3.5.3", + "inherits": "2.0.3", + "pump": "2.0.1" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "bundled": true, + "requires": { + "end-of-stream": "1.4.1", + "once": "1.4.0" + } + } + } + }, + "stream-each": { + "version": "1.2.2", + "bundled": true, + "requires": { + "end-of-stream": "1.4.1", + "stream-shift": "1.0.0" + }, + "dependencies": { + "stream-shift": { + "version": "1.0.0", + "bundled": true + } + } + }, + "through2": { + "version": "2.0.3", + "bundled": true, + "requires": { + "readable-stream": "2.3.5", + "xtend": "4.0.1" + }, + "dependencies": { + "xtend": { + "version": "4.0.1", + "bundled": true + } + } + } + } + }, + "node-fetch-npm": { + "version": "2.0.2", + "bundled": true, + "requires": { + "encoding": "0.1.12", + "json-parse-better-errors": "1.0.1", + "safe-buffer": "5.1.1" + }, + "dependencies": { + "encoding": { + "version": "0.1.12", + "bundled": true, + "requires": { + "iconv-lite": "0.4.19" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.19", + "bundled": true + } + } + }, + "json-parse-better-errors": { + "version": "1.0.1", + "bundled": true + } + } + }, + "promise-retry": { + "version": "1.1.1", + "bundled": true, + "requires": { + "err-code": "1.1.2", + "retry": "0.10.1" + }, + "dependencies": { + "err-code": { + "version": "1.1.2", + "bundled": true + } + } + }, + "socks-proxy-agent": { + "version": "3.0.1", + "bundled": true, + "requires": { + "agent-base": "4.2.0", + "socks": "1.1.10" + }, + "dependencies": { + "agent-base": { + "version": "4.2.0", + "bundled": true, + "requires": { + "es6-promisify": "5.0.0" + }, + "dependencies": { + "es6-promisify": { + "version": "5.0.0", + "bundled": true, + "requires": { + "es6-promise": "4.2.4" + }, + "dependencies": { + "es6-promise": { + "version": "4.2.4", + "bundled": true + } + } + } + } + }, + "socks": { + "version": "1.1.10", + "bundled": true, + "requires": { + "ip": "1.1.5", + "smart-buffer": "1.1.15" + }, + "dependencies": { + "ip": { + "version": "1.1.5", + "bundled": true + }, + "smart-buffer": { + "version": "1.1.15", + "bundled": true + } + } + } + } + } + } + } + } + }, + "npm-registry-client": { + "version": "8.5.1", + "bundled": true, + "requires": { + "concat-stream": "1.6.1", + "graceful-fs": "4.1.11", + "normalize-package-data": "2.4.0", + "npm-package-arg": "6.0.0", + "npmlog": "4.1.2", + "once": "1.4.0", + "request": "2.83.0", + "retry": "0.10.1", + "safe-buffer": "5.1.1", + "semver": "5.5.0", + "slide": "1.1.6", + "ssri": "5.2.4" + }, + "dependencies": { + "concat-stream": { + "version": "1.6.1", + "bundled": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.5", + "typedarray": "0.0.6" + }, + "dependencies": { + "typedarray": { + "version": "0.0.6", + "bundled": true + } + } + } + } + }, + "npm-user-validate": { + "version": "1.0.0", + "bundled": true + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + }, + "dependencies": { + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.5" + }, + "dependencies": { + "delegates": { + "version": "1.0.0", + "bundled": true + } + } + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "requires": { + "aproba": "1.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + }, + "dependencies": { + "object-assign": { + "version": "4.1.1", + "bundled": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "1.0.1" + }, + "dependencies": { + "number-is-nan": { + "version": "1.0.1", + "bundled": true + } + } + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "bundled": true + } + } + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "requires": { + "string-width": "1.0.2" + } + } + } + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true + } + } + }, + "once": { + "version": "1.4.0", + "bundled": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "opener": { + "version": "1.4.3", + "bundled": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + }, + "dependencies": { + "os-homedir": { + "version": "1.0.2", + "bundled": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true + } + } + }, + "pacote": { + "version": "7.6.1", + "bundled": true, + "requires": { + "bluebird": "3.5.1", + "cacache": "10.0.4", + "get-stream": "3.0.0", + "glob": "7.1.2", + "lru-cache": "4.1.1", + "make-fetch-happen": "2.6.0", + "minimatch": "3.0.4", + "mississippi": "3.0.0", + "mkdirp": "0.5.1", + "normalize-package-data": "2.4.0", + "npm-package-arg": "6.0.0", + "npm-packlist": "1.1.10", + "npm-pick-manifest": "2.1.0", + "osenv": "0.1.5", + "promise-inflight": "1.0.1", + "promise-retry": "1.1.1", + "protoduck": "5.0.0", + "rimraf": "2.6.2", + "safe-buffer": "5.1.1", + "semver": "5.5.0", + "ssri": "5.2.4", + "tar": "4.4.0", + "unique-filename": "1.1.0", + "which": "1.3.0" + }, + "dependencies": { + "get-stream": { + "version": "3.0.0", + "bundled": true + }, + "make-fetch-happen": { + "version": "2.6.0", + "bundled": true, + "requires": { + "agentkeepalive": "3.4.0", + "cacache": "10.0.4", + "http-cache-semantics": "3.8.1", + "http-proxy-agent": "2.1.0", + "https-proxy-agent": "2.2.0", + "lru-cache": "4.1.1", + "mississippi": "1.3.1", + "node-fetch-npm": "2.0.2", + "promise-retry": "1.1.1", + "socks-proxy-agent": "3.0.1", + "ssri": "5.2.4" + }, + "dependencies": { + "agentkeepalive": { + "version": "3.4.0", + "bundled": true, + "requires": { + "humanize-ms": "1.2.1" + }, + "dependencies": { + "humanize-ms": { + "version": "1.2.1", + "bundled": true, + "requires": { + "ms": "2.1.1" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "bundled": true + } + } + } + } + }, + "http-cache-semantics": { + "version": "3.8.1", + "bundled": true + }, + "http-proxy-agent": { + "version": "2.1.0", + "bundled": true, + "requires": { + "agent-base": "4.2.0", + "debug": "3.1.0" + }, + "dependencies": { + "agent-base": { + "version": "4.2.0", + "bundled": true, + "requires": { + "es6-promisify": "5.0.0" + }, + "dependencies": { + "es6-promisify": { + "version": "5.0.0", + "bundled": true, + "requires": { + "es6-promise": "4.2.4" + }, + "dependencies": { + "es6-promise": { + "version": "4.2.4", + "bundled": true + } + } + } + } + }, + "debug": { + "version": "3.1.0", + "bundled": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "bundled": true + } + } + } + } + }, + "https-proxy-agent": { + "version": "2.2.0", + "bundled": true, + "requires": { + "agent-base": "4.2.0", + "debug": "3.1.0" + }, + "dependencies": { + "agent-base": { + "version": "4.2.0", + "bundled": true, + "requires": { + "es6-promisify": "5.0.0" + }, + "dependencies": { + "es6-promisify": { + "version": "5.0.0", + "bundled": true, + "requires": { + "es6-promise": "4.2.4" + }, + "dependencies": { + "es6-promise": { + "version": "4.2.4", + "bundled": true + } + } + } + } + }, + "debug": { + "version": "3.1.0", + "bundled": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "bundled": true + } + } + } + } + }, + "mississippi": { + "version": "1.3.1", + "bundled": true, + "requires": { + "concat-stream": "1.6.1", + "duplexify": "3.5.4", + "end-of-stream": "1.4.1", + "flush-write-stream": "1.0.2", + "from2": "2.3.0", + "parallel-transform": "1.1.0", + "pump": "1.0.3", + "pumpify": "1.4.0", + "stream-each": "1.2.2", + "through2": "2.0.3" + }, + "dependencies": { + "concat-stream": { + "version": "1.6.1", + "bundled": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.5", + "typedarray": "0.0.6" + }, + "dependencies": { + "typedarray": { + "version": "0.0.6", + "bundled": true + } + } + }, + "duplexify": { + "version": "3.5.4", + "bundled": true, + "requires": { + "end-of-stream": "1.4.1", + "inherits": "2.0.3", + "readable-stream": "2.3.5", + "stream-shift": "1.0.0" + }, + "dependencies": { + "stream-shift": { + "version": "1.0.0", + "bundled": true + } + } + }, + "end-of-stream": { + "version": "1.4.1", + "bundled": true, + "requires": { + "once": "1.4.0" + } + }, + "flush-write-stream": { + "version": "1.0.2", + "bundled": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.5" + } + }, + "from2": { + "version": "2.3.0", + "bundled": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.5" + } + }, + "parallel-transform": { + "version": "1.1.0", + "bundled": true, + "requires": { + "cyclist": "0.2.2", + "inherits": "2.0.3", + "readable-stream": "2.3.5" + }, + "dependencies": { + "cyclist": { + "version": "0.2.2", + "bundled": true + } + } + }, + "pump": { + "version": "1.0.3", + "bundled": true, + "requires": { + "end-of-stream": "1.4.1", + "once": "1.4.0" + } + }, + "pumpify": { + "version": "1.4.0", + "bundled": true, + "requires": { + "duplexify": "3.5.4", + "inherits": "2.0.3", + "pump": "2.0.1" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "bundled": true, + "requires": { + "end-of-stream": "1.4.1", + "once": "1.4.0" + } + } + } + }, + "stream-each": { + "version": "1.2.2", + "bundled": true, + "requires": { + "end-of-stream": "1.4.1", + "stream-shift": "1.0.0" + }, + "dependencies": { + "stream-shift": { + "version": "1.0.0", + "bundled": true + } + } + }, + "through2": { + "version": "2.0.3", + "bundled": true, + "requires": { + "readable-stream": "2.3.5", + "xtend": "4.0.1" + }, + "dependencies": { + "xtend": { + "version": "4.0.1", + "bundled": true + } + } + } + } + }, + "node-fetch-npm": { + "version": "2.0.2", + "bundled": true, + "requires": { + "encoding": "0.1.12", + "json-parse-better-errors": "1.0.1", + "safe-buffer": "5.1.1" + }, + "dependencies": { + "encoding": { + "version": "0.1.12", + "bundled": true, + "requires": { + "iconv-lite": "0.4.19" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.19", + "bundled": true + } + } + }, + "json-parse-better-errors": { + "version": "1.0.1", + "bundled": true + } + } + }, + "socks-proxy-agent": { + "version": "3.0.1", + "bundled": true, + "requires": { + "agent-base": "4.2.0", + "socks": "1.1.10" + }, + "dependencies": { + "agent-base": { + "version": "4.2.0", + "bundled": true, + "requires": { + "es6-promisify": "5.0.0" + }, + "dependencies": { + "es6-promisify": { + "version": "5.0.0", + "bundled": true, + "requires": { + "es6-promise": "4.2.4" + }, + "dependencies": { + "es6-promise": { + "version": "4.2.4", + "bundled": true + } + } + } + } + }, + "socks": { + "version": "1.1.10", + "bundled": true, + "requires": { + "ip": "1.1.5", + "smart-buffer": "1.1.15" + }, + "dependencies": { + "ip": { + "version": "1.1.5", + "bundled": true + }, + "smart-buffer": { + "version": "1.1.15", + "bundled": true + } + } + } + } + } + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "1.1.11" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "1.0.0", + "bundled": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + } + } + } + } + }, + "npm-pick-manifest": { + "version": "2.1.0", + "bundled": true, + "requires": { + "npm-package-arg": "6.0.0", + "semver": "5.5.0" + } + }, + "promise-retry": { + "version": "1.1.1", + "bundled": true, + "requires": { + "err-code": "1.1.2", + "retry": "0.10.1" + }, + "dependencies": { + "err-code": { + "version": "1.1.2", + "bundled": true + } + } + }, + "protoduck": { + "version": "5.0.0", + "bundled": true, + "requires": { + "genfun": "4.0.1" + }, + "dependencies": { + "genfun": { + "version": "4.0.1", + "bundled": true + } + } + } + } + }, + "path-is-inside": { + "version": "1.0.2", + "bundled": true + }, + "promise-inflight": { + "version": "1.0.1", + "bundled": true + }, + "qrcode-terminal": { + "version": "0.11.0", + "bundled": true + }, + "query-string": { + "version": "5.1.0", + "bundled": true, + "requires": { + "decode-uri-component": "0.2.0", + "object-assign": "4.1.1", + "strict-uri-encode": "1.1.0" + }, + "dependencies": { + "decode-uri-component": { + "version": "0.2.0", + "bundled": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true + }, + "strict-uri-encode": { + "version": "1.1.0", + "bundled": true + } + } + }, + "qw": { + "version": "1.0.1", + "bundled": true + }, + "read": { + "version": "1.0.7", + "bundled": true, + "requires": { + "mute-stream": "0.0.7" + }, + "dependencies": { + "mute-stream": { + "version": "0.0.7", + "bundled": true + } + } + }, + "read-cmd-shim": { + "version": "1.0.1", + "bundled": true, + "requires": { + "graceful-fs": "4.1.11" + } + }, + "read-installed": { + "version": "4.0.3", + "bundled": true, + "requires": { + "debuglog": "1.0.1", + "graceful-fs": "4.1.11", + "read-package-json": "2.0.13", + "readdir-scoped-modules": "1.0.2", + "semver": "5.5.0", + "slide": "1.1.6", + "util-extend": "1.0.3" + }, + "dependencies": { + "util-extend": { + "version": "1.0.3", + "bundled": true + } + } + }, + "read-package-json": { + "version": "2.0.13", + "bundled": true, + "requires": { + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "json-parse-better-errors": "1.0.1", + "normalize-package-data": "2.4.0", + "slash": "1.0.0" + }, + "dependencies": { + "json-parse-better-errors": { + "version": "1.0.1", + "bundled": true + }, + "slash": { + "version": "1.0.0", + "bundled": true + } + } + }, + "read-package-tree": { + "version": "5.1.6", + "bundled": true, + "requires": { + "debuglog": "1.0.1", + "dezalgo": "1.0.3", + "once": "1.4.0", + "read-package-json": "2.0.13", + "readdir-scoped-modules": "1.0.2" + } + }, + "readable-stream": { + "version": "2.3.5", + "bundled": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "bundled": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true + }, + "string_decoder": { + "version": "1.0.3", + "bundled": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true + } + } + }, + "readdir-scoped-modules": { + "version": "1.0.2", + "bundled": true, + "requires": { + "debuglog": "1.0.1", + "dezalgo": "1.0.3", + "graceful-fs": "4.1.11", + "once": "1.4.0" + } + }, + "request": { + "version": "2.83.0", + "bundled": true, + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.3.1", + "har-validator": "5.0.3", + "hawk": "6.0.2", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.1", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.6.0", + "uuid": "3.2.1" + }, + "dependencies": { + "aws-sign2": { + "version": "0.7.0", + "bundled": true + }, + "aws4": { + "version": "1.6.0", + "bundled": true + }, + "caseless": { + "version": "0.12.0", + "bundled": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "requires": { + "delayed-stream": "1.0.0" + }, + "dependencies": { + "delayed-stream": { + "version": "1.0.0", + "bundled": true + } + } + }, + "extend": { + "version": "3.0.1", + "bundled": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true + }, + "form-data": { + "version": "2.3.1", + "bundled": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + }, + "dependencies": { + "asynckit": { + "version": "0.4.0", + "bundled": true + } + } + }, + "har-validator": { + "version": "5.0.3", + "bundled": true, + "requires": { + "ajv": "5.2.3", + "har-schema": "2.0.0" + }, + "dependencies": { + "ajv": { + "version": "5.2.3", + "bundled": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "json-schema-traverse": "0.3.1", + "json-stable-stringify": "1.0.1" + }, + "dependencies": { + "co": { + "version": "4.6.0", + "bundled": true + }, + "fast-deep-equal": { + "version": "1.0.0", + "bundled": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "bundled": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true, + "requires": { + "jsonify": "0.0.0" + }, + "dependencies": { + "jsonify": { + "version": "0.0.0", + "bundled": true + } + } + } + } + }, + "har-schema": { + "version": "2.0.0", + "bundled": true + } + } + }, + "hawk": { + "version": "6.0.2", + "bundled": true, + "requires": { + "boom": "4.3.1", + "cryptiles": "3.1.2", + "hoek": "4.2.0", + "sntp": "2.0.2" + }, + "dependencies": { + "boom": { + "version": "4.3.1", + "bundled": true, + "requires": { + "hoek": "4.2.0" + } + }, + "cryptiles": { + "version": "3.1.2", + "bundled": true, + "requires": { + "boom": "5.2.0" + }, + "dependencies": { + "boom": { + "version": "5.2.0", + "bundled": true, + "requires": { + "hoek": "4.2.0" + } + } + } + }, + "hoek": { + "version": "4.2.0", + "bundled": true + }, + "sntp": { + "version": "2.0.2", + "bundled": true, + "requires": { + "hoek": "4.2.0" + } + } + } + }, + "http-signature": { + "version": "1.2.0", + "bundled": true, + "requires": { + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true + }, + "jsprim": { + "version": "1.4.1", + "bundled": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + }, + "dependencies": { + "extsprintf": { + "version": "1.3.0", + "bundled": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true + }, + "verror": { + "version": "1.10.0", + "bundled": true, + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "bundled": true + } + } + } + } + }, + "sshpk": { + "version": "1.13.1", + "bundled": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "asn1": { + "version": "0.2.3", + "bundled": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "bundled": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.1", + "bundled": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "optional": true + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "optional": true + } + } + } + } + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true + }, + "mime-types": { + "version": "2.1.17", + "bundled": true, + "requires": { + "mime-db": "1.30.0" + }, + "dependencies": { + "mime-db": { + "version": "1.30.0", + "bundled": true + } + } + }, + "oauth-sign": { + "version": "0.8.2", + "bundled": true + }, + "performance-now": { + "version": "2.1.0", + "bundled": true + }, + "qs": { + "version": "6.5.1", + "bundled": true + }, + "stringstream": { + "version": "0.0.5", + "bundled": true + }, + "tough-cookie": { + "version": "2.3.3", + "bundled": true, + "requires": { + "punycode": "1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "bundled": true + } + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "requires": { + "safe-buffer": "5.1.1" + } + } + } + }, + "retry": { + "version": "0.10.1", + "bundled": true + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true + }, + "semver": { + "version": "5.5.0", + "bundled": true + }, + "sha": { + "version": "2.0.1", + "bundled": true, + "requires": { + "graceful-fs": "4.1.11", + "readable-stream": "2.3.5" + } + }, + "slide": { + "version": "1.1.6", + "bundled": true + }, + "sorted-object": { + "version": "2.0.1", + "bundled": true + }, + "sorted-union-stream": { + "version": "2.1.3", + "bundled": true, + "requires": { + "from2": "1.3.0", + "stream-iterate": "1.2.0" + }, + "dependencies": { + "from2": { + "version": "1.3.0", + "bundled": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "1.1.14" + }, + "dependencies": { + "readable-stream": { + "version": "1.1.14", + "bundled": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "bundled": true + }, + "isarray": { + "version": "0.0.1", + "bundled": true + }, + "string_decoder": { + "version": "0.10.31", + "bundled": true + } + } + } + } + }, + "stream-iterate": { + "version": "1.2.0", + "bundled": true, + "requires": { + "readable-stream": "2.3.5", + "stream-shift": "1.0.0" + }, + "dependencies": { + "stream-shift": { + "version": "1.0.0", + "bundled": true + } + } + } + } + }, + "ssri": { + "version": "5.2.4", + "bundled": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "strip-ansi": { + "version": "4.0.0", + "bundled": true, + "requires": { + "ansi-regex": "3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "bundled": true + } + } + }, + "tar": { + "version": "4.4.0", + "bundled": true, + "requires": { + "chownr": "1.0.1", + "fs-minipass": "1.2.5", + "minipass": "2.2.1", + "minizlib": "1.1.0", + "mkdirp": "0.5.1", + "yallist": "3.0.2" + }, + "dependencies": { + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "requires": { + "minipass": "2.2.1" + } + }, + "minipass": { + "version": "2.2.1", + "bundled": true, + "requires": { + "yallist": "3.0.2" + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "requires": { + "minipass": "2.2.1" + } + }, + "yallist": { + "version": "3.0.2", + "bundled": true + } + } + }, + "text-table": { + "version": "0.2.0", + "bundled": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true + }, + "umask": { + "version": "1.1.0", + "bundled": true + }, + "unique-filename": { + "version": "1.1.0", + "bundled": true, + "requires": { + "unique-slug": "2.0.0" + }, + "dependencies": { + "unique-slug": { + "version": "2.0.0", + "bundled": true, + "requires": { + "imurmurhash": "0.1.4" + } + } + } + }, + "unpipe": { + "version": "1.0.0", + "bundled": true + }, + "update-notifier": { + "version": "2.3.0", + "bundled": true, + "requires": { + "boxen": "1.2.1", + "chalk": "2.1.0", + "configstore": "3.1.1", + "import-lazy": "2.1.0", + "is-installed-globally": "0.1.0", + "is-npm": "1.0.0", + "latest-version": "3.1.0", + "semver-diff": "2.1.0", + "xdg-basedir": "3.0.0" + }, + "dependencies": { + "boxen": { + "version": "1.2.1", + "bundled": true, + "requires": { + "ansi-align": "2.0.0", + "camelcase": "4.1.0", + "chalk": "2.1.0", + "cli-boxes": "1.0.0", + "string-width": "2.1.1", + "term-size": "1.2.0", + "widest-line": "1.0.0" + }, + "dependencies": { + "ansi-align": { + "version": "2.0.0", + "bundled": true, + "requires": { + "string-width": "2.1.1" + } + }, + "camelcase": { + "version": "4.1.0", + "bundled": true + }, + "cli-boxes": { + "version": "1.0.0", + "bundled": true + }, + "string-width": { + "version": "2.1.1", + "bundled": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "bundled": true + } + } + }, + "term-size": { + "version": "1.2.0", + "bundled": true, + "requires": { + "execa": "0.7.0" + }, + "dependencies": { + "execa": { + "version": "0.7.0", + "bundled": true, + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "bundled": true, + "requires": { + "lru-cache": "4.1.1", + "shebang-command": "1.2.0", + "which": "1.3.0" + }, + "dependencies": { + "shebang-command": { + "version": "1.2.0", + "bundled": true, + "requires": { + "shebang-regex": "1.0.0" + }, + "dependencies": { + "shebang-regex": { + "version": "1.0.0", + "bundled": true + } + } + } + } + }, + "get-stream": { + "version": "3.0.0", + "bundled": true + }, + "is-stream": { + "version": "1.1.0", + "bundled": true + }, + "npm-run-path": { + "version": "2.0.2", + "bundled": true, + "requires": { + "path-key": "2.0.1" + }, + "dependencies": { + "path-key": { + "version": "2.0.1", + "bundled": true + } + } + }, + "p-finally": { + "version": "1.0.0", + "bundled": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true + }, + "strip-eof": { + "version": "1.0.0", + "bundled": true + } + } + } + } + }, + "widest-line": { + "version": "1.0.0", + "bundled": true, + "requires": { + "string-width": "1.0.2" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "1.0.1" + }, + "dependencies": { + "number-is-nan": { + "version": "1.0.1", + "bundled": true + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "bundled": true + } + } + } + } + } + } + } + } + }, + "chalk": { + "version": "2.1.0", + "bundled": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.4.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.0", + "bundled": true, + "requires": { + "color-convert": "1.9.0" + }, + "dependencies": { + "color-convert": { + "version": "1.9.0", + "bundled": true, + "requires": { + "color-name": "1.1.3" + }, + "dependencies": { + "color-name": { + "version": "1.1.3", + "bundled": true + } + } + } + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "bundled": true + }, + "supports-color": { + "version": "4.4.0", + "bundled": true, + "requires": { + "has-flag": "2.0.0" + }, + "dependencies": { + "has-flag": { + "version": "2.0.0", + "bundled": true + } + } + } + } + }, + "configstore": { + "version": "3.1.1", + "bundled": true, + "requires": { + "dot-prop": "4.2.0", + "graceful-fs": "4.1.11", + "make-dir": "1.0.0", + "unique-string": "1.0.0", + "write-file-atomic": "2.3.0", + "xdg-basedir": "3.0.0" + }, + "dependencies": { + "dot-prop": { + "version": "4.2.0", + "bundled": true, + "requires": { + "is-obj": "1.0.1" + }, + "dependencies": { + "is-obj": { + "version": "1.0.1", + "bundled": true + } + } + }, + "make-dir": { + "version": "1.0.0", + "bundled": true, + "requires": { + "pify": "2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "bundled": true + } + } + }, + "unique-string": { + "version": "1.0.0", + "bundled": true, + "requires": { + "crypto-random-string": "1.0.0" + }, + "dependencies": { + "crypto-random-string": { + "version": "1.0.0", + "bundled": true + } + } + } + } + }, + "import-lazy": { + "version": "2.1.0", + "bundled": true + }, + "is-installed-globally": { + "version": "0.1.0", + "bundled": true, + "requires": { + "global-dirs": "0.1.0", + "is-path-inside": "1.0.0" + }, + "dependencies": { + "global-dirs": { + "version": "0.1.0", + "bundled": true, + "requires": { + "ini": "1.3.5" + } + }, + "is-path-inside": { + "version": "1.0.0", + "bundled": true, + "requires": { + "path-is-inside": "1.0.2" + } + } + } + }, + "is-npm": { + "version": "1.0.0", + "bundled": true + }, + "latest-version": { + "version": "3.1.0", + "bundled": true, + "requires": { + "package-json": "4.0.1" + }, + "dependencies": { + "package-json": { + "version": "4.0.1", + "bundled": true, + "requires": { + "got": "6.7.1", + "registry-auth-token": "3.3.1", + "registry-url": "3.1.0", + "semver": "5.5.0" + }, + "dependencies": { + "got": { + "version": "6.7.1", + "bundled": true, + "requires": { + "create-error-class": "3.0.2", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-redirect": "1.0.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "lowercase-keys": "1.0.0", + "safe-buffer": "5.1.1", + "timed-out": "4.0.1", + "unzip-response": "2.0.1", + "url-parse-lax": "1.0.0" + }, + "dependencies": { + "create-error-class": { + "version": "3.0.2", + "bundled": true, + "requires": { + "capture-stack-trace": "1.0.0" + }, + "dependencies": { + "capture-stack-trace": { + "version": "1.0.0", + "bundled": true + } + } + }, + "duplexer3": { + "version": "0.1.4", + "bundled": true + }, + "get-stream": { + "version": "3.0.0", + "bundled": true + }, + "is-redirect": { + "version": "1.0.0", + "bundled": true + }, + "is-retry-allowed": { + "version": "1.1.0", + "bundled": true + }, + "is-stream": { + "version": "1.1.0", + "bundled": true + }, + "lowercase-keys": { + "version": "1.0.0", + "bundled": true + }, + "timed-out": { + "version": "4.0.1", + "bundled": true + }, + "unzip-response": { + "version": "2.0.1", + "bundled": true + }, + "url-parse-lax": { + "version": "1.0.0", + "bundled": true, + "requires": { + "prepend-http": "1.0.4" + }, + "dependencies": { + "prepend-http": { + "version": "1.0.4", + "bundled": true + } + } + } + } + }, + "registry-auth-token": { + "version": "3.3.1", + "bundled": true, + "requires": { + "rc": "1.2.1", + "safe-buffer": "5.1.1" + }, + "dependencies": { + "rc": { + "version": "1.2.1", + "bundled": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "deep-extend": { + "version": "0.4.2", + "bundled": true + }, + "minimist": { + "version": "1.2.0", + "bundled": true + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true + } + } + } + } + }, + "registry-url": { + "version": "3.1.0", + "bundled": true, + "requires": { + "rc": "1.2.1" + }, + "dependencies": { + "rc": { + "version": "1.2.1", + "bundled": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "deep-extend": { + "version": "0.4.2", + "bundled": true + }, + "minimist": { + "version": "1.2.0", + "bundled": true + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true + } + } + } + } + } + } + } + } + }, + "semver-diff": { + "version": "2.1.0", + "bundled": true, + "requires": { + "semver": "5.5.0" + } + }, + "xdg-basedir": { + "version": "3.0.0", + "bundled": true + } + } + }, + "uuid": { + "version": "3.2.1", + "bundled": true + }, + "validate-npm-package-license": { + "version": "3.0.1", + "bundled": true, + "requires": { + "spdx-correct": "1.0.2", + "spdx-expression-parse": "1.0.4" + }, + "dependencies": { + "spdx-correct": { + "version": "1.0.2", + "bundled": true, + "requires": { + "spdx-license-ids": "1.2.2" + }, + "dependencies": { + "spdx-license-ids": { + "version": "1.2.2", + "bundled": true + } + } + }, + "spdx-expression-parse": { + "version": "1.0.4", + "bundled": true + } + } + }, + "validate-npm-package-name": { + "version": "3.0.0", + "bundled": true, + "requires": { + "builtins": "1.0.3" + }, + "dependencies": { + "builtins": { + "version": "1.0.3", + "bundled": true + } + } + }, + "which": { + "version": "1.3.0", + "bundled": true, + "requires": { + "isexe": "2.0.0" + }, + "dependencies": { + "isexe": { + "version": "2.0.0", + "bundled": true + } + } + }, + "worker-farm": { + "version": "1.5.4", + "bundled": true, + "requires": { + "errno": "0.1.7", + "xtend": "4.0.1" + }, + "dependencies": { + "errno": { + "version": "0.1.7", + "bundled": true, + "requires": { + "prr": "1.0.1" + }, + "dependencies": { + "prr": { + "version": "1.0.1", + "bundled": true + } + } + }, + "xtend": { + "version": "4.0.1", + "bundled": true + } + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true + }, + "write-file-atomic": { + "version": "2.3.0", + "bundled": true, + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "signal-exit": "3.0.2" + }, + "dependencies": { + "signal-exit": { + "version": "3.0.2", + "bundled": true + } + } + } + } + }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", diff --git a/package.json b/package.json index 763b48091..ddaba9006 100644 --- a/package.json +++ b/package.json @@ -29,5 +29,8 @@ "eslint-plugin-jsx-a11y": "^6.0.3", "eslint-plugin-react": "^7.7.0", "jest": "^22.4.3" + }, + "dependencies": { + "npm": "^5.8.0" } } diff --git a/src/data-structures/linked-list/LinkedList.js b/src/data-structures/linked-list/LinkedList.js index 829373015..3a3e9184f 100644 --- a/src/data-structures/linked-list/LinkedList.js +++ b/src/data-structures/linked-list/LinkedList.js @@ -3,6 +3,16 @@ import LinkedListNode from './LinkedListNode'; export default class LinkedList { constructor() { this.head = null; + this.tail = null; + } + + prepend({ value, key = null }) { + const newNode = new LinkedListNode({ value, key, next: this.head }); + + // Make new node to be a head. + this.head = newNode; + + return newNode; } append({ value, key = null }) { @@ -11,27 +21,14 @@ export default class LinkedList { // If there is no head yet let's make new node a head. if (!this.head) { this.head = newNode; + this.tail = newNode; return newNode; } - // Rewind to last node. - let currentNode = this.head; - while (currentNode.next !== null) { - currentNode = currentNode.next; - } - // Attach new node to the end of linked list. - currentNode.next = newNode; - - return newNode; - } - - prepend({ value, key = null }) { - const newNode = new LinkedListNode({ value, key, next: this.head }); - - // Make new node to be a head. - this.head = newNode; + this.tail.next = newNode; + this.tail = newNode; return newNode; } @@ -42,6 +39,7 @@ export default class LinkedList { // If there is no head yet let's make new node a head. if (!this.head) { this.head = newNode; + this.tail = newNode; return newNode; } @@ -66,6 +64,7 @@ export default class LinkedList { // Attach new node to the end of linked list. currentNode.next = newNode; + this.tail = newNode; return newNode; } @@ -90,8 +89,14 @@ export default class LinkedList { if (currentNode.next.value === value) { deletedNode = currentNode.next; currentNode.next = currentNode.next.next; + } else { + currentNode = currentNode.next; } - currentNode = currentNode.next; + } + + // Check if tail must be deleted. + if (this.tail.value === value) { + this.tail = currentNode; } return deletedNode; @@ -117,13 +122,44 @@ export default class LinkedList { if (currentNode.next.key === key) { deletedNode = currentNode.next; currentNode.next = currentNode.next.next; + } else { + currentNode = currentNode.next; } - currentNode = currentNode.next; + } + + // Check if tail must be deleted. + if (this.tail.key === key) { + this.tail = currentNode; } return deletedNode; } + deleteTail() { + if (this.head === this.tail) { + const deletedTail = this.tail; + this.head = null; + this.tail = null; + + return deletedTail; + } + + const deletedTail = this.tail; + + // Rewind to the last node and delete "next" link for the node before the last one. + let currentNode = this.head; + while (currentNode.next) { + if (!currentNode.next.next) { + currentNode.next = null; + } else { + currentNode = currentNode.next; + } + } + + this.tail = currentNode; + return deletedTail; + } + findByKey(key) { let currentNode = this.head; diff --git a/src/data-structures/linked-list/__test__/LinkedList.test.js b/src/data-structures/linked-list/__test__/LinkedList.test.js index ff6ddefba..bb58f49f8 100644 --- a/src/data-structures/linked-list/__test__/LinkedList.test.js +++ b/src/data-structures/linked-list/__test__/LinkedList.test.js @@ -9,6 +9,9 @@ describe('LinkedList', () => { it('should append node to linked list', () => { const linkedList = new LinkedList(); + expect(linkedList.head).toBeNull(); + expect(linkedList.tail).toBeNull(); + const node1 = linkedList.append({ value: 1 }); const node2 = linkedList.append({ value: 2, key: 'test' }); @@ -16,6 +19,9 @@ describe('LinkedList', () => { expect(node2.value).toBe(2); expect(node2.key).toBe('test'); + expect(linkedList.head.toString()).toBe('1'); + expect(linkedList.tail.toString()).toBe('test:2'); + expect(linkedList.toString()).toBe('1,test:2'); }); @@ -28,6 +34,9 @@ describe('LinkedList', () => { expect(node1.value).toBe(1); expect(node2.value).toBe(2); + expect(linkedList.head.toString()).toBe('2'); + expect(linkedList.tail.toString()).toBe('1'); + expect(linkedList.toString()).toBe('2,1'); }); @@ -38,18 +47,61 @@ describe('LinkedList', () => { linkedList.append({ value: 2 }); linkedList.append({ value: 3 }); linkedList.append({ value: 3 }); + linkedList.append({ value: 3 }); linkedList.append({ value: 4 }); linkedList.append({ value: 5 }); + expect(linkedList.head.toString()).toBe('1'); + expect(linkedList.tail.toString()).toBe('5'); + const deletedNode = linkedList.deleteByValue(3); expect(deletedNode.value).toBe(3); - expect(linkedList.toString()).toBe('1,2,3,4,5'); + expect(linkedList.toString()).toBe('1,2,4,5'); linkedList.deleteByValue(3); expect(linkedList.toString()).toBe('1,2,4,5'); linkedList.deleteByValue(1); expect(linkedList.toString()).toBe('2,4,5'); + + expect(linkedList.head.toString()).toBe('2'); + expect(linkedList.tail.toString()).toBe('5'); + + linkedList.deleteByValue(5); + expect(linkedList.toString()).toBe('2,4'); + + expect(linkedList.head.toString()).toBe('2'); + expect(linkedList.tail.toString()).toBe('4'); + + linkedList.deleteByValue(4); + expect(linkedList.toString()).toBe('2'); + + expect(linkedList.head.toString()).toBe('2'); + expect(linkedList.tail.toString()).toBe('2'); + }); + + it('should delete linked list tail', () => { + const linkedList = new LinkedList(); + + linkedList.append({ value: 1 }); + linkedList.append({ value: 2 }); + + expect(linkedList.head.toString()).toBe('1'); + expect(linkedList.tail.toString()).toBe('2'); + + const deletedNode1 = linkedList.deleteTail(); + + expect(deletedNode1.value).toBe(2); + expect(linkedList.toString()).toBe('1'); + expect(linkedList.head.toString()).toBe('1'); + expect(linkedList.tail.toString()).toBe('1'); + + const deletedNode2 = linkedList.deleteTail(); + + expect(deletedNode2.value).toBe(1); + expect(linkedList.toString()).toBe(''); + expect(linkedList.head).toBeNull(); + expect(linkedList.tail).toBeNull(); }); it('should delete node by key from linked list', () => { diff --git a/src/data-structures/queue/Queue.js b/src/data-structures/queue/Queue.js new file mode 100644 index 000000000..fa5db5410 --- /dev/null +++ b/src/data-structures/queue/Queue.js @@ -0,0 +1,28 @@ +import LinkedList from '../linked-list/LinkedList'; + +export default class Queue { + constructor() { + this.linkedList = new LinkedList(); + } + + isEmpty() { + return !this.linkedList.tail; + } + + peek() { + if (!this.linkedList.tail) { + return null; + } + + return this.linkedList.tail.value; + } + + add(value) { + this.linkedList.append({ value }); + } + + remove() { + const removedTail = this.linkedList.deleteTail(); + return removedTail ? removedTail.value : null; + } +} diff --git a/src/data-structures/queue/README.md b/src/data-structures/queue/README.md new file mode 100644 index 000000000..a9eca0911 --- /dev/null +++ b/src/data-structures/queue/README.md @@ -0,0 +1,8 @@ +# Queue + +|Operation |Complexity | +|---------------------------|-------------------| +|Find |O() | +|Insert/delete at beginning |O() | +|Insert/delete in middle |O() | +|Insert/delete at end |O() | diff --git a/src/data-structures/queue/__test__/Queue.test.js b/src/data-structures/queue/__test__/Queue.test.js new file mode 100644 index 000000000..195a1045a --- /dev/null +++ b/src/data-structures/queue/__test__/Queue.test.js @@ -0,0 +1,51 @@ +import Queue from '../Queue'; + +describe('Queue', () => { + it('should create empty queue', () => { + const queue = new Queue(); + expect(queue).not.toBeNull(); + expect(queue.linkedList).not.toBeNull(); + }); + + it('should add data to queue', () => { + const queue = new Queue(); + + queue.add(1); + queue.add(2); + + expect(queue.linkedList.toString()).toBe('1,2'); + }); + + it('should peek data from queue', () => { + const queue = new Queue(); + + expect(queue.peek()).toBeNull(); + + queue.add(1); + queue.add(2); + + expect(queue.peek()).toBe(2); + expect(queue.peek()).toBe(2); + }); + + it('should check if queue is empty', () => { + const queue = new Queue(); + + expect(queue.isEmpty()).toBeTruthy(); + + queue.add(1); + + expect(queue.isEmpty()).toBeFalsy(); + }); + + it('should remove from empty', () => { + const queue = new Queue(); + + queue.add(1); + queue.add(2); + + expect(queue.remove()).toBe(2); + expect(queue.remove()).toBe(1); + expect(queue.isEmpty()).toBeTruthy(); + }); +}); From fb59b60e30c3d56ad555dd34b65cad7f34d87b37 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Wed, 28 Mar 2018 16:25:26 +0300 Subject: [PATCH 022/327] Configure Travis. --- .travis.yml | 8 ++++++++ package.json | 3 ++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 587bd3e03..1c6c9bdf3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1 +1,9 @@ +sudo: required +dist: trusty language: node_js +node_js: + - node +script: + - npm run ci +notifications: + email: false diff --git a/package.json b/package.json index ddaba9006..6614dd450 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,8 @@ "main": "index.js", "scripts": { "lint": "eslint ./src/*", - "test": "jest" + "test": "jest", + "ci": "npm run lint && npm run test" }, "repository": { "type": "git", From 3203010f452944030d792b615168c47064b1b99b Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Wed, 28 Mar 2018 17:01:46 +0300 Subject: [PATCH 023/327] Add Stack. --- README.md | 6 +- src/data-structures/linked-list/LinkedList.js | 17 +++++ .../linked-list/__test__/LinkedList.test.js | 74 ++++++++++++++++--- src/data-structures/queue/Queue.js | 12 +-- src/data-structures/queue/README.md | 6 -- .../queue/__test__/Queue.test.js | 26 +++---- src/data-structures/stack/README.md | 1 + src/data-structures/stack/Stack.js | 28 +++++++ .../stack/__test__/Stack.test.js | 51 +++++++++++++ 9 files changed, 181 insertions(+), 40 deletions(-) create mode 100644 src/data-structures/stack/README.md create mode 100644 src/data-structures/stack/Stack.js create mode 100644 src/data-structures/stack/__test__/Stack.test.js diff --git a/README.md b/README.md index 7486af980..143f33d3d 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,9 @@ ## Data Structures -- [Linked List](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/linked-list) -- [Hash Table](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/hash-table) -- [Queue](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/queue) +1. [Linked List](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/linked-list) +2. [Queue](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/queue) +3. [Hash Table](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/hash-table) ## Running Tests diff --git a/src/data-structures/linked-list/LinkedList.js b/src/data-structures/linked-list/LinkedList.js index 3a3e9184f..f8968aaae 100644 --- a/src/data-structures/linked-list/LinkedList.js +++ b/src/data-structures/linked-list/LinkedList.js @@ -160,6 +160,23 @@ export default class LinkedList { return deletedTail; } + deleteHead() { + if (!this.head) { + return null; + } + + const deletedHead = this.head; + + if (this.head.next) { + this.head = this.head.next; + } else { + this.head = null; + this.tail = null; + } + + return deletedHead; + } + findByKey(key) { let currentNode = this.head; diff --git a/src/data-structures/linked-list/__test__/LinkedList.test.js b/src/data-structures/linked-list/__test__/LinkedList.test.js index bb58f49f8..2806e68ea 100644 --- a/src/data-structures/linked-list/__test__/LinkedList.test.js +++ b/src/data-structures/linked-list/__test__/LinkedList.test.js @@ -43,6 +43,8 @@ describe('LinkedList', () => { it('should delete node by value from linked list', () => { const linkedList = new LinkedList(); + expect(linkedList.deleteByValue(5)).toBeNull(); + linkedList.append({ value: 1 }); linkedList.append({ value: 2 }); linkedList.append({ value: 3 }); @@ -80,40 +82,85 @@ describe('LinkedList', () => { expect(linkedList.tail.toString()).toBe('2'); }); + it('should delete node by key from linked list', () => { + const linkedList = new LinkedList(); + + expect(linkedList.deleteByKey('key')).toBeNull(); + + linkedList.append({ value: 1, key: 'test1' }); + linkedList.append({ value: 2, key: 'test2' }); + linkedList.append({ value: 3, key: 'test3' }); + linkedList.append({ value: 4, key: 'test4' }); + + const deletedNode1 = linkedList.deleteByKey('test2'); + expect(deletedNode1.key).toBe('test2'); + expect(linkedList.toString()).toBe('test1:1,test3:3,test4:4'); + + const deletedNode2 = linkedList.deleteByKey('test1'); + expect(deletedNode2.key).toBe('test1'); + expect(linkedList.toString()).toBe('test3:3,test4:4'); + + const deletedNode3 = linkedList.deleteByKey('test4'); + expect(deletedNode3.key).toBe('test4'); + expect(linkedList.toString()).toBe('test3:3'); + }); + it('should delete linked list tail', () => { const linkedList = new LinkedList(); linkedList.append({ value: 1 }); linkedList.append({ value: 2 }); + linkedList.append({ value: 3 }); expect(linkedList.head.toString()).toBe('1'); - expect(linkedList.tail.toString()).toBe('2'); + expect(linkedList.tail.toString()).toBe('3'); const deletedNode1 = linkedList.deleteTail(); - expect(deletedNode1.value).toBe(2); + expect(deletedNode1.value).toBe(3); + expect(linkedList.toString()).toBe('1,2'); + expect(linkedList.head.toString()).toBe('1'); + expect(linkedList.tail.toString()).toBe('2'); + + const deletedNode2 = linkedList.deleteTail(); + + expect(deletedNode2.value).toBe(2); expect(linkedList.toString()).toBe('1'); expect(linkedList.head.toString()).toBe('1'); expect(linkedList.tail.toString()).toBe('1'); - const deletedNode2 = linkedList.deleteTail(); + const deletedNode3 = linkedList.deleteTail(); - expect(deletedNode2.value).toBe(1); + expect(deletedNode3.value).toBe(1); expect(linkedList.toString()).toBe(''); expect(linkedList.head).toBeNull(); expect(linkedList.tail).toBeNull(); }); - it('should delete node by key from linked list', () => { + it('should delete linked list head', () => { const linkedList = new LinkedList(); - linkedList.append({ value: 1, key: 'test1' }); - linkedList.append({ value: 2, key: 'test2' }); - linkedList.append({ value: 3, key: 'test3' }); + expect(linkedList.deleteHead()).toBeNull(); + + linkedList.append({ value: 1 }); + linkedList.append({ value: 2 }); + + expect(linkedList.head.toString()).toBe('1'); + expect(linkedList.tail.toString()).toBe('2'); - const deletedNode = linkedList.deleteByKey('test2'); - expect(deletedNode.key).toBe('test2'); - expect(linkedList.toString()).toBe('test1:1,test3:3'); + const deletedNode1 = linkedList.deleteHead(); + + expect(deletedNode1.value).toBe(1); + expect(linkedList.toString()).toBe('2'); + expect(linkedList.head.toString()).toBe('2'); + expect(linkedList.tail.toString()).toBe('2'); + + const deletedNode2 = linkedList.deleteHead(); + + expect(deletedNode2.value).toBe(2); + expect(linkedList.toString()).toBe(''); + expect(linkedList.head).toBeNull(); + expect(linkedList.tail).toBeNull(); }); it('should append unique nodes', () => { @@ -122,13 +169,16 @@ describe('LinkedList', () => { linkedList.appendUnique({ value: 1, key: 'test1' }); linkedList.appendUnique({ value: 2, key: 'test2' }); linkedList.appendUnique({ value: 3, key: 'test2' }); + linkedList.appendUnique({ value: 5, key: 'test1' }); - expect(linkedList.toString()).toBe('test1:1,test2:3'); + expect(linkedList.toString()).toBe('test1:5,test2:3'); }); it('should find node by its key', () => { const linkedList = new LinkedList(); + expect(linkedList.findByKey('test')).toBeNull(); + linkedList.appendUnique({ value: 1, key: 'test1' }); linkedList.appendUnique({ value: 2, key: 'test2' }); linkedList.appendUnique({ value: 3, key: 'test3' }); diff --git a/src/data-structures/queue/Queue.js b/src/data-structures/queue/Queue.js index fa5db5410..b2d504581 100644 --- a/src/data-structures/queue/Queue.js +++ b/src/data-structures/queue/Queue.js @@ -10,19 +10,19 @@ export default class Queue { } peek() { - if (!this.linkedList.tail) { + if (!this.linkedList.head) { return null; } - return this.linkedList.tail.value; + return this.linkedList.head.value; } - add(value) { + enqueue(value) { this.linkedList.append({ value }); } - remove() { - const removedTail = this.linkedList.deleteTail(); - return removedTail ? removedTail.value : null; + dequeue() { + const removedHead = this.linkedList.deleteHead(); + return removedHead ? removedHead.value : null; } } diff --git a/src/data-structures/queue/README.md b/src/data-structures/queue/README.md index a9eca0911..8b596a2f3 100644 --- a/src/data-structures/queue/README.md +++ b/src/data-structures/queue/README.md @@ -1,8 +1,2 @@ # Queue -|Operation |Complexity | -|---------------------------|-------------------| -|Find |O() | -|Insert/delete at beginning |O() | -|Insert/delete in middle |O() | -|Insert/delete at end |O() | diff --git a/src/data-structures/queue/__test__/Queue.test.js b/src/data-structures/queue/__test__/Queue.test.js index 195a1045a..d55292d98 100644 --- a/src/data-structures/queue/__test__/Queue.test.js +++ b/src/data-structures/queue/__test__/Queue.test.js @@ -7,11 +7,11 @@ describe('Queue', () => { expect(queue.linkedList).not.toBeNull(); }); - it('should add data to queue', () => { + it('should enqueue data to queue', () => { const queue = new Queue(); - queue.add(1); - queue.add(2); + queue.enqueue(1); + queue.enqueue(2); expect(queue.linkedList.toString()).toBe('1,2'); }); @@ -21,11 +21,11 @@ describe('Queue', () => { expect(queue.peek()).toBeNull(); - queue.add(1); - queue.add(2); + queue.enqueue(1); + queue.enqueue(2); - expect(queue.peek()).toBe(2); - expect(queue.peek()).toBe(2); + expect(queue.peek()).toBe(1); + expect(queue.peek()).toBe(1); }); it('should check if queue is empty', () => { @@ -33,19 +33,19 @@ describe('Queue', () => { expect(queue.isEmpty()).toBeTruthy(); - queue.add(1); + queue.enqueue(1); expect(queue.isEmpty()).toBeFalsy(); }); - it('should remove from empty', () => { + it('should dequeue from queue in FIFO order', () => { const queue = new Queue(); - queue.add(1); - queue.add(2); + queue.enqueue(1); + queue.enqueue(2); - expect(queue.remove()).toBe(2); - expect(queue.remove()).toBe(1); + expect(queue.dequeue()).toBe(1); + expect(queue.dequeue()).toBe(2); expect(queue.isEmpty()).toBeTruthy(); }); }); diff --git a/src/data-structures/stack/README.md b/src/data-structures/stack/README.md new file mode 100644 index 000000000..d095a2b0b --- /dev/null +++ b/src/data-structures/stack/README.md @@ -0,0 +1 @@ +# Queue diff --git a/src/data-structures/stack/Stack.js b/src/data-structures/stack/Stack.js new file mode 100644 index 000000000..3c2b0c451 --- /dev/null +++ b/src/data-structures/stack/Stack.js @@ -0,0 +1,28 @@ +import LinkedList from '../linked-list/LinkedList'; + +export default class Stack { + constructor() { + this.linkedList = new LinkedList(); + } + + isEmpty() { + return !this.linkedList.tail; + } + + peek() { + if (!this.linkedList.tail) { + return null; + } + + return this.linkedList.tail.value; + } + + push(value) { + this.linkedList.append({ value }); + } + + pop() { + const removedTail = this.linkedList.deleteTail(); + return removedTail ? removedTail.value : null; + } +} diff --git a/src/data-structures/stack/__test__/Stack.test.js b/src/data-structures/stack/__test__/Stack.test.js new file mode 100644 index 000000000..cf8addcfc --- /dev/null +++ b/src/data-structures/stack/__test__/Stack.test.js @@ -0,0 +1,51 @@ +import Stack from '../Stack'; + +describe('Stack', () => { + it('should create empty stack', () => { + const stack = new Stack(); + expect(stack).not.toBeNull(); + expect(stack.linkedList).not.toBeNull(); + }); + + it('should stack data to stack', () => { + const stack = new Stack(); + + stack.push(1); + stack.push(2); + + expect(stack.linkedList.toString()).toBe('1,2'); + }); + + it('should peek data from stack', () => { + const stack = new Stack(); + + expect(stack.peek()).toBeNull(); + + stack.push(1); + stack.push(2); + + expect(stack.peek()).toBe(2); + expect(stack.peek()).toBe(2); + }); + + it('should check if stack is empty', () => { + const stack = new Stack(); + + expect(stack.isEmpty()).toBeTruthy(); + + stack.push(1); + + expect(stack.isEmpty()).toBeFalsy(); + }); + + it('should pop data from stack', () => { + const stack = new Stack(); + + stack.push(1); + stack.push(2); + + expect(stack.pop()).toBe(2); + expect(stack.pop()).toBe(1); + expect(stack.isEmpty()).toBeTruthy(); + }); +}); From af3a7b9f8bb91b0160c9d2b73052dacebd4c222f Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Wed, 28 Mar 2018 17:02:20 +0300 Subject: [PATCH 024/327] Add Stack. --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 143f33d3d..082232320 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,8 @@ 1. [Linked List](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/linked-list) 2. [Queue](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/queue) -3. [Hash Table](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/hash-table) +3. [Stack](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/stack) +4. [Hash Table](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/hash-table) ## Running Tests From 481a017110753b0b37d3a96f35551ae90952280c Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 29 Mar 2018 10:22:08 +0300 Subject: [PATCH 025/327] Add Algorithms. --- README.md | 2 ++ src/algorithms/README.md | 7 +++++++ 2 files changed, 9 insertions(+) create mode 100644 src/algorithms/README.md diff --git a/README.md b/README.md index 082232320..856de5ae6 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,8 @@ 3. [Stack](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/stack) 4. [Hash Table](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/hash-table) +## Algorithms + ## Running Tests **Run all tests** diff --git a/src/algorithms/README.md b/src/algorithms/README.md new file mode 100644 index 000000000..df914d11d --- /dev/null +++ b/src/algorithms/README.md @@ -0,0 +1,7 @@ +# Algorithms + +## Dynamic Programming (DP) + +**Useful Links** + +[Introduction to Dynamic Programming 1](https://www.hackerearth.com/practice/algorithms/dynamic-programming/introduction-to-dynamic-programming-1/tutorial/) From bac8ef31e92e6e1b96bac6a94562ea64beaae241 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 29 Mar 2018 10:22:59 +0300 Subject: [PATCH 026/327] Add Algorithms. --- README.md | 2 +- src/algorithms/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 856de5ae6..85e6ea076 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ 3. [Stack](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/stack) 4. [Hash Table](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/hash-table) -## Algorithms +## [Algorithms](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms) ## Running Tests diff --git a/src/algorithms/README.md b/src/algorithms/README.md index df914d11d..f6a8ee80b 100644 --- a/src/algorithms/README.md +++ b/src/algorithms/README.md @@ -4,4 +4,4 @@ **Useful Links** -[Introduction to Dynamic Programming 1](https://www.hackerearth.com/practice/algorithms/dynamic-programming/introduction-to-dynamic-programming-1/tutorial/) +- [Introduction to Dynamic Programming 1](https://www.hackerearth.com/practice/algorithms/dynamic-programming/introduction-to-dynamic-programming-1/tutorial/) From 381077af9b22253282be4199777820693d15a2c4 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 29 Mar 2018 21:46:50 +0300 Subject: [PATCH 027/327] Add Algorithms. --- src/algorithms/fibonacci/README.md | 8 ++++++ .../fibonacci/__test__/fibonacci.test.js | 15 +++++++++++ src/algorithms/fibonacci/fibonacci.js | 26 +++++++++++++++++++ 3 files changed, 49 insertions(+) create mode 100644 src/algorithms/fibonacci/README.md create mode 100644 src/algorithms/fibonacci/__test__/fibonacci.test.js create mode 100644 src/algorithms/fibonacci/fibonacci.js diff --git a/src/algorithms/fibonacci/README.md b/src/algorithms/fibonacci/README.md new file mode 100644 index 000000000..bdaff2dcb --- /dev/null +++ b/src/algorithms/fibonacci/README.md @@ -0,0 +1,8 @@ +# Fibonacci Number + +In mathematics, the Fibonacci numbers are the numbers in the following +integer sequence, called the Fibonacci sequence, and characterized by +the fact that every number after the first two is the sum of the two +preceding ones: + +`0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...` diff --git a/src/algorithms/fibonacci/__test__/fibonacci.test.js b/src/algorithms/fibonacci/__test__/fibonacci.test.js new file mode 100644 index 000000000..56a58127d --- /dev/null +++ b/src/algorithms/fibonacci/__test__/fibonacci.test.js @@ -0,0 +1,15 @@ +import fibonacci from '../fibonacci'; + +describe('fibonacci', () => { + it('should calculate fibonacci correctly', () => { + expect(fibonacci(1)).toBe(1); + expect(fibonacci(2)).toBe(1); + expect(fibonacci(3)).toBe(2); + expect(fibonacci(4)).toBe(3); + expect(fibonacci(5)).toBe(5); + expect(fibonacci(6)).toBe(8); + expect(fibonacci(7)).toBe(13); + expect(fibonacci(8)).toBe(21); + expect(fibonacci(20)).toBe(6765); + }); +}); diff --git a/src/algorithms/fibonacci/fibonacci.js b/src/algorithms/fibonacci/fibonacci.js new file mode 100644 index 000000000..e1289f79d --- /dev/null +++ b/src/algorithms/fibonacci/fibonacci.js @@ -0,0 +1,26 @@ +// Calculate fibonacci number at specific position using Dynamic Programming approach. +export default function fibonacci(numberPosition) { + if (numberPosition === 1) { + return 1; + } + + let iterationsCounter = numberPosition - 1; + + // Calculated fibonacci number. + let fib = null; + // Previous fibonacci number. + let fibPrev = 1; + // Before previous fibonacci number. + let fibPrevPrev = 0; + + while (iterationsCounter) { + // Calculate current value using two previous ones. + fib = fibPrev + fibPrevPrev; + // Shift previous values. + fibPrevPrev = fibPrev; + fibPrev = fib; + iterationsCounter -= 1; + } + + return fib; +} From b0b9898a3346b56e4942ec660c5ec03535c81e7f Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 29 Mar 2018 21:48:01 +0300 Subject: [PATCH 028/327] Add Algorithms. --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 85e6ea076..44b4b2f4b 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,8 @@ ## [Algorithms](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms) +1. [Fibonacci Number](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/fibonacci) + ## Running Tests **Run all tests** From 3d903a4c7a730b347aa71f794eb7935cf35e08b8 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 29 Mar 2018 21:51:40 +0300 Subject: [PATCH 029/327] Add Algorithms. --- src/data-structures/README.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 src/data-structures/README.md diff --git a/src/data-structures/README.md b/src/data-structures/README.md new file mode 100644 index 000000000..725b35bfc --- /dev/null +++ b/src/data-structures/README.md @@ -0,0 +1,6 @@ +# Data Structures + +**Useful Links** + +- [YouTube Playlist](https://www.youtube.com/playlist?list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) + From dec187530bf9cb84c4e6bf83c772a7d99b209001 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 29 Mar 2018 21:52:30 +0300 Subject: [PATCH 030/327] Update README. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 44b4b2f4b..d5e6a3ab2 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![Build Status](https://travis-ci.org/trekhleb/javascript-algorithms.svg?branch=master)](https://travis-ci.org/trekhleb/javascript-algorithms) -## Data Structures +## [Data Structures](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures) 1. [Linked List](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/linked-list) 2. [Queue](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/queue) From 9182bde3af28101a546123735d1942a6c224a88e Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Fri, 30 Mar 2018 08:03:26 +0300 Subject: [PATCH 031/327] Add Heap. --- README.md | 1 + src/data-structures/heap/MinHeap.js | 118 ++++++++++++++++++ src/data-structures/heap/README.md | 1 + .../heap/__test__/MinHeap.test.js | 56 +++++++++ 4 files changed, 176 insertions(+) create mode 100644 src/data-structures/heap/MinHeap.js create mode 100644 src/data-structures/heap/README.md create mode 100644 src/data-structures/heap/__test__/MinHeap.test.js diff --git a/README.md b/README.md index d5e6a3ab2..00f42a22f 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ 2. [Queue](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/queue) 3. [Stack](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/stack) 4. [Hash Table](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/hash-table) +5. [Heap](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/heap) ## [Algorithms](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms) diff --git a/src/data-structures/heap/MinHeap.js b/src/data-structures/heap/MinHeap.js new file mode 100644 index 000000000..73e2a22d4 --- /dev/null +++ b/src/data-structures/heap/MinHeap.js @@ -0,0 +1,118 @@ +export default class MinHeap { + constructor() { + // Array representation of the heap. + this.heapContainer = []; + } + + static getLeftChildIndex(parentIndex) { + return (2 * parentIndex) + 1; + } + + static getRightChildIndex(parentIndex) { + return (2 * parentIndex) + 2; + } + + static getParentIndex(childIndex) { + return Math.floor((childIndex - 1) / 2); + } + + static hasParent(childIndex) { + return this.getParentIndex(childIndex) >= 0; + } + + hasLeftChild(parentIndex) { + return MinHeap.getLeftChildIndex(parentIndex) < this.heapContainer.length; + } + + hasRightChild(parentIndex) { + return MinHeap.getRightChildIndex(parentIndex) < this.heapContainer.length; + } + + leftChild(parentIndex) { + return this.heapContainer[MinHeap.getLeftChildIndex(parentIndex)]; + } + + rightChild(parentIndex) { + return this.heapContainer[MinHeap.getRightChildIndex(parentIndex)]; + } + + parent(childIndex) { + return this.heapContainer[MinHeap.getParentIndex(childIndex)]; + } + + swap(indexOne, indexTwo) { + const tmp = this.heapContainer[indexTwo]; + this.heapContainer[indexTwo] = this.heapContainer[indexOne]; + this.heapContainer[indexOne] = tmp; + } + + peek() { + if (this.heapContainer.length === 0) { + return null; + } + + return this.heapContainer[0]; + } + + poll() { + if (this.heapContainer.length === 0) { + return null; + } + + if (this.heapContainer.length === 1) { + return this.heapContainer.pop(); + } + + const item = this.heapContainer[0]; + + // Move the last element from the end to the head. + this.heapContainer[0] = this.heapContainer.pop(); + this.heapifyDown(); + + return item; + } + + add(item) { + this.heapContainer.push(item); + this.heapifyUp(); + } + + heapifyUp() { + let currentIndex = this.heapContainer.length - 1; + + while ( + MinHeap.hasParent(currentIndex) && + this.parent(currentIndex) > this.heapContainer[currentIndex] + ) { + this.swap(currentIndex, MinHeap.getParentIndex(currentIndex)); + currentIndex = MinHeap.getParentIndex(currentIndex); + } + } + + heapifyDown() { + let currentIndex = 0; + let nextIndex = 0; + + while (this.hasLeftChild(currentIndex)) { + if ( + this.hasRightChild(currentIndex) && + this.leftChild(currentIndex) > this.rightChild(currentIndex) + ) { + nextIndex = MinHeap.getRightChildIndex(currentIndex); + } else { + nextIndex = MinHeap.getLeftChildIndex(currentIndex); + } + + if (this.heapContainer[currentIndex] < this.heapContainer[nextIndex]) { + break; + } + + this.swap(currentIndex, nextIndex); + currentIndex = nextIndex; + } + } + + toString() { + return this.heapContainer.toString(); + } +} diff --git a/src/data-structures/heap/README.md b/src/data-structures/heap/README.md new file mode 100644 index 000000000..fdf00083a --- /dev/null +++ b/src/data-structures/heap/README.md @@ -0,0 +1 @@ +# Heap diff --git a/src/data-structures/heap/__test__/MinHeap.test.js b/src/data-structures/heap/__test__/MinHeap.test.js new file mode 100644 index 000000000..64963de24 --- /dev/null +++ b/src/data-structures/heap/__test__/MinHeap.test.js @@ -0,0 +1,56 @@ +import MinHeap from '../MinHeap'; + +describe('MinHeap', () => { + it('should create an empty min heap', () => { + const minHeap = new MinHeap(); + + expect(minHeap).toBeDefined(); + expect(minHeap.peek()).toBeNull(); + }); + + it('should add items to the heap and heapify it up', () => { + const minHeap = new MinHeap(); + + minHeap.add(5); + expect(minHeap.peek()).toBe(5); + expect(minHeap.toString()).toBe('5'); + + minHeap.add(3); + expect(minHeap.peek()).toBe(3); + expect(minHeap.toString()).toBe('3,5'); + + minHeap.add(10); + expect(minHeap.peek()).toBe(3); + expect(minHeap.toString()).toBe('3,5,10'); + + minHeap.add(1); + expect(minHeap.peek()).toBe(1); + expect(minHeap.toString()).toBe('1,3,10,5'); + }); + + it('should poll items from the heap and heapify it down', () => { + const minHeap = new MinHeap(); + + minHeap.add(5); + minHeap.add(3); + minHeap.add(10); + minHeap.add(1); + + expect(minHeap.toString()).toBe('1,3,10,5'); + + expect(minHeap.poll()).toBe(1); + expect(minHeap.toString()).toBe('3,5,10'); + + expect(minHeap.poll()).toBe(3); + expect(minHeap.toString()).toBe('5,10'); + + expect(minHeap.poll()).toBe(5); + expect(minHeap.toString()).toBe('10'); + + expect(minHeap.poll()).toBe(10); + expect(minHeap.toString()).toBe(''); + + expect(minHeap.poll()).toBeNull(); + expect(minHeap.toString()).toBe(''); + }); +}); From 74e6f009fac763bb1636d226740f2452b3fcc42a Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Fri, 30 Mar 2018 08:07:13 +0300 Subject: [PATCH 032/327] Add Heap. --- src/data-structures/heap/__test__/MinHeap.test.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/data-structures/heap/__test__/MinHeap.test.js b/src/data-structures/heap/__test__/MinHeap.test.js index 64963de24..99c8861ce 100644 --- a/src/data-structures/heap/__test__/MinHeap.test.js +++ b/src/data-structures/heap/__test__/MinHeap.test.js @@ -34,20 +34,24 @@ describe('MinHeap', () => { minHeap.add(5); minHeap.add(3); minHeap.add(10); + minHeap.add(11); minHeap.add(1); - expect(minHeap.toString()).toBe('1,3,10,5'); + expect(minHeap.toString()).toBe('1,3,10,11,5'); expect(minHeap.poll()).toBe(1); - expect(minHeap.toString()).toBe('3,5,10'); + expect(minHeap.toString()).toBe('3,5,10,11'); expect(minHeap.poll()).toBe(3); - expect(minHeap.toString()).toBe('5,10'); + expect(minHeap.toString()).toBe('5,11,10'); expect(minHeap.poll()).toBe(5); - expect(minHeap.toString()).toBe('10'); + expect(minHeap.toString()).toBe('10,11'); expect(minHeap.poll()).toBe(10); + expect(minHeap.toString()).toBe('11'); + + expect(minHeap.poll()).toBe(11); expect(minHeap.toString()).toBe(''); expect(minHeap.poll()).toBeNull(); From 4a51bb1ad128853accbe181eb837484241728b35 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Fri, 30 Mar 2018 08:23:33 +0300 Subject: [PATCH 033/327] Add big O info. --- assets/big-O-graph.jpeg | Bin 0 -> 92717 bytes src/algorithms/README.md | 4 ++++ 2 files changed, 4 insertions(+) create mode 100644 assets/big-O-graph.jpeg diff --git a/assets/big-O-graph.jpeg b/assets/big-O-graph.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..8f49c53cb635b15349b780e7e650b60c96e9dcde GIT binary patch literal 92717 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

uIwda*?wB4%R#oGWPeWM6Fj44$S!@$hB2PdG!0d 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 literal 0 HcmV?d00001 diff --git a/src/algorithms/README.md b/src/algorithms/README.md index f6a8ee80b..9d0ddbd3d 100644 --- a/src/algorithms/README.md +++ b/src/algorithms/README.md @@ -5,3 +5,7 @@ **Useful Links** - [Introduction to Dynamic Programming 1](https://www.hackerearth.com/practice/algorithms/dynamic-programming/introduction-to-dynamic-programming-1/tutorial/) + +## Big O Notation + +![Big O graphs](https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png "Logo Title Text 1") From 98ece3450bccb57b7abd748fccb608bca83b6512 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Fri, 30 Mar 2018 08:24:13 +0300 Subject: [PATCH 034/327] Add big O info. --- src/algorithms/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/algorithms/README.md b/src/algorithms/README.md index 9d0ddbd3d..81a071d1a 100644 --- a/src/algorithms/README.md +++ b/src/algorithms/README.md @@ -8,4 +8,4 @@ ## Big O Notation -![Big O graphs](https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png "Logo Title Text 1") +![Big O graphs](https://github.com/trekhleb/javascript-algorithms/blob/master/assets/big-O-graph.jpeg) From ffcce116f283d55478861cb49829072e7aba2d1b Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Fri, 30 Mar 2018 08:36:39 +0300 Subject: [PATCH 035/327] Add big O info. --- src/algorithms/README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/algorithms/README.md b/src/algorithms/README.md index 81a071d1a..31bf8a1eb 100644 --- a/src/algorithms/README.md +++ b/src/algorithms/README.md @@ -9,3 +9,13 @@ ## Big O Notation ![Big O graphs](https://github.com/trekhleb/javascript-algorithms/blob/master/assets/big-O-graph.jpeg) + +| Big O Notation | Computations for 10 elements | Computations for 100 elements | Computations for 10 elements | +| -------------- | ---------------------------- | ----------------------------- | ----------------------------- | +| O(1) | 1 | 1 | 1 | +| O(log N) | 3 | 6 | 9 | +| O(N) | 10 | 100 | 1000 | +| O(N log N) | 30 | 60 | 9000 | +| O(N^2) | 100 | 10000 | 1000000 | +| O(2^N) | 1024 | 1.26e+29 | 1.07e+301 | +| O(N!) | 3628800 | 9.3e+157 | 4.02e+2567 | From d7879984b94234dad33685c0b47c1ec2601852b2 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Fri, 30 Mar 2018 08:38:00 +0300 Subject: [PATCH 036/327] Add big O info. --- src/algorithms/README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/algorithms/README.md b/src/algorithms/README.md index 31bf8a1eb..94d684ccc 100644 --- a/src/algorithms/README.md +++ b/src/algorithms/README.md @@ -12,10 +12,10 @@ | Big O Notation | Computations for 10 elements | Computations for 100 elements | Computations for 10 elements | | -------------- | ---------------------------- | ----------------------------- | ----------------------------- | -| O(1) | 1 | 1 | 1 | -| O(log N) | 3 | 6 | 9 | -| O(N) | 10 | 100 | 1000 | -| O(N log N) | 30 | 60 | 9000 | -| O(N^2) | 100 | 10000 | 1000000 | -| O(2^N) | 1024 | 1.26e+29 | 1.07e+301 | -| O(N!) | 3628800 | 9.3e+157 | 4.02e+2567 | +| **O(1)** | 1 | 1 | 1 | +| **O(log N)** | 3 | 6 | 9 | +| **O(N)** | 10 | 100 | 1000 | +| **O(N log N)** | 30 | 60 | 9000 | +| **O(N^2)** | 100 | 10000 | 1000000 | +| **O(2^N)** | 1024 | 1.26e+29 | 1.07e+301 | +| **O(N!)** | 3628800 | 9.3e+157 | 4.02e+2567 | From 8f044f7d63fd9bfa80c3e4d635635c3842fa1a91 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Fri, 30 Mar 2018 08:44:30 +0300 Subject: [PATCH 037/327] Add big O info. --- assets/big-O-graph.jpeg | Bin 92717 -> 0 bytes assets/big-O-graph.png | Bin 0 -> 91202 bytes src/algorithms/README.md | 6 +++++- 3 files changed, 5 insertions(+), 1 deletion(-) delete mode 100644 assets/big-O-graph.jpeg create mode 100644 assets/big-O-graph.png diff --git a/assets/big-O-graph.jpeg b/assets/big-O-graph.jpeg deleted file mode 100644 index 8f49c53cb635b15349b780e7e650b60c96e9dcde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 92717 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

uIwda*?wB4%R#oGWPeWM6Fj44$S!@$hB2PdG!0d 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 diff --git a/assets/big-O-graph.png b/assets/big-O-graph.png new file mode 100644 index 0000000000000000000000000000000000000000..509eaf1ea3c41462ea423ab1d56e281a8e11e177 GIT binary patch literal 91202 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

  • 1Y3%I2fb5Q*t<6evwFlC9{m-x3 zIKf=OnJ?>h)8!Q7nL%V_`QjH}QTJusdW_lC3slm=Lon#NWZC(t7!7}gLU&{N6y@TL z%~o;_hQy`q;;0e~g?0~QCpK?AN{G-@q&85iP3NbJ7oub4m^vsktxz92fN|(8dB1I~ z-#bB->Lq3-{sHXMBAY4d)&*I zsojpF;O!YtP`-~kXD^Zb)ZiCX@zHF;Sf zuVN>M8MVR$2CV+QDO==fymCruXlO|3K}+<=Ygq6Z4^J@-suHMPakT*e`RLk(=;u!d z@<{V;cjs^9nslhDlw_14zd*?kn%3xhR=dT-OE2p9_bC=T!)pINW`MC(T+V&cXueGE z8)g;IE8Mp9Z0s5yYyWr)Xb$iSACb*fnc?m+6;jcngH#uyaaFeKQ#6YQ;Yr^#bmjYTE?hGEhDM$ZuLi%USc{ZrMHbY?0hQw-NibH1@Z9 zO^DezGiSy|@IpcJD{7(QzP8B*mdJ+#KCW&-xm_7Gn3eS>V^V|s z662Q_)fmEE1Q9XsEQYs?!P+ERnyt|E)DSJ|O9U;=H-Y`>B6($DlycnZt<{<@5pFDB zOP)T^|J_JOZPKXstk%@CQ~o&Ry_2m-|C*bk?|Y)ZCzzPdjA~^LGgo@|{f-kS@pNZkJCrjYCqqUXC4N&Hzzf#XZ5K@^K>s?GqORLWiqu!n|0`WK#)ta1`Y!l9)6 z|61gE$1^dvy2}``&t42IdehHXX2%xRmz_PkBB7t&MHDmbQ(u)ENDUr*AnfSimI#V^ZgstK`;d4J!khv2H6r%za z`cqz`eyMios7k(^ca5R8BQp$4KNkVSz$o}nw-{GD795hwN^tOt$!O@gvLvv`>#}d| z2Rgqgs3f;Y?nx&%IEU+rDii9&nd2=CXWLDh)nt&gvz;+98-_s($~Ru?>Cx!jKj$)~ z;vKtFKp2zE=?MRJRLqffTkGu%J#Qs#%K`%4+Y&#-Y6-Rj8z?3 z4UTaiJ8;ZjwcGO~FH5n+*W-+N0HgSeY9L03S|O*iNQslJsKyo3ucNv7ue;`$#QLe( zaKglddO>h-a9&nXXh1a6Xf|D!q!d$hEaAz3V7A=XPobL<;JCi~U(Wg~F)-ol=l`7V l{l5nL{|G_Ep~0Nc=%A|hho#~XN7rv6Au20UDD>6){{mc}%?AJg literal 0 HcmV?d00001 diff --git a/src/algorithms/README.md b/src/algorithms/README.md index 94d684ccc..2c25233a9 100644 --- a/src/algorithms/README.md +++ b/src/algorithms/README.md @@ -8,7 +8,11 @@ ## Big O Notation -![Big O graphs](https://github.com/trekhleb/javascript-algorithms/blob/master/assets/big-O-graph.jpeg) +Order of growth of algorithms specified in Big-O notation. Source: [Big-O Cheat Sheet](http://bigocheatsheet.com/). + +![Big O graphs](https://github.com/trekhleb/javascript-algorithms/blob/master/assets/big-O-graph.png) + +Below is the list of some of the most used Big O notations and their performance comparisons against different sizes of the input data. | Big O Notation | Computations for 10 elements | Computations for 100 elements | Computations for 10 elements | | -------------- | ---------------------------- | ----------------------------- | ----------------------------- | From 8cf4df6d6b3b5916962e561e3f836e5d5ee3203e Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Fri, 30 Mar 2018 08:45:07 +0300 Subject: [PATCH 038/327] Add big O info. --- src/algorithms/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/algorithms/README.md b/src/algorithms/README.md index 2c25233a9..5bd476f79 100644 --- a/src/algorithms/README.md +++ b/src/algorithms/README.md @@ -8,7 +8,7 @@ ## Big O Notation -Order of growth of algorithms specified in Big-O notation. Source: [Big-O Cheat Sheet](http://bigocheatsheet.com/). +Order of growth of algorithms specified in Big O notation. Source: [Big O Cheat Sheet](http://bigocheatsheet.com/). ![Big O graphs](https://github.com/trekhleb/javascript-algorithms/blob/master/assets/big-O-graph.png) From 652575bcc2a85e3e1609ad7d6f498e3cb745a28a Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Fri, 30 Mar 2018 10:13:58 +0300 Subject: [PATCH 039/327] Add big O info. --- assets/big-o-data-structures.png | Bin 0 -> 408988 bytes assets/{big-O-graph.png => big-o-graph.png} | Bin src/algorithms/README.md | 6 ++++-- src/data-structures/README.md | 5 +++++ 4 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 assets/big-o-data-structures.png rename assets/{big-O-graph.png => big-o-graph.png} (100%) diff --git a/assets/big-o-data-structures.png b/assets/big-o-data-structures.png new file mode 100644 index 0000000000000000000000000000000000000000..98023c52fa5ec286370339c6a26fdf5987f6f973 GIT binary patch literal 408988 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

    Q+fZ|ijm>Fg^&S7Lz^q_)CkHKuP(a@ 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 literal 408988 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

    Q+fZ|ijm>Fg^&S7Lz^q_)CkHKuP(a@ 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 From 5e6f0dc477b20454115a80bd856891b596181b93 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Sun, 15 Apr 2018 06:56:15 +0300 Subject: [PATCH 151/327] Add quick sort. --- README.md | 34 ++++++++++++---------------------- 1 file changed, 12 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 4246f848c..95b0ffcbf 100644 --- a/README.md +++ b/README.md @@ -89,29 +89,19 @@ Below is the list of some of the most used Big O notations and their performance | **O(2^N)** | 1024 | 1.26e+29 | 1.07e+301 | | **O(N!)** | 3628800 | 9.3e+157 | 4.02e+2567 | -### Common Data Structure Operations Complexity - - - - - - - - - -
    OneTwo
    Three
    - -| Data Structure | Access | Search | Insertion | Deletion | +### Data Structure Operations Complexity + +| Data Structure | Access | Search | Insertion | Deletion | | ----------------------- | :-------: | :-------: | :-------: | :-------: | -| **Array** | 1 | n | n | n | -| **Stack** | n | n | 1 | 1 | -| **Queue** | n | n | 1 | 1 | -| **Linked List** | n | n | 1 | 1 | -| **Hash Table** | | n | n | n | -| **Binary Search Tree** | n | n | n | n | -| **B-Tree** | log(n) | log(n) | log(n) | log(n) | -| **Red-Black Tree** | log(n) | log(n) | log(n) | log(n) | -| **AVL Tree** | log(n) | log(n) | log(n) | log(n) | +| **Array** | 1 | n | n | n | +| **Stack** | n | n | 1 | 1 | +| **Queue** | n | n | 1 | 1 | +| **Linked List** | n | n | 1 | 1 | +| **Hash Table** | - | n | n | n | +| **Binary Search Tree** | n | n | n | n | +| **B-Tree** | log(n) | log(n) | log(n) | log(n) | +| **Red-Black Tree** | log(n) | log(n) | log(n) | log(n) | +| **AVL Tree** | log(n) | log(n) | log(n) | log(n) | ### Array Sorting Algorithms Complexity From edbfdf65d33f5d72ab79d57e41b0040ead7dc6ec Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Sun, 15 Apr 2018 06:57:34 +0300 Subject: [PATCH 152/327] Add quick sort. --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 95b0ffcbf..4abeb5b1a 100644 --- a/README.md +++ b/README.md @@ -75,6 +75,7 @@ npm test -- -t 'playground' Order of growth of algorithms specified in Big O notation. ![Big O graphs](https://github.com/trekhleb/javascript-algorithms/blob/master/assets/big-o-graph.png) + Source: [Big O Cheat Sheet](http://bigocheatsheet.com/). Below is the list of some of the most used Big O notations and their performance comparisons against different sizes of the input data. From ddcfd6c049c185f09f1df3c36a024f69bdb00b1e Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Sun, 15 Apr 2018 08:42:01 +0300 Subject: [PATCH 153/327] Add quick sort. --- README.md | 20 ++++--- src/algorithms/sorting/SortTester.js | 3 +- src/algorithms/sorting/shell-sort/README.md | 48 ++++++++++++++++ .../sorting/shell-sort/ShellSort.js | 41 ++++++++++++++ .../shell-sort/__test__/ShellSort.test.js | 56 +++++++++++++++++++ 5 files changed, 158 insertions(+), 10 deletions(-) create mode 100644 src/algorithms/sorting/shell-sort/README.md create mode 100644 src/algorithms/sorting/shell-sort/ShellSort.js create mode 100644 src/algorithms/sorting/shell-sort/__test__/ShellSort.test.js diff --git a/README.md b/README.md index 4abeb5b1a..5873a212a 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,8 @@ * [Insertion Sort](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sorting/insertion-sort) * [Heap Sort](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sorting/heap-sort) * [Merge Sort](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sorting/merge-sort) - * [Quick Sort](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sorting/quick-sort) + * [Quicksort](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sorting/quick-sort) + * [Shellsort](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sorting/shell-sort) ## Running Tests @@ -106,11 +107,12 @@ Below is the list of some of the most used Big O notations and their performance ### Array Sorting Algorithms Complexity -| Name | Best | Average | Worst | Memory | Stable | -| --------------------- | :-------: | :-------: | :-------: | :-------: | :-------: | -| **Bubble sort** | n | n^2 | n^2 | 1 | Yes | -| **Insertion sort** | n | n^2 | n^2 | 1 | Yes | -| **Selection sort** | n^2 | n^2 | n^2 | 1 | No | -| **Heap sort** | n log(n) | n log(n) | n log(n) | 1 | No | -| **Merge sort** | n log(n) | n log(n) | n log(n) | n | Yes | -| **Quick sort** | n log(n) | n log(n) | n^2 | log(n) | No | +| Name | Best | Average | Worst | Memory | Stable | +| --------------------- | :-------: | :-------: | :-----------: | :-------: | :-------: | +| **Bubble sort** | n | n^2 | n^2 | 1 | Yes | +| **Insertion sort** | n | n^2 | n^2 | 1 | Yes | +| **Selection sort** | n^2 | n^2 | n^2 | 1 | No | +| **Heap sort** | n log(n) | n log(n) | n log(n) | 1 | No | +| **Merge sort** | n log(n) | n log(n) | n log(n) | n | Yes | +| **Quick sort** | n log(n) | n log(n) | n^2 | log(n) | No | +| **Shell sort** | n log(n) | depends on gap sequence | n (log(n))^2 | 1 | No | diff --git a/src/algorithms/sorting/SortTester.js b/src/algorithms/sorting/SortTester.js index 725793e00..696f6e28a 100644 --- a/src/algorithms/sorting/SortTester.js +++ b/src/algorithms/sorting/SortTester.js @@ -32,7 +32,7 @@ export class SortTester { expect(sorter.sort([''])).toEqual(['']); expect(sorter.sort(['a'])).toEqual(['a']); expect(sorter.sort(['aa', 'a'])).toEqual(['a', 'aa']); - expect(sorter.sort(['aa', 'q', 'a', 'bbbb', 'ccc'])).toEqual(['q', 'a', 'aa', 'ccc', 'bbbb']); + expect(sorter.sort(['aa', 'q', 'bbbb', 'ccc'])).toEqual(['q', 'aa', 'ccc', 'bbbb']); expect(sorter.sort(['aa', 'aa'])).toEqual(['aa', 'aa']); } @@ -49,6 +49,7 @@ export class SortTester { const sorter = new SortingClass(callbacks); expect(sorter.sort(['bb', 'aa', 'c'])).toEqual(['c', 'bb', 'aa']); + expect(sorter.sort(['aa', 'q', 'a', 'bbbb', 'ccc'])).toEqual(['q', 'a', 'aa', 'ccc', 'bbbb']); } static testAlgorithmTimeComplexity(SortingClass, arrayToBeSorted, numberOfVisits) { diff --git a/src/algorithms/sorting/shell-sort/README.md b/src/algorithms/sorting/shell-sort/README.md new file mode 100644 index 000000000..9d202c55e --- /dev/null +++ b/src/algorithms/sorting/shell-sort/README.md @@ -0,0 +1,48 @@ +# Shellsort + +Shellsort, also known as Shell sort or Shell's method, +is an in-place comparison sort. It can be seen as either a +generalization of sorting by exchange (bubble sort) or sorting +by insertion (insertion sort). The method starts by sorting +pairs of elements far apart from each other, then progressively +reducing the gap between elements to be compared. Starting +with far apart elements, it can move some out-of-place +elements into position faster than a simple nearest neighbor +exchange + +![Shellsort](https://upload.wikimedia.org/wikipedia/commons/d/d8/Sorting_shellsort_anim.gif) + +## How Shell Sort Works + +For our example and ease of understanding, we take the interval +of `4`. Make a virtual sub-list of all values located at the +interval of 4 positions. Here these values are +`{35, 14}`, `{33, 19}`, `{42, 27}` and `{10, 44}` + +![Shellsort](https://www.tutorialspoint.com/data_structures_algorithms/images/shell_sort_gap_4.jpg) + +We compare values in each sub-list and swap them (if necessary) +in the original array. After this step, the new array should +look like this + +![Shellsort](https://www.tutorialspoint.com/data_structures_algorithms/images/shell_sort_step_1.jpg) + +Then, we take interval of 2 and this gap generates two sub-lists +- `{14, 27, 35, 42}`, `{19, 10, 33, 44}` + +![Shellsort](https://www.tutorialspoint.com/data_structures_algorithms/images/shell_sort_gap_2.jpg) + +We compare and swap the values, if required, in the original array. +After this step, the array should look like this + +![Shellsort](https://www.tutorialspoint.com/data_structures_algorithms/images/shell_sort_step_2.jpg) + +Finally, we sort the rest of the array using interval of value 1. +Shell sort uses insertion sort to sort the array. + +![Shellsort](https://www.tutorialspoint.com/data_structures_algorithms/images/shell_sort.jpg) + +## References + +* [Tutorials Point](https://www.tutorialspoint.com/data_structures_algorithms/shell_sort_algorithm.htm) +* [Wikipedia](https://en.wikipedia.org/wiki/Shellsort) diff --git a/src/algorithms/sorting/shell-sort/ShellSort.js b/src/algorithms/sorting/shell-sort/ShellSort.js new file mode 100644 index 000000000..eac410456 --- /dev/null +++ b/src/algorithms/sorting/shell-sort/ShellSort.js @@ -0,0 +1,41 @@ +import Sort from '../Sort'; + +export default class ShellSort extends Sort { + sort(originalArray) { + // Prevent original array from mutations. + const array = originalArray.slice(0); + + // Define a gap distance. + let gap = Math.floor(array.length / 2); + + // Until gap is bigger then zero do elements comparisons and swaps. + while (gap > 0) { + // Go and compare all distant element pairs. + for (let i = 0; i < (array.length - gap); i += 1) { + let currentIndex = i; + let gapShiftedIndex = i + gap; + + while (currentIndex >= 0) { + // Call visiting callback. + this.callbacks.visitingCallback(array[currentIndex]); + + // Compare and swap array elements if needed. + if (this.comparator.lessThen(array[gapShiftedIndex], array[currentIndex])) { + const tmp = array[currentIndex]; + array[currentIndex] = array[gapShiftedIndex]; + array[gapShiftedIndex] = tmp; + } + + gapShiftedIndex = currentIndex; + currentIndex -= gap; + } + } + + // Shrink the gap. + gap = Math.floor(gap / 2); + } + + // Return sorted copy of an original array. + return array; + } +} diff --git a/src/algorithms/sorting/shell-sort/__test__/ShellSort.test.js b/src/algorithms/sorting/shell-sort/__test__/ShellSort.test.js new file mode 100644 index 000000000..c05aa6cd1 --- /dev/null +++ b/src/algorithms/sorting/shell-sort/__test__/ShellSort.test.js @@ -0,0 +1,56 @@ +import ShellSort from '../ShellSort'; +import { + equalArr, + notSortedArr, + reverseArr, + sortedArr, + SortTester, +} from '../../SortTester'; + +// Complexity constants. +const SORTED_ARRAY_VISITING_COUNT = 320; +const NOT_SORTED_ARRAY_VISITING_COUNT = 320; +const REVERSE_SORTED_ARRAY_VISITING_COUNT = 320; +const EQUAL_ARRAY_VISITING_COUNT = 320; + +describe('ShellSort', () => { + it('should sort array', () => { + SortTester.testSort(ShellSort); + }); + + it('should sort array with custom comparator', () => { + SortTester.testSortWithCustomComparator(ShellSort); + }); + + it('should visit EQUAL array element specified number of times', () => { + SortTester.testAlgorithmTimeComplexity( + ShellSort, + equalArr, + EQUAL_ARRAY_VISITING_COUNT, + ); + }); + + it('should visit SORTED array element specified number of times', () => { + SortTester.testAlgorithmTimeComplexity( + ShellSort, + sortedArr, + SORTED_ARRAY_VISITING_COUNT, + ); + }); + + it('should visit NOT SORTED array element specified number of times', () => { + SortTester.testAlgorithmTimeComplexity( + ShellSort, + notSortedArr, + NOT_SORTED_ARRAY_VISITING_COUNT, + ); + }); + + it('should visit REVERSE SORTED array element specified number of times', () => { + SortTester.testAlgorithmTimeComplexity( + ShellSort, + reverseArr, + REVERSE_SORTED_ARRAY_VISITING_COUNT, + ); + }); +}); From db5c576cb7d7baafdaef5f2cb2a57b2e040c0674 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Mon, 16 Apr 2018 19:30:29 +0300 Subject: [PATCH 154/327] Add binary search. --- README.md | 2 ++ src/algorithms/search/binary-search/README.md | 17 +++++++++ .../__test__/binarySearch.test.js | 34 ++++++++++++++++++ .../search/binary-search/binarySearch.js | 35 +++++++++++++++++++ 4 files changed, 88 insertions(+) create mode 100644 src/algorithms/search/binary-search/README.md create mode 100644 src/algorithms/search/binary-search/__test__/binarySearch.test.js create mode 100644 src/algorithms/search/binary-search/binarySearch.js diff --git a/README.md b/README.md index 5873a212a..e8a8bcc8c 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,8 @@ * Graph * [Depth-First Search (DFS)](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/depth-first-search) * [Breadth-First Search (BFS)](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/breadth-first-search) +* Search + * [Binary Search](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/search/binary-search) * Sorting * [Bubble Sort](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sorting/bubble-sort) * [Selection Sort](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sorting/selection-sort) diff --git a/src/algorithms/search/binary-search/README.md b/src/algorithms/search/binary-search/README.md new file mode 100644 index 000000000..0b55e1aab --- /dev/null +++ b/src/algorithms/search/binary-search/README.md @@ -0,0 +1,17 @@ +# Binary Search + +In computer science, binary search, also known as half-interval +search, logarithmic search, or binary chop, is a search algorithm +that finds the position of a target value within a sorted +array. Binary search compares the target value to the middle +element of the array; if they are unequal, the half in which +the target cannot lie is eliminated and the search continues +on the remaining half until it is successful. If the search +ends with the remaining half being empty, the target is not +in the array. + +![Binary Search](https://upload.wikimedia.org/wikipedia/commons/8/83/Binary_Search_Depiction.svg) + +## References + +[Wikipedia](https://en.wikipedia.org/wiki/Binary_search_algorithm) diff --git a/src/algorithms/search/binary-search/__test__/binarySearch.test.js b/src/algorithms/search/binary-search/__test__/binarySearch.test.js new file mode 100644 index 000000000..72c2b344f --- /dev/null +++ b/src/algorithms/search/binary-search/__test__/binarySearch.test.js @@ -0,0 +1,34 @@ +import binarySearch from '../binarySearch'; + +describe('binarySearch', () => { + it('should search number in sorted array', () => { + expect(binarySearch([], 1)).toBe(-1); + expect(binarySearch([1], 1)).toBe(0); + expect(binarySearch([1, 2], 1)).toBe(0); + expect(binarySearch([1, 2], 2)).toBe(1); + expect(binarySearch([1, 5, 10, 12], 1)).toBe(0); + expect(binarySearch([1, 5, 10, 12, 14, 17, 22, 100], 17)).toBe(5); + expect(binarySearch([1, 5, 10, 12, 14, 17, 22, 100], 1)).toBe(0); + expect(binarySearch([1, 5, 10, 12, 14, 17, 22, 100], 100)).toBe(7); + expect(binarySearch([1, 5, 10, 12, 14, 17, 22, 100], 0)).toBe(-1); + }); + + it('should search object in sorted array', () => { + const sortedArrayOfObjects = [ + { key: 1, value: 'value1' }, + { key: 2, value: 'value2' }, + { key: 3, value: 'value3' }, + ]; + + const comparator = (a, b) => { + if (a.key === b.key) return 0; + return a.key < b.key ? -1 : 1; + }; + + expect(binarySearch([], { key: 1 }, comparator)).toBe(-1); + expect(binarySearch(sortedArrayOfObjects, { key: 4 }, comparator)).toBe(-1); + expect(binarySearch(sortedArrayOfObjects, { key: 1 }, comparator)).toBe(0); + expect(binarySearch(sortedArrayOfObjects, { key: 2 }, comparator)).toBe(1); + expect(binarySearch(sortedArrayOfObjects, { key: 3 }, comparator)).toBe(2); + }); +}); diff --git a/src/algorithms/search/binary-search/binarySearch.js b/src/algorithms/search/binary-search/binarySearch.js new file mode 100644 index 000000000..cc85b1ff2 --- /dev/null +++ b/src/algorithms/search/binary-search/binarySearch.js @@ -0,0 +1,35 @@ +import Comparator from '../../../utils/comparator/Comparator'; + +/** + * @param {*[]} sortedArray + * @param {*} seekElement + * @param {function(a, b)} [comparatorCallback] + * @return {number} + */ + +export default function binarySearch(sortedArray, seekElement, comparatorCallback) { + const comparator = new Comparator(comparatorCallback); + + let startIndex = 0; + let endIndex = sortedArray.length - 1; + + while (startIndex <= endIndex) { + const middleIndex = startIndex + Math.floor((endIndex - startIndex) / 2); + + // If we've found the element just return its position. + if (comparator.equal(sortedArray[middleIndex], seekElement)) { + return middleIndex; + } + + // Decide which half to choose for seeking next: left or right one. + if (comparator.lessThen(sortedArray[middleIndex], seekElement)) { + // Go to the right half of the array. + startIndex = middleIndex + 1; + } else { + // Go to the left half of the array. + endIndex = middleIndex - 1; + } + } + + return -1; +} From b305b19edce29398a8563d140fc20514300299db Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Mon, 16 Apr 2018 20:49:52 +0300 Subject: [PATCH 155/327] Update README. --- README.md | 64 +++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 57 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index e8a8bcc8c..4ec02b5f8 100644 --- a/README.md +++ b/README.md @@ -17,22 +17,43 @@ 8. [Tree](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/tree) * [Binary Search Tree](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/tree/binary-search-tree) * [AVL Tree](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/tree/avl-tree) + * B-Tree + * 2-3 Tree + * Red-Black Tree + * Suffix Tree + * Segment Tree or Interval Tree + * Binary Indexed Tree or Fenwick Tree 9. [Graph](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/graph) ### Algorithms -* Math +* **Math** * [Fibonacci Number](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/fibonacci) * [Cartesian Product](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/cartesian-product) * [Power Set](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/power-set) -* String + * Collatz Conjecture algorithm + * Extended Euclidean algorithm + * Euclidean algorithm to calculate the Greatest Common Divisor (GCD) + * Find Divisors + * Fisher-Yates + * Greatest Difference + * Least Common Multiple + * Newton's square + * Primality Test + * Shannon Entropy +* **String** * [String Permutations](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/permutations) -* Graph - * [Depth-First Search (DFS)](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/depth-first-search) - * [Breadth-First Search (BFS)](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/breadth-first-search) -* Search + * Combination + * Minimum Edit distance (Levenshtein Distance) + * Hamming + * Huffman + * Knuth Morris Pratt + * Longest common subsequence + * longest common substring + * Rabin Karp +* **Search** * [Binary Search](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/search/binary-search) -* Sorting +* **Sorting** * [Bubble Sort](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sorting/bubble-sort) * [Selection Sort](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sorting/selection-sort) * [Insertion Sort](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sorting/insertion-sort) @@ -40,6 +61,35 @@ * [Merge Sort](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sorting/merge-sort) * [Quicksort](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sorting/quick-sort) * [Shellsort](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sorting/shell-sort) +* **Graph** + * [Depth-First Search (DFS)](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/depth-first-search) + * [Breadth-First Search (BFS)](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/breadth-first-search) + * Detect Cycle + * Topological Sorting + * Dijkstra Algorithm to Find Shortest Path + * Eulerian path, Eulerian circuit + * Bellman Ford + * Strongly Connected Component algorithm + * Shortest Path Faster Algorithm (SPFA) +* **Tree** + * Depth-First Search (DFS) + * Breadth-First Search (BFS) +* **Minimum Spanning Tree** + * Prim’s algorithm + * Kruskal’s algorithm +* **Dynamic Programming** + * Increasing subsequence + * Knapsack problem + * Maximum subarray + * Maximum sum path + * Integer Partition + * Longest common Subsequence + * Longest Increasing subsequence + * Shortest common supersequence +* **Uncategorized** + * Union-Find + * Maze + ## Running Tests From 98bebe92948fc55af0d3d0d6fbddc1102736370c Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Mon, 16 Apr 2018 22:03:10 +0300 Subject: [PATCH 156/327] Update README. --- README.md | 2 +- src/algorithms/math/primality-tests/README.md | 14 ++++++++++ .../primality-tests/__test__/primalityTest.js | 22 +++++++++++++++ .../__test__/trialDivision.test.js | 8 ++++++ .../math/primality-tests/trialDivision.js | 28 +++++++++++++++++++ 5 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 src/algorithms/math/primality-tests/README.md create mode 100644 src/algorithms/math/primality-tests/__test__/primalityTest.js create mode 100644 src/algorithms/math/primality-tests/__test__/trialDivision.test.js create mode 100644 src/algorithms/math/primality-tests/trialDivision.js diff --git a/README.md b/README.md index 4ec02b5f8..7a8393168 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,7 @@ * [Fibonacci Number](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/fibonacci) * [Cartesian Product](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/cartesian-product) * [Power Set](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/power-set) + * [Primality Tests](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/primality-tests) * Collatz Conjecture algorithm * Extended Euclidean algorithm * Euclidean algorithm to calculate the Greatest Common Divisor (GCD) @@ -39,7 +40,6 @@ * Greatest Difference * Least Common Multiple * Newton's square - * Primality Test * Shannon Entropy * **String** * [String Permutations](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/permutations) diff --git a/src/algorithms/math/primality-tests/README.md b/src/algorithms/math/primality-tests/README.md new file mode 100644 index 000000000..fd5af6568 --- /dev/null +++ b/src/algorithms/math/primality-tests/README.md @@ -0,0 +1,14 @@ +# Primality Test + +A primality test is an algorithm for determining whether an input +number is prime. Among other fields of mathematics, it is used +for cryptography. Unlike integer factorization, primality tests +do not generally give prime factors, only stating whether the +input number is prime or not. Factorization is thought to be +a computationally difficult problem, whereas primality testing +is comparatively easy (its running time is polynomial in the +size of the input). + +## References + +[Wikipedia](https://en.wikipedia.org/wiki/Primality_test) diff --git a/src/algorithms/math/primality-tests/__test__/primalityTest.js b/src/algorithms/math/primality-tests/__test__/primalityTest.js new file mode 100644 index 000000000..96edb3c67 --- /dev/null +++ b/src/algorithms/math/primality-tests/__test__/primalityTest.js @@ -0,0 +1,22 @@ +/** + * @param {function(n: number)} testFunction + */ +export default function primalityTest(testFunction) { + expect(testFunction(1)).toBeTruthy(); + expect(testFunction(2)).toBeTruthy(); + expect(testFunction(3)).toBeTruthy(); + expect(testFunction(5)).toBeTruthy(); + expect(testFunction(11)).toBeTruthy(); + expect(testFunction(191)).toBeTruthy(); + expect(testFunction(191)).toBeTruthy(); + expect(testFunction(199)).toBeTruthy(); + + expect(testFunction(-1)).toBeFalsy(); + expect(testFunction(0)).toBeFalsy(); + expect(testFunction(4)).toBeFalsy(); + expect(testFunction(6)).toBeFalsy(); + expect(testFunction(12)).toBeFalsy(); + expect(testFunction(192)).toBeFalsy(); + expect(testFunction(200)).toBeFalsy(); + expect(testFunction(400)).toBeFalsy(); +} diff --git a/src/algorithms/math/primality-tests/__test__/trialDivision.test.js b/src/algorithms/math/primality-tests/__test__/trialDivision.test.js new file mode 100644 index 000000000..c9c8ea1e3 --- /dev/null +++ b/src/algorithms/math/primality-tests/__test__/trialDivision.test.js @@ -0,0 +1,8 @@ +import trialDivision from '../trialDivision'; +import primalityTest from './primalityTest'; + +describe('trialDivision', () => { + it('should detect prime numbers', () => { + primalityTest(trialDivision); + }); +}); diff --git a/src/algorithms/math/primality-tests/trialDivision.js b/src/algorithms/math/primality-tests/trialDivision.js new file mode 100644 index 000000000..eb3272e21 --- /dev/null +++ b/src/algorithms/math/primality-tests/trialDivision.js @@ -0,0 +1,28 @@ +/** + * @param {number} number + * @return {boolean} + */ +export default function trialDivision(number) { + if (number <= 0) { + // If number is less then one then it isn't prime by definition. + return false; + } else if (number <= 3) { + // All numbers from 1 to 3 are prime. + return true; + } + + // If the number is not divided by 2 then we may eliminate all further even dividers. + if (number % 2 === 0) { + return false; + } + + // If there is no dividers up to square root of n then there is no higher dividers as well. + const dividerLimit = Math.sqrt(number); + for (let divider = 3; divider < dividerLimit; divider += 2) { + if (number % divider === 0) { + return false; + } + } + + return true; +} From 9999ec34220f2380429a47da935dcc59b8a35b76 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Mon, 16 Apr 2018 22:09:41 +0300 Subject: [PATCH 157/327] Add primality tests. --- src/algorithms/math/primality-tests/__test__/primalityTest.js | 2 ++ src/algorithms/math/primality-tests/trialDivision.js | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/algorithms/math/primality-tests/__test__/primalityTest.js b/src/algorithms/math/primality-tests/__test__/primalityTest.js index 96edb3c67..72a456be0 100644 --- a/src/algorithms/math/primality-tests/__test__/primalityTest.js +++ b/src/algorithms/math/primality-tests/__test__/primalityTest.js @@ -16,6 +16,8 @@ export default function primalityTest(testFunction) { expect(testFunction(4)).toBeFalsy(); expect(testFunction(6)).toBeFalsy(); expect(testFunction(12)).toBeFalsy(); + expect(testFunction(14)).toBeFalsy(); + expect(testFunction(25)).toBeFalsy(); expect(testFunction(192)).toBeFalsy(); expect(testFunction(200)).toBeFalsy(); expect(testFunction(400)).toBeFalsy(); diff --git a/src/algorithms/math/primality-tests/trialDivision.js b/src/algorithms/math/primality-tests/trialDivision.js index eb3272e21..79988e640 100644 --- a/src/algorithms/math/primality-tests/trialDivision.js +++ b/src/algorithms/math/primality-tests/trialDivision.js @@ -18,7 +18,7 @@ export default function trialDivision(number) { // If there is no dividers up to square root of n then there is no higher dividers as well. const dividerLimit = Math.sqrt(number); - for (let divider = 3; divider < dividerLimit; divider += 2) { + for (let divider = 3; divider <= dividerLimit; divider += 2) { if (number % divider === 0) { return false; } From f2c1c86e624cc110817a767fa3cd70c67f7176d7 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Mon, 16 Apr 2018 22:18:05 +0300 Subject: [PATCH 158/327] Add primality tests. --- .../primality-tests/__test__/primalityTest.js | 24 ----------------- .../__test__/trialDivision.test.js | 26 ++++++++++++++++++- 2 files changed, 25 insertions(+), 25 deletions(-) delete mode 100644 src/algorithms/math/primality-tests/__test__/primalityTest.js diff --git a/src/algorithms/math/primality-tests/__test__/primalityTest.js b/src/algorithms/math/primality-tests/__test__/primalityTest.js deleted file mode 100644 index 72a456be0..000000000 --- a/src/algorithms/math/primality-tests/__test__/primalityTest.js +++ /dev/null @@ -1,24 +0,0 @@ -/** - * @param {function(n: number)} testFunction - */ -export default function primalityTest(testFunction) { - expect(testFunction(1)).toBeTruthy(); - expect(testFunction(2)).toBeTruthy(); - expect(testFunction(3)).toBeTruthy(); - expect(testFunction(5)).toBeTruthy(); - expect(testFunction(11)).toBeTruthy(); - expect(testFunction(191)).toBeTruthy(); - expect(testFunction(191)).toBeTruthy(); - expect(testFunction(199)).toBeTruthy(); - - expect(testFunction(-1)).toBeFalsy(); - expect(testFunction(0)).toBeFalsy(); - expect(testFunction(4)).toBeFalsy(); - expect(testFunction(6)).toBeFalsy(); - expect(testFunction(12)).toBeFalsy(); - expect(testFunction(14)).toBeFalsy(); - expect(testFunction(25)).toBeFalsy(); - expect(testFunction(192)).toBeFalsy(); - expect(testFunction(200)).toBeFalsy(); - expect(testFunction(400)).toBeFalsy(); -} diff --git a/src/algorithms/math/primality-tests/__test__/trialDivision.test.js b/src/algorithms/math/primality-tests/__test__/trialDivision.test.js index c9c8ea1e3..9e5b67ec5 100644 --- a/src/algorithms/math/primality-tests/__test__/trialDivision.test.js +++ b/src/algorithms/math/primality-tests/__test__/trialDivision.test.js @@ -1,5 +1,29 @@ import trialDivision from '../trialDivision'; -import primalityTest from './primalityTest'; + +/** + * @param {function(n: number)} testFunction + */ +function primalityTest(testFunction) { + expect(testFunction(1)).toBeTruthy(); + expect(testFunction(2)).toBeTruthy(); + expect(testFunction(3)).toBeTruthy(); + expect(testFunction(5)).toBeTruthy(); + expect(testFunction(11)).toBeTruthy(); + expect(testFunction(191)).toBeTruthy(); + expect(testFunction(191)).toBeTruthy(); + expect(testFunction(199)).toBeTruthy(); + + expect(testFunction(-1)).toBeFalsy(); + expect(testFunction(0)).toBeFalsy(); + expect(testFunction(4)).toBeFalsy(); + expect(testFunction(6)).toBeFalsy(); + expect(testFunction(12)).toBeFalsy(); + expect(testFunction(14)).toBeFalsy(); + expect(testFunction(25)).toBeFalsy(); + expect(testFunction(192)).toBeFalsy(); + expect(testFunction(200)).toBeFalsy(); + expect(testFunction(400)).toBeFalsy(); +} describe('trialDivision', () => { it('should detect prime numbers', () => { From 523986080e7a277619a5a8c0d135b6047d8a5f4f Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Mon, 16 Apr 2018 22:19:06 +0300 Subject: [PATCH 159/327] Add primality tests. --- README.md | 2 +- .../math/{primality-tests => primality-test}/README.md | 0 .../__test__/trialDivision.test.js | 0 .../math/{primality-tests => primality-test}/trialDivision.js | 0 4 files changed, 1 insertion(+), 1 deletion(-) rename src/algorithms/math/{primality-tests => primality-test}/README.md (100%) rename src/algorithms/math/{primality-tests => primality-test}/__test__/trialDivision.test.js (100%) rename src/algorithms/math/{primality-tests => primality-test}/trialDivision.js (100%) diff --git a/README.md b/README.md index 7a8393168..3b72e1bad 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ * [Fibonacci Number](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/fibonacci) * [Cartesian Product](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/cartesian-product) * [Power Set](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/power-set) - * [Primality Tests](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/primality-tests) + * [Primality Test](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/primality-test) * Collatz Conjecture algorithm * Extended Euclidean algorithm * Euclidean algorithm to calculate the Greatest Common Divisor (GCD) diff --git a/src/algorithms/math/primality-tests/README.md b/src/algorithms/math/primality-test/README.md similarity index 100% rename from src/algorithms/math/primality-tests/README.md rename to src/algorithms/math/primality-test/README.md diff --git a/src/algorithms/math/primality-tests/__test__/trialDivision.test.js b/src/algorithms/math/primality-test/__test__/trialDivision.test.js similarity index 100% rename from src/algorithms/math/primality-tests/__test__/trialDivision.test.js rename to src/algorithms/math/primality-test/__test__/trialDivision.test.js diff --git a/src/algorithms/math/primality-tests/trialDivision.js b/src/algorithms/math/primality-test/trialDivision.js similarity index 100% rename from src/algorithms/math/primality-tests/trialDivision.js rename to src/algorithms/math/primality-test/trialDivision.js From 7667f1b9d5e1be65d5cd7378ad778639321b56ed Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Tue, 17 Apr 2018 08:02:06 +0300 Subject: [PATCH 160/327] Add primality tests. --- README.md | 4 +- .../math/euclidean-algorithm/README.md | 57 +++++++++++++++++++ .../__test__/euclieanAlgorithm.test.js | 24 ++++++++ .../euclidean-algorithm/euclideanAlgorithm.js | 24 ++++++++ 4 files changed, 107 insertions(+), 2 deletions(-) create mode 100644 src/algorithms/math/euclidean-algorithm/README.md create mode 100644 src/algorithms/math/euclidean-algorithm/__test__/euclieanAlgorithm.test.js create mode 100644 src/algorithms/math/euclidean-algorithm/euclideanAlgorithm.js diff --git a/README.md b/README.md index 3b72e1bad..1688ba98e 100644 --- a/README.md +++ b/README.md @@ -31,10 +31,10 @@ * [Fibonacci Number](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/fibonacci) * [Cartesian Product](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/cartesian-product) * [Power Set](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/power-set) - * [Primality Test](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/primality-test) + * [Primality Test](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/primality-test) (Trial Division) + * [Euclidean Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/euclidean-algorithm) - calculate the greatest common divisor (GCD) * Collatz Conjecture algorithm * Extended Euclidean algorithm - * Euclidean algorithm to calculate the Greatest Common Divisor (GCD) * Find Divisors * Fisher-Yates * Greatest Difference diff --git a/src/algorithms/math/euclidean-algorithm/README.md b/src/algorithms/math/euclidean-algorithm/README.md new file mode 100644 index 000000000..a7276fd53 --- /dev/null +++ b/src/algorithms/math/euclidean-algorithm/README.md @@ -0,0 +1,57 @@ +# Euclidean algorithm + +In mathematics, the Euclidean algorithm, or Euclid's algorithm, +is an efficient method for computing the greatest common divisor +(GCD) of two numbers, the largest number that divides both of +them without leaving a remainder. + +The Euclidean algorithm is based on the principle that the +greatest common divisor of two numbers does not change if +the larger number is replaced by its difference with the +smaller number. For example, `21` is the GCD of `252` and +`105` (as `252 = 21 × 12` and `105 = 21 × 5`), and the same +number `21` is also the GCD of `105` and `252 − 105 = 147`. +Since this replacement reduces the larger of the two numbers, +repeating this process gives successively smaller pairs of +numbers until the two numbers become equal. +When that occurs, they are the GCD of the original two numbers. + +By reversing the steps, the GCD can be expressed as a sum of +the two original numbers each multiplied by a positive or +negative integer, e.g., `21 = 5 × 105 + (−2) × 252`. +The fact that the GCD can always be expressed in this way is +known as Bézout's identity. + +![GCD](https://upload.wikimedia.org/wikipedia/commons/3/37/Euclid%27s_algorithm_Book_VII_Proposition_2_3.png) + +Euclid's method for finding the greatest common divisor (GCD) +of two starting lengths `BA` and `DC`, both defined to be +multiples of a common "unit" length. The length `DC` being +shorter, it is used to "measure" `BA`, but only once because +remainder `EA` is less than `DC`. EA now measures (twice) +the shorter length `DC`, with remainder `FC` shorter than `EA`. +Then `FC` measures (three times) length `EA`. Because there is +no remainder, the process ends with `FC` being the `GCD`. +On the right Nicomachus' example with numbers `49` and `21` +resulting in their GCD of `7` (derived from Heath 1908:300). + +![GCD](https://upload.wikimedia.org/wikipedia/commons/7/74/24x60.svg) + +A `24-by-60` rectangle is covered with ten `12-by-12` square +tiles, where `12` is the GCD of `24` and `60`. More generally, +an `a-by-b` rectangle can be covered with square tiles of +side-length `c` only if `c` is a common divisor of `a` and `b`. + +![GCD](https://upload.wikimedia.org/wikipedia/commons/1/1c/Euclidean_algorithm_1071_462.gif) + +Subtraction-based animation of the Euclidean algorithm. +The initial rectangle has dimensions `a = 1071` and `b = 462`. +Squares of size `462×462` are placed within it leaving a +`462×147` rectangle. This rectangle is tiled with `147×147` +squares until a `21×147` rectangle is left, which in turn is +tiled with `21×21` squares, leaving no uncovered area. +The smallest square size, `21`, is the GCD of `1071` and `462`. + +## References + +[Wikipedia](https://en.wikipedia.org/wiki/Euclidean_algorithm) diff --git a/src/algorithms/math/euclidean-algorithm/__test__/euclieanAlgorithm.test.js b/src/algorithms/math/euclidean-algorithm/__test__/euclieanAlgorithm.test.js new file mode 100644 index 000000000..5c08c01eb --- /dev/null +++ b/src/algorithms/math/euclidean-algorithm/__test__/euclieanAlgorithm.test.js @@ -0,0 +1,24 @@ +import euclideanAlgorithm from '../euclideanAlgorithm'; + +describe('euclideanAlgorithm', () => { + it('should calculate GCD', () => { + expect(euclideanAlgorithm(0, 0)).toBeNull(); + expect(euclideanAlgorithm(2, 0)).toBe(2); + expect(euclideanAlgorithm(0, 2)).toBe(2); + expect(euclideanAlgorithm(1, 2)).toBe(1); + expect(euclideanAlgorithm(2, 1)).toBe(1); + expect(euclideanAlgorithm(6, 6)).toBe(6); + expect(euclideanAlgorithm(2, 4)).toBe(2); + expect(euclideanAlgorithm(4, 2)).toBe(2); + expect(euclideanAlgorithm(12, 4)).toBe(4); + expect(euclideanAlgorithm(4, 12)).toBe(4); + expect(euclideanAlgorithm(5, 13)).toBe(1); + expect(euclideanAlgorithm(27, 13)).toBe(1); + expect(euclideanAlgorithm(24, 60)).toBe(12); + expect(euclideanAlgorithm(60, 24)).toBe(12); + expect(euclideanAlgorithm(252, 105)).toBe(21); + expect(euclideanAlgorithm(105, 252)).toBe(21); + expect(euclideanAlgorithm(1071, 462)).toBe(21); + expect(euclideanAlgorithm(462, 1071)).toBe(21); + }); +}); diff --git a/src/algorithms/math/euclidean-algorithm/euclideanAlgorithm.js b/src/algorithms/math/euclidean-algorithm/euclideanAlgorithm.js new file mode 100644 index 000000000..422b23fbd --- /dev/null +++ b/src/algorithms/math/euclidean-algorithm/euclideanAlgorithm.js @@ -0,0 +1,24 @@ +/** + * @param {number} a + * @param {number} b + * @return {number|null} + */ +export default function euclideanAlgorithm(a, b) { + if (a === 0 && b === 0) { + return null; + } + + if (a === 0 && b !== 0) { + return b; + } + + if (a !== 0 && b === 0) { + return a; + } + + if (a > b) { + return euclideanAlgorithm(a - b, b); + } + + return euclideanAlgorithm(b - a, a); +} From ed2aa0910f17729a3044c7d8f9e22379ad215d04 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Tue, 17 Apr 2018 08:03:09 +0300 Subject: [PATCH 161/327] Add primality tests. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1688ba98e..7ce2f1c13 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ * [Fibonacci Number](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/fibonacci) * [Cartesian Product](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/cartesian-product) * [Power Set](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/power-set) - * [Primality Test](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/primality-test) (Trial Division) + * [Primality Test](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/primality-test) - trial division * [Euclidean Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/euclidean-algorithm) - calculate the greatest common divisor (GCD) * Collatz Conjecture algorithm * Extended Euclidean algorithm From 81f51558e7329f3c3e77522d081d9c039e40b1bc Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Tue, 17 Apr 2018 08:04:46 +0300 Subject: [PATCH 162/327] Add primality tests. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7ce2f1c13..8a4040f67 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ * [Fibonacci Number](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/fibonacci) * [Cartesian Product](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/cartesian-product) * [Power Set](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/power-set) - * [Primality Test](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/primality-test) - trial division + * [Primality Test](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/primality-test) (trial division) * [Euclidean Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/euclidean-algorithm) - calculate the greatest common divisor (GCD) * Collatz Conjecture algorithm * Extended Euclidean algorithm From f2ca3a8d535c48673ebddab3c93b176cf58b3205 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Tue, 17 Apr 2018 08:34:20 +0300 Subject: [PATCH 163/327] Add Fisher-Yates. --- README.md | 3 +-- src/algorithms/math/fisher-yates/README.md | 15 +++++++++++++ .../fisher-yates/__test__/fisherYates.test.js | 19 +++++++++++++++++ .../math/fisher-yates/fisherYates.js | 21 +++++++++++++++++++ 4 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 src/algorithms/math/fisher-yates/README.md create mode 100644 src/algorithms/math/fisher-yates/__test__/fisherYates.test.js create mode 100644 src/algorithms/math/fisher-yates/fisherYates.js diff --git a/README.md b/README.md index 8a4040f67..6c74d91f5 100644 --- a/README.md +++ b/README.md @@ -33,10 +33,9 @@ * [Power Set](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/power-set) * [Primality Test](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/primality-test) (trial division) * [Euclidean Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/euclidean-algorithm) - calculate the greatest common divisor (GCD) + * [Fisher–Yates Shuffle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/fisher-yates) - random permutation of a finite sequence * Collatz Conjecture algorithm * Extended Euclidean algorithm - * Find Divisors - * Fisher-Yates * Greatest Difference * Least Common Multiple * Newton's square diff --git a/src/algorithms/math/fisher-yates/README.md b/src/algorithms/math/fisher-yates/README.md new file mode 100644 index 000000000..36278d34e --- /dev/null +++ b/src/algorithms/math/fisher-yates/README.md @@ -0,0 +1,15 @@ +# Fisher–Yates shuffle + +The Fisher–Yates shuffle is an algorithm for generating a random +permutation of a finite sequence—in plain terms, the algorithm +shuffles the sequence. The algorithm effectively puts all the +elements into a hat; it continually determines the next element +by randomly drawing an element from the hat until no elements +remain. The algorithm produces an unbiased permutation: every +permutation is equally likely. The modern version of the +algorithm is efficient: it takes time proportional to the +number of items being shuffled and shuffles them in place. + +## References + +[Wikipedia](https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle) diff --git a/src/algorithms/math/fisher-yates/__test__/fisherYates.test.js b/src/algorithms/math/fisher-yates/__test__/fisherYates.test.js new file mode 100644 index 000000000..f43a7b7cf --- /dev/null +++ b/src/algorithms/math/fisher-yates/__test__/fisherYates.test.js @@ -0,0 +1,19 @@ +import fisherYates from '../fisherYates'; +import { sortedArr } from '../../../sorting/SortTester'; +import QuickSort from '../../../sorting/quick-sort/QuickSort'; + +describe('fisherYates', () => { + it('should shuffle small arrays', () => { + expect(fisherYates([])).toEqual([]); + expect(fisherYates([1])).toEqual([1]); + }); + + it('should shuffle array randomly', () => { + const shuffledArray = fisherYates(sortedArr); + const sorter = new QuickSort(); + + expect(shuffledArray.length).toBe(sortedArr.length); + expect(shuffledArray).not.toEqual(sortedArr); + expect(sorter.sort(shuffledArray)).toEqual(sortedArr); + }); +}); diff --git a/src/algorithms/math/fisher-yates/fisherYates.js b/src/algorithms/math/fisher-yates/fisherYates.js new file mode 100644 index 000000000..98cb2c31d --- /dev/null +++ b/src/algorithms/math/fisher-yates/fisherYates.js @@ -0,0 +1,21 @@ +/** + * @param {*[]} originalArray + * @return {*[]} + */ +export default function fisherYates(originalArray) { + // Clone array from preventing original array from modification (for testing purpose). + const array = originalArray.slice(0); + + if (array.length <= 1) { + return array; + } + + for (let i = (array.length - 1); i > 0; i -= 1) { + const randomIndex = Math.floor(Math.random() * (i + 1)); + const tmp = array[randomIndex]; + array[randomIndex] = array[i]; + array[i] = tmp; + } + + return array; +} From 53a30dba8d11d36725bd5b963151f80698a9d8e5 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Tue, 17 Apr 2018 08:35:52 +0300 Subject: [PATCH 164/327] Add Fisher-Yates. --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 6c74d91f5..3751d89cd 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,6 @@ * [Euclidean Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/euclidean-algorithm) - calculate the greatest common divisor (GCD) * [Fisher–Yates Shuffle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/fisher-yates) - random permutation of a finite sequence * Collatz Conjecture algorithm - * Extended Euclidean algorithm * Greatest Difference * Least Common Multiple * Newton's square From ac966a9ab7a2437176fb7d6280b8ca6810cc7d1b Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Tue, 17 Apr 2018 09:28:15 +0300 Subject: [PATCH 165/327] Add lcm. --- README.md | 3 +- .../__test__/euclieanAlgorithm.test.js | 2 + .../euclidean-algorithm/euclideanAlgorithm.js | 18 ++++-- .../math/least-common-multiple/README.md | 62 +++++++++++++++++++ .../__test__/leastCommonMultiple.test.js | 18 ++++++ .../leastCommonMultiple.js | 15 +++++ 6 files changed, 111 insertions(+), 7 deletions(-) create mode 100644 src/algorithms/math/least-common-multiple/README.md create mode 100644 src/algorithms/math/least-common-multiple/__test__/leastCommonMultiple.test.js create mode 100644 src/algorithms/math/least-common-multiple/leastCommonMultiple.js diff --git a/README.md b/README.md index 3751d89cd..bb69b6efa 100644 --- a/README.md +++ b/README.md @@ -33,10 +33,9 @@ * [Power Set](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/power-set) * [Primality Test](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/primality-test) (trial division) * [Euclidean Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/euclidean-algorithm) - calculate the greatest common divisor (GCD) + * [Least Common Multiple (LCM)](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/least-common-multiple) * [Fisher–Yates Shuffle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/fisher-yates) - random permutation of a finite sequence * Collatz Conjecture algorithm - * Greatest Difference - * Least Common Multiple * Newton's square * Shannon Entropy * **String** diff --git a/src/algorithms/math/euclidean-algorithm/__test__/euclieanAlgorithm.test.js b/src/algorithms/math/euclidean-algorithm/__test__/euclieanAlgorithm.test.js index 5c08c01eb..01d4f4e18 100644 --- a/src/algorithms/math/euclidean-algorithm/__test__/euclieanAlgorithm.test.js +++ b/src/algorithms/math/euclidean-algorithm/__test__/euclieanAlgorithm.test.js @@ -20,5 +20,7 @@ describe('euclideanAlgorithm', () => { expect(euclideanAlgorithm(105, 252)).toBe(21); expect(euclideanAlgorithm(1071, 462)).toBe(21); expect(euclideanAlgorithm(462, 1071)).toBe(21); + expect(euclideanAlgorithm(462, -1071)).toBe(21); + expect(euclideanAlgorithm(-462, -1071)).toBe(21); }); }); diff --git a/src/algorithms/math/euclidean-algorithm/euclideanAlgorithm.js b/src/algorithms/math/euclidean-algorithm/euclideanAlgorithm.js index 422b23fbd..1532ea353 100644 --- a/src/algorithms/math/euclidean-algorithm/euclideanAlgorithm.js +++ b/src/algorithms/math/euclidean-algorithm/euclideanAlgorithm.js @@ -1,9 +1,12 @@ /** - * @param {number} a - * @param {number} b + * @param {number} originalA + * @param {number} originalB * @return {number|null} */ -export default function euclideanAlgorithm(a, b) { +export default function euclideanAlgorithm(originalA, originalB) { + const a = Math.abs(originalA); + const b = Math.abs(originalB); + if (a === 0 && b === 0) { return null; } @@ -16,9 +19,14 @@ export default function euclideanAlgorithm(a, b) { return a; } + // Normally we need to do subtraction (a - b) but to prevent + // recursion occurs to often we may shorten subtraction to (a % b). + // Since (a % b) is normally means that we've subtracted b from a + // many times until the difference became less then a. + if (a > b) { - return euclideanAlgorithm(a - b, b); + return euclideanAlgorithm(a % b, b); } - return euclideanAlgorithm(b - a, a); + return euclideanAlgorithm(b % a, a); } diff --git a/src/algorithms/math/least-common-multiple/README.md b/src/algorithms/math/least-common-multiple/README.md new file mode 100644 index 000000000..3e49af9a5 --- /dev/null +++ b/src/algorithms/math/least-common-multiple/README.md @@ -0,0 +1,62 @@ +# Least common multiple + +In arithmetic and number theory, the least common multiple, +lowest common multiple, or smallest common multiple of +two integers `a` and `b`, usually denoted by `LCM(a, b)`, is +the smallest positive integer that is divisible by +both `a` and `b`. Since division of integers by zero is +undefined, this definition has meaning only if `a` and `b` are +both different from zero. However, some authors define `lcm(a,0)` +as `0` for all `a`, which is the result of taking the `lcm` +to be the least upper bound in the lattice of divisibility. + +## Example + +What is the LCM of 4 and 6? + +Multiples of `4` are: + +``` +4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, ... +``` + +and the multiples of `6` are: + +``` +6, 12, 18, 24, 30, 36, 42, 48, 54, 60, 66, 72, ... +``` + +Common multiples of `4` and `6` are simply the numbers +that are in both lists: + +``` +12, 24, 36, 48, 60, 72, .... +``` + +So, from this list of the first few common multiples of +the numbers `4` and `6`, their least common multiple is `12`. + +## Computing the least common multiple + +The following formula reduces the problem of computing the +least common multiple to the problem of computing the greatest +common divisor (GCD), also known as the greatest common factor: + +``` +lcm(a, b) = |a * b| / gcd(a, b) +``` + +![LCM](https://upload.wikimedia.org/wikipedia/commons/c/c9/Symmetrical_5-set_Venn_diagram_LCM_2_3_4_5_7.svg) + +A Venn diagram showing the least common multiples of +combinations of `2`, `3`, `4`, `5` and `7` (`6` is skipped as +it is `2 × 3`, both of which are already represented). + +For example, a card game which requires its cards to be +divided equally among up to `5` players requires at least `60` +cards, the number at the intersection of the `2`, `3`, `4` +and `5` sets, but not the `7` set. + +## References + +[Wikipedia](https://en.wikipedia.org/wiki/Least_common_multiple) diff --git a/src/algorithms/math/least-common-multiple/__test__/leastCommonMultiple.test.js b/src/algorithms/math/least-common-multiple/__test__/leastCommonMultiple.test.js new file mode 100644 index 000000000..2152e110a --- /dev/null +++ b/src/algorithms/math/least-common-multiple/__test__/leastCommonMultiple.test.js @@ -0,0 +1,18 @@ +import leastCommonMultiple from '../leastCommonMultiple'; + +describe('leastCommonMultiple', () => { + it('should find least common multiple', () => { + expect(leastCommonMultiple(0, 0)).toBe(0); + expect(leastCommonMultiple(1, 0)).toBe(0); + expect(leastCommonMultiple(0, 1)).toBe(0); + expect(leastCommonMultiple(4, 6)).toBe(12); + expect(leastCommonMultiple(6, 21)).toBe(42); + expect(leastCommonMultiple(7, 2)).toBe(14); + expect(leastCommonMultiple(3, 5)).toBe(15); + expect(leastCommonMultiple(7, 3)).toBe(21); + expect(leastCommonMultiple(1000000, 2)).toBe(1000000); + expect(leastCommonMultiple(-9, -18)).toBe(18); + expect(leastCommonMultiple(-7, -9)).toBe(63); + expect(leastCommonMultiple(-7, 9)).toBe(63); + }); +}); diff --git a/src/algorithms/math/least-common-multiple/leastCommonMultiple.js b/src/algorithms/math/least-common-multiple/leastCommonMultiple.js new file mode 100644 index 000000000..e40f9c955 --- /dev/null +++ b/src/algorithms/math/least-common-multiple/leastCommonMultiple.js @@ -0,0 +1,15 @@ +import euclideanAlgorithm from '../euclidean-algorithm/euclideanAlgorithm'; + +/** + * @param {number} a + * @param {number} b + * @return {number} + */ + +export default function leastCommonMultiple(a, b) { + if (a === 0 && b === 0) { + return 0; + } + + return Math.abs(a * b) / euclideanAlgorithm(a, b); +} From cc54e581c284cc58a6f8fe66ab1348ebc5a88acd Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Tue, 17 Apr 2018 09:36:29 +0300 Subject: [PATCH 166/327] Add lcm. --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index bb69b6efa..df7cc8815 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,6 @@ * [Euclidean Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/euclidean-algorithm) - calculate the greatest common divisor (GCD) * [Least Common Multiple (LCM)](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/least-common-multiple) * [Fisher–Yates Shuffle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/fisher-yates) - random permutation of a finite sequence - * Collatz Conjecture algorithm * Newton's square * Shannon Entropy * **String** From 2dfbe9451fcdb61df2fb170981e02fa073d045b5 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Tue, 17 Apr 2018 09:39:46 +0300 Subject: [PATCH 167/327] Add lcm. --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index df7cc8815..0d8b46521 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,6 @@ * [Euclidean Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/euclidean-algorithm) - calculate the greatest common divisor (GCD) * [Least Common Multiple (LCM)](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/least-common-multiple) * [Fisher–Yates Shuffle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/fisher-yates) - random permutation of a finite sequence - * Newton's square * Shannon Entropy * **String** * [String Permutations](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/permutations) From 9f815a7320a49d09073afd6c076f47eb41b1b1eb Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Tue, 17 Apr 2018 09:54:23 +0300 Subject: [PATCH 168/327] Add lcm. --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 0d8b46521..b8dd989cc 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,6 @@ * [Euclidean Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/euclidean-algorithm) - calculate the greatest common divisor (GCD) * [Least Common Multiple (LCM)](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/least-common-multiple) * [Fisher–Yates Shuffle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/fisher-yates) - random permutation of a finite sequence - * Shannon Entropy * **String** * [String Permutations](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/permutations) * Combination From 595efce773e595d5c692cfa1dad59e2565f9d207 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Tue, 17 Apr 2018 19:39:44 +0300 Subject: [PATCH 169/327] Add permutations and combinations. --- README.md | 2 +- src/algorithms/string/permutations/README.md | 31 +++++++++++++++---- ...js => permutateWithoutRepetitions.test.js} | 16 +++++----- ...ring.js => permutateWithoutRepetitions.js} | 4 +-- 4 files changed, 36 insertions(+), 17 deletions(-) rename src/algorithms/string/permutations/__test__/{permutateString.test.js => permutateWithoutRepetitions.test.js} (67%) rename src/algorithms/string/permutations/{permutateString.js => permutateWithoutRepetitions.js} (88%) diff --git a/README.md b/README.md index b8dd989cc..69fc850b8 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ * [Least Common Multiple (LCM)](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/least-common-multiple) * [Fisher–Yates Shuffle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/fisher-yates) - random permutation of a finite sequence * **String** - * [String Permutations](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/permutations) + * [String Permutations](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/permutations) - with and without repetitions * Combination * Minimum Edit distance (Levenshtein Distance) * Hamming diff --git a/src/algorithms/string/permutations/README.md b/src/algorithms/string/permutations/README.md index 501356065..5e1fba067 100644 --- a/src/algorithms/string/permutations/README.md +++ b/src/algorithms/string/permutations/README.md @@ -1,22 +1,41 @@ -# String Permutations +# Permutations + +When the order doesn't matter, it is a **Combination**. + +When the order **does** matter it is a **Permutation**. + +**"The combination to the safe is 472"**. We do care about the order. `724` won't work, nor will `247`. +It has to be exactly `4-7-2`. + +## Permutations without repetitions A permutation, also called an “arrangement number” or “order”, is a rearrangement of the elements of an ordered list `S` into a one-to-one correspondence with `S` itself. -A string of length `n` has `n!` permutation. Below are the permutations of string `ABC`. `ABC ACB BAC BCA CBA CAB` -When the order doesn't matter, it is a **Combination**. +Or for example the first three people in a running race: you can't be first and second. -When the order **does** matter it is a **Permutation**. +**Number of combinations** + +``` +n * (n-1) * (n -2) * ... * 1 = n! +``` + +## Permutations with repetitions + +When repetition is allowed we have permutations with repetitions. +For example the the lock below: it could be `333`. ![Permutation Lock](https://www.mathsisfun.com/combinatorics/images/combination-lock.jpg) -Permutation with repetitions example +**Number of combinations** -![Permutation With Repetitions](https://upload.wikimedia.org/wikipedia/commons/6/69/Permutations-With-Repetition.gif) +``` +n * n * n ... (r times) = n^r +``` ## References diff --git a/src/algorithms/string/permutations/__test__/permutateString.test.js b/src/algorithms/string/permutations/__test__/permutateWithoutRepetitions.test.js similarity index 67% rename from src/algorithms/string/permutations/__test__/permutateString.test.js rename to src/algorithms/string/permutations/__test__/permutateWithoutRepetitions.test.js index c252516f1..4a74d7f4a 100644 --- a/src/algorithms/string/permutations/__test__/permutateString.test.js +++ b/src/algorithms/string/permutations/__test__/permutateWithoutRepetitions.test.js @@ -1,28 +1,28 @@ -import permutateString from '../permutateString'; +import permutateWithoutRepetitions from '../permutateWithoutRepetitions'; describe('permutateString', () => { it('should permutate string', () => { - const permutations0 = permutateString(''); + const permutations0 = permutateWithoutRepetitions(''); expect(permutations0).toEqual([]); - const permutations1 = permutateString('A'); + const permutations1 = permutateWithoutRepetitions('A'); expect(permutations1).toEqual(['A']); - const permutations2 = permutateString('AB'); + const permutations2 = permutateWithoutRepetitions('AB'); expect(permutations2.length).toBe(2); expect(permutations2).toEqual([ 'BA', 'AB', ]); - const permutations6 = permutateString('AA'); + const permutations6 = permutateWithoutRepetitions('AA'); expect(permutations6.length).toBe(2); expect(permutations6).toEqual([ 'AA', 'AA', ]); - const permutations3 = permutateString('ABC'); + const permutations3 = permutateWithoutRepetitions('ABC'); expect(permutations3.length).toBe(2 * 3); expect(permutations3).toEqual([ 'CBA', @@ -33,7 +33,7 @@ describe('permutateString', () => { 'ABC', ]); - const permutations4 = permutateString('ABCD'); + const permutations4 = permutateWithoutRepetitions('ABCD'); expect(permutations4.length).toBe(2 * 3 * 4); expect(permutations4).toEqual([ 'DCBA', @@ -62,7 +62,7 @@ describe('permutateString', () => { 'ABCD', ]); - const permutations5 = permutateString('ABCDEF'); + const permutations5 = permutateWithoutRepetitions('ABCDEF'); expect(permutations5.length).toBe(2 * 3 * 4 * 5 * 6); }); }); diff --git a/src/algorithms/string/permutations/permutateString.js b/src/algorithms/string/permutations/permutateWithoutRepetitions.js similarity index 88% rename from src/algorithms/string/permutations/permutateString.js rename to src/algorithms/string/permutations/permutateWithoutRepetitions.js index 49d2f3073..c1a376a47 100644 --- a/src/algorithms/string/permutations/permutateString.js +++ b/src/algorithms/string/permutations/permutateWithoutRepetitions.js @@ -1,4 +1,4 @@ -export default function permutateString(str) { +export default function permutateWithoutRepetitions(str) { if (str.length === 0) { return []; } @@ -11,7 +11,7 @@ export default function permutateString(str) { // Get all permutations of string of length (n - 1). const previousString = str.substring(0, str.length - 1); - const previousPermutations = permutateString(previousString); + const previousPermutations = permutateWithoutRepetitions(previousString); // Insert last character into every possible position of every previous permutation. const lastCharacter = str.substring(str.length - 1); From 8d16d9d65311f1adaf027ec80175bfa0f3e5f25d Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Tue, 17 Apr 2018 19:40:32 +0300 Subject: [PATCH 170/327] Add permutations and combinations. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 69fc850b8..d59a2964b 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ * [Least Common Multiple (LCM)](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/least-common-multiple) * [Fisher–Yates Shuffle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/fisher-yates) - random permutation of a finite sequence * **String** - * [String Permutations](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/permutations) - with and without repetitions + * [Permutations](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/permutations) - with and without repetitions * Combination * Minimum Edit distance (Levenshtein Distance) * Hamming From 54c298c3f705c25303645bfcb485e0dab59d0535 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Tue, 17 Apr 2018 19:41:04 +0300 Subject: [PATCH 171/327] Add permutations and combinations. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d59a2964b..b8c50e821 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ * [Least Common Multiple (LCM)](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/least-common-multiple) * [Fisher–Yates Shuffle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/fisher-yates) - random permutation of a finite sequence * **String** - * [Permutations](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/permutations) - with and without repetitions + * [Permutations](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/permutations) (with and without repetitions) * Combination * Minimum Edit distance (Levenshtein Distance) * Hamming From 3380d8028a38e562903ba65ae8e6469d2a3c9883 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Tue, 17 Apr 2018 20:28:35 +0300 Subject: [PATCH 172/327] Add permutations and combinations. --- src/algorithms/string/combinations/README.md | 18 +++++++ .../__test__/permutateWithRepetitions.test.js | 53 +++++++++++++++++++ .../permutations/permutateWithRepetitions.js | 41 ++++++++++++++ .../permutateWithoutRepetitions.js | 4 ++ 4 files changed, 116 insertions(+) create mode 100644 src/algorithms/string/combinations/README.md create mode 100644 src/algorithms/string/permutations/__test__/permutateWithRepetitions.test.js create mode 100644 src/algorithms/string/permutations/permutateWithRepetitions.js diff --git a/src/algorithms/string/combinations/README.md b/src/algorithms/string/combinations/README.md new file mode 100644 index 000000000..a4d58408f --- /dev/null +++ b/src/algorithms/string/combinations/README.md @@ -0,0 +1,18 @@ +# Combinations + +When the order doesn't matter, it is a **Combination**. + +When the order **does** matter it is a **Permutation**. + +**"My fruit salad is a combination of apples, grapes and bananas"** +We don't care what order the fruits are in, they could also be +"bananas, grapes and apples" or "grapes, apples and bananas", +its the same fruit salad. + +## Combinations without repetitions + +## Combinations with repetitions + +## References + +[Math Is Fun](https://www.mathsisfun.com/combinatorics/combinations-permutations.html) diff --git a/src/algorithms/string/permutations/__test__/permutateWithRepetitions.test.js b/src/algorithms/string/permutations/__test__/permutateWithRepetitions.test.js new file mode 100644 index 000000000..a43ec7dbe --- /dev/null +++ b/src/algorithms/string/permutations/__test__/permutateWithRepetitions.test.js @@ -0,0 +1,53 @@ +import permutateWithRepetition from '../permutateWithRepetitions'; + +describe('permutateWithRepetition', () => { + it('should permutate string with repetition', () => { + const permutations0 = permutateWithRepetition(''); + expect(permutations0).toEqual([]); + + const permutations1 = permutateWithRepetition('A'); + expect(permutations1).toEqual(['A']); + + const permutations2 = permutateWithRepetition('AB'); + expect(permutations2).toEqual([ + 'AA', + 'AB', + 'BA', + 'BB', + ]); + + const permutations3 = permutateWithRepetition('ABC'); + expect(permutations3).toEqual([ + 'AAA', + 'AAB', + 'AAC', + 'ABA', + 'ABB', + 'ABC', + 'ACA', + 'ACB', + 'ACC', + 'BAA', + 'BAB', + 'BAC', + 'BBA', + 'BBB', + 'BBC', + 'BCA', + 'BCB', + 'BCC', + 'CAA', + 'CAB', + 'CAC', + 'CBA', + 'CBB', + 'CBC', + 'CCA', + 'CCB', + 'CCC', + ]); + + const permutations4 = permutateWithRepetition('ABCD'); + expect(permutations4.length).toBe(4 * 4 * 4 * 4); + }); +}); diff --git a/src/algorithms/string/permutations/permutateWithRepetitions.js b/src/algorithms/string/permutations/permutateWithRepetitions.js new file mode 100644 index 000000000..1bae1df3b --- /dev/null +++ b/src/algorithms/string/permutations/permutateWithRepetitions.js @@ -0,0 +1,41 @@ +/** + * @param {string} str + * @return {string[]} + */ +export default function permutateWithRepetition(str) { + // There is no permutations for empty string. + if (!str || str.length === 0) { + return []; + } + + // There is only one permutation for the 1-character string. + if (str.length === 1) { + return [str]; + } + + // Let's create initial set of permutations. + let previousPermutations = Array.from(str); + let currentPermutations = []; + let permutationSize = 1; + + // While the size of each permutation is less then or equal to string length... + while (permutationSize < str.length) { + // Reset all current permutations. + currentPermutations = []; + + for (let pemIndex = 0; pemIndex < previousPermutations.length; pemIndex += 1) { + for (let charIndex = 0; charIndex < str.length; charIndex += 1) { + const currentPermutation = previousPermutations[pemIndex] + str[charIndex]; + currentPermutations.push(currentPermutation); + } + } + + // Make current permutations to be the previous ones. + previousPermutations = currentPermutations.slice(0); + + // Increase permutation size counter. + permutationSize += 1; + } + + return currentPermutations; +} diff --git a/src/algorithms/string/permutations/permutateWithoutRepetitions.js b/src/algorithms/string/permutations/permutateWithoutRepetitions.js index c1a376a47..0a0346361 100644 --- a/src/algorithms/string/permutations/permutateWithoutRepetitions.js +++ b/src/algorithms/string/permutations/permutateWithoutRepetitions.js @@ -1,3 +1,7 @@ +/** + * @param {string} str + * @return {string[]} + */ export default function permutateWithoutRepetitions(str) { if (str.length === 0) { return []; From 9799c9c3de807f82b6e4e4d9f61ffb68b4a7f169 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Wed, 18 Apr 2018 13:04:05 +0300 Subject: [PATCH 173/327] Add factorial. --- README.md | 3 +- src/algorithms/math/factorial/README.md | 32 ++++++++++++++++ .../math/factorial/__test__/factorial.test.js | 11 ++++++ src/algorithms/math/factorial/factorial.js | 13 +++++++ src/algorithms/string/combinations/README.md | 37 +++++++++++++++++++ 5 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 src/algorithms/math/factorial/README.md create mode 100644 src/algorithms/math/factorial/__test__/factorial.test.js create mode 100644 src/algorithms/math/factorial/factorial.js diff --git a/README.md b/README.md index b8c50e821..62650ba83 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,7 @@ ### Algorithms * **Math** + * [Factorial](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/factorial) * [Fibonacci Number](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/fibonacci) * [Cartesian Product](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/cartesian-product) * [Power Set](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/power-set) @@ -37,7 +38,7 @@ * [Fisher–Yates Shuffle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/fisher-yates) - random permutation of a finite sequence * **String** * [Permutations](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/permutations) (with and without repetitions) - * Combination + * [Combinations](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/combinations) (with and without repetitions) * Minimum Edit distance (Levenshtein Distance) * Hamming * Huffman diff --git a/src/algorithms/math/factorial/README.md b/src/algorithms/math/factorial/README.md new file mode 100644 index 000000000..06400c55f --- /dev/null +++ b/src/algorithms/math/factorial/README.md @@ -0,0 +1,32 @@ +# Factorial + +In mathematics, the factorial of a non-negative integer `n`, +denoted by `n!`, is the product of all positive integers less +than or equal to `n`. For example: + +``` +5! = 5 * 4 * 3 * 2 * 1 = 120 +``` + +| n | n! | +| ----- | :-------------------------: | +| 0 | 1 | +| 1 | 1 | +| 2 | 2 | +| 3 | 6 | +| 4 | 24 | +| 5 | 120 | +| 6 | 720 | +| 7 | 5 040 | +| 8 | 40 320 | +| 9 | 362 880 | +| 10 | 3 628 800 | +| 11 | 39 916 800 | +| 12 | 479 001 600 | +| 13 | 6 227 020 800 | +| 14 | 87 178 291 200 | +| 15 | 1 307 674 368 000 | + +## References + +[Wikipedia](https://en.wikipedia.org/wiki/Factorial) diff --git a/src/algorithms/math/factorial/__test__/factorial.test.js b/src/algorithms/math/factorial/__test__/factorial.test.js new file mode 100644 index 000000000..bf6aa0ecb --- /dev/null +++ b/src/algorithms/math/factorial/__test__/factorial.test.js @@ -0,0 +1,11 @@ +import factorial from '../factorial'; + +describe('factorial', () => { + it('should calculate factorial', () => { + expect(factorial(0)).toBe(1); + expect(factorial(1)).toBe(1); + expect(factorial(5)).toBe(120); + expect(factorial(8)).toBe(40320); + expect(factorial(10)).toBe(3628800); + }); +}); diff --git a/src/algorithms/math/factorial/factorial.js b/src/algorithms/math/factorial/factorial.js new file mode 100644 index 000000000..194fc8984 --- /dev/null +++ b/src/algorithms/math/factorial/factorial.js @@ -0,0 +1,13 @@ +/** + * @param {number} number + * @return {number} + */ +export default function factorial(number) { + let result = 1; + + for (let i = 1; i <= number; i += 1) { + result *= i; + } + + return result; +} diff --git a/src/algorithms/string/combinations/README.md b/src/algorithms/string/combinations/README.md index a4d58408f..517a7f330 100644 --- a/src/algorithms/string/combinations/README.md +++ b/src/algorithms/string/combinations/README.md @@ -11,8 +11,45 @@ its the same fruit salad. ## Combinations without repetitions +This is how lotteries work. The numbers are drawn one at a +time, and if we have the lucky numbers (no matter what order) +we win! + +No Repetition: such as lottery numbers `(2,14,15,27,30,33)` + +**Number of combinations** + +![Formula](https://www.mathsisfun.com/combinatorics/images/combinations-no-repeat.png) + +where `n` is the number of things to choose from, and we choose `r` of them, +no repetition, order doesn't matter. + +It is often called "n choose r" (such as "16 choose 3"). And is also known as the Binomial Coefficient. + ## Combinations with repetitions +Repetition is Allowed: such as coins in your pocket `(5,5,5,10,10)` + +Or let us say there are five flavours of icecream: +`banana`, `chocolate`, `lemon`, `strawberry` and `vanilla`. + +We can have three scoops. How many variations will there be? + +Let's use letters for the flavours: `{b, c, l, s, v}`. +Example selections include: + +- `{c, c, c}` (3 scoops of chocolate) +- `{b, l, v}` (one each of banana, lemon and vanilla) +- `{b, v, v}` (one of banana, two of vanilla) + +**Number of combinations** + +![Formula](https://www.mathsisfun.com/combinatorics/images/combinations-repeat.gif) + +Where `n` is the number of things to choose from, and we +choose `r` of them. Repetition allowed, +order doesn't matter. + ## References [Math Is Fun](https://www.mathsisfun.com/combinatorics/combinations-permutations.html) From 7c6dae425ec73ccdba1d0f8451b8ee68e9a84064 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Wed, 18 Apr 2018 13:05:07 +0300 Subject: [PATCH 174/327] Add factorial. --- src/algorithms/math/factorial/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/algorithms/math/factorial/README.md b/src/algorithms/math/factorial/README.md index 06400c55f..55c481a2f 100644 --- a/src/algorithms/math/factorial/README.md +++ b/src/algorithms/math/factorial/README.md @@ -9,7 +9,7 @@ than or equal to `n`. For example: ``` | n | n! | -| ----- | :-------------------------: | +| ----- | --------------------------: | | 0 | 1 | | 1 | 1 | | 2 | 2 | From 4caed1911e8ba72a0befc63bcdeca8566fc92181 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Wed, 18 Apr 2018 13:07:50 +0300 Subject: [PATCH 175/327] Add factorial. --- .../__test__/permutateWithoutRepetitions.test.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/algorithms/string/permutations/__test__/permutateWithoutRepetitions.test.js b/src/algorithms/string/permutations/__test__/permutateWithoutRepetitions.test.js index 4a74d7f4a..0130fd0ab 100644 --- a/src/algorithms/string/permutations/__test__/permutateWithoutRepetitions.test.js +++ b/src/algorithms/string/permutations/__test__/permutateWithoutRepetitions.test.js @@ -1,4 +1,5 @@ import permutateWithoutRepetitions from '../permutateWithoutRepetitions'; +import factorial from '../../../math/factorial/factorial'; describe('permutateString', () => { it('should permutate string', () => { @@ -23,7 +24,7 @@ describe('permutateString', () => { ]); const permutations3 = permutateWithoutRepetitions('ABC'); - expect(permutations3.length).toBe(2 * 3); + expect(permutations3.length).toBe(factorial(3)); expect(permutations3).toEqual([ 'CBA', 'BCA', @@ -34,7 +35,7 @@ describe('permutateString', () => { ]); const permutations4 = permutateWithoutRepetitions('ABCD'); - expect(permutations4.length).toBe(2 * 3 * 4); + expect(permutations4.length).toBe(factorial(4)); expect(permutations4).toEqual([ 'DCBA', 'CDBA', @@ -63,6 +64,6 @@ describe('permutateString', () => { ]); const permutations5 = permutateWithoutRepetitions('ABCDEF'); - expect(permutations5.length).toBe(2 * 3 * 4 * 5 * 6); + expect(permutations5.length).toBe(factorial(6)); }); }); From 55a560e77819068981fbce43614832c5ea30a3dc Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Sat, 21 Apr 2018 09:24:16 +0300 Subject: [PATCH 176/327] Add combinations. --- .../combineWithoutRepetitions.test.js | 40 +++++++++++ .../combinations/combineWithoutRepetitions.js | 67 +++++++++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 src/algorithms/string/combinations/__test__/combineWithoutRepetitions.test.js create mode 100644 src/algorithms/string/combinations/combineWithoutRepetitions.js diff --git a/src/algorithms/string/combinations/__test__/combineWithoutRepetitions.test.js b/src/algorithms/string/combinations/__test__/combineWithoutRepetitions.test.js new file mode 100644 index 000000000..6d2987ec3 --- /dev/null +++ b/src/algorithms/string/combinations/__test__/combineWithoutRepetitions.test.js @@ -0,0 +1,40 @@ +import combineWithoutRepetitions from '../combineWithoutRepetitions'; +import factorial from '../../../math/factorial/factorial'; + +describe('combineWithoutRepetitions', () => { + it('should combine string without repetitions', () => { + expect(combineWithoutRepetitions('AB', 3)).toEqual([]); + expect(combineWithoutRepetitions('AB', 1)).toEqual(['A', 'B']); + expect(combineWithoutRepetitions('A', 1)).toEqual(['A']); + expect(combineWithoutRepetitions('AB', 2)).toEqual(['AB']); + expect(combineWithoutRepetitions('ABC', 2)).toEqual(['AB', 'AC', 'BC']); + expect(combineWithoutRepetitions('ABC', 3)).toEqual(['ABC']); + expect(combineWithoutRepetitions('ABCD', 3)).toEqual([ + 'ABC', + 'ABD', + 'ACD', + 'BCD', + ]); + expect(combineWithoutRepetitions('ABCDE', 3)).toEqual([ + 'ABC', + 'ABD', + 'ABE', + 'ACD', + 'ACE', + 'ADE', + 'BCD', + 'BCE', + 'BDE', + 'CDE', + ]); + + const combinationOptions = 'ABCDEFGH'; + const combinationSlotsNumber = 4; + const combinations = combineWithoutRepetitions(combinationOptions, combinationSlotsNumber); + const n = combinationOptions.length; + const r = combinationSlotsNumber; + const expectedNumberOfCombinations = factorial(n) / (factorial(r) * factorial(n - r)); + + expect(combinations.length).toBe(expectedNumberOfCombinations); + }); +}); diff --git a/src/algorithms/string/combinations/combineWithoutRepetitions.js b/src/algorithms/string/combinations/combineWithoutRepetitions.js new file mode 100644 index 000000000..c087990d1 --- /dev/null +++ b/src/algorithms/string/combinations/combineWithoutRepetitions.js @@ -0,0 +1,67 @@ +/* + @see: https://stackoverflow.com/a/127898/7794070 + + Lets say your array of letters looks like this: "ABCDEFGH". + You have three indices (i, j, k) indicating which letters you + are going to use for the current word, You start with: + + A B C D E F G H + ^ ^ ^ + i j k + + First you vary k, so the next step looks like that: + + A B C D E F G H + ^ ^ ^ + i j k + + If you reached the end you go on and vary j and then k again. + + A B C D E F G H + ^ ^ ^ + i j k + + A B C D E F G H + ^ ^ ^ + i j k + + Once you j reached G you start also to vary i. + + A B C D E F G H + ^ ^ ^ + i j k + + A B C D E F G H + ^ ^ ^ + i j k + ... + */ + +/** + * @param {string} combinationOptions + * @param {number} combinationLength + * @return {string[]} + */ +export default function combineWithoutRepetitions(combinationOptions, combinationLength) { + // If combination length is just 1 then return combinationOptions. + if (combinationLength === 1) { + return Array.from(combinationOptions); + } + + // Init combinations array. + const combinations = []; + + for (let i = 0; i <= (combinationOptions.length - combinationLength); i += 1) { + const smallerCombinations = combineWithoutRepetitions( + combinationOptions.substr(i + 1), + combinationLength - 1, + ); + + for (let j = 0; j < smallerCombinations.length; j += 1) { + combinations.push(combinationOptions[i] + smallerCombinations[j]); + } + } + + // Return all calculated combinations. + return combinations; +} From 5864f5f46b4680cc708feaa75b984fd45f178deb Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Mon, 23 Apr 2018 08:35:03 +0300 Subject: [PATCH 177/327] Add combinations. --- .../__test__/combineWithRepetitions.test.js | 59 +++++++++++++++++++ .../combinations/combineWithRepetitions.js | 38 ++++++++++++ 2 files changed, 97 insertions(+) create mode 100644 src/algorithms/string/combinations/__test__/combineWithRepetitions.test.js create mode 100644 src/algorithms/string/combinations/combineWithRepetitions.js diff --git a/src/algorithms/string/combinations/__test__/combineWithRepetitions.test.js b/src/algorithms/string/combinations/__test__/combineWithRepetitions.test.js new file mode 100644 index 000000000..90c38958e --- /dev/null +++ b/src/algorithms/string/combinations/__test__/combineWithRepetitions.test.js @@ -0,0 +1,59 @@ +import combineWithRepetitions from '../combineWithRepetitions'; +import factorial from '../../../math/factorial/factorial'; + +describe('combineWithRepetitions', () => { + it('should combine string with repetitions', () => { + expect(combineWithRepetitions(['A'], 1)).toEqual([ + ['A'], + ]); + + expect(combineWithRepetitions(['A', 'B'], 1)).toEqual([ + ['A'], + ['B'], + ]); + + expect(combineWithRepetitions(['A', 'B'], 2)).toEqual([ + ['A', 'A'], + ['A', 'B'], + ['B', 'B'], + ]); + + expect(combineWithRepetitions(['A', 'B'], 3)).toEqual([ + ['A', 'A', 'A'], + ['A', 'A', 'B'], + ['A', 'B', 'B'], + ['B', 'B', 'B'], + ]); + + expect(combineWithRepetitions(['A', 'B', 'C'], 2)).toEqual([ + ['A', 'A'], + ['A', 'B'], + ['A', 'C'], + ['B', 'B'], + ['B', 'C'], + ['C', 'C'], + ]); + + expect(combineWithRepetitions(['A', 'B', 'C'], 3)).toEqual([ + ['A', 'A', 'A'], + ['A', 'A', 'B'], + ['A', 'A', 'C'], + ['A', 'B', 'B'], + ['A', 'B', 'C'], + ['A', 'C', 'C'], + ['B', 'B', 'B'], + ['B', 'B', 'C'], + ['B', 'C', 'C'], + ['C', 'C', 'C'], + ]); + + const combinationOptions = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']; + const combinationSlotsNumber = 4; + const combinations = combineWithRepetitions(combinationOptions, combinationSlotsNumber); + const n = combinationOptions.length; + const r = combinationSlotsNumber; + const expectedNumberOfCombinations = factorial((r + n) - 1) / (factorial(r) * factorial(n - 1)); + + expect(combinations.length).toBe(expectedNumberOfCombinations); + }); +}); diff --git a/src/algorithms/string/combinations/combineWithRepetitions.js b/src/algorithms/string/combinations/combineWithRepetitions.js new file mode 100644 index 000000000..0d2ef3c16 --- /dev/null +++ b/src/algorithms/string/combinations/combineWithRepetitions.js @@ -0,0 +1,38 @@ +/** + * @param {*[]} combinationOptions + * @param {number} combinationLength + * @return {*[]} + */ + +export default function combineWithRepetitions(combinationOptions, combinationLength) { + // If combination length equal to 0 then return empty combination. + if (combinationLength === 0) { + return [[]]; + } + + // If combination options are empty then return "no-combinations" array. + if (combinationOptions.length === 0) { + return []; + } + + // Init combinations array. + const combos = []; + + // Find all shorter combinations and attach head to each of those. + const headCombo = [combinationOptions[0]]; + const shorterCombos = combineWithRepetitions(combinationOptions, combinationLength - 1); + + for (let combinationIndex = 0; combinationIndex < shorterCombos.length; combinationIndex += 1) { + const combo = headCombo.concat(shorterCombos[combinationIndex]); + combos.push(combo); + } + + // Let's shift head to the right and calculate all the rest combinations. + const combinationsWithoutHead = combineWithRepetitions( + combinationOptions.slice(1), + combinationLength, + ); + + // Join all combinations and return them. + return combos.concat(combinationsWithoutHead); +} From bc1db9b240a512a92533b9425404a26d5ef5382e Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Mon, 23 Apr 2018 09:38:46 +0300 Subject: [PATCH 178/327] Add combinations. --- README.md | 6 +- .../{string => math}/combinations/README.md | 0 .../__test__/combineWithRepetitions.test.js | 2 +- .../combineWithoutRepetitions.test.js | 60 ++++++++++++++++ .../combinations/combineWithRepetitions.js | 0 .../combinations/combineWithoutRepetitions.js | 11 +-- .../{string => math}/permutations/README.md | 0 .../__test__/permutateWithRepetitions.test.js | 55 ++++++++++++++ .../permutateWithoutRepetitions.test.js | 71 +++++++++++++++++++ .../permutations/permutateWithRepetitions.js | 42 +++++++++++ .../permutateWithoutRepetitions.js | 39 ++++++++++ .../combineWithoutRepetitions.test.js | 40 ----------- .../__test__/permutateWithRepetitions.test.js | 53 -------------- .../permutateWithoutRepetitions.test.js | 69 ------------------ .../permutations/permutateWithRepetitions.js | 41 ----------- .../permutateWithoutRepetitions.js | 39 ---------- 16 files changed, 277 insertions(+), 251 deletions(-) rename src/algorithms/{string => math}/combinations/README.md (100%) rename src/algorithms/{string => math}/combinations/__test__/combineWithRepetitions.test.js (96%) create mode 100644 src/algorithms/math/combinations/__test__/combineWithoutRepetitions.test.js rename src/algorithms/{string => math}/combinations/combineWithRepetitions.js (100%) rename src/algorithms/{string => math}/combinations/combineWithoutRepetitions.js (82%) rename src/algorithms/{string => math}/permutations/README.md (100%) create mode 100644 src/algorithms/math/permutations/__test__/permutateWithRepetitions.test.js create mode 100644 src/algorithms/math/permutations/__test__/permutateWithoutRepetitions.test.js create mode 100644 src/algorithms/math/permutations/permutateWithRepetitions.js create mode 100644 src/algorithms/math/permutations/permutateWithoutRepetitions.js delete mode 100644 src/algorithms/string/combinations/__test__/combineWithoutRepetitions.test.js delete mode 100644 src/algorithms/string/permutations/__test__/permutateWithRepetitions.test.js delete mode 100644 src/algorithms/string/permutations/__test__/permutateWithoutRepetitions.test.js delete mode 100644 src/algorithms/string/permutations/permutateWithRepetitions.js delete mode 100644 src/algorithms/string/permutations/permutateWithoutRepetitions.js diff --git a/README.md b/README.md index 62650ba83..7f68441e5 100644 --- a/README.md +++ b/README.md @@ -32,13 +32,13 @@ * [Fibonacci Number](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/fibonacci) * [Cartesian Product](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/cartesian-product) * [Power Set](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/power-set) - * [Primality Test](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/primality-test) (trial division) + * [Permutations](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/permutations) (with and without repetitions) + * [Combinations](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/combinations) (with and without repetitions) + * [Primality Test](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/primality-test) (trial division method) * [Euclidean Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/euclidean-algorithm) - calculate the greatest common divisor (GCD) * [Least Common Multiple (LCM)](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/least-common-multiple) * [Fisher–Yates Shuffle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/fisher-yates) - random permutation of a finite sequence * **String** - * [Permutations](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/permutations) (with and without repetitions) - * [Combinations](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/combinations) (with and without repetitions) * Minimum Edit distance (Levenshtein Distance) * Hamming * Huffman diff --git a/src/algorithms/string/combinations/README.md b/src/algorithms/math/combinations/README.md similarity index 100% rename from src/algorithms/string/combinations/README.md rename to src/algorithms/math/combinations/README.md diff --git a/src/algorithms/string/combinations/__test__/combineWithRepetitions.test.js b/src/algorithms/math/combinations/__test__/combineWithRepetitions.test.js similarity index 96% rename from src/algorithms/string/combinations/__test__/combineWithRepetitions.test.js rename to src/algorithms/math/combinations/__test__/combineWithRepetitions.test.js index 90c38958e..25c8a20c5 100644 --- a/src/algorithms/string/combinations/__test__/combineWithRepetitions.test.js +++ b/src/algorithms/math/combinations/__test__/combineWithRepetitions.test.js @@ -1,5 +1,5 @@ import combineWithRepetitions from '../combineWithRepetitions'; -import factorial from '../../../math/factorial/factorial'; +import factorial from '../../factorial/factorial'; describe('combineWithRepetitions', () => { it('should combine string with repetitions', () => { diff --git a/src/algorithms/math/combinations/__test__/combineWithoutRepetitions.test.js b/src/algorithms/math/combinations/__test__/combineWithoutRepetitions.test.js new file mode 100644 index 000000000..1c048adaa --- /dev/null +++ b/src/algorithms/math/combinations/__test__/combineWithoutRepetitions.test.js @@ -0,0 +1,60 @@ +import combineWithoutRepetitions from '../combineWithoutRepetitions'; +import factorial from '../../factorial/factorial'; + +describe('combineWithoutRepetitions', () => { + it('should combine string without repetitions', () => { + expect(combineWithoutRepetitions(['A', 'B'], 3)).toEqual([]); + + expect(combineWithoutRepetitions(['A', 'B'], 1)).toEqual([ + ['A'], + ['B'], + ]); + + expect(combineWithoutRepetitions(['A'], 1)).toEqual([ + ['A'], + ]); + + expect(combineWithoutRepetitions(['A', 'B'], 2)).toEqual([ + ['A', 'B'], + ]); + + expect(combineWithoutRepetitions(['A', 'B', 'C'], 2)).toEqual([ + ['A', 'B'], + ['A', 'C'], + ['B', 'C'], + ]); + + expect(combineWithoutRepetitions(['A', 'B', 'C'], 3)).toEqual([ + ['A', 'B', 'C'], + ]); + + expect(combineWithoutRepetitions(['A', 'B', 'C', 'D'], 3)).toEqual([ + ['A', 'B', 'C'], + ['A', 'B', 'D'], + ['A', 'C', 'D'], + ['B', 'C', 'D'], + ]); + + expect(combineWithoutRepetitions(['A', 'B', 'C', 'D', 'E'], 3)).toEqual([ + ['A', 'B', 'C'], + ['A', 'B', 'D'], + ['A', 'B', 'E'], + ['A', 'C', 'D'], + ['A', 'C', 'E'], + ['A', 'D', 'E'], + ['B', 'C', 'D'], + ['B', 'C', 'E'], + ['B', 'D', 'E'], + ['C', 'D', 'E'], + ]); + + const combinationOptions = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']; + const combinationSlotsNumber = 4; + const combinations = combineWithoutRepetitions(combinationOptions, combinationSlotsNumber); + const n = combinationOptions.length; + const r = combinationSlotsNumber; + const expectedNumberOfCombinations = factorial(n) / (factorial(r) * factorial(n - r)); + + expect(combinations.length).toBe(expectedNumberOfCombinations); + }); +}); diff --git a/src/algorithms/string/combinations/combineWithRepetitions.js b/src/algorithms/math/combinations/combineWithRepetitions.js similarity index 100% rename from src/algorithms/string/combinations/combineWithRepetitions.js rename to src/algorithms/math/combinations/combineWithRepetitions.js diff --git a/src/algorithms/string/combinations/combineWithoutRepetitions.js b/src/algorithms/math/combinations/combineWithoutRepetitions.js similarity index 82% rename from src/algorithms/string/combinations/combineWithoutRepetitions.js rename to src/algorithms/math/combinations/combineWithoutRepetitions.js index c087990d1..a8217fc5e 100644 --- a/src/algorithms/string/combinations/combineWithoutRepetitions.js +++ b/src/algorithms/math/combinations/combineWithoutRepetitions.js @@ -38,14 +38,14 @@ */ /** - * @param {string} combinationOptions + * @param {*[]} combinationOptions * @param {number} combinationLength - * @return {string[]} + * @return {*[]} */ export default function combineWithoutRepetitions(combinationOptions, combinationLength) { // If combination length is just 1 then return combinationOptions. if (combinationLength === 1) { - return Array.from(combinationOptions); + return combinationOptions.map(option => [option]); } // Init combinations array. @@ -53,12 +53,13 @@ export default function combineWithoutRepetitions(combinationOptions, combinatio for (let i = 0; i <= (combinationOptions.length - combinationLength); i += 1) { const smallerCombinations = combineWithoutRepetitions( - combinationOptions.substr(i + 1), + combinationOptions.slice(i + 1), combinationLength - 1, ); for (let j = 0; j < smallerCombinations.length; j += 1) { - combinations.push(combinationOptions[i] + smallerCombinations[j]); + const combination = [combinationOptions[i]].concat(smallerCombinations[j]); + combinations.push(combination); } } diff --git a/src/algorithms/string/permutations/README.md b/src/algorithms/math/permutations/README.md similarity index 100% rename from src/algorithms/string/permutations/README.md rename to src/algorithms/math/permutations/README.md diff --git a/src/algorithms/math/permutations/__test__/permutateWithRepetitions.test.js b/src/algorithms/math/permutations/__test__/permutateWithRepetitions.test.js new file mode 100644 index 000000000..2984b7c9e --- /dev/null +++ b/src/algorithms/math/permutations/__test__/permutateWithRepetitions.test.js @@ -0,0 +1,55 @@ +import permutateWithRepetitions from '../permutateWithRepetitions'; + +describe('permutateWithRepetitions', () => { + it('should permutate string with repetition', () => { + const permutations0 = permutateWithRepetitions([]); + expect(permutations0).toEqual([]); + + const permutations1 = permutateWithRepetitions(['A']); + expect(permutations1).toEqual([ + ['A'], + ]); + + const permutations2 = permutateWithRepetitions(['A', 'B']); + expect(permutations2).toEqual([ + ['A', 'A'], + ['A', 'B'], + ['B', 'A'], + ['B', 'B'], + ]); + + const permutations3 = permutateWithRepetitions(['A', 'B', 'C']); + expect(permutations3).toEqual([ + ['A', 'A', 'A'], + ['A', 'A', 'B'], + ['A', 'A', 'C'], + ['A', 'B', 'A'], + ['A', 'B', 'B'], + ['A', 'B', 'C'], + ['A', 'C', 'A'], + ['A', 'C', 'B'], + ['A', 'C', 'C'], + ['B', 'A', 'A'], + ['B', 'A', 'B'], + ['B', 'A', 'C'], + ['B', 'B', 'A'], + ['B', 'B', 'B'], + ['B', 'B', 'C'], + ['B', 'C', 'A'], + ['B', 'C', 'B'], + ['B', 'C', 'C'], + ['C', 'A', 'A'], + ['C', 'A', 'B'], + ['C', 'A', 'C'], + ['C', 'B', 'A'], + ['C', 'B', 'B'], + ['C', 'B', 'C'], + ['C', 'C', 'A'], + ['C', 'C', 'B'], + ['C', 'C', 'C'], + ]); + + const permutations4 = permutateWithRepetitions(['A', 'B', 'C', 'D']); + expect(permutations4.length).toBe(4 * 4 * 4 * 4); + }); +}); diff --git a/src/algorithms/math/permutations/__test__/permutateWithoutRepetitions.test.js b/src/algorithms/math/permutations/__test__/permutateWithoutRepetitions.test.js new file mode 100644 index 000000000..3d082c90d --- /dev/null +++ b/src/algorithms/math/permutations/__test__/permutateWithoutRepetitions.test.js @@ -0,0 +1,71 @@ +import permutateWithoutRepetitions from '../permutateWithoutRepetitions'; +import factorial from '../../factorial/factorial'; + +describe('permutateWithoutRepetitions', () => { + it('should permutate string', () => { + const permutations0 = permutateWithoutRepetitions([]); + expect(permutations0).toEqual([]); + + const permutations1 = permutateWithoutRepetitions(['A']); + expect(permutations1).toEqual([ + ['A'], + ]); + + const permutations2 = permutateWithoutRepetitions(['A', 'B']); + expect(permutations2.length).toBe(2); + expect(permutations2).toEqual([ + ['B', 'A'], + ['A', 'B'], + ]); + + const permutations6 = permutateWithoutRepetitions(['A', 'A']); + expect(permutations6.length).toBe(2); + expect(permutations6).toEqual([ + ['A', 'A'], + ['A', 'A'], + ]); + + const permutations3 = permutateWithoutRepetitions(['A', 'B', 'C']); + expect(permutations3.length).toBe(factorial(3)); + expect(permutations3).toEqual([ + ['C', 'B', 'A'], + ['B', 'C', 'A'], + ['B', 'A', 'C'], + ['C', 'A', 'B'], + ['A', 'C', 'B'], + ['A', 'B', 'C'], + ]); + + const permutations4 = permutateWithoutRepetitions(['A', 'B', 'C', 'D']); + expect(permutations4.length).toBe(factorial(4)); + expect(permutations4).toEqual([ + ['D', 'C', 'B', 'A'], + ['C', 'D', 'B', 'A'], + ['C', 'B', 'D', 'A'], + ['C', 'B', 'A', 'D'], + ['D', 'B', 'C', 'A'], + ['B', 'D', 'C', 'A'], + ['B', 'C', 'D', 'A'], + ['B', 'C', 'A', 'D'], + ['D', 'B', 'A', 'C'], + ['B', 'D', 'A', 'C'], + ['B', 'A', 'D', 'C'], + ['B', 'A', 'C', 'D'], + ['D', 'C', 'A', 'B'], + ['C', 'D', 'A', 'B'], + ['C', 'A', 'D', 'B'], + ['C', 'A', 'B', 'D'], + ['D', 'A', 'C', 'B'], + ['A', 'D', 'C', 'B'], + ['A', 'C', 'D', 'B'], + ['A', 'C', 'B', 'D'], + ['D', 'A', 'B', 'C'], + ['A', 'D', 'B', 'C'], + ['A', 'B', 'D', 'C'], + ['A', 'B', 'C', 'D'], + ]); + + const permutations5 = permutateWithoutRepetitions(['A', 'B', 'C', 'D', 'E', 'F']); + expect(permutations5.length).toBe(factorial(6)); + }); +}); diff --git a/src/algorithms/math/permutations/permutateWithRepetitions.js b/src/algorithms/math/permutations/permutateWithRepetitions.js new file mode 100644 index 000000000..25d6fcafa --- /dev/null +++ b/src/algorithms/math/permutations/permutateWithRepetitions.js @@ -0,0 +1,42 @@ +/** + * @param {*[]} permutationOptions + * @return {*[]} + */ +export default function permutateWithRepetitions(permutationOptions) { + // There is no permutations for empty array. + if (!permutationOptions || permutationOptions.length === 0) { + return []; + } + + // There is only one permutation for the 1-element array. + if (permutationOptions.length === 1) { + return [permutationOptions]; + } + + // Let's create initial set of permutations. + let previousPermutations = permutationOptions.map(option => [option]); + let currentPermutations = []; + let permutationSize = 1; + + // While the size of each permutation is less then or equal to options length... + while (permutationSize < permutationOptions.length) { + // Reset all current permutations. + currentPermutations = []; + + for (let permIndex = 0; permIndex < previousPermutations.length; permIndex += 1) { + for (let optionIndex = 0; optionIndex < permutationOptions.length; optionIndex += 1) { + let currentPermutation = previousPermutations[permIndex]; + currentPermutation = currentPermutation.concat([permutationOptions[optionIndex]]); + currentPermutations.push(currentPermutation); + } + } + + // Make current permutations to be the previous ones. + previousPermutations = currentPermutations.slice(0); + + // Increase permutation size counter. + permutationSize += 1; + } + + return currentPermutations; +} diff --git a/src/algorithms/math/permutations/permutateWithoutRepetitions.js b/src/algorithms/math/permutations/permutateWithoutRepetitions.js new file mode 100644 index 000000000..afdbd7d48 --- /dev/null +++ b/src/algorithms/math/permutations/permutateWithoutRepetitions.js @@ -0,0 +1,39 @@ +/** + * @param {*[]} permutationOptions + * @return {*[]} + */ +export default function permutateWithoutRepetitions(permutationOptions) { + if (permutationOptions.length === 0) { + return []; + } + + if (permutationOptions.length === 1) { + return [permutationOptions]; + } + + const permutations = []; + + // Get all permutations of length (n - 1). + const previousOptions = permutationOptions.slice(0, permutationOptions.length - 1); + const previousPermutations = permutateWithoutRepetitions(previousOptions); + + // Insert last option into every possible position of every previous permutation. + const lastOption = permutationOptions.slice(permutationOptions.length - 1); + + for ( + let permutationIndex = 0; + permutationIndex < previousPermutations.length; + permutationIndex += 1 + ) { + const currentPermutation = previousPermutations[permutationIndex]; + + // Insert last option into every possible position of currentPermutation. + for (let positionIndex = 0; positionIndex <= currentPermutation.length; positionIndex += 1) { + const permutationPrefix = currentPermutation.slice(0, positionIndex); + const permutationSuffix = currentPermutation.slice(positionIndex); + permutations.push(permutationPrefix.concat(lastOption, permutationSuffix)); + } + } + + return permutations; +} diff --git a/src/algorithms/string/combinations/__test__/combineWithoutRepetitions.test.js b/src/algorithms/string/combinations/__test__/combineWithoutRepetitions.test.js deleted file mode 100644 index 6d2987ec3..000000000 --- a/src/algorithms/string/combinations/__test__/combineWithoutRepetitions.test.js +++ /dev/null @@ -1,40 +0,0 @@ -import combineWithoutRepetitions from '../combineWithoutRepetitions'; -import factorial from '../../../math/factorial/factorial'; - -describe('combineWithoutRepetitions', () => { - it('should combine string without repetitions', () => { - expect(combineWithoutRepetitions('AB', 3)).toEqual([]); - expect(combineWithoutRepetitions('AB', 1)).toEqual(['A', 'B']); - expect(combineWithoutRepetitions('A', 1)).toEqual(['A']); - expect(combineWithoutRepetitions('AB', 2)).toEqual(['AB']); - expect(combineWithoutRepetitions('ABC', 2)).toEqual(['AB', 'AC', 'BC']); - expect(combineWithoutRepetitions('ABC', 3)).toEqual(['ABC']); - expect(combineWithoutRepetitions('ABCD', 3)).toEqual([ - 'ABC', - 'ABD', - 'ACD', - 'BCD', - ]); - expect(combineWithoutRepetitions('ABCDE', 3)).toEqual([ - 'ABC', - 'ABD', - 'ABE', - 'ACD', - 'ACE', - 'ADE', - 'BCD', - 'BCE', - 'BDE', - 'CDE', - ]); - - const combinationOptions = 'ABCDEFGH'; - const combinationSlotsNumber = 4; - const combinations = combineWithoutRepetitions(combinationOptions, combinationSlotsNumber); - const n = combinationOptions.length; - const r = combinationSlotsNumber; - const expectedNumberOfCombinations = factorial(n) / (factorial(r) * factorial(n - r)); - - expect(combinations.length).toBe(expectedNumberOfCombinations); - }); -}); diff --git a/src/algorithms/string/permutations/__test__/permutateWithRepetitions.test.js b/src/algorithms/string/permutations/__test__/permutateWithRepetitions.test.js deleted file mode 100644 index a43ec7dbe..000000000 --- a/src/algorithms/string/permutations/__test__/permutateWithRepetitions.test.js +++ /dev/null @@ -1,53 +0,0 @@ -import permutateWithRepetition from '../permutateWithRepetitions'; - -describe('permutateWithRepetition', () => { - it('should permutate string with repetition', () => { - const permutations0 = permutateWithRepetition(''); - expect(permutations0).toEqual([]); - - const permutations1 = permutateWithRepetition('A'); - expect(permutations1).toEqual(['A']); - - const permutations2 = permutateWithRepetition('AB'); - expect(permutations2).toEqual([ - 'AA', - 'AB', - 'BA', - 'BB', - ]); - - const permutations3 = permutateWithRepetition('ABC'); - expect(permutations3).toEqual([ - 'AAA', - 'AAB', - 'AAC', - 'ABA', - 'ABB', - 'ABC', - 'ACA', - 'ACB', - 'ACC', - 'BAA', - 'BAB', - 'BAC', - 'BBA', - 'BBB', - 'BBC', - 'BCA', - 'BCB', - 'BCC', - 'CAA', - 'CAB', - 'CAC', - 'CBA', - 'CBB', - 'CBC', - 'CCA', - 'CCB', - 'CCC', - ]); - - const permutations4 = permutateWithRepetition('ABCD'); - expect(permutations4.length).toBe(4 * 4 * 4 * 4); - }); -}); diff --git a/src/algorithms/string/permutations/__test__/permutateWithoutRepetitions.test.js b/src/algorithms/string/permutations/__test__/permutateWithoutRepetitions.test.js deleted file mode 100644 index 0130fd0ab..000000000 --- a/src/algorithms/string/permutations/__test__/permutateWithoutRepetitions.test.js +++ /dev/null @@ -1,69 +0,0 @@ -import permutateWithoutRepetitions from '../permutateWithoutRepetitions'; -import factorial from '../../../math/factorial/factorial'; - -describe('permutateString', () => { - it('should permutate string', () => { - const permutations0 = permutateWithoutRepetitions(''); - expect(permutations0).toEqual([]); - - const permutations1 = permutateWithoutRepetitions('A'); - expect(permutations1).toEqual(['A']); - - const permutations2 = permutateWithoutRepetitions('AB'); - expect(permutations2.length).toBe(2); - expect(permutations2).toEqual([ - 'BA', - 'AB', - ]); - - const permutations6 = permutateWithoutRepetitions('AA'); - expect(permutations6.length).toBe(2); - expect(permutations6).toEqual([ - 'AA', - 'AA', - ]); - - const permutations3 = permutateWithoutRepetitions('ABC'); - expect(permutations3.length).toBe(factorial(3)); - expect(permutations3).toEqual([ - 'CBA', - 'BCA', - 'BAC', - 'CAB', - 'ACB', - 'ABC', - ]); - - const permutations4 = permutateWithoutRepetitions('ABCD'); - expect(permutations4.length).toBe(factorial(4)); - expect(permutations4).toEqual([ - 'DCBA', - 'CDBA', - 'CBDA', - 'CBAD', - 'DBCA', - 'BDCA', - 'BCDA', - 'BCAD', - 'DBAC', - 'BDAC', - 'BADC', - 'BACD', - 'DCAB', - 'CDAB', - 'CADB', - 'CABD', - 'DACB', - 'ADCB', - 'ACDB', - 'ACBD', - 'DABC', - 'ADBC', - 'ABDC', - 'ABCD', - ]); - - const permutations5 = permutateWithoutRepetitions('ABCDEF'); - expect(permutations5.length).toBe(factorial(6)); - }); -}); diff --git a/src/algorithms/string/permutations/permutateWithRepetitions.js b/src/algorithms/string/permutations/permutateWithRepetitions.js deleted file mode 100644 index 1bae1df3b..000000000 --- a/src/algorithms/string/permutations/permutateWithRepetitions.js +++ /dev/null @@ -1,41 +0,0 @@ -/** - * @param {string} str - * @return {string[]} - */ -export default function permutateWithRepetition(str) { - // There is no permutations for empty string. - if (!str || str.length === 0) { - return []; - } - - // There is only one permutation for the 1-character string. - if (str.length === 1) { - return [str]; - } - - // Let's create initial set of permutations. - let previousPermutations = Array.from(str); - let currentPermutations = []; - let permutationSize = 1; - - // While the size of each permutation is less then or equal to string length... - while (permutationSize < str.length) { - // Reset all current permutations. - currentPermutations = []; - - for (let pemIndex = 0; pemIndex < previousPermutations.length; pemIndex += 1) { - for (let charIndex = 0; charIndex < str.length; charIndex += 1) { - const currentPermutation = previousPermutations[pemIndex] + str[charIndex]; - currentPermutations.push(currentPermutation); - } - } - - // Make current permutations to be the previous ones. - previousPermutations = currentPermutations.slice(0); - - // Increase permutation size counter. - permutationSize += 1; - } - - return currentPermutations; -} diff --git a/src/algorithms/string/permutations/permutateWithoutRepetitions.js b/src/algorithms/string/permutations/permutateWithoutRepetitions.js deleted file mode 100644 index 0a0346361..000000000 --- a/src/algorithms/string/permutations/permutateWithoutRepetitions.js +++ /dev/null @@ -1,39 +0,0 @@ -/** - * @param {string} str - * @return {string[]} - */ -export default function permutateWithoutRepetitions(str) { - if (str.length === 0) { - return []; - } - - if (str.length === 1) { - return [str]; - } - - const permutations = []; - - // Get all permutations of string of length (n - 1). - const previousString = str.substring(0, str.length - 1); - const previousPermutations = permutateWithoutRepetitions(previousString); - - // Insert last character into every possible position of every previous permutation. - const lastCharacter = str.substring(str.length - 1); - - for ( - let permutationIndex = 0; - permutationIndex < previousPermutations.length; - permutationIndex += 1 - ) { - const currentPermutation = previousPermutations[permutationIndex]; - - // Insert strLastCharacter into every possible position of currentPermutation. - for (let positionIndex = 0; positionIndex <= currentPermutation.length; positionIndex += 1) { - const permutationPrefix = currentPermutation.substr(0, positionIndex); - const permutationSuffix = currentPermutation.substr(positionIndex); - permutations.push(permutationPrefix + lastCharacter + permutationSuffix); - } - } - - return permutations; -} From 4bfa01452eef987520630b2f1c251c66093d56c9 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Tue, 24 Apr 2018 06:41:16 +0300 Subject: [PATCH 179/327] Add Levenshtein. --- README.md | 2 +- .../string/levenshtein-distance/README.md | 45 +++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 src/algorithms/string/levenshtein-distance/README.md diff --git a/README.md b/README.md index 7f68441e5..bcd85d3c4 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ * [Least Common Multiple (LCM)](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/least-common-multiple) * [Fisher–Yates Shuffle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/fisher-yates) - random permutation of a finite sequence * **String** - * Minimum Edit distance (Levenshtein Distance) + * [Levenshtein Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/levenshtein-distance) - minimum edit distance between two sequences * Hamming * Huffman * Knuth Morris Pratt diff --git a/src/algorithms/string/levenshtein-distance/README.md b/src/algorithms/string/levenshtein-distance/README.md new file mode 100644 index 000000000..4085c5333 --- /dev/null +++ b/src/algorithms/string/levenshtein-distance/README.md @@ -0,0 +1,45 @@ +# Levenshtein Distance + +The Levenshtein distance is a string metric for measuring the +difference between two sequences. Informally, the Levenshtein +distance between two words is the minimum number of +single-character edits (insertions, deletions or substitutions) +required to change one word into the other. + +## Definition + +Mathematically, the Levenshtein distance between two strings +`a` and `b` (of length `|a|` and `|b|` respectively) is given by +![Levenshtein](https://wikimedia.org/api/rest_v1/media/math/render/svg/4cf357d8f2135035207088d2c7b890fb4b64e410) +where + +![Levenshtein](https://wikimedia.org/api/rest_v1/media/math/render/svg/f0a48ecfc9852c042382fdc33c19e11a16948e85) + +where +![Levenshtein](https://wikimedia.org/api/rest_v1/media/math/render/svg/52512ede08444b13838c570ba4a3fc71d54dbce9) +is the indicator function equal to `0` when +![Levenshtein](https://wikimedia.org/api/rest_v1/media/math/render/svg/231fda9ee578f0328c5ca28088d01928bb0aaaec) +and equal to 1 otherwise, and +![Levenshtein](https://wikimedia.org/api/rest_v1/media/math/render/svg/bdc0315678caad28648aafedb6ebafb16bd1655c) +is the distance between the first `i` characters of `a` and the first +`j` characters of `b`. + +Note that the first element in the minimum corresponds to +deletion (from `a` to `b`), the second to insertion and +the third to match or mismatch, depending on whether the +respective symbols are the same. + +## Example + +For example, the Levenshtein distance between `kitten` and +`sitting` is `3`, since the following three edits change one +into the other, and there is no way to do it with fewer than +three edits: + +1. **k**itten → **s**itten (substitution of "s" for "k") +2. sitt**e**n → sitt**i**n (substitution of "i" for "e") +3. sittin → sittin**g** (insertion of "g" at the end). + +## References + +- [Wikipedia](https://en.wikipedia.org/wiki/Levenshtein_distance) From cdc32311acbc5db0c80531cd3ea02b8b25b32148 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Tue, 24 Apr 2018 07:54:38 +0300 Subject: [PATCH 180/327] Add Levenshtein. --- .../__test__/levenshteinDistance.test.js | 29 +++++++++++++++ .../levenshteinDistance.js | 37 +++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 src/algorithms/string/levenshtein-distance/__test__/levenshteinDistance.test.js create mode 100644 src/algorithms/string/levenshtein-distance/levenshteinDistance.js diff --git a/src/algorithms/string/levenshtein-distance/__test__/levenshteinDistance.test.js b/src/algorithms/string/levenshtein-distance/__test__/levenshteinDistance.test.js new file mode 100644 index 000000000..e4e46d567 --- /dev/null +++ b/src/algorithms/string/levenshtein-distance/__test__/levenshteinDistance.test.js @@ -0,0 +1,29 @@ +import levenshteinDistance from '../levenshteinDistance'; + +describe('levenshteinDistance', () => { + it('should calculate edit distance between two strings', () => { + expect(levenshteinDistance('', '')).toBe(0); + expect(levenshteinDistance('a', '')).toBe(1); + expect(levenshteinDistance('', 'a')).toBe(1); + expect(levenshteinDistance('abc', '')).toBe(3); + expect(levenshteinDistance('', 'abc')).toBe(3); + + // Should just add I to the beginning. + expect(levenshteinDistance('islander', 'slander')).toBe(1); + + // Needs to substitute M by K, T by M and add an A to the end + expect(levenshteinDistance('mart', 'karma')).toBe(3); + + // Substitute K by S, E by I and insert G at the end. + expect(levenshteinDistance('kitten', 'sitting')).toBe(3); + + // Should add 4 letters FOOT at the beginning. + expect(levenshteinDistance('ball', 'football')).toBe(4); + + // Should delete 4 letters FOOT at the beginning. + expect(levenshteinDistance('football', 'foot')).toBe(4); + + // Needs to substitute the first 5 chars: INTEN by EXECU + expect(levenshteinDistance('intention', 'execution')).toBe(5); + }); +}); diff --git a/src/algorithms/string/levenshtein-distance/levenshteinDistance.js b/src/algorithms/string/levenshtein-distance/levenshteinDistance.js new file mode 100644 index 000000000..051e080ea --- /dev/null +++ b/src/algorithms/string/levenshtein-distance/levenshteinDistance.js @@ -0,0 +1,37 @@ +/** + * @param {string} a + * @param {string} b + * @return {number} + */ +export default function levenshteinDistance(a, b) { + // Create empty edit distance matrix for all possible modifications of + // substrings of a to substrings of b. + const distanceMatrix = Array(b.length + 1).fill(null).map(() => Array(a.length + 1).fill(null)); + + // Fill the first raw of the matrix. + // If this is first row then we're transforming empty string to a. + // In this case the number of transformations equals to size of a substring. + for (let i = 0; i <= a.length; i += 1) { + distanceMatrix[0][i] = i; + } + + // Fill the first column of the matrix. + // If this is first column then we're transforming empty string to b. + // In this case the number of transformations equals to size of b substring. + for (let j = 0; j <= b.length; j += 1) { + distanceMatrix[j][0] = j; + } + + for (let j = 1; j <= b.length; j += 1) { + for (let i = 1; i <= a.length; i += 1) { + const indicator = a[i - 1] === b[j - 1] ? 0 : 1; + distanceMatrix[j][i] = Math.min( + distanceMatrix[j][i - 1] + 1, // deletion + distanceMatrix[j - 1][i] + 1, // insertion + distanceMatrix[j - 1][i - 1] + indicator, // substitution + ); + } + } + + return distanceMatrix[b.length][a.length]; +} From b44a4224638b276d5c58a604f39dce8160043aae Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Tue, 24 Apr 2018 07:55:53 +0300 Subject: [PATCH 181/327] Add Levenshtein. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index bcd85d3c4..c2ca16399 100644 --- a/README.md +++ b/README.md @@ -35,8 +35,8 @@ * [Permutations](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/permutations) (with and without repetitions) * [Combinations](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/combinations) (with and without repetitions) * [Primality Test](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/primality-test) (trial division method) - * [Euclidean Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/euclidean-algorithm) - calculate the greatest common divisor (GCD) - * [Least Common Multiple (LCM)](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/least-common-multiple) + * [Euclidean Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/euclidean-algorithm) - calculate the Greatest Common Divisor (GCD) + * [Least Common Multiple](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/least-common-multiple) (LCM) * [Fisher–Yates Shuffle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/fisher-yates) - random permutation of a finite sequence * **String** * [Levenshtein Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/levenshtein-distance) - minimum edit distance between two sequences From a4b152bf78adc620fd62189a228c3ccb3e18cf89 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Tue, 24 Apr 2018 14:45:55 +0300 Subject: [PATCH 182/327] Add Hamming. --- README.md | 2 +- .../string/hamming-distance/README.md | 23 +++++++++++++++++++ .../__test__/hammingDistance.test.js | 21 +++++++++++++++++ .../hamming-distance/hammingDistance.js | 20 ++++++++++++++++ 4 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 src/algorithms/string/hamming-distance/README.md create mode 100644 src/algorithms/string/hamming-distance/__test__/hammingDistance.test.js create mode 100644 src/algorithms/string/hamming-distance/hammingDistance.js diff --git a/README.md b/README.md index c2ca16399..0e2413375 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ * [Fisher–Yates Shuffle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/fisher-yates) - random permutation of a finite sequence * **String** * [Levenshtein Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/levenshtein-distance) - minimum edit distance between two sequences - * Hamming + * [Hamming Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/hamming-distance) - number of positions at which the symbols are different * Huffman * Knuth Morris Pratt * Longest common subsequence diff --git a/src/algorithms/string/hamming-distance/README.md b/src/algorithms/string/hamming-distance/README.md new file mode 100644 index 000000000..516a8e037 --- /dev/null +++ b/src/algorithms/string/hamming-distance/README.md @@ -0,0 +1,23 @@ +# Hamming Distance + +the Hamming distance between two strings of equal length is the +number of positions at which the corresponding symbols are +different. In other words, it measures the minimum number of +substitutions required to change one string into the other, or +the minimum number of errors that could have transformed one +string into the other. In a more general context, the Hamming +distance is one of several string metrics for measuring the +edit distance between two sequences. + +## Examples + +The Hamming distance between: + +- "ka**rol**in" and "ka**thr**in" is **3**. +- "k**a**r**ol**in" and "k**e**r**st**in" is **3**. +- 10**1**1**1**01 and 10**0**1**0**01 is **2**. +- 2**17**3**8**96 and 2**23**3**7**96 is **3**. + +## References + +[Wikipedia](https://en.wikipedia.org/wiki/Hamming_distance) diff --git a/src/algorithms/string/hamming-distance/__test__/hammingDistance.test.js b/src/algorithms/string/hamming-distance/__test__/hammingDistance.test.js new file mode 100644 index 000000000..e8e8fd7a1 --- /dev/null +++ b/src/algorithms/string/hamming-distance/__test__/hammingDistance.test.js @@ -0,0 +1,21 @@ +import hammingDistance from '../hammingDistance'; + +describe('hammingDistance', () => { + it('should throw an error when trying to compare the strings of different lengths', () => { + const compareStringsOfDifferentLength = () => { + hammingDistance('a', 'aa'); + }; + + expect(compareStringsOfDifferentLength).toThrowError(); + }); + + it('should calculate difference between two strings', () => { + expect(hammingDistance('a', 'a')).toBe(0); + expect(hammingDistance('a', 'b')).toBe(1); + expect(hammingDistance('abc', 'add')).toBe(2); + expect(hammingDistance('karolin', 'kathrin')).toBe(3); + expect(hammingDistance('karolin', 'kerstin')).toBe(3); + expect(hammingDistance('1011101', '1001001')).toBe(2); + expect(hammingDistance('2173896', '2233796')).toBe(3); + }); +}); diff --git a/src/algorithms/string/hamming-distance/hammingDistance.js b/src/algorithms/string/hamming-distance/hammingDistance.js new file mode 100644 index 000000000..3749e78b4 --- /dev/null +++ b/src/algorithms/string/hamming-distance/hammingDistance.js @@ -0,0 +1,20 @@ +/** + * @param {string} a + * @param {string} b + * @return {number} + */ +export default function hammingDistance(a, b) { + if (a.length !== b.length) { + throw new Error('Strings must be of the same length'); + } + + let distance = 0; + + for (let i = 0; i < a.length; i += 1) { + if (a[i] !== b[i]) { + distance += 1; + } + } + + return distance; +} From 07e9209267b3796ed6314df46bd3eb1621b56f4a Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Tue, 24 Apr 2018 15:02:45 +0300 Subject: [PATCH 183/327] Update README. --- README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/README.md b/README.md index 0e2413375..443dbef35 100644 --- a/README.md +++ b/README.md @@ -112,9 +112,6 @@ npm test -- -t 'playground' ## Useful links * [Data Structures and Algorithms on YouTube](https://www.youtube.com/playlist?list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) -* Algorithms - * Dynamic Programming - * [Introduction to Dynamic Programming 1](https://www.hackerearth.com/practice/algorithms/dynamic-programming/introduction-to-dynamic-programming-1/tutorial/) ## Useful Information From 136cb92c40c9cebaa0376cb7edd912b44f866205 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Tue, 24 Apr 2018 15:07:11 +0300 Subject: [PATCH 184/327] Update README. --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 443dbef35..b53e85b98 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,6 @@ * **String** * [Levenshtein Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/levenshtein-distance) - minimum edit distance between two sequences * [Hamming Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/hamming-distance) - number of positions at which the symbols are different - * Huffman * Knuth Morris Pratt * Longest common subsequence * longest common substring From 74a06979cf65b099edb0f588dcd2a78c899573b6 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Tue, 24 Apr 2018 15:41:06 +0300 Subject: [PATCH 185/327] Update README. --- src/algorithms/string/levenshtein-distance/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/src/algorithms/string/levenshtein-distance/README.md b/src/algorithms/string/levenshtein-distance/README.md index 4085c5333..0ad2d5cb7 100644 --- a/src/algorithms/string/levenshtein-distance/README.md +++ b/src/algorithms/string/levenshtein-distance/README.md @@ -43,3 +43,4 @@ three edits: ## References - [Wikipedia](https://en.wikipedia.org/wiki/Levenshtein_distance) +- [YouTube](https://www.youtube.com/watch?v=We3YDTzNXEk) From fc067f5808dc694b2d3618ddc379c51e4fe87b89 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Tue, 24 Apr 2018 17:53:29 +0300 Subject: [PATCH 186/327] Add knuth. --- README.md | 4 +- .../string/knuth-morris-pratt/README.md | 19 +++++++ .../__test__/knuthMorrisPratt.test.js | 12 ++++ .../knuth-morris-pratt/knuthMorrisPratt.js | 55 +++++++++++++++++++ 4 files changed, 88 insertions(+), 2 deletions(-) create mode 100644 src/algorithms/string/knuth-morris-pratt/README.md create mode 100644 src/algorithms/string/knuth-morris-pratt/__test__/knuthMorrisPratt.test.js create mode 100644 src/algorithms/string/knuth-morris-pratt/knuthMorrisPratt.js diff --git a/README.md b/README.md index b53e85b98..40860e0f1 100644 --- a/README.md +++ b/README.md @@ -41,10 +41,10 @@ * **String** * [Levenshtein Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/levenshtein-distance) - minimum edit distance between two sequences * [Hamming Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/hamming-distance) - number of positions at which the symbols are different - * Knuth Morris Pratt + * [Knuth–Morris–Pratt algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/knuth-morris-pratt) - substring search + * Rabin Karp * Longest common subsequence * longest common substring - * Rabin Karp * **Search** * [Binary Search](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/search/binary-search) * **Sorting** diff --git a/src/algorithms/string/knuth-morris-pratt/README.md b/src/algorithms/string/knuth-morris-pratt/README.md new file mode 100644 index 000000000..8f17c9e94 --- /dev/null +++ b/src/algorithms/string/knuth-morris-pratt/README.md @@ -0,0 +1,19 @@ +# Knuth–Morris–Pratt Algorithm + +The Knuth–Morris–Pratt string searching algorithm (or +KMP algorithm) searches for occurrences of a "word" `W` +within a main "text string" `T` by employing the +observation that when a mismatch occurs, the word itself +embodies sufficient information to determine where the +next match could begin, thus bypassing re-examination +of previously matched characters. + +## Complexity + +- **Time:** `O(|W| + |T|)` (much faster comparing to trivial `O(|W| * |T|)`) +- **Space:** `O(|W|)` + +## References + +- [Wikipedia](https://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm) +- [YouTube](https://www.youtube.com/watch?v=GTJr8OvyEVQ) diff --git a/src/algorithms/string/knuth-morris-pratt/__test__/knuthMorrisPratt.test.js b/src/algorithms/string/knuth-morris-pratt/__test__/knuthMorrisPratt.test.js new file mode 100644 index 000000000..5b47e72a3 --- /dev/null +++ b/src/algorithms/string/knuth-morris-pratt/__test__/knuthMorrisPratt.test.js @@ -0,0 +1,12 @@ +import knuthMorrisPratt from '../knuthMorrisPratt'; + +describe('knuthMorrisPratt', () => { + it('should find word position in given text', () => { + expect(knuthMorrisPratt('abcbcglx', 'abca')).toBe(-1); + expect(knuthMorrisPratt('abcbcglx', 'bcgl')).toBe(3); + expect(knuthMorrisPratt('abcxabcdabxabcdabcdabcy', 'abcdabcy')).toBe(15); + expect(knuthMorrisPratt('abcxabcdabxabcdabcdabcy', 'abcdabca')).toBe(-1); + expect(knuthMorrisPratt('abcxabcdabxaabcdabcabcdabcdabcy', 'abcdabca')).toBe(12); + expect(knuthMorrisPratt('abcxabcdabxaabaabaaaabcdabcdabcy', 'aabaabaaa')).toBe(11); + }); +}); diff --git a/src/algorithms/string/knuth-morris-pratt/knuthMorrisPratt.js b/src/algorithms/string/knuth-morris-pratt/knuthMorrisPratt.js new file mode 100644 index 000000000..4c008e446 --- /dev/null +++ b/src/algorithms/string/knuth-morris-pratt/knuthMorrisPratt.js @@ -0,0 +1,55 @@ +/** + * @see https://www.youtube.com/watch?v=GTJr8OvyEVQ + * @param {string} word + * @return {number[]} + */ +function buildPatternTable(word) { + const patternTable = [0]; + let prefixIndex = 0; + let suffixIndex = 1; + + while (suffixIndex < word.length) { + if (word[prefixIndex] === word[suffixIndex]) { + patternTable[suffixIndex] = prefixIndex + 1; + suffixIndex += 1; + prefixIndex += 1; + } else if (prefixIndex === 0) { + patternTable[suffixIndex] = 0; + suffixIndex += 1; + } else { + prefixIndex = patternTable[prefixIndex - 1]; + } + } + + return patternTable; +} + +/** + * @param {string} text + * @param {string} word + * @return {number} + */ +export default function knuthMorrisPratt(text, word) { + let textIndex = 0; + let wordIndex = 0; + + const patternTable = buildPatternTable(word); + + while (textIndex < text.length) { + if (text[textIndex] === word[wordIndex]) { + // We've found a match. + if (wordIndex === word.length - 1) { + return (textIndex - word.length) + 1; + } + wordIndex += 1; + textIndex += 1; + } else if (wordIndex > 0) { + wordIndex = patternTable[wordIndex - 1]; + } else { + wordIndex = 0; + textIndex += 1; + } + } + + return -1; +} From a3c91b1e7f9da3b5e2046da57dc1f49a24f8035e Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Tue, 24 Apr 2018 17:55:27 +0300 Subject: [PATCH 187/327] Add knuth. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 40860e0f1..57b699d3d 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ * [Least Common Multiple](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/least-common-multiple) (LCM) * [Fisher–Yates Shuffle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/fisher-yates) - random permutation of a finite sequence * **String** - * [Levenshtein Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/levenshtein-distance) - minimum edit distance between two sequences + * [Levenshtein Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/levenshtein-distance) - minimum edit distance between two sequences (using DP) * [Hamming Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/hamming-distance) - number of positions at which the symbols are different * [Knuth–Morris–Pratt algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/knuth-morris-pratt) - substring search * Rabin Karp From 5690ef5786c6af1a6c100ea46e6287330316a8ef Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Tue, 24 Apr 2018 17:56:02 +0300 Subject: [PATCH 188/327] Add knuth. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 57b699d3d..f1de421b7 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ * [Least Common Multiple](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/least-common-multiple) (LCM) * [Fisher–Yates Shuffle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/fisher-yates) - random permutation of a finite sequence * **String** - * [Levenshtein Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/levenshtein-distance) - minimum edit distance between two sequences (using DP) + * [Levenshtein Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/levenshtein-distance) - minimum edit distance between two sequences (DP approach) * [Hamming Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/hamming-distance) - number of positions at which the symbols are different * [Knuth–Morris–Pratt algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/knuth-morris-pratt) - substring search * Rabin Karp From 04a6a9547c7a14268b5eb6636f454372f6f08cb9 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Tue, 24 Apr 2018 21:36:47 +0300 Subject: [PATCH 189/327] Add Rabin. --- README.md | 4 ++-- src/algorithms/string/rabin-karp/README.md | 24 ++++++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 src/algorithms/string/rabin-karp/README.md diff --git a/README.md b/README.md index f1de421b7..a21fe9b01 100644 --- a/README.md +++ b/README.md @@ -41,8 +41,8 @@ * **String** * [Levenshtein Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/levenshtein-distance) - minimum edit distance between two sequences (DP approach) * [Hamming Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/hamming-distance) - number of positions at which the symbols are different - * [Knuth–Morris–Pratt algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/knuth-morris-pratt) - substring search - * Rabin Karp + * [Knuth–Morris–Pratt Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/knuth-morris-pratt) - substring search + * [Rabin Karp Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/rabin-karp) - substring search * Longest common subsequence * longest common substring * **Search** diff --git a/src/algorithms/string/rabin-karp/README.md b/src/algorithms/string/rabin-karp/README.md new file mode 100644 index 000000000..40d29a55f --- /dev/null +++ b/src/algorithms/string/rabin-karp/README.md @@ -0,0 +1,24 @@ +# Rabin Karp Algorithm + +In computer science, the Rabin–Karp algorithm or Karp–Rabin algorithm +is a string searching algorithm created by Richard M. Karp and +Michael O. Rabin (1987) that uses hashing to find any one of a set +of pattern strings in a text. + +## Complexity + +For text of length `n` and `p` patterns +of combined length `m`, its average and best case running time is +`O(n + m)` in space `O(p)`, but its worst-case time is `O(n * m)`. + +## Application + +A practical application of the algorithm is detecting plagiarism. +Given source material, the algorithm can rapidly search through a paper +for instances of sentences from the source material, ignoring details +such as case and punctuation. Because of the abundance of the sought +strings, single-string searching algorithms are impractical. + +## References + +[Wikipedia](https://en.wikipedia.org/wiki/Rabin%E2%80%93Karp_algorithm) From 5068abff2ebbd41612f6a907d7cd351731fb4327 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Tue, 24 Apr 2018 21:51:01 +0300 Subject: [PATCH 190/327] Update README. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a21fe9b01..8100324e6 100644 --- a/README.md +++ b/README.md @@ -30,8 +30,8 @@ * **Math** * [Factorial](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/factorial) * [Fibonacci Number](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/fibonacci) - * [Cartesian Product](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/cartesian-product) - * [Power Set](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/power-set) + * [Cartesian Product](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/cartesian-product) - product of multiple sets + * [Power Set](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/power-set) - all subsets of the set * [Permutations](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/permutations) (with and without repetitions) * [Combinations](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/combinations) (with and without repetitions) * [Primality Test](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/primality-test) (trial division method) From 55463f428041e4dce39269e889f82ee5bc213bac Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Tue, 24 Apr 2018 22:51:01 +0300 Subject: [PATCH 191/327] Add Rabin. --- .../rabin-karp/__test__/rabinKarp.test.js | 21 +++++ src/algorithms/string/rabin-karp/rabinKarp.js | 90 +++++++++++++++++++ 2 files changed, 111 insertions(+) create mode 100644 src/algorithms/string/rabin-karp/__test__/rabinKarp.test.js create mode 100644 src/algorithms/string/rabin-karp/rabinKarp.js diff --git a/src/algorithms/string/rabin-karp/__test__/rabinKarp.test.js b/src/algorithms/string/rabin-karp/__test__/rabinKarp.test.js new file mode 100644 index 000000000..1548928f8 --- /dev/null +++ b/src/algorithms/string/rabin-karp/__test__/rabinKarp.test.js @@ -0,0 +1,21 @@ +import { rabinKarp, hashWord, reHashWord } from '../rabinKarp'; + +describe('rabinKarp', () => { + it('should correctly calculates hash and re-hash', () => { + expect(hashWord('a')).toBe(97); + expect(hashWord('b')).toBe(98); + expect(hashWord('abc')).toBe(941094); + expect(hashWord('bcd')).toBe(950601); + expect(reHashWord(hashWord('abc'), 'abc', 'bcd')).toBe(950601); + expect(reHashWord(hashWord('abc'), 'abc', 'bcd')).toBe(hashWord('bcd')); + }); + + it('should find substring in a string', () => { + expect(rabinKarp('abcbcglx', 'abca')).toBe(-1); + expect(rabinKarp('abcbcglx', 'bcgl')).toBe(3); + expect(rabinKarp('abcxabcdabxabcdabcdabcy', 'abcdabcy')).toBe(15); + expect(rabinKarp('abcxabcdabxabcdabcdabcy', 'abcdabca')).toBe(-1); + expect(rabinKarp('abcxabcdabxaabcdabcabcdabcdabcy', 'abcdabca')).toBe(12); + expect(rabinKarp('abcxabcdabxaabaabaaaabcdabcdabcy', 'aabaabaaa')).toBe(11); + }); +}); diff --git a/src/algorithms/string/rabin-karp/rabinKarp.js b/src/algorithms/string/rabin-karp/rabinKarp.js new file mode 100644 index 000000000..e6c544fac --- /dev/null +++ b/src/algorithms/string/rabin-karp/rabinKarp.js @@ -0,0 +1,90 @@ +/** + * A prime number used to create + * the hash representation of a word + * + * Bigger the prime number, + * bigger the hash value + */ +const PRIME = 97; + +/** + * Function that creates hash representation of the word. + * + * @param {string} word + * @return {number} + */ +export function hashWord(word) { + let hash = 0; + + for (let charIndex = 0; charIndex < word.length; charIndex += 1) { + hash += word[charIndex].charCodeAt(0) * (PRIME ** charIndex); + } + + return hash; +} + +/** + * Function that creates hash representation of the word + * based on previous word (shifted by one character left) hash value. + * + * Recalculates the hash representation of a word so that it isn't + * necessary to traverse the whole word again + * + * @param {number} prevHash + * @param {string} prevWord + * @param {string} newWord + * @return {number} + */ +export function reHashWord(prevHash, prevWord, newWord) { + const newWordLastIndex = newWord.length - 1; + let newHash = prevHash - prevWord[0].charCodeAt(0); + newHash /= PRIME; + newHash += newWord[newWordLastIndex].charCodeAt(0) * (PRIME ** newWordLastIndex); + + return newHash; +} + +/** + * @param {string} text + * @param {string} word + * @return {number} + */ +export function rabinKarp(text, word) { + // Calculate word hash that we will use for comparison with other substring hashes. + const wordHash = hashWord(word); + + let prevSegment = null; + let currentSegmentHash = null; + + // Go through all substring of the text that may match + for (let charIndex = 0; charIndex <= text.length - word.length; charIndex += 1) { + const currentSegment = text.substring(charIndex, charIndex + word.length); + + // Calculate the hash of current substring. + if (currentSegmentHash === null) { + currentSegmentHash = hashWord(currentSegment); + } else { + currentSegmentHash = reHashWord(currentSegmentHash, prevSegment, currentSegment); + } + + prevSegment = currentSegment; + + // Compare the hash of current substring and seeking string. + if (wordHash === currentSegmentHash) { + // In case if hashes match let's check substring char by char. + let numberOfMatches = 0; + + for (let deepCharIndex = 0; deepCharIndex < word.length; deepCharIndex += 1) { + if (word[deepCharIndex] === text[charIndex + deepCharIndex]) { + numberOfMatches += 1; + } + } + + if (numberOfMatches === word.length) { + return charIndex; + } + } + } + + return -1; +} From c4e492d5759b74ded78a6131bda57312669d4c6d Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Tue, 24 Apr 2018 22:51:45 +0300 Subject: [PATCH 192/327] Add Rabin. --- src/algorithms/string/rabin-karp/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/algorithms/string/rabin-karp/README.md b/src/algorithms/string/rabin-karp/README.md index 40d29a55f..800ec5b88 100644 --- a/src/algorithms/string/rabin-karp/README.md +++ b/src/algorithms/string/rabin-karp/README.md @@ -21,4 +21,5 @@ strings, single-string searching algorithms are impractical. ## References -[Wikipedia](https://en.wikipedia.org/wiki/Rabin%E2%80%93Karp_algorithm) +- [Wikipedia](https://en.wikipedia.org/wiki/Rabin%E2%80%93Karp_algorithm) +- [YouTube](https://www.youtube.com/watch?v=H4VrKHVG5qI) From aa81cec3da5cfcf41a7c66ed9a7675e212095bef Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Wed, 25 Apr 2018 15:36:05 +0300 Subject: [PATCH 193/327] Add LCS. --- README.md | 4 +- .../longest-common-subsequnce/README.md | 25 ++++++++ .../__test__/longestCommonSubsequnce.test.js | 13 ++++ .../longestCommonSubsequnce.js | 60 +++++++++++++++++++ 4 files changed, 100 insertions(+), 2 deletions(-) create mode 100644 src/algorithms/string/longest-common-subsequnce/README.md create mode 100644 src/algorithms/string/longest-common-subsequnce/__test__/longestCommonSubsequnce.test.js create mode 100644 src/algorithms/string/longest-common-subsequnce/longestCommonSubsequnce.js diff --git a/README.md b/README.md index 8100324e6..685f41225 100644 --- a/README.md +++ b/README.md @@ -39,11 +39,11 @@ * [Least Common Multiple](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/least-common-multiple) (LCM) * [Fisher–Yates Shuffle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/fisher-yates) - random permutation of a finite sequence * **String** - * [Levenshtein Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/levenshtein-distance) - minimum edit distance between two sequences (DP approach) + * [Levenshtein Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/levenshtein-distance) - minimum edit distance between two sequences (dynamic programming approach) * [Hamming Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/hamming-distance) - number of positions at which the symbols are different * [Knuth–Morris–Pratt Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/knuth-morris-pratt) - substring search * [Rabin Karp Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/rabin-karp) - substring search - * Longest common subsequence + * [Longest Common Subsequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/longest-common-subsequnce) (LCS) * longest common substring * **Search** * [Binary Search](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/search/binary-search) diff --git a/src/algorithms/string/longest-common-subsequnce/README.md b/src/algorithms/string/longest-common-subsequnce/README.md new file mode 100644 index 000000000..8427072ed --- /dev/null +++ b/src/algorithms/string/longest-common-subsequnce/README.md @@ -0,0 +1,25 @@ +# Longest common subsequence problem + +The longest common subsequence (LCS) problem is the problem of finding +the longest subsequence common to all sequences in a set of sequences +(often just two sequences). It differs from the longest common substring +problem: unlike substrings, subsequences are not required to occupy +consecutive positions within the original sequences. + +## Application + +The longest common subsequence problem is a classic computer science +problem, the basis of data comparison programs such as the diff utility, +and has applications in bioinformatics. It is also widely used by +revision control systems such as Git for reconciling multiple changes +made to a revision-controlled collection of files. + +## Example + +- LCS for input Sequences `ABCDGH` and `AEDFHR` is `ADH` of length 3. +- LCS for input Sequences `AGGTAB` and `GXTXAYB` is `GTAB` of length 4. + +## References + +- [Wikipedia](https://en.wikipedia.org/wiki/Longest_common_subsequence_problem) +- [YouTube](https://www.youtube.com/watch?v=NnD96abizww) diff --git a/src/algorithms/string/longest-common-subsequnce/__test__/longestCommonSubsequnce.test.js b/src/algorithms/string/longest-common-subsequnce/__test__/longestCommonSubsequnce.test.js new file mode 100644 index 000000000..7be969ee3 --- /dev/null +++ b/src/algorithms/string/longest-common-subsequnce/__test__/longestCommonSubsequnce.test.js @@ -0,0 +1,13 @@ +import longestCommonSubsequnce from '../longestCommonSubsequnce'; + +describe('longestCommonSubsequnce', () => { + it('should find longest common subsequence for two strings', () => { + expect(longestCommonSubsequnce('', '')).toBe(''); + expect(longestCommonSubsequnce('', 'ABC')).toBe(''); + expect(longestCommonSubsequnce('ABC', '')).toBe(''); + expect(longestCommonSubsequnce('ABC', 'DEFG')).toBe(''); + expect(longestCommonSubsequnce('ABCDGH', 'AEDFHR')).toBe('ADH'); + expect(longestCommonSubsequnce('AGGTAB', 'GXTXAYB')).toBe('GTAB'); + expect(longestCommonSubsequnce('ABCDAF', 'ACBCF')).toBe('ABCF'); + }); +}); diff --git a/src/algorithms/string/longest-common-subsequnce/longestCommonSubsequnce.js b/src/algorithms/string/longest-common-subsequnce/longestCommonSubsequnce.js new file mode 100644 index 000000000..94c6c4d9d --- /dev/null +++ b/src/algorithms/string/longest-common-subsequnce/longestCommonSubsequnce.js @@ -0,0 +1,60 @@ +/** + * @param {string} s1 + * @param {string} s2 + * @return {string} + */ +export default function longestCommonSubsequnce(s1, s2) { + // Init LCS matrix. + const lcsMatrix = Array(s2.length + 1).fill(null).map(() => Array(s1.length + 1).fill(null)); + + // Fill first row with zeros. + for (let columnIndex = 0; columnIndex <= s1.length; columnIndex += 1) { + lcsMatrix[0][columnIndex] = 0; + } + + // Fill first column with zeros. + for (let rowIndex = 0; rowIndex <= s2.length; rowIndex += 1) { + lcsMatrix[rowIndex][0] = 0; + } + + // Fill rest of the column that correspond to each of two strings. + for (let rowIndex = 1; rowIndex <= s2.length; rowIndex += 1) { + for (let columnIndex = 1; columnIndex <= s1.length; columnIndex += 1) { + if (s1[columnIndex - 1] === s2[rowIndex - 1]) { + lcsMatrix[rowIndex][columnIndex] = lcsMatrix[rowIndex - 1][columnIndex - 1] + 1; + } else { + lcsMatrix[rowIndex][columnIndex] = Math.max( + lcsMatrix[rowIndex - 1][columnIndex], + lcsMatrix[rowIndex][columnIndex - 1], + ); + } + } + } + + // Calculate LCS based on LCS matrix. + if (!lcsMatrix[s2.length][s1.length]) { + // If the length of largest common string is zero then return empty string. + return ''; + } + + let lcs = ''; + let columnIndex = s1.length; + let rowIndex = s2.length; + + while (columnIndex > 0 || rowIndex > 0) { + if (s1[columnIndex - 1] === s2[rowIndex - 1]) { + // Move by diagonal left-top. + lcs = s1[columnIndex - 1] + lcs; + columnIndex -= 1; + rowIndex -= 1; + } else if (lcsMatrix[rowIndex][columnIndex] === lcsMatrix[rowIndex][columnIndex - 1]) { + // Move left. + columnIndex -= 1; + } else { + // Move up. + rowIndex -= 1; + } + } + + return lcs; +} From 0c4784052087abba7c29b8ad4f79fc28c2e0e198 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Wed, 25 Apr 2018 16:00:26 +0300 Subject: [PATCH 194/327] Update README. --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 685f41225..4aee77fa3 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ * [Least Common Multiple](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/least-common-multiple) (LCM) * [Fisher–Yates Shuffle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/fisher-yates) - random permutation of a finite sequence * **String** - * [Levenshtein Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/levenshtein-distance) - minimum edit distance between two sequences (dynamic programming approach) + * [Levenshtein Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/levenshtein-distance) - minimum edit distance between two sequences * [Hamming Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/hamming-distance) - number of positions at which the symbols are different * [Knuth–Morris–Pratt Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/knuth-morris-pratt) - substring search * [Rabin Karp Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/rabin-karp) - substring search @@ -72,12 +72,13 @@ * Prim’s algorithm * Kruskal’s algorithm * **Dynamic Programming** + * [Levenshtein Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/levenshtein-distance) - minimum edit distance between two sequences + * [Longest Common Subsequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/longest-common-subsequnce) (LCS) * Increasing subsequence * Knapsack problem * Maximum subarray * Maximum sum path * Integer Partition - * Longest common Subsequence * Longest Increasing subsequence * Shortest common supersequence * **Uncategorized** From 8746a80780a40a6e6628ffc5de8af36f280b9254 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Wed, 25 Apr 2018 17:35:44 +0300 Subject: [PATCH 195/327] Add BFS and DFS for tree. --- README.md | 10 +- .../__test__/depthFirstSearch.test.js | 2 +- .../tree/breadth-first-search/README.md | 13 +++ .../__test__/breadthFirstSearch.test.js | 102 ++++++++++++++++++ .../breadthFirstSearch.js | 58 ++++++++++ .../tree/depth-first-search/README.md | 13 +++ .../__test__/depthFirstSearch.test.js | 102 ++++++++++++++++++ .../depth-first-search/depthFirstSearch.js | 52 +++++++++ 8 files changed, 346 insertions(+), 6 deletions(-) create mode 100644 src/algorithms/tree/breadth-first-search/README.md create mode 100644 src/algorithms/tree/breadth-first-search/__test__/breadthFirstSearch.test.js create mode 100644 src/algorithms/tree/breadth-first-search/breadthFirstSearch.js create mode 100644 src/algorithms/tree/depth-first-search/README.md create mode 100644 src/algorithms/tree/depth-first-search/__test__/depthFirstSearch.test.js create mode 100644 src/algorithms/tree/depth-first-search/depthFirstSearch.js diff --git a/README.md b/README.md index 4aee77fa3..6336b7da8 100644 --- a/README.md +++ b/README.md @@ -55,9 +55,12 @@ * [Merge Sort](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sorting/merge-sort) * [Quicksort](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sorting/quick-sort) * [Shellsort](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sorting/shell-sort) +* **Tree** + * [Depth-First Search](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/tree/depth-first-search) (DFS) + * [Breadth-First Search](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/tree/breadth-first-search) (BFS) * **Graph** - * [Depth-First Search (DFS)](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/depth-first-search) - * [Breadth-First Search (BFS)](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/breadth-first-search) + * [Depth-First Search](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/depth-first-search) (DFS) + * [Breadth-First Search](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/breadth-first-search) (BFS) * Detect Cycle * Topological Sorting * Dijkstra Algorithm to Find Shortest Path @@ -65,9 +68,6 @@ * Bellman Ford * Strongly Connected Component algorithm * Shortest Path Faster Algorithm (SPFA) -* **Tree** - * Depth-First Search (DFS) - * Breadth-First Search (BFS) * **Minimum Spanning Tree** * Prim’s algorithm * Kruskal’s algorithm diff --git a/src/algorithms/graph/depth-first-search/__test__/depthFirstSearch.test.js b/src/algorithms/graph/depth-first-search/__test__/depthFirstSearch.test.js index 1b556186b..52806dc8b 100644 --- a/src/algorithms/graph/depth-first-search/__test__/depthFirstSearch.test.js +++ b/src/algorithms/graph/depth-first-search/__test__/depthFirstSearch.test.js @@ -39,7 +39,7 @@ describe('depthFirstSearch', () => { const enterVertexCallback = jest.fn(); const leaveVertexCallback = jest.fn(); - // Traverse graphs without callbacks first. + // Traverse graphs without callbacks first to check default ones. depthFirstSearch(graph, vertexA); // Traverse graph with enterVertex and leaveVertex callbacks. diff --git a/src/algorithms/tree/breadth-first-search/README.md b/src/algorithms/tree/breadth-first-search/README.md new file mode 100644 index 000000000..d71dc7ece --- /dev/null +++ b/src/algorithms/tree/breadth-first-search/README.md @@ -0,0 +1,13 @@ +# Breadth-First Search (BFS) + +Breadth-first search (BFS) is an algorithm for traversing +or searching tree or graph data structures. It starts at +the tree root (or some arbitrary node of a graph, sometimes +referred to as a 'search key') and explores the neighbor +nodes first, before moving to the next level neighbors. + +![Algorithm Visualization](https://upload.wikimedia.org/wikipedia/commons/5/5d/Breadth-First-Search-Algorithm.gif) + +## References + +[Wikipedia](https://en.wikipedia.org/wiki/Breadth-first_search) diff --git a/src/algorithms/tree/breadth-first-search/__test__/breadthFirstSearch.test.js b/src/algorithms/tree/breadth-first-search/__test__/breadthFirstSearch.test.js new file mode 100644 index 000000000..4a77f0f31 --- /dev/null +++ b/src/algorithms/tree/breadth-first-search/__test__/breadthFirstSearch.test.js @@ -0,0 +1,102 @@ +import BinaryTreeNode from '../../../../data-structures/tree/BinaryTreeNode'; +import breadthFirstSearch from '../breadthFirstSearch'; + +describe('breadthFirstSearch', () => { + it('should perform DFS operation on tree', () => { + const nodeA = new BinaryTreeNode('A'); + const nodeB = new BinaryTreeNode('B'); + const nodeC = new BinaryTreeNode('C'); + const nodeD = new BinaryTreeNode('D'); + const nodeE = new BinaryTreeNode('E'); + const nodeF = new BinaryTreeNode('F'); + const nodeG = new BinaryTreeNode('G'); + + nodeA.setLeft(nodeB).setRight(nodeC); + nodeB.setLeft(nodeD).setRight(nodeE); + nodeC.setLeft(nodeF).setRight(nodeG); + + // In-order traversing. + expect(nodeA.toString()).toBe('D,B,E,A,F,C,G'); + + const enterNodeCallback = jest.fn(); + const leaveNodeCallback = jest.fn(); + + // Traverse tree without callbacks first to check default ones. + breadthFirstSearch(nodeA); + + // Traverse tree with callbacks. + breadthFirstSearch(nodeA, { + enterNode: enterNodeCallback, + leaveNode: leaveNodeCallback, + }); + + expect(enterNodeCallback).toHaveBeenCalledTimes(7); + expect(leaveNodeCallback).toHaveBeenCalledTimes(7); + + // Check node entering. + expect(enterNodeCallback.mock.calls[0][0].value).toEqual('A'); + expect(enterNodeCallback.mock.calls[1][0].value).toEqual('B'); + expect(enterNodeCallback.mock.calls[2][0].value).toEqual('C'); + expect(enterNodeCallback.mock.calls[3][0].value).toEqual('D'); + expect(enterNodeCallback.mock.calls[4][0].value).toEqual('E'); + expect(enterNodeCallback.mock.calls[5][0].value).toEqual('F'); + expect(enterNodeCallback.mock.calls[6][0].value).toEqual('G'); + + // Check node leaving. + expect(leaveNodeCallback.mock.calls[0][0].value).toEqual('A'); + expect(leaveNodeCallback.mock.calls[1][0].value).toEqual('B'); + expect(leaveNodeCallback.mock.calls[2][0].value).toEqual('C'); + expect(leaveNodeCallback.mock.calls[3][0].value).toEqual('D'); + expect(leaveNodeCallback.mock.calls[4][0].value).toEqual('E'); + expect(leaveNodeCallback.mock.calls[5][0].value).toEqual('F'); + expect(leaveNodeCallback.mock.calls[6][0].value).toEqual('G'); + }); + + it('allow users to redefine node visiting logic', () => { + const nodeA = new BinaryTreeNode('A'); + const nodeB = new BinaryTreeNode('B'); + const nodeC = new BinaryTreeNode('C'); + const nodeD = new BinaryTreeNode('D'); + const nodeE = new BinaryTreeNode('E'); + const nodeF = new BinaryTreeNode('F'); + const nodeG = new BinaryTreeNode('G'); + + nodeA.setLeft(nodeB).setRight(nodeC); + nodeB.setLeft(nodeD).setRight(nodeE); + nodeC.setLeft(nodeF).setRight(nodeG); + + // In-order traversing. + expect(nodeA.toString()).toBe('D,B,E,A,F,C,G'); + + const enterNodeCallback = jest.fn(); + const leaveNodeCallback = jest.fn(); + + // Traverse tree without callbacks first to check default ones. + breadthFirstSearch(nodeA); + + // Traverse tree with callbacks. + breadthFirstSearch(nodeA, { + allowTraversal: (node, child) => { + // Forbid traversing left half of the tree. + return child.value !== 'B'; + }, + enterNode: enterNodeCallback, + leaveNode: leaveNodeCallback, + }); + + expect(enterNodeCallback).toHaveBeenCalledTimes(4); + expect(leaveNodeCallback).toHaveBeenCalledTimes(4); + + // Check node entering. + expect(enterNodeCallback.mock.calls[0][0].value).toEqual('A'); + expect(enterNodeCallback.mock.calls[1][0].value).toEqual('C'); + expect(enterNodeCallback.mock.calls[2][0].value).toEqual('F'); + expect(enterNodeCallback.mock.calls[3][0].value).toEqual('G'); + + // Check node leaving. + expect(leaveNodeCallback.mock.calls[0][0].value).toEqual('A'); + expect(leaveNodeCallback.mock.calls[1][0].value).toEqual('C'); + expect(leaveNodeCallback.mock.calls[2][0].value).toEqual('F'); + expect(leaveNodeCallback.mock.calls[3][0].value).toEqual('G'); + }); +}); diff --git a/src/algorithms/tree/breadth-first-search/breadthFirstSearch.js b/src/algorithms/tree/breadth-first-search/breadthFirstSearch.js new file mode 100644 index 000000000..503ec34f9 --- /dev/null +++ b/src/algorithms/tree/breadth-first-search/breadthFirstSearch.js @@ -0,0 +1,58 @@ +import Queue from '../../../data-structures/queue/Queue'; + +/** + * @typedef {Object} Callbacks + * @property {function(node: BinaryTreeNode, child: BinaryTreeNode): boolean} allowTraversal - + * Determines whether DFS should traverse from the node to its child. + * @property {function(node: BinaryTreeNode)} enterNode - Called when DFS enters the node. + * @property {function(node: BinaryTreeNode)} leaveNode - Called when DFS leaves the node. + */ + +/** + * @param {Callbacks} [callbacks] + * @returns {Callbacks} + */ +function initCallbacks(callbacks = {}) { + const initiatedCallback = callbacks; + + const stubCallback = () => {}; + const defaultAllowTraversal = () => true; + + initiatedCallback.allowTraversal = callbacks.allowTraversal || defaultAllowTraversal; + initiatedCallback.enterNode = callbacks.enterNode || stubCallback; + initiatedCallback.leaveNode = callbacks.leaveNode || stubCallback; + + return initiatedCallback; +} + +/** + * @param {BinaryTreeNode} rootNode + * @param {Callbacks} [originalCallbacks] + */ +export default function breadthFirstSearch(rootNode, originalCallbacks) { + const callbacks = initCallbacks(originalCallbacks); + const nodeQueue = new Queue(); + + // Do initial queue setup. + nodeQueue.enqueue(rootNode); + + while (!nodeQueue.isEmpty()) { + const currentNode = nodeQueue.dequeue(); + + callbacks.enterNode(currentNode); + + // Add all children to the queue for future traversals. + + // Traverse left branch. + if (currentNode.left && callbacks.allowTraversal(currentNode, currentNode.left)) { + nodeQueue.enqueue(currentNode.left); + } + + // Traverse right branch. + if (currentNode.right && callbacks.allowTraversal(currentNode, currentNode.right)) { + nodeQueue.enqueue(currentNode.right); + } + + callbacks.leaveNode(currentNode); + } +} diff --git a/src/algorithms/tree/depth-first-search/README.md b/src/algorithms/tree/depth-first-search/README.md new file mode 100644 index 000000000..be3565d12 --- /dev/null +++ b/src/algorithms/tree/depth-first-search/README.md @@ -0,0 +1,13 @@ +# Depth-First Search (DFS) + +Depth-first search (DFS) is an algorithm for traversing or +searching tree or graph data structures. One starts at +the root (selecting some arbitrary node as the root in +the case of a graph) and explores as far as possible +along each branch before backtracking. + +![Algorithm Visualization](https://upload.wikimedia.org/wikipedia/commons/7/7f/Depth-First-Search.gif) + +## References + +[Wikipedia](https://en.wikipedia.org/wiki/Depth-first_search) diff --git a/src/algorithms/tree/depth-first-search/__test__/depthFirstSearch.test.js b/src/algorithms/tree/depth-first-search/__test__/depthFirstSearch.test.js new file mode 100644 index 000000000..732b7d506 --- /dev/null +++ b/src/algorithms/tree/depth-first-search/__test__/depthFirstSearch.test.js @@ -0,0 +1,102 @@ +import BinaryTreeNode from '../../../../data-structures/tree/BinaryTreeNode'; +import depthFirstSearch from '../depthFirstSearch'; + +describe('depthFirstSearch', () => { + it('should perform DFS operation on tree', () => { + const nodeA = new BinaryTreeNode('A'); + const nodeB = new BinaryTreeNode('B'); + const nodeC = new BinaryTreeNode('C'); + const nodeD = new BinaryTreeNode('D'); + const nodeE = new BinaryTreeNode('E'); + const nodeF = new BinaryTreeNode('F'); + const nodeG = new BinaryTreeNode('G'); + + nodeA.setLeft(nodeB).setRight(nodeC); + nodeB.setLeft(nodeD).setRight(nodeE); + nodeC.setLeft(nodeF).setRight(nodeG); + + // In-order traversing. + expect(nodeA.toString()).toBe('D,B,E,A,F,C,G'); + + const enterNodeCallback = jest.fn(); + const leaveNodeCallback = jest.fn(); + + // Traverse tree without callbacks first to check default ones. + depthFirstSearch(nodeA); + + // Traverse tree with callbacks. + depthFirstSearch(nodeA, { + enterNode: enterNodeCallback, + leaveNode: leaveNodeCallback, + }); + + expect(enterNodeCallback).toHaveBeenCalledTimes(7); + expect(leaveNodeCallback).toHaveBeenCalledTimes(7); + + // Check node entering. + expect(enterNodeCallback.mock.calls[0][0].value).toEqual('A'); + expect(enterNodeCallback.mock.calls[1][0].value).toEqual('B'); + expect(enterNodeCallback.mock.calls[2][0].value).toEqual('D'); + expect(enterNodeCallback.mock.calls[3][0].value).toEqual('E'); + expect(enterNodeCallback.mock.calls[4][0].value).toEqual('C'); + expect(enterNodeCallback.mock.calls[5][0].value).toEqual('F'); + expect(enterNodeCallback.mock.calls[6][0].value).toEqual('G'); + + // Check node leaving. + expect(leaveNodeCallback.mock.calls[0][0].value).toEqual('D'); + expect(leaveNodeCallback.mock.calls[1][0].value).toEqual('E'); + expect(leaveNodeCallback.mock.calls[2][0].value).toEqual('B'); + expect(leaveNodeCallback.mock.calls[3][0].value).toEqual('F'); + expect(leaveNodeCallback.mock.calls[4][0].value).toEqual('G'); + expect(leaveNodeCallback.mock.calls[5][0].value).toEqual('C'); + expect(leaveNodeCallback.mock.calls[6][0].value).toEqual('A'); + }); + + it('allow users to redefine node visiting logic', () => { + const nodeA = new BinaryTreeNode('A'); + const nodeB = new BinaryTreeNode('B'); + const nodeC = new BinaryTreeNode('C'); + const nodeD = new BinaryTreeNode('D'); + const nodeE = new BinaryTreeNode('E'); + const nodeF = new BinaryTreeNode('F'); + const nodeG = new BinaryTreeNode('G'); + + nodeA.setLeft(nodeB).setRight(nodeC); + nodeB.setLeft(nodeD).setRight(nodeE); + nodeC.setLeft(nodeF).setRight(nodeG); + + // In-order traversing. + expect(nodeA.toString()).toBe('D,B,E,A,F,C,G'); + + const enterNodeCallback = jest.fn(); + const leaveNodeCallback = jest.fn(); + + // Traverse tree without callbacks first to check default ones. + depthFirstSearch(nodeA); + + // Traverse tree with callbacks. + depthFirstSearch(nodeA, { + allowTraversal: (node, child) => { + // Forbid traversing left part of the tree. + return child.value !== 'B'; + }, + enterNode: enterNodeCallback, + leaveNode: leaveNodeCallback, + }); + + expect(enterNodeCallback).toHaveBeenCalledTimes(4); + expect(leaveNodeCallback).toHaveBeenCalledTimes(4); + + // Check node entering. + expect(enterNodeCallback.mock.calls[0][0].value).toEqual('A'); + expect(enterNodeCallback.mock.calls[1][0].value).toEqual('C'); + expect(enterNodeCallback.mock.calls[2][0].value).toEqual('F'); + expect(enterNodeCallback.mock.calls[3][0].value).toEqual('G'); + + // Check node leaving. + expect(leaveNodeCallback.mock.calls[0][0].value).toEqual('F'); + expect(leaveNodeCallback.mock.calls[1][0].value).toEqual('G'); + expect(leaveNodeCallback.mock.calls[2][0].value).toEqual('C'); + expect(leaveNodeCallback.mock.calls[3][0].value).toEqual('A'); + }); +}); diff --git a/src/algorithms/tree/depth-first-search/depthFirstSearch.js b/src/algorithms/tree/depth-first-search/depthFirstSearch.js new file mode 100644 index 000000000..188e4a49f --- /dev/null +++ b/src/algorithms/tree/depth-first-search/depthFirstSearch.js @@ -0,0 +1,52 @@ +/** + * @typedef {Object} Callbacks + * @property {function(node: BinaryTreeNode, child: BinaryTreeNode): boolean} allowTraversal - + * Determines whether DFS should traverse from the node to its child. + * @property {function(node: BinaryTreeNode)} enterNode - Called when DFS enters the node. + * @property {function(node: BinaryTreeNode)} leaveNode - Called when DFS leaves the node. + */ + +/** + * @param {Callbacks} [callbacks] + * @returns {Callbacks} + */ +function initCallbacks(callbacks = {}) { + const initiatedCallback = callbacks; + + const stubCallback = () => {}; + const defaultAllowTraversal = () => true; + + initiatedCallback.allowTraversal = callbacks.allowTraversal || defaultAllowTraversal; + initiatedCallback.enterNode = callbacks.enterNode || stubCallback; + initiatedCallback.leaveNode = callbacks.leaveNode || stubCallback; + + return initiatedCallback; +} + +/** + * @param {BinaryTreeNode} node + * @param {Callbacks} callbacks + */ +export function depthFirstSearchRecursive(node, callbacks) { + callbacks.enterNode(node); + + // Traverse left branch. + if (node.left && callbacks.allowTraversal(node, node.left)) { + depthFirstSearchRecursive(node.left, callbacks); + } + + // Traverse right branch. + if (node.right && callbacks.allowTraversal(node, node.right)) { + depthFirstSearchRecursive(node.right, callbacks); + } + + callbacks.leaveNode(node); +} + +/** + * @param {BinaryTreeNode} rootNode + * @param {Callbacks} [callbacks] + */ +export default function depthFirstSearch(rootNode, callbacks) { + depthFirstSearchRecursive(rootNode, initCallbacks(callbacks)); +} From bee5d6e72aeb18a8ecbc028ff1c572baf46b1869 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Wed, 25 Apr 2018 17:41:21 +0300 Subject: [PATCH 196/327] Add BFS and DFS for tree. --- src/algorithms/graph/breadth-first-search/README.md | 4 +++- src/algorithms/graph/depth-first-search/README.md | 4 +++- src/algorithms/tree/breadth-first-search/README.md | 4 +++- src/algorithms/tree/depth-first-search/README.md | 4 +++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/algorithms/graph/breadth-first-search/README.md b/src/algorithms/graph/breadth-first-search/README.md index d71dc7ece..d9a076151 100644 --- a/src/algorithms/graph/breadth-first-search/README.md +++ b/src/algorithms/graph/breadth-first-search/README.md @@ -10,4 +10,6 @@ nodes first, before moving to the next level neighbors. ## References -[Wikipedia](https://en.wikipedia.org/wiki/Breadth-first_search) +- [Wikipedia](https://en.wikipedia.org/wiki/Breadth-first_search) +- [Tree Traversals (Inorder, Preorder and Postorder)](https://www.geeksforgeeks.org/tree-traversals-inorder-preorder-and-postorder/) +- [BFS vs DFS](https://www.geeksforgeeks.org/bfs-vs-dfs-binary-tree/) diff --git a/src/algorithms/graph/depth-first-search/README.md b/src/algorithms/graph/depth-first-search/README.md index be3565d12..30f22ee7f 100644 --- a/src/algorithms/graph/depth-first-search/README.md +++ b/src/algorithms/graph/depth-first-search/README.md @@ -10,4 +10,6 @@ along each branch before backtracking. ## References -[Wikipedia](https://en.wikipedia.org/wiki/Depth-first_search) +- [Wikipedia](https://en.wikipedia.org/wiki/Depth-first_search) +- [Tree Traversals (Inorder, Preorder and Postorder)](https://www.geeksforgeeks.org/tree-traversals-inorder-preorder-and-postorder/) +- [BFS vs DFS](https://www.geeksforgeeks.org/bfs-vs-dfs-binary-tree/) diff --git a/src/algorithms/tree/breadth-first-search/README.md b/src/algorithms/tree/breadth-first-search/README.md index d71dc7ece..d9a076151 100644 --- a/src/algorithms/tree/breadth-first-search/README.md +++ b/src/algorithms/tree/breadth-first-search/README.md @@ -10,4 +10,6 @@ nodes first, before moving to the next level neighbors. ## References -[Wikipedia](https://en.wikipedia.org/wiki/Breadth-first_search) +- [Wikipedia](https://en.wikipedia.org/wiki/Breadth-first_search) +- [Tree Traversals (Inorder, Preorder and Postorder)](https://www.geeksforgeeks.org/tree-traversals-inorder-preorder-and-postorder/) +- [BFS vs DFS](https://www.geeksforgeeks.org/bfs-vs-dfs-binary-tree/) diff --git a/src/algorithms/tree/depth-first-search/README.md b/src/algorithms/tree/depth-first-search/README.md index be3565d12..30f22ee7f 100644 --- a/src/algorithms/tree/depth-first-search/README.md +++ b/src/algorithms/tree/depth-first-search/README.md @@ -10,4 +10,6 @@ along each branch before backtracking. ## References -[Wikipedia](https://en.wikipedia.org/wiki/Depth-first_search) +- [Wikipedia](https://en.wikipedia.org/wiki/Depth-first_search) +- [Tree Traversals (Inorder, Preorder and Postorder)](https://www.geeksforgeeks.org/tree-traversals-inorder-preorder-and-postorder/) +- [BFS vs DFS](https://www.geeksforgeeks.org/bfs-vs-dfs-binary-tree/) From d7c8703b3517f0d9ec43561e1a93a67f8a50da13 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Wed, 25 Apr 2018 17:42:28 +0300 Subject: [PATCH 197/327] Add BFS and DFS for tree. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6336b7da8..ee2f0a0ca 100644 --- a/README.md +++ b/README.md @@ -111,7 +111,7 @@ npm test -- -t 'playground' ## Useful links -* [Data Structures and Algorithms on YouTube](https://www.youtube.com/playlist?list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) +* [📹 Data Structures and Algorithms on YouTube](https://www.youtube.com/playlist?list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) ## Useful Information From bb49cca6c4c5661d4a8175a1b18092ec672241f4 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Wed, 25 Apr 2018 17:43:30 +0300 Subject: [PATCH 198/327] Add BFS and DFS for tree. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ee2f0a0ca..cd61e9502 100644 --- a/README.md +++ b/README.md @@ -111,7 +111,7 @@ npm test -- -t 'playground' ## Useful links -* [📹 Data Structures and Algorithms on YouTube](https://www.youtube.com/playlist?list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) +* [Data Structures and Algorithms on YouTube 📹](https://www.youtube.com/playlist?list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) ## Useful Information From b43c76759246dfa4345fcc30e0a46ee5214082c9 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Wed, 25 Apr 2018 17:44:24 +0300 Subject: [PATCH 199/327] Add BFS and DFS for tree. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cd61e9502..cb95ca353 100644 --- a/README.md +++ b/README.md @@ -111,7 +111,7 @@ npm test -- -t 'playground' ## Useful links -* [Data Structures and Algorithms on YouTube 📹](https://www.youtube.com/playlist?list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) +[▶ Data Structures and Algorithms on YouTube](https://www.youtube.com/playlist?list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) ## Useful Information From 4eee39607429b600779a2dc0220a7fac219770a5 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 26 Apr 2018 07:03:59 +0300 Subject: [PATCH 200/327] Add LCS. --- README.md | 3 +- .../string/longest-common-substring/README.md | 24 ++++++++ .../__test__/longestCommonSubstring.test.js | 11 ++++ .../longestCommonSubstring.js | 59 +++++++++++++++++++ 4 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 src/algorithms/string/longest-common-substring/README.md create mode 100644 src/algorithms/string/longest-common-substring/__test__/longestCommonSubstring.test.js create mode 100644 src/algorithms/string/longest-common-substring/longestCommonSubstring.js diff --git a/README.md b/README.md index cb95ca353..72884a984 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ * [Knuth–Morris–Pratt Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/knuth-morris-pratt) - substring search * [Rabin Karp Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/rabin-karp) - substring search * [Longest Common Subsequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/longest-common-subsequnce) (LCS) - * longest common substring + * [Longest Common Substring](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/longest-common-substring) * **Search** * [Binary Search](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/search/binary-search) * **Sorting** @@ -74,6 +74,7 @@ * **Dynamic Programming** * [Levenshtein Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/levenshtein-distance) - minimum edit distance between two sequences * [Longest Common Subsequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/longest-common-subsequnce) (LCS) + * [Longest Common Substring](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/longest-common-substring) * Increasing subsequence * Knapsack problem * Maximum subarray diff --git a/src/algorithms/string/longest-common-substring/README.md b/src/algorithms/string/longest-common-substring/README.md new file mode 100644 index 000000000..3b4dded3f --- /dev/null +++ b/src/algorithms/string/longest-common-substring/README.md @@ -0,0 +1,24 @@ +# Longest Common Substring Problem + +The longest common substring problem is to find the longest string +(or strings) that is a substring (or are substrings) of two or more +strings. + +## Example + +The longest common substring of the strings `ABABC`, `BABCA` and +`ABCBA` is string `ABC` of length 3. Other common substrings are +`A`, `AB`, `B`, `BA`, `BC` and `C`. + +``` +ABABC + ||| + BABCA + ||| + ABCBA +``` + +## References + +- [Wikipedia](https://en.wikipedia.org/wiki/Longest_common_substring_problem) +- [YouTube](https://www.youtube.com/watch?v=BysNXJHzCEs) diff --git a/src/algorithms/string/longest-common-substring/__test__/longestCommonSubstring.test.js b/src/algorithms/string/longest-common-substring/__test__/longestCommonSubstring.test.js new file mode 100644 index 000000000..55c7d4da9 --- /dev/null +++ b/src/algorithms/string/longest-common-substring/__test__/longestCommonSubstring.test.js @@ -0,0 +1,11 @@ +import longestCommonSubstring from '../longestCommonSubstring'; + +describe('longestCommonSubstring', () => { + it('should find longest common substring between two strings', () => { + expect(longestCommonSubstring('', '')).toBe(''); + expect(longestCommonSubstring('ABC', '')).toBe(''); + expect(longestCommonSubstring('', 'ABC')).toBe(''); + expect(longestCommonSubstring('ABABC', 'BABCA')).toBe('BABC'); + expect(longestCommonSubstring('BABCA', 'ABCBA')).toBe('ABC'); + }); +}); diff --git a/src/algorithms/string/longest-common-substring/longestCommonSubstring.js b/src/algorithms/string/longest-common-substring/longestCommonSubstring.js new file mode 100644 index 000000000..10919bf6a --- /dev/null +++ b/src/algorithms/string/longest-common-substring/longestCommonSubstring.js @@ -0,0 +1,59 @@ +/** + * @param {string} s1 + * @param {string} s2 + * @return {string} + */ +export default function longestCommonSubstring(s1, s2) { + // Init the matrix of all substring lengths to use Dynamic Programming approach. + const substringMatrix = Array(s2.length + 1).fill(null).map(() => { + return Array(s1.length + 1).fill(null); + }); + + // Fill the first row and first column with zeros to provide initial values. + for (let columnIndex = 0; columnIndex <= s1.length; columnIndex += 1) { + substringMatrix[0][columnIndex] = 0; + } + + for (let rowIndex = 0; rowIndex <= s2.length; rowIndex += 1) { + substringMatrix[rowIndex][0] = 0; + } + + // Build the matrix of all substring lengths to use Dynamic Programming approach. + let longestSubstringLength = 0; + let longestSubstringColumn = 0; + let longestSubstringRow = 0; + + for (let rowIndex = 1; rowIndex <= s2.length; rowIndex += 1) { + for (let columnIndex = 1; columnIndex <= s1.length; columnIndex += 1) { + if (s1[columnIndex - 1] === s2[rowIndex - 1]) { + substringMatrix[rowIndex][columnIndex] = substringMatrix[rowIndex - 1][columnIndex - 1] + 1; + } else { + substringMatrix[rowIndex][columnIndex] = 0; + } + + // Try to find the biggest length of all common substring lengths + // and to memorize its last character position (indices) + if (substringMatrix[rowIndex][columnIndex] > longestSubstringLength) { + longestSubstringLength = substringMatrix[rowIndex][columnIndex]; + longestSubstringColumn = columnIndex; + longestSubstringRow = rowIndex; + } + } + } + + if (longestSubstringLength === 0) { + // Longest common substring has not been found. + return ''; + } + + // Detect the longest substring from the matrix. + let longestSubstring = ''; + + while (substringMatrix[longestSubstringRow][longestSubstringColumn] > 0) { + longestSubstring = s1[longestSubstringColumn - 1] + longestSubstring; + longestSubstringRow -= 1; + longestSubstringColumn -= 1; + } + + return longestSubstring; +} From f2f7264261efdce35ef94b78e06cda20e2467e06 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 26 Apr 2018 07:26:12 +0300 Subject: [PATCH 201/327] Restructure folders. --- README.md | 11 ++++++----- .../{math => sets}/cartesian-product/README.md | 0 .../__test__/cartesianProduct.test.js | 0 .../cartesian-product/cartesianProduct.js | 0 src/algorithms/{math => sets}/combinations/README.md | 0 .../__test__/combineWithRepetitions.test.js | 2 +- .../__test__/combineWithoutRepetitions.test.js | 2 +- .../combinations/combineWithRepetitions.js | 0 .../combinations/combineWithoutRepetitions.js | 0 src/algorithms/{math => sets}/fisher-yates/README.md | 0 .../fisher-yates/__test__/fisherYates.test.js | 0 .../{math => sets}/fisher-yates/fisherYates.js | 0 src/algorithms/{math => sets}/permutations/README.md | 0 .../__test__/permutateWithRepetitions.test.js | 0 .../__test__/permutateWithoutRepetitions.test.js | 2 +- .../permutations/permutateWithRepetitions.js | 0 .../permutations/permutateWithoutRepetitions.js | 0 src/algorithms/{math => sets}/power-set/README.md | 0 .../power-set/__test__/powerSet.test.js | 0 src/algorithms/{math => sets}/power-set/powerSet.js | 0 20 files changed, 9 insertions(+), 8 deletions(-) rename src/algorithms/{math => sets}/cartesian-product/README.md (100%) rename src/algorithms/{math => sets}/cartesian-product/__test__/cartesianProduct.test.js (100%) rename src/algorithms/{math => sets}/cartesian-product/cartesianProduct.js (100%) rename src/algorithms/{math => sets}/combinations/README.md (100%) rename src/algorithms/{math => sets}/combinations/__test__/combineWithRepetitions.test.js (96%) rename src/algorithms/{math => sets}/combinations/__test__/combineWithoutRepetitions.test.js (96%) rename src/algorithms/{math => sets}/combinations/combineWithRepetitions.js (100%) rename src/algorithms/{math => sets}/combinations/combineWithoutRepetitions.js (100%) rename src/algorithms/{math => sets}/fisher-yates/README.md (100%) rename src/algorithms/{math => sets}/fisher-yates/__test__/fisherYates.test.js (100%) rename src/algorithms/{math => sets}/fisher-yates/fisherYates.js (100%) rename src/algorithms/{math => sets}/permutations/README.md (100%) rename src/algorithms/{math => sets}/permutations/__test__/permutateWithRepetitions.test.js (100%) rename src/algorithms/{math => sets}/permutations/__test__/permutateWithoutRepetitions.test.js (97%) rename src/algorithms/{math => sets}/permutations/permutateWithRepetitions.js (100%) rename src/algorithms/{math => sets}/permutations/permutateWithoutRepetitions.js (100%) rename src/algorithms/{math => sets}/power-set/README.md (100%) rename src/algorithms/{math => sets}/power-set/__test__/powerSet.test.js (100%) rename src/algorithms/{math => sets}/power-set/powerSet.js (100%) diff --git a/README.md b/README.md index 72884a984..5b1c07871 100644 --- a/README.md +++ b/README.md @@ -30,14 +30,15 @@ * **Math** * [Factorial](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/factorial) * [Fibonacci Number](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/fibonacci) - * [Cartesian Product](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/cartesian-product) - product of multiple sets - * [Power Set](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/power-set) - all subsets of the set - * [Permutations](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/permutations) (with and without repetitions) - * [Combinations](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/combinations) (with and without repetitions) * [Primality Test](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/primality-test) (trial division method) * [Euclidean Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/euclidean-algorithm) - calculate the Greatest Common Divisor (GCD) * [Least Common Multiple](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/least-common-multiple) (LCM) - * [Fisher–Yates Shuffle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/fisher-yates) - random permutation of a finite sequence +* **Sets** + * [Cartesian Product](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/cartesian-product) - product of multiple sets + * [Power Set](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/power-set) - all subsets of the set + * [Permutations](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/permutations) (with and without repetitions) + * [Combinations](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/combinations) (with and without repetitions) + * [Fisher–Yates Shuffle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/fisher-yates) - random permutation of a finite sequence * **String** * [Levenshtein Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/levenshtein-distance) - minimum edit distance between two sequences * [Hamming Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/hamming-distance) - number of positions at which the symbols are different diff --git a/src/algorithms/math/cartesian-product/README.md b/src/algorithms/sets/cartesian-product/README.md similarity index 100% rename from src/algorithms/math/cartesian-product/README.md rename to src/algorithms/sets/cartesian-product/README.md diff --git a/src/algorithms/math/cartesian-product/__test__/cartesianProduct.test.js b/src/algorithms/sets/cartesian-product/__test__/cartesianProduct.test.js similarity index 100% rename from src/algorithms/math/cartesian-product/__test__/cartesianProduct.test.js rename to src/algorithms/sets/cartesian-product/__test__/cartesianProduct.test.js diff --git a/src/algorithms/math/cartesian-product/cartesianProduct.js b/src/algorithms/sets/cartesian-product/cartesianProduct.js similarity index 100% rename from src/algorithms/math/cartesian-product/cartesianProduct.js rename to src/algorithms/sets/cartesian-product/cartesianProduct.js diff --git a/src/algorithms/math/combinations/README.md b/src/algorithms/sets/combinations/README.md similarity index 100% rename from src/algorithms/math/combinations/README.md rename to src/algorithms/sets/combinations/README.md diff --git a/src/algorithms/math/combinations/__test__/combineWithRepetitions.test.js b/src/algorithms/sets/combinations/__test__/combineWithRepetitions.test.js similarity index 96% rename from src/algorithms/math/combinations/__test__/combineWithRepetitions.test.js rename to src/algorithms/sets/combinations/__test__/combineWithRepetitions.test.js index 25c8a20c5..90c38958e 100644 --- a/src/algorithms/math/combinations/__test__/combineWithRepetitions.test.js +++ b/src/algorithms/sets/combinations/__test__/combineWithRepetitions.test.js @@ -1,5 +1,5 @@ import combineWithRepetitions from '../combineWithRepetitions'; -import factorial from '../../factorial/factorial'; +import factorial from '../../../math/factorial/factorial'; describe('combineWithRepetitions', () => { it('should combine string with repetitions', () => { diff --git a/src/algorithms/math/combinations/__test__/combineWithoutRepetitions.test.js b/src/algorithms/sets/combinations/__test__/combineWithoutRepetitions.test.js similarity index 96% rename from src/algorithms/math/combinations/__test__/combineWithoutRepetitions.test.js rename to src/algorithms/sets/combinations/__test__/combineWithoutRepetitions.test.js index 1c048adaa..186e9a73d 100644 --- a/src/algorithms/math/combinations/__test__/combineWithoutRepetitions.test.js +++ b/src/algorithms/sets/combinations/__test__/combineWithoutRepetitions.test.js @@ -1,5 +1,5 @@ import combineWithoutRepetitions from '../combineWithoutRepetitions'; -import factorial from '../../factorial/factorial'; +import factorial from '../../../math/factorial/factorial'; describe('combineWithoutRepetitions', () => { it('should combine string without repetitions', () => { diff --git a/src/algorithms/math/combinations/combineWithRepetitions.js b/src/algorithms/sets/combinations/combineWithRepetitions.js similarity index 100% rename from src/algorithms/math/combinations/combineWithRepetitions.js rename to src/algorithms/sets/combinations/combineWithRepetitions.js diff --git a/src/algorithms/math/combinations/combineWithoutRepetitions.js b/src/algorithms/sets/combinations/combineWithoutRepetitions.js similarity index 100% rename from src/algorithms/math/combinations/combineWithoutRepetitions.js rename to src/algorithms/sets/combinations/combineWithoutRepetitions.js diff --git a/src/algorithms/math/fisher-yates/README.md b/src/algorithms/sets/fisher-yates/README.md similarity index 100% rename from src/algorithms/math/fisher-yates/README.md rename to src/algorithms/sets/fisher-yates/README.md diff --git a/src/algorithms/math/fisher-yates/__test__/fisherYates.test.js b/src/algorithms/sets/fisher-yates/__test__/fisherYates.test.js similarity index 100% rename from src/algorithms/math/fisher-yates/__test__/fisherYates.test.js rename to src/algorithms/sets/fisher-yates/__test__/fisherYates.test.js diff --git a/src/algorithms/math/fisher-yates/fisherYates.js b/src/algorithms/sets/fisher-yates/fisherYates.js similarity index 100% rename from src/algorithms/math/fisher-yates/fisherYates.js rename to src/algorithms/sets/fisher-yates/fisherYates.js diff --git a/src/algorithms/math/permutations/README.md b/src/algorithms/sets/permutations/README.md similarity index 100% rename from src/algorithms/math/permutations/README.md rename to src/algorithms/sets/permutations/README.md diff --git a/src/algorithms/math/permutations/__test__/permutateWithRepetitions.test.js b/src/algorithms/sets/permutations/__test__/permutateWithRepetitions.test.js similarity index 100% rename from src/algorithms/math/permutations/__test__/permutateWithRepetitions.test.js rename to src/algorithms/sets/permutations/__test__/permutateWithRepetitions.test.js diff --git a/src/algorithms/math/permutations/__test__/permutateWithoutRepetitions.test.js b/src/algorithms/sets/permutations/__test__/permutateWithoutRepetitions.test.js similarity index 97% rename from src/algorithms/math/permutations/__test__/permutateWithoutRepetitions.test.js rename to src/algorithms/sets/permutations/__test__/permutateWithoutRepetitions.test.js index 3d082c90d..f717d0cae 100644 --- a/src/algorithms/math/permutations/__test__/permutateWithoutRepetitions.test.js +++ b/src/algorithms/sets/permutations/__test__/permutateWithoutRepetitions.test.js @@ -1,5 +1,5 @@ import permutateWithoutRepetitions from '../permutateWithoutRepetitions'; -import factorial from '../../factorial/factorial'; +import factorial from '../../../math/factorial/factorial'; describe('permutateWithoutRepetitions', () => { it('should permutate string', () => { diff --git a/src/algorithms/math/permutations/permutateWithRepetitions.js b/src/algorithms/sets/permutations/permutateWithRepetitions.js similarity index 100% rename from src/algorithms/math/permutations/permutateWithRepetitions.js rename to src/algorithms/sets/permutations/permutateWithRepetitions.js diff --git a/src/algorithms/math/permutations/permutateWithoutRepetitions.js b/src/algorithms/sets/permutations/permutateWithoutRepetitions.js similarity index 100% rename from src/algorithms/math/permutations/permutateWithoutRepetitions.js rename to src/algorithms/sets/permutations/permutateWithoutRepetitions.js diff --git a/src/algorithms/math/power-set/README.md b/src/algorithms/sets/power-set/README.md similarity index 100% rename from src/algorithms/math/power-set/README.md rename to src/algorithms/sets/power-set/README.md diff --git a/src/algorithms/math/power-set/__test__/powerSet.test.js b/src/algorithms/sets/power-set/__test__/powerSet.test.js similarity index 100% rename from src/algorithms/math/power-set/__test__/powerSet.test.js rename to src/algorithms/sets/power-set/__test__/powerSet.test.js diff --git a/src/algorithms/math/power-set/powerSet.js b/src/algorithms/sets/power-set/powerSet.js similarity index 100% rename from src/algorithms/math/power-set/powerSet.js rename to src/algorithms/sets/power-set/powerSet.js From 660853d11d7520719fdae8947b7b707da0ea68a0 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 26 Apr 2018 07:27:44 +0300 Subject: [PATCH 202/327] Update README. --- README.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 5b1c07871..0c01595e3 100644 --- a/README.md +++ b/README.md @@ -3,9 +3,7 @@ [![Build Status](https://travis-ci.org/trekhleb/javascript-algorithms.svg?branch=master)](https://travis-ci.org/trekhleb/javascript-algorithms) [![codecov](https://codecov.io/gh/trekhleb/javascript-algorithms/branch/master/graph/badge.svg)](https://codecov.io/gh/trekhleb/javascript-algorithms) -## Code Examples - -### Data Structures +## Data Structures 1. [Linked List](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/linked-list) 2. [Queue](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/queue) @@ -25,7 +23,7 @@ * Binary Indexed Tree or Fenwick Tree 9. [Graph](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/graph) -### Algorithms +## Algorithms * **Math** * [Factorial](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/factorial) From fcd640e8408d684fab508e7a5425fa145bc90634 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 26 Apr 2018 07:39:08 +0300 Subject: [PATCH 203/327] Update README. --- README.md | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 0c01595e3..08eb442d0 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,8 @@ ## Algorithms +### Algorithms by Topic + * **Math** * [Factorial](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/factorial) * [Fibonacci Number](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/fibonacci) @@ -70,21 +72,27 @@ * **Minimum Spanning Tree** * Prim’s algorithm * Kruskal’s algorithm -* **Dynamic Programming** - * [Levenshtein Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/levenshtein-distance) - minimum edit distance between two sequences - * [Longest Common Subsequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/longest-common-subsequnce) (LCS) - * [Longest Common Substring](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/longest-common-substring) - * Increasing subsequence - * Knapsack problem - * Maximum subarray - * Maximum sum path - * Integer Partition - * Longest Increasing subsequence - * Shortest common supersequence * **Uncategorized** * Union-Find * Maze +### Algorithms by Paradigm + +* **Greedy** +* **Divide and Conquer** +* **Dynamic Programming** + * [Levenshtein Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/levenshtein-distance) - minimum edit distance between two sequences + * [Longest Common Subsequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/longest-common-subsequnce) (LCS) + * [Longest Common Substring](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/longest-common-substring) + * Increasing subsequence + * Longest Increasing subsequence + * Shortest common supersequence + * Knapsack problem + * Maximum subarray + * Maximum sum path + * Integer Partition +* **Backtracking** +* **Branch & Bound** ## Running Tests From 629b2a2cbdb7b863f89ee79c1634f0f890ae35ad Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 26 Apr 2018 07:42:11 +0300 Subject: [PATCH 204/327] Update README. --- README.md | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 08eb442d0..5ccb8ed6e 100644 --- a/README.md +++ b/README.md @@ -81,16 +81,17 @@ * **Greedy** * **Divide and Conquer** * **Dynamic Programming** - * [Levenshtein Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/levenshtein-distance) - minimum edit distance between two sequences - * [Longest Common Subsequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/longest-common-subsequnce) (LCS) - * [Longest Common Substring](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/longest-common-substring) - * Increasing subsequence - * Longest Increasing subsequence - * Shortest common supersequence - * Knapsack problem - * Maximum subarray - * Maximum sum path - * Integer Partition + * [Fibonacci Number](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/fibonacci) + * [Levenshtein Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/levenshtein-distance) - minimum edit distance between two sequences + * [Longest Common Subsequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/longest-common-subsequnce) (LCS) + * [Longest Common Substring](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/longest-common-substring) + * Increasing subsequence + * Longest Increasing subsequence + * Shortest common supersequence + * Knapsack problem + * Maximum subarray + * Maximum sum path + * Integer Partition * **Backtracking** * **Branch & Bound** From 1bfbef0a69f0573c3c95d30a1eae4c4e405fbd68 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 26 Apr 2018 07:45:51 +0300 Subject: [PATCH 205/327] Update README. --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 5ccb8ed6e..186d70dc5 100644 --- a/README.md +++ b/README.md @@ -80,6 +80,9 @@ * **Greedy** * **Divide and Conquer** + * [Euclidean Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/euclidean-algorithm) - calculate the Greatest Common Divisor (GCD) + * [Permutations](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/permutations) (with and without repetitions) + * [Combinations](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/combinations) (with and without repetitions) * **Dynamic Programming** * [Fibonacci Number](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/fibonacci) * [Levenshtein Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/levenshtein-distance) - minimum edit distance between two sequences From 9265fce460354f6aa0d9859144358428d05646b3 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 26 Apr 2018 07:46:23 +0300 Subject: [PATCH 206/327] Update README. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 186d70dc5..9d583d78d 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ * [Power Set](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/power-set) - all subsets of the set * [Permutations](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/permutations) (with and without repetitions) * [Combinations](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/combinations) (with and without repetitions) - * [Fisher–Yates Shuffle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/fisher-yates) - random permutation of a finite sequence + * [Fisher–Yates Shuffle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/fisher-yates) - random permutation of a finite sequence * **String** * [Levenshtein Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/levenshtein-distance) - minimum edit distance between two sequences * [Hamming Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/hamming-distance) - number of positions at which the symbols are different From 7bb1043e4355dff219e21f76fd01728d12b7243a Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 26 Apr 2018 07:52:07 +0300 Subject: [PATCH 207/327] Update README. --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 9d583d78d..dd47a80bf 100644 --- a/README.md +++ b/README.md @@ -83,6 +83,10 @@ * [Euclidean Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/euclidean-algorithm) - calculate the Greatest Common Divisor (GCD) * [Permutations](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/permutations) (with and without repetitions) * [Combinations](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/combinations) (with and without repetitions) + * [Merge Sort](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sorting/merge-sort) + * [Quicksort](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sorting/quick-sort) + * [Tree Depth-First Search](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/tree/depth-first-search) (DFS) + * [Graph Depth-First Search](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/depth-first-search) (DFS) * **Dynamic Programming** * [Fibonacci Number](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/fibonacci) * [Levenshtein Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/levenshtein-distance) - minimum edit distance between two sequences From 2e11947d363dd534718ab8df32ff9a6f3687ff3c Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 26 Apr 2018 08:08:13 +0300 Subject: [PATCH 208/327] Update README. --- README.md | 6 ++-- .../longest-common-subsequnce/README.md | 0 .../__test__/longestCommonSubsequnce.test.js | 31 ++++++++++++++++ .../longestCommonSubsequnce.js | 36 +++++++++---------- .../__test__/longestCommonSubsequnce.test.js | 13 ------- 5 files changed, 52 insertions(+), 34 deletions(-) rename src/algorithms/{string => sets}/longest-common-subsequnce/README.md (100%) create mode 100644 src/algorithms/sets/longest-common-subsequnce/__test__/longestCommonSubsequnce.test.js rename src/algorithms/{string => sets}/longest-common-subsequnce/longestCommonSubsequnce.js (53%) delete mode 100644 src/algorithms/string/longest-common-subsequnce/__test__/longestCommonSubsequnce.test.js diff --git a/README.md b/README.md index dd47a80bf..3cbfe6cda 100644 --- a/README.md +++ b/README.md @@ -38,13 +38,13 @@ * [Power Set](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/power-set) - all subsets of the set * [Permutations](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/permutations) (with and without repetitions) * [Combinations](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/combinations) (with and without repetitions) - * [Fisher–Yates Shuffle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/fisher-yates) - random permutation of a finite sequence + * [Fisher–Yates Shuffle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/fisher-yates) - random permutation of a finite sequence + * [Longest Common Subsequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/longest-common-subsequnce) (LCS) * **String** * [Levenshtein Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/levenshtein-distance) - minimum edit distance between two sequences * [Hamming Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/hamming-distance) - number of positions at which the symbols are different * [Knuth–Morris–Pratt Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/knuth-morris-pratt) - substring search * [Rabin Karp Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/rabin-karp) - substring search - * [Longest Common Subsequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/longest-common-subsequnce) (LCS) * [Longest Common Substring](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/longest-common-substring) * **Search** * [Binary Search](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/search/binary-search) @@ -90,7 +90,7 @@ * **Dynamic Programming** * [Fibonacci Number](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/fibonacci) * [Levenshtein Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/levenshtein-distance) - minimum edit distance between two sequences - * [Longest Common Subsequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/longest-common-subsequnce) (LCS) + * [Longest Common Subsequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/longest-common-subsequnce) (LCS) * [Longest Common Substring](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/longest-common-substring) * Increasing subsequence * Longest Increasing subsequence diff --git a/src/algorithms/string/longest-common-subsequnce/README.md b/src/algorithms/sets/longest-common-subsequnce/README.md similarity index 100% rename from src/algorithms/string/longest-common-subsequnce/README.md rename to src/algorithms/sets/longest-common-subsequnce/README.md diff --git a/src/algorithms/sets/longest-common-subsequnce/__test__/longestCommonSubsequnce.test.js b/src/algorithms/sets/longest-common-subsequnce/__test__/longestCommonSubsequnce.test.js new file mode 100644 index 000000000..01d84cabb --- /dev/null +++ b/src/algorithms/sets/longest-common-subsequnce/__test__/longestCommonSubsequnce.test.js @@ -0,0 +1,31 @@ +import longestCommonSubsequnce from '../longestCommonSubsequnce'; + +describe('longestCommonSubsequnce', () => { + it('should find longest common subsequence for two strings', () => { + expect(longestCommonSubsequnce([''], [''])).toEqual(['']); + + expect(longestCommonSubsequnce([''], ['A', 'B', 'C'])).toEqual(['']); + + expect(longestCommonSubsequnce(['A', 'B', 'C'], [''])).toEqual(['']); + + expect(longestCommonSubsequnce( + ['A', 'B', 'C'], + ['D', 'E', 'F', 'G'], + )).toEqual(['']); + + expect(longestCommonSubsequnce( + ['A', 'B', 'C', 'D', 'G', 'H'], + ['A', 'E', 'D', 'F', 'H', 'R'], + )).toEqual(['A', 'D', 'H']); + + expect(longestCommonSubsequnce( + ['A', 'G', 'G', 'T', 'A', 'B'], + ['G', 'X', 'T', 'X', 'A', 'Y', 'B'], + )).toEqual(['G', 'T', 'A', 'B']); + + expect(longestCommonSubsequnce( + ['A', 'B', 'C', 'D', 'A', 'F'], + ['A', 'C', 'B', 'C', 'F'], + )).toEqual(['A', 'B', 'C', 'F']); + }); +}); diff --git a/src/algorithms/string/longest-common-subsequnce/longestCommonSubsequnce.js b/src/algorithms/sets/longest-common-subsequnce/longestCommonSubsequnce.js similarity index 53% rename from src/algorithms/string/longest-common-subsequnce/longestCommonSubsequnce.js rename to src/algorithms/sets/longest-common-subsequnce/longestCommonSubsequnce.js index 94c6c4d9d..440fe767d 100644 --- a/src/algorithms/string/longest-common-subsequnce/longestCommonSubsequnce.js +++ b/src/algorithms/sets/longest-common-subsequnce/longestCommonSubsequnce.js @@ -1,26 +1,26 @@ /** - * @param {string} s1 - * @param {string} s2 - * @return {string} + * @param {string[]} set1 + * @param {string[]} set2 + * @return {string[]} */ -export default function longestCommonSubsequnce(s1, s2) { +export default function longestCommonSubsequnce(set1, set2) { // Init LCS matrix. - const lcsMatrix = Array(s2.length + 1).fill(null).map(() => Array(s1.length + 1).fill(null)); + const lcsMatrix = Array(set2.length + 1).fill(null).map(() => Array(set1.length + 1).fill(null)); // Fill first row with zeros. - for (let columnIndex = 0; columnIndex <= s1.length; columnIndex += 1) { + for (let columnIndex = 0; columnIndex <= set1.length; columnIndex += 1) { lcsMatrix[0][columnIndex] = 0; } // Fill first column with zeros. - for (let rowIndex = 0; rowIndex <= s2.length; rowIndex += 1) { + for (let rowIndex = 0; rowIndex <= set2.length; rowIndex += 1) { lcsMatrix[rowIndex][0] = 0; } // Fill rest of the column that correspond to each of two strings. - for (let rowIndex = 1; rowIndex <= s2.length; rowIndex += 1) { - for (let columnIndex = 1; columnIndex <= s1.length; columnIndex += 1) { - if (s1[columnIndex - 1] === s2[rowIndex - 1]) { + for (let rowIndex = 1; rowIndex <= set2.length; rowIndex += 1) { + for (let columnIndex = 1; columnIndex <= set1.length; columnIndex += 1) { + if (set1[columnIndex - 1] === set2[rowIndex - 1]) { lcsMatrix[rowIndex][columnIndex] = lcsMatrix[rowIndex - 1][columnIndex - 1] + 1; } else { lcsMatrix[rowIndex][columnIndex] = Math.max( @@ -32,19 +32,19 @@ export default function longestCommonSubsequnce(s1, s2) { } // Calculate LCS based on LCS matrix. - if (!lcsMatrix[s2.length][s1.length]) { + if (!lcsMatrix[set2.length][set1.length]) { // If the length of largest common string is zero then return empty string. - return ''; + return ['']; } - let lcs = ''; - let columnIndex = s1.length; - let rowIndex = s2.length; + const longestSequence = []; + let columnIndex = set1.length; + let rowIndex = set2.length; while (columnIndex > 0 || rowIndex > 0) { - if (s1[columnIndex - 1] === s2[rowIndex - 1]) { + if (set1[columnIndex - 1] === set2[rowIndex - 1]) { // Move by diagonal left-top. - lcs = s1[columnIndex - 1] + lcs; + longestSequence.unshift(set1[columnIndex - 1]); columnIndex -= 1; rowIndex -= 1; } else if (lcsMatrix[rowIndex][columnIndex] === lcsMatrix[rowIndex][columnIndex - 1]) { @@ -56,5 +56,5 @@ export default function longestCommonSubsequnce(s1, s2) { } } - return lcs; + return longestSequence; } diff --git a/src/algorithms/string/longest-common-subsequnce/__test__/longestCommonSubsequnce.test.js b/src/algorithms/string/longest-common-subsequnce/__test__/longestCommonSubsequnce.test.js deleted file mode 100644 index 7be969ee3..000000000 --- a/src/algorithms/string/longest-common-subsequnce/__test__/longestCommonSubsequnce.test.js +++ /dev/null @@ -1,13 +0,0 @@ -import longestCommonSubsequnce from '../longestCommonSubsequnce'; - -describe('longestCommonSubsequnce', () => { - it('should find longest common subsequence for two strings', () => { - expect(longestCommonSubsequnce('', '')).toBe(''); - expect(longestCommonSubsequnce('', 'ABC')).toBe(''); - expect(longestCommonSubsequnce('ABC', '')).toBe(''); - expect(longestCommonSubsequnce('ABC', 'DEFG')).toBe(''); - expect(longestCommonSubsequnce('ABCDGH', 'AEDFHR')).toBe('ADH'); - expect(longestCommonSubsequnce('AGGTAB', 'GXTXAYB')).toBe('GTAB'); - expect(longestCommonSubsequnce('ABCDAF', 'ACBCF')).toBe('ABCF'); - }); -}); From ae9f5123e69a9bcdfedb67ec29d7fab4309a8ba2 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 26 Apr 2018 15:49:52 +0300 Subject: [PATCH 209/327] Add longest increasing subsequence. --- README.md | 4 +- .../longest-increasing-subsequence/README.md | 46 ++++++++++++++++ .../dpLongestIncreasingSubsequence.test.js | 36 +++++++++++++ .../dpLongestIncreasingSubsequence.js | 53 +++++++++++++++++++ 4 files changed, 137 insertions(+), 2 deletions(-) create mode 100644 src/algorithms/sets/longest-increasing-subsequence/README.md create mode 100644 src/algorithms/sets/longest-increasing-subsequence/__test__/dpLongestIncreasingSubsequence.test.js create mode 100644 src/algorithms/sets/longest-increasing-subsequence/dpLongestIncreasingSubsequence.js diff --git a/README.md b/README.md index 3cbfe6cda..6cf67b475 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,7 @@ * [Combinations](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/combinations) (with and without repetitions) * [Fisher–Yates Shuffle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/fisher-yates) - random permutation of a finite sequence * [Longest Common Subsequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/longest-common-subsequnce) (LCS) + * [Longest Increasing subsequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/longest-increasing-subsequence) * **String** * [Levenshtein Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/levenshtein-distance) - minimum edit distance between two sequences * [Hamming Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/hamming-distance) - number of positions at which the symbols are different @@ -92,8 +93,7 @@ * [Levenshtein Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/levenshtein-distance) - minimum edit distance between two sequences * [Longest Common Subsequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/longest-common-subsequnce) (LCS) * [Longest Common Substring](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/longest-common-substring) - * Increasing subsequence - * Longest Increasing subsequence + * [Longest Increasing subsequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/longest-increasing-subsequence) * Shortest common supersequence * Knapsack problem * Maximum subarray diff --git a/src/algorithms/sets/longest-increasing-subsequence/README.md b/src/algorithms/sets/longest-increasing-subsequence/README.md new file mode 100644 index 000000000..1011a1b84 --- /dev/null +++ b/src/algorithms/sets/longest-increasing-subsequence/README.md @@ -0,0 +1,46 @@ +# Longest Increasing Subsequence + +The longest increasing subsequence problem is to find a subsequence of a +given sequence in which the subsequence's elements are in sorted order, +lowest to highest, and in which the subsequence is as long as possible. +This subsequence is not necessarily contiguous, or unique. + +## Complexity + +The longest increasing subsequence problem is solvable in +time `O(n log n)`, where `n` denotes the length of the input sequence. + +Dynamic programming approach has complexity `O(n * n)`. + +## Example + +In the first 16 terms of the binary Van der Corput sequence + +``` +0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15 +``` + +a longest increasing subsequence is + +``` +0, 2, 6, 9, 11, 15. +``` + +This subsequence has length six; +the input sequence has no seven-member increasing subsequences. +The longest increasing subsequence in this example is not unique: for +instance, + +``` +0, 4, 6, 9, 11, 15 or +0, 2, 6, 9, 13, 15 or +0, 4, 6, 9, 13, 15 +``` + +are other increasing subsequences of equal length in the same +input sequence. + +## References + +- [Wikipedia](https://en.wikipedia.org/wiki/Longest_increasing_subsequence) +- [Dynamic Programming Approach on YouTube](https://www.youtube.com/watch?v=CE2b_-XfVDk) diff --git a/src/algorithms/sets/longest-increasing-subsequence/__test__/dpLongestIncreasingSubsequence.test.js b/src/algorithms/sets/longest-increasing-subsequence/__test__/dpLongestIncreasingSubsequence.test.js new file mode 100644 index 000000000..13160b619 --- /dev/null +++ b/src/algorithms/sets/longest-increasing-subsequence/__test__/dpLongestIncreasingSubsequence.test.js @@ -0,0 +1,36 @@ +import dpLongestIncreasingSubsequence from '../dpLongestIncreasingSubsequence'; + +describe('dpLongestIncreasingSubsequence', () => { + it('should find longest increasing subsequence length', () => { + // Should be: + // 9 or + // 8 or + // 7 or + // 6 or + // ... + expect(dpLongestIncreasingSubsequence([ + 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, + ])).toBe(1); + + // Should be: + // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 + expect(dpLongestIncreasingSubsequence([ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + ])).toBe(10); + + // Should be: + // -1, 0, 2, 3 + expect(dpLongestIncreasingSubsequence([ + 3, 4, -1, 0, 6, 2, 3, + ])).toBe(4); + + // Should be: + // 0, 2, 6, 9, 11, 15 or + // 0, 4, 6, 9, 11, 15 or + // 0, 2, 6, 9, 13, 15 or + // 0, 4, 6, 9, 13, 15 + expect(dpLongestIncreasingSubsequence([ + 0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15, + ])).toBe(6); + }); +}); diff --git a/src/algorithms/sets/longest-increasing-subsequence/dpLongestIncreasingSubsequence.js b/src/algorithms/sets/longest-increasing-subsequence/dpLongestIncreasingSubsequence.js new file mode 100644 index 000000000..e5f2ec6db --- /dev/null +++ b/src/algorithms/sets/longest-increasing-subsequence/dpLongestIncreasingSubsequence.js @@ -0,0 +1,53 @@ +/** + * Dynamic programming approach to find longest increasing subsequence. + * Complexity: O(n * n) + * + * @param {number[]} sequence + * @return {number} + */ +export default function dpLongestIncreasingSubsequence(sequence) { + // Create array with longest increasing substrings length and + // fill it with 1-s that would mean that each element of the sequence + // is itself a minimum increasing subsequence. + const lengthsArray = Array(sequence.length).fill(1); + + let previousElementIndex = 0; + let currentElementIndex = 1; + + while (currentElementIndex < sequence.length) { + if (sequence[previousElementIndex] < sequence[currentElementIndex]) { + // If current element is bigger then the previous one then + // current element is a part of increasing subsequence which + // length is by one bigger then the length of increasing subsequence + // for previous element. + const newLength = lengthsArray[previousElementIndex] + 1; + if (newLength > lengthsArray[currentElementIndex]) { + // Increase only if previous element would give us bigger subsequence length + // then we already have for current element. + lengthsArray[currentElementIndex] = newLength; + } + } + + // Move previous element index right. + previousElementIndex += 1; + + // If previous element index equals to current element index then + // shift current element right and reset previous element index to zero. + if (previousElementIndex === currentElementIndex) { + currentElementIndex += 1; + previousElementIndex = 0; + } + } + + // Find the biggest element in lengthsArray. + // This number is the biggest length of increasing subsequence. + let longestIncreasingLength = 0; + + for (let i = 0; i < lengthsArray.length; i += 1) { + if (lengthsArray[i] > longestIncreasingLength) { + longestIncreasingLength = lengthsArray[i]; + } + } + + return longestIncreasingLength; +} From ccc8702dab40ab0f8064d200ff6dd98591087b7d Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 26 Apr 2018 17:25:16 +0300 Subject: [PATCH 210/327] Update README.md --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 6cf67b475..bf32b051e 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,6 @@ 8. [Tree](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/tree) * [Binary Search Tree](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/tree/binary-search-tree) * [AVL Tree](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/tree/avl-tree) - * B-Tree * 2-3 Tree * Red-Black Tree * Suffix Tree From 01833f2474959903c280d1d45ddfbe67573083e3 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 26 Apr 2018 17:31:31 +0300 Subject: [PATCH 211/327] Update README.md --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index bf32b051e..1690334c3 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,6 @@ 8. [Tree](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/tree) * [Binary Search Tree](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/tree/binary-search-tree) * [AVL Tree](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/tree/avl-tree) - * 2-3 Tree * Red-Black Tree * Suffix Tree * Segment Tree or Interval Tree From 48a1c15c7223aaffc009c5bb96fef98f297c2fd7 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 26 Apr 2018 17:32:48 +0300 Subject: [PATCH 212/327] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1690334c3..c90156aee 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ * Suffix Tree * Segment Tree or Interval Tree * Binary Indexed Tree or Fenwick Tree -9. [Graph](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/graph) +9. [Graph](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/graph) (both directed and undirected) ## Algorithms From 036b159565640f2543d59be008d85a3c8a1df8c6 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Fri, 27 Apr 2018 08:19:11 +0300 Subject: [PATCH 213/327] Add SCS. --- README.md | 3 +- .../shortest-common-supersequence/README.md | 24 +++++++ .../shortestCommonSupersequence.test.js | 35 +++++++++ .../shortestCommonSupersequence.js | 71 +++++++++++++++++++ 4 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 src/algorithms/sets/shortest-common-supersequence/README.md create mode 100644 src/algorithms/sets/shortest-common-supersequence/__test__/shortestCommonSupersequence.test.js create mode 100644 src/algorithms/sets/shortest-common-supersequence/shortestCommonSupersequence.js diff --git a/README.md b/README.md index c90156aee..73f57b062 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,7 @@ * [Fisher–Yates Shuffle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/fisher-yates) - random permutation of a finite sequence * [Longest Common Subsequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/longest-common-subsequnce) (LCS) * [Longest Increasing subsequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/longest-increasing-subsequence) + * [Shortest Common Supersequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/shortest-common-supersequence) (SCS) * **String** * [Levenshtein Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/levenshtein-distance) - minimum edit distance between two sequences * [Hamming Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/hamming-distance) - number of positions at which the symbols are different @@ -92,7 +93,7 @@ * [Longest Common Subsequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/longest-common-subsequnce) (LCS) * [Longest Common Substring](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/longest-common-substring) * [Longest Increasing subsequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/longest-increasing-subsequence) - * Shortest common supersequence + * [Shortest Common Supersequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/shortest-common-supersequence) * Knapsack problem * Maximum subarray * Maximum sum path diff --git a/src/algorithms/sets/shortest-common-supersequence/README.md b/src/algorithms/sets/shortest-common-supersequence/README.md new file mode 100644 index 000000000..5af90a833 --- /dev/null +++ b/src/algorithms/sets/shortest-common-supersequence/README.md @@ -0,0 +1,24 @@ +# Shortest Common Supersequence + +The shortest common supersequence (SCS) of two sequences `X` and `Y` +is the shortest sequence which has `X` and `Y` as subsequences. + +In other words assume we're given two strings str1 and str2, find +the shortest string that has both str1 and str2 as subsequences. + +This is a problem closely related to the longest common +subsequence problem. + +## Example + +``` +Input: str1 = "geek", str2 = "eke" +Output: "geeke" + +Input: str1 = "AGGTAB", str2 = "GXTXAYB" +Output: "AGXGTXAYB" +``` + +## References + +- [GeeksForGeeks](https://www.geeksforgeeks.org/shortest-common-supersequence/) diff --git a/src/algorithms/sets/shortest-common-supersequence/__test__/shortestCommonSupersequence.test.js b/src/algorithms/sets/shortest-common-supersequence/__test__/shortestCommonSupersequence.test.js new file mode 100644 index 000000000..8adf27d15 --- /dev/null +++ b/src/algorithms/sets/shortest-common-supersequence/__test__/shortestCommonSupersequence.test.js @@ -0,0 +1,35 @@ +import shortestCommonSupersequence from '../shortestCommonSupersequence'; + +describe('shortestCommonSupersequence', () => { + it('should find shortest common supersequence of two sequences', () => { + // LCS (longest common subsequence) is empty + expect(shortestCommonSupersequence( + ['A', 'B', 'C'], + ['D', 'E', 'F'], + )).toEqual(['A', 'B', 'C', 'D', 'E', 'F']); + + // LCS (longest common subsequence) is "EE" + expect(shortestCommonSupersequence( + ['G', 'E', 'E', 'K'], + ['E', 'K', 'E'], + )).toEqual(['G', 'E', 'K', 'E', 'K']); + + // LCS (longest common subsequence) is "GTAB" + expect(shortestCommonSupersequence( + ['A', 'G', 'G', 'T', 'A', 'B'], + ['G', 'X', 'T', 'X', 'A', 'Y', 'B'], + )).toEqual(['A', 'G', 'G', 'X', 'T', 'X', 'A', 'Y', 'B']); + + // LCS (longest common subsequence) is "BCBA". + expect(shortestCommonSupersequence( + ['A', 'B', 'C', 'B', 'D', 'A', 'B'], + ['B', 'D', 'C', 'A', 'B', 'A'], + )).toEqual(['A', 'B', 'D', 'C', 'A', 'B', 'D', 'A', 'B']); + + // LCS (longest common subsequence) is "BDABA". + expect(shortestCommonSupersequence( + ['B', 'D', 'C', 'A', 'B', 'A'], + ['A', 'B', 'C', 'B', 'D', 'A', 'B', 'A', 'C'], + )).toEqual(['A', 'B', 'C', 'B', 'D', 'C', 'A', 'B', 'A', 'C']); + }); +}); diff --git a/src/algorithms/sets/shortest-common-supersequence/shortestCommonSupersequence.js b/src/algorithms/sets/shortest-common-supersequence/shortestCommonSupersequence.js new file mode 100644 index 000000000..6998e0d10 --- /dev/null +++ b/src/algorithms/sets/shortest-common-supersequence/shortestCommonSupersequence.js @@ -0,0 +1,71 @@ +import longestCommonSubsequnce from '../longest-common-subsequnce/longestCommonSubsequnce'; + +/** + * @param {string[]} set1 + * @param {string[]} set2 + * @return {string[]} + */ + +export default function shortestCommonSupersequence(set1, set2) { + // Let's first find the longest common subsequence of two sets. + const lcs = longestCommonSubsequnce(set1, set2); + + // If LCS is empty then the shortest common supersequnce would be just + // concatenation of two sequences. + if (lcs.length === 1 && lcs[0] === '') { + return set1.concat(set2); + } + + // Now let's add elements of set1 and set2 in order before/inside/after the LCS. + let supersequence = []; + + let setIndex1 = 0; + let setIndex2 = 0; + let lcsIndex = 0; + let setOnHold1 = false; + let setOnHold2 = false; + + while (lcsIndex < lcs.length) { + // Add elements of the first set to supersequence in correct order. + if (setIndex1 < set1.length) { + if (!setOnHold1 && set1[setIndex1] !== lcs[lcsIndex]) { + supersequence.push(set1[setIndex1]); + setIndex1 += 1; + } else { + setOnHold1 = true; + } + } + + // Add elements of the second set to supersequence in correct order. + if (setIndex2 < set2.length) { + if (!setOnHold2 && set2[setIndex2] !== lcs[lcsIndex]) { + supersequence.push(set2[setIndex2]); + setIndex2 += 1; + } else { + setOnHold2 = true; + } + } + + // Add LCS element to the supersequence in correct order. + if (setOnHold1 && setOnHold2) { + supersequence.push(lcs[lcsIndex]); + lcsIndex += 1; + setIndex1 += 1; + setIndex2 += 1; + setOnHold1 = false; + setOnHold2 = false; + } + } + + // Attach set1 leftovers. + if (setIndex1 < set1.length) { + supersequence = supersequence.concat(set1.slice(setIndex1)); + } + + // Attach set2 leftovers. + if (setIndex2 < set2.length) { + supersequence = supersequence.concat(set2.slice(setIndex2)); + } + + return supersequence; +} From 50a860c3c2c1dc5fcf589318c8870c7b5a8e80c9 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Fri, 27 Apr 2018 08:29:22 +0300 Subject: [PATCH 214/327] Update packages. --- package-lock.json | 195 ++++++---------------------------------------- package.json | 27 ++++--- 2 files changed, 38 insertions(+), 184 deletions(-) diff --git a/package-lock.json b/package-lock.json index cef5303d7..59f6040da 100644 --- a/package-lock.json +++ b/package-lock.json @@ -56,9 +56,9 @@ } }, "@types/jest": { - "version": "22.2.2", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-22.2.2.tgz", - "integrity": "sha512-Dt7aifQmvMPTLVimzvfQ99qUn4zeSDCQarFNV4otfDLYu0RFdSRBnqSLgksoAnsRL88xJ/UBKbd66iP2XIab0w==", + "version": "22.2.3", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-22.2.3.tgz", + "integrity": "sha512-e74sM9W/4qqWB6D4TWV9FQk0WoHtX1X4FJpbjxucMSVJHtFjbQOH3H6yp+xno4br0AKG0wz/kPtaN599GUOvAg==", "dev": true }, "abab": { @@ -1454,163 +1454,14 @@ "dev": true }, "codecov": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/codecov/-/codecov-3.0.0.tgz", - "integrity": "sha1-wnO4xPEpRXI+jcnSWAPYk0Pl8o4=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/codecov/-/codecov-3.0.1.tgz", + "integrity": "sha512-0TjnXrbvcPzAkRPv/Y5D8aZju/M5adkFxShRyMMgDReB8EV9nF4XMERXs6ajgLA1di9LUFW2tgePDQd2JPWy7g==", "dev": true, "requires": { "argv": "0.0.2", - "request": "2.81.0", + "request": "2.85.0", "urlgrey": "0.4.4" - }, - "dependencies": { - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "dev": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, - "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", - "dev": true - }, - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", - "dev": true - }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "dev": true, - "requires": { - "boom": "2.10.1" - } - }, - "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", - "dev": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.6", - "mime-types": "2.1.18" - } - }, - "har-schema": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", - "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", - "dev": true - }, - "har-validator": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", - "dev": true, - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } - }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "dev": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true - }, - "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "dev": true, - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.1", - "sshpk": "1.14.1" - } - }, - "performance-now": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", - "dev": true - }, - "qs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", - "dev": true - }, - "request": { - "version": "2.81.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", - "dev": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.6", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.18", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.4", - "tunnel-agent": "0.6.0", - "uuid": "3.2.1" - } - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "dev": true, - "requires": { - "hoek": "2.16.3" - } - } } }, "collection-visit": { @@ -2145,13 +1996,13 @@ "dev": true, "requires": { "debug": "2.6.9", - "resolve": "1.6.0" + "resolve": "1.7.1" } }, "eslint-module-utils": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz", - "integrity": "sha512-jDI/X5l/6D1rRD/3T43q8Qgbls2nq5km5KSqiwlyUbGo5+04fXhMKdCPhjwbqAa6HXWaMxj8Q4hQDIh7IadJQw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz", + "integrity": "sha1-snA2LNiLGkitMIl2zn+lTphBF0Y=", "dev": true, "requires": { "debug": "2.6.9", @@ -2159,21 +2010,21 @@ } }, "eslint-plugin-import": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.9.0.tgz", - "integrity": "sha1-JgAu+/ylmJtyiKwEdQi9JPIXsWk=", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.11.0.tgz", + "integrity": "sha1-Fa7qN6Z0mdhI6OmBgG1GJ7VQOBY=", "dev": true, "requires": { - "builtin-modules": "1.1.1", "contains-path": "0.1.0", "debug": "2.6.9", "doctrine": "1.5.0", "eslint-import-resolver-node": "0.3.2", - "eslint-module-utils": "2.1.1", + "eslint-module-utils": "2.2.0", "has": "1.0.1", "lodash": "4.17.5", "minimatch": "3.0.4", - "read-pkg-up": "2.0.0" + "read-pkg-up": "2.0.0", + "resolve": "1.7.1" }, "dependencies": { "doctrine": { @@ -2189,9 +2040,9 @@ } }, "eslint-plugin-jest": { - "version": "21.15.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-21.15.0.tgz", - "integrity": "sha512-Qe1egBnn0obmFQ9quZiJwwsf1H6oBXrJBku7OUt8XdCSwKL6h7xC4OKyg2px9jQXxv7YcTNUIFAGk2OUpPfDOA==", + "version": "21.15.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-21.15.1.tgz", + "integrity": "sha512-Op9AFHQXFXD0pWubu2v7K7NydSEBopIYVyZM2CxbiIoVXMa6AnqJt+v+HkBxbwS5aYvPQYoHthZO18A4QVeF1Q==", "dev": true }, "eslint-plugin-jsx-a11y": { @@ -10239,9 +10090,9 @@ } }, "resolve": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.6.0.tgz", - "integrity": "sha512-mw7JQNu5ExIkcw4LPih0owX/TZXjD/ZUF/ZQ/pDnkw3ZKhDcZZw5klmBlj6gVMwjQ3Pz5Jgu7F3d0jcDVuEWdw==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", + "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", "dev": true, "requires": { "path-parse": "1.0.5" diff --git a/package.json b/package.json index b6ad85964..48a871910 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { - "name": "data-structures", + "name": "javascript-algorithms", "version": "1.0.0", - "description": "Data structures on JavaScript", + "description": "Algorithms and data-structures implemented on JavaScript", "main": "index.js", "scripts": { "lint": "eslint ./src/*", @@ -11,29 +11,32 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/trekhleb/data-structures.git" + "url": "git+https://github.com/trekhleb/javascript-algorithms.git" }, "keywords": [ - "computer science", + "computer-science", "cs", "algorithms", - "data structures" + "data-structures", + "javascript", + "algorithm", + "javascript-algorithms" ], "author": "Oleksii Trekhleb (https://www.linkedin.com/in/trekhleb/)", - "license": "ISC", + "license": "MIT", "bugs": { - "url": "https://github.com/trekhleb/data-structures/issues" + "url": "https://github.com/trekhleb/javascript-algorithms/issues" }, - "homepage": "https://github.com/trekhleb/data-structures#readme", + "homepage": "https://github.com/trekhleb/javascript-algorithms#readme", "devDependencies": { - "@types/jest": "^22.2.2", + "@types/jest": "^22.2.3", "babel-cli": "^6.26.0", "babel-preset-env": "^1.6.1", - "codecov": "^3.0.0", + "codecov": "^3.0.1", "eslint": "^4.19.1", "eslint-config-airbnb": "^16.1.0", - "eslint-plugin-import": "^2.9.0", - "eslint-plugin-jest": "^21.15.0", + "eslint-plugin-import": "^2.11.0", + "eslint-plugin-jest": "^21.15.1", "eslint-plugin-jsx-a11y": "^6.0.3", "eslint-plugin-react": "^7.7.0", "jest": "^22.4.3" From a14de91869ba06aa8d8f8175b22ed61759f68f40 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Fri, 27 Apr 2018 08:51:48 +0300 Subject: [PATCH 215/327] Update packages. --- package-lock.json | 6885 ++++++++++----------------------------------- package.json | 8 +- 2 files changed, 1520 insertions(+), 5373 deletions(-) diff --git a/package-lock.json b/package-lock.json index 59f6040da..703a8d237 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,5 @@ { - "name": "data-structures", + "name": "javascript-algorithms", "version": "1.0.0", "lockfileVersion": 1, "requires": true, @@ -19,9 +19,9 @@ "integrity": "sha512-X3Ur/A/lIbbP8W0pmwgqtDXIxhQmxPaiwY9SKP7kF9wvZfjZRwMvbJE92ozUhF3UDK3DCKaV7oGqmI1rP/zqWA==", "dev": true, "requires": { - "chalk": "2.3.2", - "esutils": "2.0.2", - "js-tokens": "3.0.2" + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^3.0.0" }, "dependencies": { "ansi-styles": { @@ -30,7 +30,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -39,9 +39,9 @@ "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.3.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "supports-color": { @@ -50,7 +50,7 @@ "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -79,7 +79,7 @@ "integrity": "sha512-KjZwU26uG3u6eZcfGbTULzFcsoz6pegNKtHPksZPOUsiKo5bUmiBPa38FuHZ/Eun+XYh/JCCkS9AS3Lu4McQOQ==", "dev": true, "requires": { - "acorn": "5.5.3" + "acorn": "^5.0.0" } }, "acorn-jsx": { @@ -88,7 +88,7 @@ "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", "dev": true, "requires": { - "acorn": "3.3.0" + "acorn": "^3.0.4" }, "dependencies": { "acorn": { @@ -105,10 +105,10 @@ "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "dev": true, "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" } }, "ajv-keywords": { @@ -123,9 +123,9 @@ "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "dev": true, "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" } }, "amdefine": { @@ -159,8 +159,8 @@ "dev": true, "optional": true, "requires": { - "micromatch": "2.3.11", - "normalize-path": "2.1.1" + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" } }, "append-transform": { @@ -169,7 +169,7 @@ "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", "dev": true, "requires": { - "default-require-extensions": "1.0.0" + "default-require-extensions": "^1.0.0" } }, "argparse": { @@ -178,7 +178,7 @@ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { - "sprintf-js": "1.0.3" + "sprintf-js": "~1.0.2" } }, "argv": { @@ -194,7 +194,7 @@ "dev": true, "requires": { "ast-types-flow": "0.0.7", - "commander": "2.15.1" + "commander": "^2.11.0" } }, "arr-diff": { @@ -203,7 +203,7 @@ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "dev": true, "requires": { - "arr-flatten": "1.1.0" + "arr-flatten": "^1.0.1" } }, "arr-flatten": { @@ -230,8 +230,8 @@ "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", "dev": true, "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.11.0" + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" } }, "array-union": { @@ -240,7 +240,7 @@ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "dev": true, "requires": { - "array-uniq": "1.0.3" + "array-uniq": "^1.0.1" } }, "array-uniq": { @@ -303,7 +303,7 @@ "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", "dev": true, "requires": { - "lodash": "4.17.5" + "lodash": "^4.14.0" } }, "async-each": { @@ -358,21 +358,21 @@ "integrity": "sha1-UCq1SHTX24itALiHoGODzgPQAvE=", "dev": true, "requires": { - "babel-core": "6.26.0", - "babel-polyfill": "6.26.0", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "chokidar": "1.7.0", - "commander": "2.15.1", - "convert-source-map": "1.5.1", - "fs-readdir-recursive": "1.1.0", - "glob": "7.1.2", - "lodash": "4.17.5", - "output-file-sync": "1.1.2", - "path-is-absolute": "1.0.1", - "slash": "1.0.0", - "source-map": "0.5.7", - "v8flags": "2.1.1" + "babel-core": "^6.26.0", + "babel-polyfill": "^6.26.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "chokidar": "^1.6.1", + "commander": "^2.11.0", + "convert-source-map": "^1.5.0", + "fs-readdir-recursive": "^1.0.0", + "glob": "^7.1.2", + "lodash": "^4.17.4", + "output-file-sync": "^1.1.2", + "path-is-absolute": "^1.0.1", + "slash": "^1.0.0", + "source-map": "^0.5.6", + "v8flags": "^2.1.1" } }, "babel-code-frame": { @@ -381,9 +381,9 @@ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" } }, "babel-core": { @@ -392,25 +392,25 @@ "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "babel-generator": "6.26.1", - "babel-helpers": "6.24.1", - "babel-messages": "6.23.0", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "convert-source-map": "1.5.1", - "debug": "2.6.9", - "json5": "0.5.1", - "lodash": "4.17.5", - "minimatch": "3.0.4", - "path-is-absolute": "1.0.1", - "private": "0.1.8", - "slash": "1.0.0", - "source-map": "0.5.7" + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.0", + "debug": "^2.6.8", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.7", + "slash": "^1.0.0", + "source-map": "^0.5.6" } }, "babel-generator": { @@ -419,14 +419,14 @@ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", "dev": true, "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.5", - "source-map": "0.5.7", - "trim-right": "1.0.1" + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" } }, "babel-helper-builder-binary-assignment-operator-visitor": { @@ -435,9 +435,9 @@ "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", "dev": true, "requires": { - "babel-helper-explode-assignable-expression": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-explode-assignable-expression": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-call-delegate": { @@ -446,10 +446,10 @@ "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", "dev": true, "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "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": { @@ -458,10 +458,10 @@ "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.5" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, "babel-helper-explode-assignable-expression": { @@ -470,9 +470,9 @@ "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-function-name": { @@ -481,11 +481,11 @@ "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", "dev": true, "requires": { - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "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": { @@ -494,8 +494,8 @@ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-hoist-variables": { @@ -504,8 +504,8 @@ "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-optimise-call-expression": { @@ -514,8 +514,8 @@ "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-regex": { @@ -524,9 +524,9 @@ "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.5" + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, "babel-helper-remap-async-to-generator": { @@ -535,11 +535,11 @@ "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "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": { @@ -548,12 +548,12 @@ "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", "dev": true, "requires": { - "babel-helper-optimise-call-expression": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "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": { @@ -562,8 +562,8 @@ "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-jest": { @@ -572,8 +572,8 @@ "integrity": "sha512-BgSjmtl3mW3i+VeVHEr9d2zFSAT66G++pJcHQiUjd00pkW+voYXFctIm/indcqOWWXw5a1nUpR1XWszD9fJ1qg==", "dev": true, "requires": { - "babel-plugin-istanbul": "4.1.5", - "babel-preset-jest": "22.4.3" + "babel-plugin-istanbul": "^4.1.5", + "babel-preset-jest": "^22.4.3" } }, "babel-messages": { @@ -582,7 +582,7 @@ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-check-es2015-constants": { @@ -591,7 +591,7 @@ "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-istanbul": { @@ -600,9 +600,9 @@ "integrity": "sha1-Z2DN2Xf0EdPhdbsGTyvDJ9mbK24=", "dev": true, "requires": { - "find-up": "2.1.0", - "istanbul-lib-instrument": "1.10.1", - "test-exclude": "4.2.1" + "find-up": "^2.1.0", + "istanbul-lib-instrument": "^1.7.5", + "test-exclude": "^4.1.1" }, "dependencies": { "find-up": { @@ -611,7 +611,7 @@ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "locate-path": "2.0.0" + "locate-path": "^2.0.0" } } } @@ -652,9 +652,9 @@ "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", "dev": true, "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-functions": "6.13.0", - "babel-runtime": "6.26.0" + "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-es2015-arrow-functions": { @@ -663,7 +663,7 @@ "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-block-scoped-functions": { @@ -672,7 +672,7 @@ "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-block-scoping": { @@ -681,11 +681,11 @@ "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.5" + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, "babel-plugin-transform-es2015-classes": { @@ -694,15 +694,15 @@ "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", "dev": true, "requires": { - "babel-helper-define-map": "6.26.0", - "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.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "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": { @@ -711,8 +711,8 @@ "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-destructuring": { @@ -721,7 +721,7 @@ "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-duplicate-keys": { @@ -730,8 +730,8 @@ "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-for-of": { @@ -740,7 +740,7 @@ "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-function-name": { @@ -749,9 +749,9 @@ "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-literals": { @@ -760,7 +760,7 @@ "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-modules-amd": { @@ -769,9 +769,9 @@ "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", "dev": true, "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "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": { @@ -780,10 +780,10 @@ "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", "dev": true, "requires": { - "babel-plugin-transform-strict-mode": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" } }, "babel-plugin-transform-es2015-modules-systemjs": { @@ -792,9 +792,9 @@ "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", "dev": true, "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-modules-umd": { @@ -803,9 +803,9 @@ "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", "dev": true, "requires": { - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "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": { @@ -814,8 +814,8 @@ "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", "dev": true, "requires": { - "babel-helper-replace-supers": "6.24.1", - "babel-runtime": "6.26.0" + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-parameters": { @@ -824,12 +824,12 @@ "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", "dev": true, "requires": { - "babel-helper-call-delegate": "6.24.1", - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "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": { @@ -838,8 +838,8 @@ "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-spread": { @@ -848,7 +848,7 @@ "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-sticky-regex": { @@ -857,9 +857,9 @@ "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", "dev": true, "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-template-literals": { @@ -868,7 +868,7 @@ "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-typeof-symbol": { @@ -877,7 +877,7 @@ "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-unicode-regex": { @@ -886,9 +886,9 @@ "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", "dev": true, "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "regexpu-core": "2.0.0" + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" } }, "babel-plugin-transform-exponentiation-operator": { @@ -897,9 +897,9 @@ "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", "dev": true, "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", - "babel-plugin-syntax-exponentiation-operator": "6.13.0", - "babel-runtime": "6.26.0" + "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-regenerator": { @@ -908,7 +908,7 @@ "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", "dev": true, "requires": { - "regenerator-transform": "0.10.1" + "regenerator-transform": "^0.10.0" } }, "babel-plugin-transform-strict-mode": { @@ -917,8 +917,8 @@ "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-polyfill": { @@ -927,9 +927,9 @@ "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "core-js": "2.5.3", - "regenerator-runtime": "0.10.5" + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "regenerator-runtime": "^0.10.5" }, "dependencies": { "regenerator-runtime": { @@ -946,36 +946,36 @@ "integrity": "sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA==", "dev": true, "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-syntax-trailing-function-commas": "6.22.0", - "babel-plugin-transform-async-to-generator": "6.24.1", - "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.26.0", - "babel-plugin-transform-es2015-classes": "6.24.1", - "babel-plugin-transform-es2015-computed-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", - "babel-plugin-transform-es2015-for-of": "6.23.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.26.0", - "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.23.0", - "babel-plugin-transform-es2015-unicode-regex": "6.24.1", - "babel-plugin-transform-exponentiation-operator": "6.24.1", - "babel-plugin-transform-regenerator": "6.26.0", - "browserslist": "2.11.3", - "invariant": "2.2.4", - "semver": "5.5.0" + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-to-generator": "^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.23.0", + "babel-plugin-transform-es2015-classes": "^6.23.0", + "babel-plugin-transform-es2015-computed-properties": "^6.22.0", + "babel-plugin-transform-es2015-destructuring": "^6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", + "babel-plugin-transform-es2015-for-of": "^6.23.0", + "babel-plugin-transform-es2015-function-name": "^6.22.0", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.22.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-umd": "^6.23.0", + "babel-plugin-transform-es2015-object-super": "^6.22.0", + "babel-plugin-transform-es2015-parameters": "^6.23.0", + "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", + "babel-plugin-transform-exponentiation-operator": "^6.22.0", + "babel-plugin-transform-regenerator": "^6.22.0", + "browserslist": "^2.1.2", + "invariant": "^2.2.2", + "semver": "^5.3.0" } }, "babel-preset-jest": { @@ -984,8 +984,8 @@ "integrity": "sha512-a+M3LTEXTq3gxv0uBN9Qm6ahUl7a8pj923nFbCUdqFUSsf3YrX8Uc+C3MEwji5Af3LiQjSC7w4ooYewlz8HRTA==", "dev": true, "requires": { - "babel-plugin-jest-hoist": "22.4.3", - "babel-plugin-syntax-object-rest-spread": "6.13.0" + "babel-plugin-jest-hoist": "^22.4.3", + "babel-plugin-syntax-object-rest-spread": "^6.13.0" } }, "babel-register": { @@ -994,13 +994,13 @@ "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", "dev": true, "requires": { - "babel-core": "6.26.0", - "babel-runtime": "6.26.0", - "core-js": "2.5.3", - "home-or-tmp": "2.0.0", - "lodash": "4.17.5", - "mkdirp": "0.5.1", - "source-map-support": "0.4.18" + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" } }, "babel-runtime": { @@ -1009,8 +1009,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.3", - "regenerator-runtime": "0.11.1" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, "babel-template": { @@ -1019,11 +1019,11 @@ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.5" + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" } }, "babel-traverse": { @@ -1032,15 +1032,15 @@ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.9", - "globals": "9.18.0", - "invariant": "2.2.4", - "lodash": "4.17.5" + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" } }, "babel-types": { @@ -1049,10 +1049,10 @@ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.5", - "to-fast-properties": "1.0.3" + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" } }, "babylon": { @@ -1073,13 +1073,13 @@ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, "requires": { - "cache-base": "1.0.1", - "class-utils": "0.3.6", - "component-emitter": "1.2.1", - "define-property": "1.0.0", - "isobject": "3.0.1", - "mixin-deep": "1.3.1", - "pascalcase": "0.1.1" + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" }, "dependencies": { "define-property": { @@ -1088,7 +1088,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "isobject": { @@ -1106,7 +1106,7 @@ "dev": true, "optional": true, "requires": { - "tweetnacl": "0.14.5" + "tweetnacl": "^0.14.3" } }, "binary-extensions": { @@ -1122,7 +1122,7 @@ "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", "dev": true, "requires": { - "hoek": "4.2.1" + "hoek": "4.x.x" } }, "brace-expansion": { @@ -1131,7 +1131,7 @@ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -1141,9 +1141,9 @@ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "dev": true, "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, "browser-process-hrtime": { @@ -1175,8 +1175,8 @@ "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", "dev": true, "requires": { - "caniuse-lite": "1.0.30000820", - "electron-to-chromium": "1.3.40" + "caniuse-lite": "^1.0.30000792", + "electron-to-chromium": "^1.3.30" } }, "bser": { @@ -1185,7 +1185,7 @@ "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", "dev": true, "requires": { - "node-int64": "0.4.0" + "node-int64": "^0.4.0" } }, "buffer-from": { @@ -1206,15 +1206,15 @@ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, "requires": { - "collection-visit": "1.0.0", - "component-emitter": "1.2.1", - "get-value": "2.0.6", - "has-value": "1.0.0", - "isobject": "3.0.1", - "set-value": "2.0.0", - "to-object-path": "0.3.0", - "union-value": "1.0.0", - "unset-value": "1.0.0" + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" }, "dependencies": { "isobject": { @@ -1231,7 +1231,7 @@ "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", "dev": true, "requires": { - "callsites": "0.2.0" + "callsites": "^0.2.0" } }, "callsites": { @@ -1266,8 +1266,8 @@ "dev": true, "optional": true, "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" } }, "chalk": { @@ -1276,11 +1276,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "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" } }, "chardet": { @@ -1296,15 +1296,15 @@ "dev": true, "optional": true, "requires": { - "anymatch": "1.3.2", - "async-each": "1.0.1", - "fsevents": "1.1.3", - "glob-parent": "2.0.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "2.0.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0" + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "fsevents": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" } }, "ci-info": { @@ -1325,10 +1325,10 @@ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, "requires": { - "arr-union": "3.1.0", - "define-property": "0.2.5", - "isobject": "3.0.1", - "static-extend": "0.1.2" + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" }, "dependencies": { "define-property": { @@ -1337,7 +1337,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "is-accessor-descriptor": { @@ -1346,7 +1346,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -1355,7 +1355,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -1366,7 +1366,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -1375,7 +1375,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -1386,9 +1386,9 @@ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" } }, "isobject": { @@ -1411,7 +1411,7 @@ "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", "dev": true, "requires": { - "restore-cursor": "2.0.0" + "restore-cursor": "^2.0.0" } }, "cli-width": { @@ -1427,8 +1427,8 @@ "dev": true, "optional": true, "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", + "center-align": "^0.1.1", + "right-align": "^0.1.1", "wordwrap": "0.0.2" }, "dependencies": { @@ -1460,7 +1460,7 @@ "dev": true, "requires": { "argv": "0.0.2", - "request": "2.85.0", + "request": "^2.81.0", "urlgrey": "0.4.4" } }, @@ -1470,8 +1470,8 @@ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "dev": true, "requires": { - "map-visit": "1.0.0", - "object-visit": "1.0.1" + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" } }, "color-convert": { @@ -1480,7 +1480,7 @@ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", "dev": true, "requires": { - "color-name": "1.1.3" + "color-name": "^1.1.1" } }, "color-name": { @@ -1495,7 +1495,7 @@ "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "dev": true, "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, "commander": { @@ -1528,10 +1528,10 @@ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "requires": { - "buffer-from": "1.0.0", - "inherits": "2.0.3", - "readable-stream": "2.3.5", - "typedarray": "0.0.6" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, "contains-path": { @@ -1576,9 +1576,9 @@ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { - "lru-cache": "4.1.2", - "shebang-command": "1.2.0", - "which": "1.3.0" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, "cryptiles": { @@ -1587,7 +1587,7 @@ "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", "dev": true, "requires": { - "boom": "5.2.0" + "boom": "5.x.x" }, "dependencies": { "boom": { @@ -1596,7 +1596,7 @@ "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", "dev": true, "requires": { - "hoek": "4.2.1" + "hoek": "4.x.x" } } } @@ -1613,7 +1613,7 @@ "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", "dev": true, "requires": { - "cssom": "0.3.2" + "cssom": "0.3.x" } }, "damerau-levenshtein": { @@ -1628,7 +1628,7 @@ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "debug": { @@ -1664,7 +1664,7 @@ "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", "dev": true, "requires": { - "strip-bom": "2.0.0" + "strip-bom": "^2.0.0" }, "dependencies": { "strip-bom": { @@ -1673,7 +1673,7 @@ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { - "is-utf8": "0.2.1" + "is-utf8": "^0.2.0" } } } @@ -1684,8 +1684,8 @@ "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", "dev": true, "requires": { - "foreach": "2.0.5", - "object-keys": "1.0.11" + "foreach": "^2.0.5", + "object-keys": "^1.0.8" } }, "define-property": { @@ -1694,8 +1694,8 @@ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dev": true, "requires": { - "is-descriptor": "1.0.2", - "isobject": "3.0.1" + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" }, "dependencies": { "isobject": { @@ -1712,13 +1712,13 @@ "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", "dev": true, "requires": { - "globby": "5.0.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.1", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "rimraf": "2.6.2" + "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": { @@ -1733,7 +1733,7 @@ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", "dev": true, "requires": { - "repeating": "2.0.1" + "repeating": "^2.0.0" } }, "detect-newline": { @@ -1754,7 +1754,7 @@ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "requires": { - "esutils": "2.0.2" + "esutils": "^2.0.2" } }, "domexception": { @@ -1763,7 +1763,7 @@ "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", "dev": true, "requires": { - "webidl-conversions": "4.0.2" + "webidl-conversions": "^4.0.2" } }, "ecc-jsbn": { @@ -1773,7 +1773,7 @@ "dev": true, "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "~0.1.0" } }, "electron-to-chromium": { @@ -1794,7 +1794,7 @@ "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", "dev": true, "requires": { - "iconv-lite": "0.4.19" + "iconv-lite": "~0.4.13" } }, "error-ex": { @@ -1803,7 +1803,7 @@ "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", "dev": true, "requires": { - "is-arrayish": "0.2.1" + "is-arrayish": "^0.2.1" } }, "es-abstract": { @@ -1812,11 +1812,11 @@ "integrity": "sha512-ZnQrE/lXTTQ39ulXZ+J1DTFazV9qBy61x2bY071B+qGco8Z8q1QddsLdt/EF8Ai9hcWH72dWS0kFqXLxOxqslA==", "dev": true, "requires": { - "es-to-primitive": "1.1.1", - "function-bind": "1.1.1", - "has": "1.0.1", - "is-callable": "1.1.3", - "is-regex": "1.0.4" + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" } }, "es-to-primitive": { @@ -1825,9 +1825,9 @@ "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", "dev": true, "requires": { - "is-callable": "1.1.3", - "is-date-object": "1.0.1", - "is-symbol": "1.0.1" + "is-callable": "^1.1.1", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.1" } }, "escape-string-regexp": { @@ -1842,11 +1842,11 @@ "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==", "dev": true, "requires": { - "esprima": "3.1.3", - "estraverse": "4.2.0", - "esutils": "2.0.2", - "optionator": "0.8.2", - "source-map": "0.6.1" + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" }, "dependencies": { "esprima": { @@ -1870,44 +1870,44 @@ "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", "dev": true, "requires": { - "ajv": "5.5.2", - "babel-code-frame": "6.26.0", - "chalk": "2.3.2", - "concat-stream": "1.6.2", - "cross-spawn": "5.1.0", - "debug": "3.1.0", - "doctrine": "2.1.0", - "eslint-scope": "3.7.1", - "eslint-visitor-keys": "1.0.0", - "espree": "3.5.4", - "esquery": "1.0.0", - "esutils": "2.0.2", - "file-entry-cache": "2.0.0", - "functional-red-black-tree": "1.0.1", - "glob": "7.1.2", - "globals": "11.4.0", - "ignore": "3.3.7", - "imurmurhash": "0.1.4", - "inquirer": "3.3.0", - "is-resolvable": "1.1.0", - "js-yaml": "3.11.0", - "json-stable-stringify-without-jsonify": "1.0.1", - "levn": "0.3.0", - "lodash": "4.17.5", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "optionator": "0.8.2", - "path-is-inside": "1.0.2", - "pluralize": "7.0.0", - "progress": "2.0.0", - "regexpp": "1.0.1", - "require-uncached": "1.0.3", - "semver": "5.5.0", - "strip-ansi": "4.0.0", - "strip-json-comments": "2.0.1", + "ajv": "^5.3.0", + "babel-code-frame": "^6.22.0", + "chalk": "^2.1.0", + "concat-stream": "^1.6.0", + "cross-spawn": "^5.1.0", + "debug": "^3.1.0", + "doctrine": "^2.1.0", + "eslint-scope": "^3.7.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^3.5.4", + "esquery": "^1.0.0", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.0.1", + "ignore": "^3.3.3", + "imurmurhash": "^0.1.4", + "inquirer": "^3.0.6", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.9.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.4", + "minimatch": "^3.0.2", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "regexpp": "^1.0.1", + "require-uncached": "^1.0.3", + "semver": "^5.3.0", + "strip-ansi": "^4.0.0", + "strip-json-comments": "~2.0.1", "table": "4.0.2", - "text-table": "0.2.0" + "text-table": "~0.2.0" }, "dependencies": { "ansi-regex": { @@ -1922,7 +1922,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -1931,9 +1931,9 @@ "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.3.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "debug": { @@ -1957,7 +1957,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } }, "supports-color": { @@ -1966,7 +1966,7 @@ "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -1977,7 +1977,7 @@ "integrity": "sha512-zLyOhVWhzB/jwbz7IPSbkUuj7X2ox4PHXTcZkEmDqTvd0baJmJyuxlFPDlZOE/Y5bC+HQRaEkT3FoHo9wIdRiw==", "dev": true, "requires": { - "eslint-config-airbnb-base": "12.1.0" + "eslint-config-airbnb-base": "^12.1.0" } }, "eslint-config-airbnb-base": { @@ -1986,7 +1986,7 @@ "integrity": "sha512-/vjm0Px5ZCpmJqnjIzcFb9TKZrKWz0gnuG/7Gfkt0Db1ELJR51xkZth+t14rYdqWgX836XbuxtArbIHlVhbLBA==", "dev": true, "requires": { - "eslint-restricted-globals": "0.1.1" + "eslint-restricted-globals": "^0.1.1" } }, "eslint-import-resolver-node": { @@ -1995,8 +1995,8 @@ "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", "dev": true, "requires": { - "debug": "2.6.9", - "resolve": "1.7.1" + "debug": "^2.6.9", + "resolve": "^1.5.0" } }, "eslint-module-utils": { @@ -2005,8 +2005,8 @@ "integrity": "sha1-snA2LNiLGkitMIl2zn+lTphBF0Y=", "dev": true, "requires": { - "debug": "2.6.9", - "pkg-dir": "1.0.0" + "debug": "^2.6.8", + "pkg-dir": "^1.0.0" } }, "eslint-plugin-import": { @@ -2015,16 +2015,16 @@ "integrity": "sha1-Fa7qN6Z0mdhI6OmBgG1GJ7VQOBY=", "dev": true, "requires": { - "contains-path": "0.1.0", - "debug": "2.6.9", + "contains-path": "^0.1.0", + "debug": "^2.6.8", "doctrine": "1.5.0", - "eslint-import-resolver-node": "0.3.2", - "eslint-module-utils": "2.2.0", - "has": "1.0.1", - "lodash": "4.17.5", - "minimatch": "3.0.4", - "read-pkg-up": "2.0.0", - "resolve": "1.7.1" + "eslint-import-resolver-node": "^0.3.1", + "eslint-module-utils": "^2.2.0", + "has": "^1.0.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.3", + "read-pkg-up": "^2.0.0", + "resolve": "^1.6.0" }, "dependencies": { "doctrine": { @@ -2033,8 +2033,8 @@ "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "dev": true, "requires": { - "esutils": "2.0.2", - "isarray": "1.0.0" + "esutils": "^2.0.2", + "isarray": "^1.0.0" } } } @@ -2051,13 +2051,13 @@ "integrity": "sha1-VFg9GuRCSDFi4EDhPMMYZUZRAOU=", "dev": true, "requires": { - "aria-query": "0.7.1", - "array-includes": "3.0.3", + "aria-query": "^0.7.0", + "array-includes": "^3.0.3", "ast-types-flow": "0.0.7", - "axobject-query": "0.1.0", - "damerau-levenshtein": "1.0.4", - "emoji-regex": "6.5.1", - "jsx-ast-utils": "2.0.1" + "axobject-query": "^0.1.0", + "damerau-levenshtein": "^1.0.0", + "emoji-regex": "^6.1.0", + "jsx-ast-utils": "^2.0.0" } }, "eslint-plugin-react": { @@ -2066,10 +2066,10 @@ "integrity": "sha512-KC7Snr4YsWZD5flu6A5c0AcIZidzW3Exbqp7OT67OaD2AppJtlBr/GuPrW/vaQM/yfZotEvKAdrxrO+v8vwYJA==", "dev": true, "requires": { - "doctrine": "2.1.0", - "has": "1.0.1", - "jsx-ast-utils": "2.0.1", - "prop-types": "15.6.1" + "doctrine": "^2.0.2", + "has": "^1.0.1", + "jsx-ast-utils": "^2.0.1", + "prop-types": "^15.6.0" } }, "eslint-restricted-globals": { @@ -2084,8 +2084,8 @@ "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", "dev": true, "requires": { - "esrecurse": "4.2.1", - "estraverse": "4.2.0" + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, "eslint-visitor-keys": { @@ -2100,8 +2100,8 @@ "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", "dev": true, "requires": { - "acorn": "5.5.3", - "acorn-jsx": "3.0.1" + "acorn": "^5.5.0", + "acorn-jsx": "^3.0.0" } }, "esprima": { @@ -2116,7 +2116,7 @@ "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", "dev": true, "requires": { - "estraverse": "4.2.0" + "estraverse": "^4.0.0" } }, "esrecurse": { @@ -2125,7 +2125,7 @@ "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "dev": true, "requires": { - "estraverse": "4.2.0" + "estraverse": "^4.1.0" } }, "estraverse": { @@ -2146,7 +2146,7 @@ "integrity": "sha512-aLt95pexaugVtQerpmE51+4QfWrNc304uez7jvj6fWnN8GeEHpttB8F36n8N7uVhUMbH/1enbxQ9HImZ4w/9qg==", "dev": true, "requires": { - "merge": "1.2.0" + "merge": "^1.1.3" } }, "execa": { @@ -2155,13 +2155,13 @@ "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", "dev": true, "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" + "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" } }, "exit": { @@ -2176,7 +2176,7 @@ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "dev": true, "requires": { - "is-posix-bracket": "0.1.1" + "is-posix-bracket": "^0.1.0" } }, "expand-range": { @@ -2185,7 +2185,7 @@ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "dev": true, "requires": { - "fill-range": "2.2.3" + "fill-range": "^2.1.0" } }, "expect": { @@ -2194,12 +2194,12 @@ "integrity": "sha512-XcNXEPehqn8b/jm8FYotdX0YrXn36qp4HWlrVT4ktwQas1l1LPxiVWncYnnL2eyMtKAmVIaG0XAp0QlrqJaxaA==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "jest-diff": "22.4.3", - "jest-get-type": "22.4.3", - "jest-matcher-utils": "22.4.3", - "jest-message-util": "22.4.3", - "jest-regex-util": "22.4.3" + "ansi-styles": "^3.2.0", + "jest-diff": "^22.4.3", + "jest-get-type": "^22.4.3", + "jest-matcher-utils": "^22.4.3", + "jest-message-util": "^22.4.3", + "jest-regex-util": "^22.4.3" }, "dependencies": { "ansi-styles": { @@ -2208,7 +2208,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } } } @@ -2225,8 +2225,8 @@ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { @@ -2235,7 +2235,7 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "2.0.4" + "is-plain-object": "^2.0.4" } } } @@ -2246,9 +2246,9 @@ "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", "dev": true, "requires": { - "chardet": "0.4.2", - "iconv-lite": "0.4.19", - "tmp": "0.0.33" + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" } }, "extglob": { @@ -2257,7 +2257,7 @@ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "extsprintf": { @@ -2290,7 +2290,7 @@ "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", "dev": true, "requires": { - "bser": "2.0.0" + "bser": "^2.0.0" } }, "fbjs": { @@ -2299,13 +2299,13 @@ "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", "dev": true, "requires": { - "core-js": "1.2.7", - "isomorphic-fetch": "2.2.1", - "loose-envify": "1.3.1", - "object-assign": "4.1.1", - "promise": "7.3.1", - "setimmediate": "1.0.5", - "ua-parser-js": "0.7.17" + "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" }, "dependencies": { "core-js": { @@ -2322,7 +2322,7 @@ "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", "dev": true, "requires": { - "escape-string-regexp": "1.0.5" + "escape-string-regexp": "^1.0.5" } }, "file-entry-cache": { @@ -2331,8 +2331,8 @@ "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", "dev": true, "requires": { - "flat-cache": "1.3.0", - "object-assign": "4.1.1" + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" } }, "filename-regex": { @@ -2347,8 +2347,8 @@ "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", "dev": true, "requires": { - "glob": "7.1.2", - "minimatch": "3.0.4" + "glob": "^7.0.3", + "minimatch": "^3.0.3" } }, "fill-range": { @@ -2357,11 +2357,11 @@ "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", "dev": true, "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^1.1.3", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" } }, "find-up": { @@ -2370,8 +2370,8 @@ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "flat-cache": { @@ -2380,10 +2380,10 @@ "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", "dev": true, "requires": { - "circular-json": "0.3.3", - "del": "2.2.2", - "graceful-fs": "4.1.11", - "write": "0.2.1" + "circular-json": "^0.3.1", + "del": "^2.0.2", + "graceful-fs": "^4.1.2", + "write": "^0.2.1" } }, "for-in": { @@ -2398,7 +2398,7 @@ "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "dev": true, "requires": { - "for-in": "1.0.2" + "for-in": "^1.0.1" } }, "foreach": { @@ -2419,9 +2419,9 @@ "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", "dev": true, "requires": { - "asynckit": "0.4.0", + "asynckit": "^0.4.0", "combined-stream": "1.0.6", - "mime-types": "2.1.18" + "mime-types": "^2.1.12" } }, "fragment-cache": { @@ -2430,7 +2430,7 @@ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "dev": true, "requires": { - "map-cache": "0.2.2" + "map-cache": "^0.2.2" } }, "fs-readdir-recursive": { @@ -2452,8 +2452,8 @@ "dev": true, "optional": true, "requires": { - "nan": "2.10.0", - "node-pre-gyp": "0.6.39" + "nan": "^2.3.0", + "node-pre-gyp": "^0.6.39" }, "dependencies": { "abbrev": { @@ -2468,8 +2468,8 @@ "dev": true, "optional": true, "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" } }, "ansi-regex": { @@ -2489,8 +2489,8 @@ "dev": true, "optional": true, "requires": { - "delegates": "1.0.0", - "readable-stream": "2.2.9" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, "asn1": { @@ -2534,7 +2534,7 @@ "dev": true, "optional": true, "requires": { - "tweetnacl": "0.14.5" + "tweetnacl": "^0.14.3" } }, "block-stream": { @@ -2542,7 +2542,7 @@ "bundled": true, "dev": true, "requires": { - "inherits": "2.0.3" + "inherits": "~2.0.0" } }, "boom": { @@ -2550,7 +2550,7 @@ "bundled": true, "dev": true, "requires": { - "hoek": "2.16.3" + "hoek": "2.x.x" } }, "brace-expansion": { @@ -2558,7 +2558,7 @@ "bundled": true, "dev": true, "requires": { - "balanced-match": "0.4.2", + "balanced-match": "^0.4.1", "concat-map": "0.0.1" } }, @@ -2589,7 +2589,7 @@ "bundled": true, "dev": true, "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, "concat-map": { @@ -2612,7 +2612,7 @@ "bundled": true, "dev": true, "requires": { - "boom": "2.10.1" + "boom": "2.x.x" } }, "dashdash": { @@ -2621,7 +2621,7 @@ "dev": true, "optional": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" }, "dependencies": { "assert-plus": { @@ -2670,7 +2670,7 @@ "dev": true, "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "~0.1.0" } }, "extend": { @@ -2696,9 +2696,9 @@ "dev": true, "optional": true, "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.15" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" } }, "fs.realpath": { @@ -2711,10 +2711,10 @@ "bundled": true, "dev": true, "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.1" + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" } }, "fstream-ignore": { @@ -2723,9 +2723,9 @@ "dev": true, "optional": true, "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" + "fstream": "^1.0.0", + "inherits": "2", + "minimatch": "^3.0.0" } }, "gauge": { @@ -2734,14 +2734,14 @@ "dev": true, "optional": true, "requires": { - "aproba": "1.1.1", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" + "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" } }, "getpass": { @@ -2750,7 +2750,7 @@ "dev": true, "optional": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" }, "dependencies": { "assert-plus": { @@ -2766,12 +2766,12 @@ "bundled": true, "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "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" } }, "graceful-fs": { @@ -2791,8 +2791,8 @@ "dev": true, "optional": true, "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" + "ajv": "^4.9.1", + "har-schema": "^1.0.5" } }, "has-unicode": { @@ -2806,10 +2806,10 @@ "bundled": true, "dev": true, "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" } }, "hoek": { @@ -2823,9 +2823,9 @@ "dev": true, "optional": true, "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.0", - "sshpk": "1.13.0" + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "inflight": { @@ -2833,8 +2833,8 @@ "bundled": true, "dev": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -2853,7 +2853,7 @@ "bundled": true, "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-typedarray": { @@ -2879,7 +2879,7 @@ "dev": true, "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "~0.1.0" } }, "jsbn": { @@ -2900,7 +2900,7 @@ "dev": true, "optional": true, "requires": { - "jsonify": "0.0.0" + "jsonify": "~0.0.0" } }, "json-stringify-safe": { @@ -2945,7 +2945,7 @@ "bundled": true, "dev": true, "requires": { - "mime-db": "1.27.0" + "mime-db": "~1.27.0" } }, "minimatch": { @@ -2953,7 +2953,7 @@ "bundled": true, "dev": true, "requires": { - "brace-expansion": "1.1.7" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -2981,17 +2981,17 @@ "dev": true, "optional": true, "requires": { - "detect-libc": "1.0.2", + "detect-libc": "^1.0.2", "hawk": "3.1.3", - "mkdirp": "0.5.1", - "nopt": "4.0.1", - "npmlog": "4.1.0", - "rc": "1.2.1", + "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" + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^2.2.1", + "tar-pack": "^3.4.0" } }, "nopt": { @@ -3000,8 +3000,8 @@ "dev": true, "optional": true, "requires": { - "abbrev": "1.1.0", - "osenv": "0.1.4" + "abbrev": "1", + "osenv": "^0.1.4" } }, "npmlog": { @@ -3010,10 +3010,10 @@ "dev": true, "optional": true, "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" } }, "number-is-nan": { @@ -3038,7 +3038,7 @@ "bundled": true, "dev": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "os-homedir": { @@ -3059,8 +3059,8 @@ "dev": true, "optional": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" } }, "path-is-absolute": { @@ -3097,10 +3097,10 @@ "dev": true, "optional": true, "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" + "deep-extend": "~0.4.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, "dependencies": { "minimist": { @@ -3116,13 +3116,13 @@ "bundled": true, "dev": true, "requires": { - "buffer-shims": "1.0.0", - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "1.0.1", - "util-deprecate": "1.0.2" + "buffer-shims": "~1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~1.0.0", + "util-deprecate": "~1.0.1" } }, "request": { @@ -3131,28 +3131,28 @@ "dev": true, "optional": true, "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.15", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.0.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.0.1" + "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" } }, "rimraf": { @@ -3160,7 +3160,7 @@ "bundled": true, "dev": true, "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" } }, "safe-buffer": { @@ -3191,7 +3191,7 @@ "bundled": true, "dev": true, "requires": { - "hoek": "2.16.3" + "hoek": "2.x.x" } }, "sshpk": { @@ -3200,15 +3200,15 @@ "dev": true, "optional": true, "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jodid25519": "1.0.2", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jodid25519": "^1.0.0", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" }, "dependencies": { "assert-plus": { @@ -3224,9 +3224,9 @@ "bundled": true, "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "string_decoder": { @@ -3234,7 +3234,7 @@ "bundled": true, "dev": true, "requires": { - "safe-buffer": "5.0.1" + "safe-buffer": "^5.0.1" } }, "stringstream": { @@ -3248,7 +3248,7 @@ "bundled": true, "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-json-comments": { @@ -3262,9 +3262,9 @@ "bundled": true, "dev": true, "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" } }, "tar-pack": { @@ -3273,14 +3273,14 @@ "dev": true, "optional": true, "requires": { - "debug": "2.6.8", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.2.9", - "rimraf": "2.6.1", - "tar": "2.2.1", - "uid-number": "0.0.6" + "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" } }, "tough-cookie": { @@ -3289,7 +3289,7 @@ "dev": true, "optional": true, "requires": { - "punycode": "1.4.1" + "punycode": "^1.4.1" } }, "tunnel-agent": { @@ -3298,7 +3298,7 @@ "dev": true, "optional": true, "requires": { - "safe-buffer": "5.0.1" + "safe-buffer": "^5.0.1" } }, "tweetnacl": { @@ -3339,7 +3339,7 @@ "dev": true, "optional": true, "requires": { - "string-width": "1.0.2" + "string-width": "^1.0.2" } }, "wrappy": { @@ -3385,7 +3385,7 @@ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "glob": { @@ -3394,12 +3394,12 @@ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "glob-base": { @@ -3408,8 +3408,8 @@ "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", "dev": true, "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" } }, "glob-parent": { @@ -3418,7 +3418,7 @@ "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "dev": true, "requires": { - "is-glob": "2.0.1" + "is-glob": "^2.0.0" } }, "globals": { @@ -3433,12 +3433,12 @@ "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", "dev": true, "requires": { - "array-union": "1.0.2", - "arrify": "1.0.1", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "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" } }, "graceful-fs": { @@ -3459,10 +3459,10 @@ "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", "dev": true, "requires": { - "async": "1.5.2", - "optimist": "0.6.1", - "source-map": "0.4.4", - "uglify-js": "2.8.29" + "async": "^1.4.0", + "optimist": "^0.6.1", + "source-map": "^0.4.4", + "uglify-js": "^2.6" }, "dependencies": { "async": { @@ -3477,7 +3477,7 @@ "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "dev": true, "requires": { - "amdefine": "1.0.1" + "amdefine": ">=0.0.4" } } } @@ -3494,8 +3494,8 @@ "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", "dev": true, "requires": { - "ajv": "5.5.2", - "har-schema": "2.0.0" + "ajv": "^5.1.0", + "har-schema": "^2.0.0" } }, "has": { @@ -3504,7 +3504,7 @@ "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", "dev": true, "requires": { - "function-bind": "1.1.1" + "function-bind": "^1.0.2" } }, "has-ansi": { @@ -3513,7 +3513,7 @@ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "has-flag": { @@ -3528,9 +3528,9 @@ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dev": true, "requires": { - "get-value": "2.0.6", - "has-values": "1.0.0", - "isobject": "3.0.1" + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" }, "dependencies": { "isobject": { @@ -3547,8 +3547,8 @@ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "dev": true, "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "dependencies": { "is-number": { @@ -3557,7 +3557,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -3566,7 +3566,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -3577,7 +3577,7 @@ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -3588,10 +3588,10 @@ "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", "dev": true, "requires": { - "boom": "4.3.1", - "cryptiles": "3.1.2", - "hoek": "4.2.1", - "sntp": "2.1.0" + "boom": "4.x.x", + "cryptiles": "3.x.x", + "hoek": "4.x.x", + "sntp": "2.x.x" } }, "hoek": { @@ -3606,8 +3606,8 @@ "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", "dev": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" } }, "hosted-git-info": { @@ -3622,7 +3622,7 @@ "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", "dev": true, "requires": { - "whatwg-encoding": "1.0.3" + "whatwg-encoding": "^1.0.1" } }, "http-signature": { @@ -3631,9 +3631,9 @@ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.14.1" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "iconv-lite": { @@ -3654,8 +3654,8 @@ "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", "dev": true, "requires": { - "pkg-dir": "2.0.0", - "resolve-cwd": "2.0.0" + "pkg-dir": "^2.0.0", + "resolve-cwd": "^2.0.0" }, "dependencies": { "find-up": { @@ -3664,7 +3664,7 @@ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "locate-path": "2.0.0" + "locate-path": "^2.0.0" } }, "pkg-dir": { @@ -3673,7 +3673,7 @@ "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "dev": true, "requires": { - "find-up": "2.1.0" + "find-up": "^2.1.0" } } } @@ -3690,8 +3690,8 @@ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -3706,20 +3706,20 @@ "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", "dev": true, "requires": { - "ansi-escapes": "3.1.0", - "chalk": "2.3.2", - "cli-cursor": "2.1.0", - "cli-width": "2.2.0", - "external-editor": "2.1.0", - "figures": "2.0.0", - "lodash": "4.17.5", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.0", "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rx-lite": "4.0.8", - "rx-lite-aggregates": "4.0.8", - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "through": "2.3.8" + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" }, "dependencies": { "ansi-regex": { @@ -3734,7 +3734,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -3743,9 +3743,9 @@ "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.3.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "strip-ansi": { @@ -3754,7 +3754,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } }, "supports-color": { @@ -3763,7 +3763,7 @@ "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -3774,7 +3774,7 @@ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "dev": true, "requires": { - "loose-envify": "1.3.1" + "loose-envify": "^1.0.0" } }, "invert-kv": { @@ -3789,7 +3789,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" }, "dependencies": { "kind-of": { @@ -3813,7 +3813,7 @@ "dev": true, "optional": true, "requires": { - "binary-extensions": "1.11.0" + "binary-extensions": "^1.0.0" } }, "is-buffer": { @@ -3828,7 +3828,7 @@ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "dev": true, "requires": { - "builtin-modules": "1.1.1" + "builtin-modules": "^1.0.0" } }, "is-callable": { @@ -3843,7 +3843,7 @@ "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==", "dev": true, "requires": { - "ci-info": "1.1.3" + "ci-info": "^1.0.0" } }, "is-data-descriptor": { @@ -3852,7 +3852,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" }, "dependencies": { "kind-of": { @@ -3875,9 +3875,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" }, "dependencies": { "kind-of": { @@ -3900,7 +3900,7 @@ "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "dev": true, "requires": { - "is-primitive": "2.0.0" + "is-primitive": "^2.0.0" } }, "is-extendable": { @@ -3921,7 +3921,7 @@ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-fullwidth-code-point": { @@ -3942,7 +3942,7 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "is-number": { @@ -3951,7 +3951,7 @@ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-odd": { @@ -3960,7 +3960,7 @@ "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", "dev": true, "requires": { - "is-number": "4.0.0" + "is-number": "^4.0.0" }, "dependencies": { "is-number": { @@ -3983,7 +3983,7 @@ "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", "dev": true, "requires": { - "is-path-inside": "1.0.1" + "is-path-inside": "^1.0.0" } }, "is-path-inside": { @@ -3992,7 +3992,7 @@ "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", "dev": true, "requires": { - "path-is-inside": "1.0.2" + "path-is-inside": "^1.0.1" } }, "is-plain-object": { @@ -4001,7 +4001,7 @@ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" }, "dependencies": { "isobject": { @@ -4036,7 +4036,7 @@ "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", "dev": true, "requires": { - "has": "1.0.1" + "has": "^1.0.1" } }, "is-resolvable": { @@ -4102,8 +4102,8 @@ "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", "dev": true, "requires": { - "node-fetch": "1.7.3", - "whatwg-fetch": "2.0.3" + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" } }, "isstream": { @@ -4118,18 +4118,18 @@ "integrity": "sha512-duj6AlLcsWNwUpfyfHt0nWIeRiZpuShnP40YTxOGQgtaN8fd6JYSxsvxUphTDy8V5MfDXo4s/xVCIIvVCO808g==", "dev": true, "requires": { - "async": "2.6.0", - "compare-versions": "3.1.0", - "fileset": "2.0.3", - "istanbul-lib-coverage": "1.2.0", - "istanbul-lib-hook": "1.2.0", - "istanbul-lib-instrument": "1.10.1", - "istanbul-lib-report": "1.1.4", - "istanbul-lib-source-maps": "1.2.4", - "istanbul-reports": "1.3.0", - "js-yaml": "3.11.0", - "mkdirp": "0.5.1", - "once": "1.4.0" + "async": "^2.1.4", + "compare-versions": "^3.1.0", + "fileset": "^2.0.2", + "istanbul-lib-coverage": "^1.2.0", + "istanbul-lib-hook": "^1.2.0", + "istanbul-lib-instrument": "^1.10.1", + "istanbul-lib-report": "^1.1.4", + "istanbul-lib-source-maps": "^1.2.4", + "istanbul-reports": "^1.3.0", + "js-yaml": "^3.7.0", + "mkdirp": "^0.5.1", + "once": "^1.4.0" }, "dependencies": { "debug": { @@ -4147,11 +4147,11 @@ "integrity": "sha512-UzuK0g1wyQijiaYQxj/CdNycFhAd2TLtO2obKQMTZrZ1jzEMRY3rvpASEKkaxbRR6brvdovfA03znPa/pXcejg==", "dev": true, "requires": { - "debug": "3.1.0", - "istanbul-lib-coverage": "1.2.0", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "source-map": "0.5.7" + "debug": "^3.1.0", + "istanbul-lib-coverage": "^1.2.0", + "mkdirp": "^0.5.1", + "rimraf": "^2.6.1", + "source-map": "^0.5.3" } } } @@ -4168,7 +4168,7 @@ "integrity": "sha512-p3En6/oGkFQV55Up8ZPC2oLxvgSxD8CzA0yBrhRZSh3pfv3OFj9aSGVC0yoerAi/O4u7jUVnOGVX1eVFM+0tmQ==", "dev": true, "requires": { - "append-transform": "0.4.0" + "append-transform": "^0.4.0" } }, "istanbul-lib-instrument": { @@ -4177,13 +4177,13 @@ "integrity": "sha512-1dYuzkOCbuR5GRJqySuZdsmsNKPL3PTuyPevQfoCXJePT9C8y1ga75neU+Tuy9+yS3G/dgx8wgOmp2KLpgdoeQ==", "dev": true, "requires": { - "babel-generator": "6.26.1", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "istanbul-lib-coverage": "1.2.0", - "semver": "5.5.0" + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.2.0", + "semver": "^5.3.0" } }, "istanbul-lib-report": { @@ -4192,10 +4192,10 @@ "integrity": "sha512-Azqvq5tT0U09nrncK3q82e/Zjkxa4tkFZv7E6VcqP0QCPn6oNljDPfrZEC/umNXds2t7b8sRJfs6Kmpzt8m2kA==", "dev": true, "requires": { - "istanbul-lib-coverage": "1.2.0", - "mkdirp": "0.5.1", - "path-parse": "1.0.5", - "supports-color": "3.2.3" + "istanbul-lib-coverage": "^1.2.0", + "mkdirp": "^0.5.1", + "path-parse": "^1.0.5", + "supports-color": "^3.1.2" }, "dependencies": { "has-flag": { @@ -4210,7 +4210,7 @@ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "dev": true, "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -4221,11 +4221,11 @@ "integrity": "sha512-fDa0hwU/5sDXwAklXgAoCJCOsFsBplVQ6WBldz5UwaqOzmDhUK4nfuR7/G//G2lERlblUNJB8P6e8cXq3a7MlA==", "dev": true, "requires": { - "debug": "3.1.0", - "istanbul-lib-coverage": "1.2.0", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "source-map": "0.5.7" + "debug": "^3.1.0", + "istanbul-lib-coverage": "^1.1.2", + "mkdirp": "^0.5.1", + "rimraf": "^2.6.1", + "source-map": "^0.5.3" }, "dependencies": { "debug": { @@ -4245,7 +4245,7 @@ "integrity": "sha512-y2Z2IMqE1gefWUaVjrBm0mSKvUkaBy9Vqz8iwr/r40Y9hBbIteH5wqHG/9DLTfJ9xUnUT2j7A3+VVJ6EaYBllA==", "dev": true, "requires": { - "handlebars": "4.0.11" + "handlebars": "^4.0.3" } }, "jest": { @@ -4254,8 +4254,8 @@ "integrity": "sha512-FFCdU/pXOEASfHxFDOWUysI/+FFoqiXJADEIXgDKuZyqSmBD3tZ4BEGH7+M79v7czj7bbkhwtd2LaEDcJiM/GQ==", "dev": true, "requires": { - "import-local": "1.0.0", - "jest-cli": "22.4.3" + "import-local": "^1.0.0", + "jest-cli": "^22.4.3" }, "dependencies": { "ansi-regex": { @@ -4270,7 +4270,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -4279,9 +4279,9 @@ "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.3.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "jest-cli": { @@ -4290,40 +4290,40 @@ "integrity": "sha512-IiHybF0DJNqZPsbjn4Cy4vcqcmImpoFwNFnkehzVw8lTUSl4axZh5DHewu5bdpZF2Y5gUqFKYzH0FH4Qx2k+UA==", "dev": true, "requires": { - "ansi-escapes": "3.1.0", - "chalk": "2.3.2", - "exit": "0.1.2", - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "import-local": "1.0.0", - "is-ci": "1.1.0", - "istanbul-api": "1.3.1", - "istanbul-lib-coverage": "1.2.0", - "istanbul-lib-instrument": "1.10.1", - "istanbul-lib-source-maps": "1.2.3", - "jest-changed-files": "22.4.3", - "jest-config": "22.4.3", - "jest-environment-jsdom": "22.4.3", - "jest-get-type": "22.4.3", - "jest-haste-map": "22.4.3", - "jest-message-util": "22.4.3", - "jest-regex-util": "22.4.3", - "jest-resolve-dependencies": "22.4.3", - "jest-runner": "22.4.3", - "jest-runtime": "22.4.3", - "jest-snapshot": "22.4.3", - "jest-util": "22.4.3", - "jest-validate": "22.4.3", - "jest-worker": "22.4.3", - "micromatch": "2.3.11", - "node-notifier": "5.2.1", - "realpath-native": "1.0.0", - "rimraf": "2.6.2", - "slash": "1.0.0", - "string-length": "2.0.0", - "strip-ansi": "4.0.0", - "which": "1.3.0", - "yargs": "10.1.2" + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "import-local": "^1.0.0", + "is-ci": "^1.0.10", + "istanbul-api": "^1.1.14", + "istanbul-lib-coverage": "^1.1.1", + "istanbul-lib-instrument": "^1.8.0", + "istanbul-lib-source-maps": "^1.2.1", + "jest-changed-files": "^22.4.3", + "jest-config": "^22.4.3", + "jest-environment-jsdom": "^22.4.3", + "jest-get-type": "^22.4.3", + "jest-haste-map": "^22.4.3", + "jest-message-util": "^22.4.3", + "jest-regex-util": "^22.4.3", + "jest-resolve-dependencies": "^22.4.3", + "jest-runner": "^22.4.3", + "jest-runtime": "^22.4.3", + "jest-snapshot": "^22.4.3", + "jest-util": "^22.4.3", + "jest-validate": "^22.4.3", + "jest-worker": "^22.4.3", + "micromatch": "^2.3.11", + "node-notifier": "^5.2.1", + "realpath-native": "^1.0.0", + "rimraf": "^2.5.4", + "slash": "^1.0.0", + "string-length": "^2.0.0", + "strip-ansi": "^4.0.0", + "which": "^1.2.12", + "yargs": "^10.0.3" } }, "strip-ansi": { @@ -4332,7 +4332,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } }, "supports-color": { @@ -4341,7 +4341,7 @@ "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -4352,7 +4352,7 @@ "integrity": "sha512-83Dh0w1aSkUNFhy5d2dvqWxi/y6weDwVVLU6vmK0cV9VpRxPzhTeGimbsbRDSnEoszhF937M4sDLLeS7Cu/Tmw==", "dev": true, "requires": { - "throat": "4.1.0" + "throat": "^4.0.0" } }, "jest-config": { @@ -4361,17 +4361,17 @@ "integrity": "sha512-KSg3EOToCgkX+lIvenKY7J8s426h6ahXxaUFJxvGoEk0562Z6inWj1TnKoGycTASwiLD+6kSYFALcjdosq9KIQ==", "dev": true, "requires": { - "chalk": "2.3.2", - "glob": "7.1.2", - "jest-environment-jsdom": "22.4.3", - "jest-environment-node": "22.4.3", - "jest-get-type": "22.4.3", - "jest-jasmine2": "22.4.3", - "jest-regex-util": "22.4.3", - "jest-resolve": "22.4.3", - "jest-util": "22.4.3", - "jest-validate": "22.4.3", - "pretty-format": "22.4.3" + "chalk": "^2.0.1", + "glob": "^7.1.1", + "jest-environment-jsdom": "^22.4.3", + "jest-environment-node": "^22.4.3", + "jest-get-type": "^22.4.3", + "jest-jasmine2": "^22.4.3", + "jest-regex-util": "^22.4.3", + "jest-resolve": "^22.4.3", + "jest-util": "^22.4.3", + "jest-validate": "^22.4.3", + "pretty-format": "^22.4.3" }, "dependencies": { "ansi-styles": { @@ -4380,7 +4380,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -4389,9 +4389,9 @@ "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.3.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "supports-color": { @@ -4400,7 +4400,7 @@ "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -4411,10 +4411,10 @@ "integrity": "sha512-/QqGvCDP5oZOF6PebDuLwrB2BMD8ffJv6TAGAdEVuDx1+uEgrHpSFrfrOiMRx2eJ1hgNjlQrOQEHetVwij90KA==", "dev": true, "requires": { - "chalk": "2.3.2", - "diff": "3.5.0", - "jest-get-type": "22.4.3", - "pretty-format": "22.4.3" + "chalk": "^2.0.1", + "diff": "^3.2.0", + "jest-get-type": "^22.4.3", + "pretty-format": "^22.4.3" }, "dependencies": { "ansi-styles": { @@ -4423,7 +4423,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -4432,9 +4432,9 @@ "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.3.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "supports-color": { @@ -4443,7 +4443,7 @@ "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -4454,7 +4454,7 @@ "integrity": "sha512-uPKBEAw7YrEMcXueMKZXn/rbMxBiSv48fSqy3uEnmgOlQhSX+lthBqHb1fKWNVmFqAp9E/RsSdBfiV31LbzaOg==", "dev": true, "requires": { - "detect-newline": "2.1.0" + "detect-newline": "^2.1.0" } }, "jest-environment-jsdom": { @@ -4463,9 +4463,9 @@ "integrity": "sha512-FviwfR+VyT3Datf13+ULjIMO5CSeajlayhhYQwpzgunswoaLIPutdbrnfUHEMyJCwvqQFaVtTmn9+Y8WCt6n1w==", "dev": true, "requires": { - "jest-mock": "22.4.3", - "jest-util": "22.4.3", - "jsdom": "11.6.2" + "jest-mock": "^22.4.3", + "jest-util": "^22.4.3", + "jsdom": "^11.5.1" } }, "jest-environment-node": { @@ -4474,8 +4474,8 @@ "integrity": "sha512-reZl8XF6t/lMEuPWwo9OLfttyC26A5AMgDyEQ6DBgZuyfyeNUzYT8BFo6uxCCP/Av/b7eb9fTi3sIHFPBzmlRA==", "dev": true, "requires": { - "jest-mock": "22.4.3", - "jest-util": "22.4.3" + "jest-mock": "^22.4.3", + "jest-util": "^22.4.3" } }, "jest-get-type": { @@ -4490,13 +4490,13 @@ "integrity": "sha512-4Q9fjzuPVwnaqGKDpIsCSoTSnG3cteyk2oNVjBX12HHOaF1oxql+uUiqZb5Ndu7g/vTZfdNwwy4WwYogLh29DQ==", "dev": true, "requires": { - "fb-watchman": "2.0.0", - "graceful-fs": "4.1.11", - "jest-docblock": "22.4.3", - "jest-serializer": "22.4.3", - "jest-worker": "22.4.3", - "micromatch": "2.3.11", - "sane": "2.5.0" + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.1.11", + "jest-docblock": "^22.4.3", + "jest-serializer": "^22.4.3", + "jest-worker": "^22.4.3", + "micromatch": "^2.3.11", + "sane": "^2.0.0" } }, "jest-jasmine2": { @@ -4505,17 +4505,17 @@ "integrity": "sha512-yZCPCJUcEY6R5KJB/VReo1AYI2b+5Ky+C+JA1v34jndJsRcLpU4IZX4rFJn7yDTtdNbO/nNqg+3SDIPNH2ecnw==", "dev": true, "requires": { - "chalk": "2.3.2", - "co": "4.6.0", - "expect": "22.4.3", - "graceful-fs": "4.1.11", - "is-generator-fn": "1.0.0", - "jest-diff": "22.4.3", - "jest-matcher-utils": "22.4.3", - "jest-message-util": "22.4.3", - "jest-snapshot": "22.4.3", - "jest-util": "22.4.3", - "source-map-support": "0.5.4" + "chalk": "^2.0.1", + "co": "^4.6.0", + "expect": "^22.4.3", + "graceful-fs": "^4.1.11", + "is-generator-fn": "^1.0.0", + "jest-diff": "^22.4.3", + "jest-matcher-utils": "^22.4.3", + "jest-message-util": "^22.4.3", + "jest-snapshot": "^22.4.3", + "jest-util": "^22.4.3", + "source-map-support": "^0.5.0" }, "dependencies": { "ansi-styles": { @@ -4524,7 +4524,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -4533,9 +4533,9 @@ "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.3.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "source-map": { @@ -4550,7 +4550,7 @@ "integrity": "sha512-PETSPG6BjY1AHs2t64vS2aqAgu6dMIMXJULWFBGbh2Gr8nVLbCFDo6i/RMMvviIQ2h1Z8+5gQhVKSn2je9nmdg==", "dev": true, "requires": { - "source-map": "0.6.1" + "source-map": "^0.6.0" } }, "supports-color": { @@ -4559,7 +4559,7 @@ "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -4570,7 +4570,7 @@ "integrity": "sha512-NZpR/Ls7+ndO57LuXROdgCGz2RmUdC541tTImL9bdUtU3WadgFGm0yV+Ok4Fuia/1rLAn5KaJ+i76L6e3zGJYQ==", "dev": true, "requires": { - "pretty-format": "22.4.3" + "pretty-format": "^22.4.3" } }, "jest-matcher-utils": { @@ -4579,9 +4579,9 @@ "integrity": "sha512-lsEHVaTnKzdAPR5t4B6OcxXo9Vy4K+kRRbG5gtddY8lBEC+Mlpvm1CJcsMESRjzUhzkz568exMV1hTB76nAKbA==", "dev": true, "requires": { - "chalk": "2.3.2", - "jest-get-type": "22.4.3", - "pretty-format": "22.4.3" + "chalk": "^2.0.1", + "jest-get-type": "^22.4.3", + "pretty-format": "^22.4.3" }, "dependencies": { "ansi-styles": { @@ -4590,7 +4590,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -4599,9 +4599,9 @@ "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.3.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "supports-color": { @@ -4610,7 +4610,7 @@ "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -4621,11 +4621,11 @@ "integrity": "sha512-iAMeKxhB3Se5xkSjU0NndLLCHtP4n+GtCqV0bISKA5dmOXQfEbdEmYiu2qpnWBDCQdEafNDDU6Q+l6oBMd/+BA==", "dev": true, "requires": { - "@babel/code-frame": "7.0.0-beta.42", - "chalk": "2.3.2", - "micromatch": "2.3.11", - "slash": "1.0.0", - "stack-utils": "1.0.1" + "@babel/code-frame": "^7.0.0-beta.35", + "chalk": "^2.0.1", + "micromatch": "^2.3.11", + "slash": "^1.0.0", + "stack-utils": "^1.0.1" }, "dependencies": { "ansi-styles": { @@ -4634,7 +4634,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -4643,9 +4643,9 @@ "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.3.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "supports-color": { @@ -4654,7 +4654,7 @@ "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -4677,8 +4677,8 @@ "integrity": "sha512-u3BkD/MQBmwrOJDzDIaxpyqTxYH+XqAXzVJP51gt29H8jpj3QgKof5GGO2uPGKGeA1yTMlpbMs1gIQ6U4vcRhw==", "dev": true, "requires": { - "browser-resolve": "1.11.2", - "chalk": "2.3.2" + "browser-resolve": "^1.11.2", + "chalk": "^2.0.1" }, "dependencies": { "ansi-styles": { @@ -4687,7 +4687,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -4696,9 +4696,9 @@ "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.3.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "supports-color": { @@ -4707,7 +4707,7 @@ "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -4718,7 +4718,7 @@ "integrity": "sha512-06czCMVToSN8F2U4EvgSB1Bv/56gc7MpCftZ9z9fBgUQM7dzHGCMBsyfVA6dZTx8v0FDcnALf7hupeQxaBCvpA==", "dev": true, "requires": { - "jest-regex-util": "22.4.3" + "jest-regex-util": "^22.4.3" } }, "jest-runner": { @@ -4727,17 +4727,17 @@ "integrity": "sha512-U7PLlQPRlWNbvOHWOrrVay9sqhBJmiKeAdKIkvX4n1G2tsvzLlf77nBD28GL1N6tGv4RmuTfI8R8JrkvCa+IBg==", "dev": true, "requires": { - "exit": "0.1.2", - "jest-config": "22.4.3", - "jest-docblock": "22.4.3", - "jest-haste-map": "22.4.3", - "jest-jasmine2": "22.4.3", - "jest-leak-detector": "22.4.3", - "jest-message-util": "22.4.3", - "jest-runtime": "22.4.3", - "jest-util": "22.4.3", - "jest-worker": "22.4.3", - "throat": "4.1.0" + "exit": "^0.1.2", + "jest-config": "^22.4.3", + "jest-docblock": "^22.4.3", + "jest-haste-map": "^22.4.3", + "jest-jasmine2": "^22.4.3", + "jest-leak-detector": "^22.4.3", + "jest-message-util": "^22.4.3", + "jest-runtime": "^22.4.3", + "jest-util": "^22.4.3", + "jest-worker": "^22.4.3", + "throat": "^4.0.0" } }, "jest-runtime": { @@ -4746,26 +4746,26 @@ "integrity": "sha512-Eat/esQjevhx9BgJEC8udye+FfoJ2qvxAZfOAWshYGS22HydHn5BgsvPdTtt9cp0fSl5LxYOFA1Pja9Iz2Zt8g==", "dev": true, "requires": { - "babel-core": "6.26.0", - "babel-jest": "22.4.3", - "babel-plugin-istanbul": "4.1.5", - "chalk": "2.3.2", - "convert-source-map": "1.5.1", - "exit": "0.1.2", - "graceful-fs": "4.1.11", - "jest-config": "22.4.3", - "jest-haste-map": "22.4.3", - "jest-regex-util": "22.4.3", - "jest-resolve": "22.4.3", - "jest-util": "22.4.3", - "jest-validate": "22.4.3", - "json-stable-stringify": "1.0.1", - "micromatch": "2.3.11", - "realpath-native": "1.0.0", - "slash": "1.0.0", + "babel-core": "^6.0.0", + "babel-jest": "^22.4.3", + "babel-plugin-istanbul": "^4.1.5", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "exit": "^0.1.2", + "graceful-fs": "^4.1.11", + "jest-config": "^22.4.3", + "jest-haste-map": "^22.4.3", + "jest-regex-util": "^22.4.3", + "jest-resolve": "^22.4.3", + "jest-util": "^22.4.3", + "jest-validate": "^22.4.3", + "json-stable-stringify": "^1.0.1", + "micromatch": "^2.3.11", + "realpath-native": "^1.0.0", + "slash": "^1.0.0", "strip-bom": "3.0.0", - "write-file-atomic": "2.3.0", - "yargs": "10.1.2" + "write-file-atomic": "^2.1.0", + "yargs": "^10.0.3" }, "dependencies": { "ansi-styles": { @@ -4774,7 +4774,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -4783,9 +4783,9 @@ "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.3.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "supports-color": { @@ -4794,7 +4794,7 @@ "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -4811,12 +4811,12 @@ "integrity": "sha512-JXA0gVs5YL0HtLDCGa9YxcmmV2LZbwJ+0MfyXBBc5qpgkEYITQFJP7XNhcHFbUvRiniRpRbGVfJrOoYhhGE0RQ==", "dev": true, "requires": { - "chalk": "2.3.2", - "jest-diff": "22.4.3", - "jest-matcher-utils": "22.4.3", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "pretty-format": "22.4.3" + "chalk": "^2.0.1", + "jest-diff": "^22.4.3", + "jest-matcher-utils": "^22.4.3", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^22.4.3" }, "dependencies": { "ansi-styles": { @@ -4825,7 +4825,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -4834,9 +4834,9 @@ "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.3.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "supports-color": { @@ -4845,7 +4845,7 @@ "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -4856,13 +4856,13 @@ "integrity": "sha512-rfDfG8wyC5pDPNdcnAlZgwKnzHvZDu8Td2NJI/jAGKEGxJPYiE4F0ss/gSAkG4778Y23Hvbz+0GMrDJTeo7RjQ==", "dev": true, "requires": { - "callsites": "2.0.0", - "chalk": "2.3.2", - "graceful-fs": "4.1.11", - "is-ci": "1.1.0", - "jest-message-util": "22.4.3", - "mkdirp": "0.5.1", - "source-map": "0.6.1" + "callsites": "^2.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.11", + "is-ci": "^1.0.10", + "jest-message-util": "^22.4.3", + "mkdirp": "^0.5.1", + "source-map": "^0.6.0" }, "dependencies": { "ansi-styles": { @@ -4871,7 +4871,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "callsites": { @@ -4886,9 +4886,9 @@ "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.3.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "source-map": { @@ -4903,7 +4903,7 @@ "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -4914,11 +4914,11 @@ "integrity": "sha512-CfFM18W3GSP/xgmA4UouIx0ljdtfD2mjeBC6c89Gg17E44D4tQhAcTrZmf9djvipwU30kSTnk6CzcxdCCeSXfA==", "dev": true, "requires": { - "chalk": "2.3.2", - "jest-config": "22.4.3", - "jest-get-type": "22.4.3", - "leven": "2.1.0", - "pretty-format": "22.4.3" + "chalk": "^2.0.1", + "jest-config": "^22.4.3", + "jest-get-type": "^22.4.3", + "leven": "^2.1.0", + "pretty-format": "^22.4.3" }, "dependencies": { "ansi-styles": { @@ -4927,7 +4927,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -4936,9 +4936,9 @@ "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.3.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "supports-color": { @@ -4947,7 +4947,7 @@ "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -4958,7 +4958,7 @@ "integrity": "sha512-B1ucW4fI8qVAuZmicFxI1R3kr2fNeYJyvIQ1rKcuLYnenFV5K5aMbxFj6J0i00Ju83S8jP2d7Dz14+AvbIHRYQ==", "dev": true, "requires": { - "merge-stream": "1.0.1" + "merge-stream": "^1.0.1" } }, "js-tokens": { @@ -4973,8 +4973,8 @@ "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", "dev": true, "requires": { - "argparse": "1.0.10", - "esprima": "4.0.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, "jsbn": { @@ -4990,32 +4990,32 @@ "integrity": "sha512-pAeZhpbSlUp5yQcS6cBQJwkbzmv4tWFaYxHbFVSxzXefqjvtRA851Z5N2P+TguVG9YeUDcgb8pdeVQRJh0XR3Q==", "dev": true, "requires": { - "abab": "1.0.4", - "acorn": "5.5.3", - "acorn-globals": "4.1.0", - "array-equal": "1.0.0", - "browser-process-hrtime": "0.1.2", - "content-type-parser": "1.0.2", - "cssom": "0.3.2", - "cssstyle": "0.2.37", - "domexception": "1.0.1", - "escodegen": "1.9.1", - "html-encoding-sniffer": "1.0.2", - "left-pad": "1.2.0", - "nwmatcher": "1.4.4", + "abab": "^1.0.4", + "acorn": "^5.3.0", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "browser-process-hrtime": "^0.1.2", + "content-type-parser": "^1.0.2", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": ">= 0.2.37 < 0.3.0", + "domexception": "^1.0.0", + "escodegen": "^1.9.0", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.2.0", + "nwmatcher": "^1.4.3", "parse5": "4.0.0", - "pn": "1.1.0", - "request": "2.85.0", - "request-promise-native": "1.0.5", - "sax": "1.2.4", - "symbol-tree": "3.2.2", - "tough-cookie": "2.3.4", - "w3c-hr-time": "1.0.1", - "webidl-conversions": "4.0.2", - "whatwg-encoding": "1.0.3", - "whatwg-url": "6.4.0", - "ws": "4.1.0", - "xml-name-validator": "3.0.0" + "pn": "^1.1.0", + "request": "^2.83.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.3", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-url": "^6.4.0", + "ws": "^4.0.0", + "xml-name-validator": "^3.0.0" } }, "jsesc": { @@ -5042,7 +5042,7 @@ "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "dev": true, "requires": { - "jsonify": "0.0.0" + "jsonify": "~0.0.0" } }, "json-stable-stringify-without-jsonify": { @@ -5087,7 +5087,7 @@ "integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=", "dev": true, "requires": { - "array-includes": "3.0.3" + "array-includes": "^3.0.3" } }, "kind-of": { @@ -5096,7 +5096,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } }, "lazy-cache": { @@ -5112,7 +5112,7 @@ "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "dev": true, "requires": { - "invert-kv": "1.0.0" + "invert-kv": "^1.0.0" } }, "left-pad": { @@ -5133,8 +5133,8 @@ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "requires": { - "prelude-ls": "1.1.2", - "type-check": "0.3.2" + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" } }, "load-json-file": { @@ -5143,10 +5143,10 @@ "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" } }, "locate-path": { @@ -5155,8 +5155,8 @@ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" }, "dependencies": { "path-exists": { @@ -5191,7 +5191,7 @@ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", "dev": true, "requires": { - "js-tokens": "3.0.2" + "js-tokens": "^3.0.0" } }, "lru-cache": { @@ -5200,8 +5200,8 @@ "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", "dev": true, "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, "makeerror": { @@ -5210,7 +5210,7 @@ "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", "dev": true, "requires": { - "tmpl": "1.0.4" + "tmpl": "1.0.x" } }, "map-cache": { @@ -5225,7 +5225,7 @@ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dev": true, "requires": { - "object-visit": "1.0.1" + "object-visit": "^1.0.0" } }, "mem": { @@ -5234,7 +5234,7 @@ "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", "dev": true, "requires": { - "mimic-fn": "1.2.0" + "mimic-fn": "^1.0.0" } }, "merge": { @@ -5249,7 +5249,7 @@ "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", "dev": true, "requires": { - "readable-stream": "2.3.5" + "readable-stream": "^2.0.1" } }, "micromatch": { @@ -5258,19 +5258,19 @@ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "dev": true, "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" + "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": { @@ -5285,7 +5285,7 @@ "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "dev": true, "requires": { - "mime-db": "1.33.0" + "mime-db": "~1.33.0" } }, "mimic-fn": { @@ -5300,7 +5300,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -5315,8 +5315,8 @@ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", "dev": true, "requires": { - "for-in": "1.0.2", - "is-extendable": "1.0.1" + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { @@ -5325,7 +5325,7 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "2.0.4" + "is-plain-object": "^2.0.4" } } } @@ -5364,18 +5364,18 @@ "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", "dev": true, "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "fragment-cache": "0.2.1", - "is-odd": "2.0.0", - "is-windows": "1.0.2", - "kind-of": "6.0.2", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-odd": "^2.0.0", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "arr-diff": { @@ -5410,8 +5410,8 @@ "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", "dev": true, "requires": { - "encoding": "0.1.12", - "is-stream": "1.1.0" + "encoding": "^0.1.11", + "is-stream": "^1.0.1" } }, "node-int64": { @@ -5426,10 +5426,10 @@ "integrity": "sha512-MIBs+AAd6dJ2SklbbE8RUDRlIVhU8MaNLh1A9SUZDUHPiZkWLFde6UNwG41yQHZEToHgJMXqyVZ9UcS/ReOVTg==", "dev": true, "requires": { - "growly": "1.3.0", - "semver": "5.5.0", - "shellwords": "0.1.1", - "which": "1.3.0" + "growly": "^1.3.0", + "semver": "^5.4.1", + "shellwords": "^0.1.1", + "which": "^1.3.0" } }, "normalize-package-data": { @@ -5438,10 +5438,10 @@ "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "dev": true, "requires": { - "hosted-git-info": "2.6.0", - "is-builtin-module": "1.0.0", - "semver": "5.5.0", - "validate-npm-package-license": "3.0.3" + "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": { @@ -5450,3951 +5450,96 @@ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { - "remove-trailing-separator": "1.1.0" - } - }, - "npm": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/npm/-/npm-5.8.0.tgz", - "integrity": "sha512-DowXzQwtSWDtbAjuWecuEiismR0VdNEYaL3VxNTYTdW6AGkYxfGk9LUZ/rt6etEyiH4IEk95HkJeGfXE5Rz9xQ==", - "requires": { - "JSONStream": "1.3.2", - "abbrev": "1.1.1", - "ansi-regex": "3.0.0", - "ansicolors": "0.3.2", - "ansistyles": "0.1.3", - "aproba": "1.2.0", - "archy": "1.0.0", - "bin-links": "1.1.0", - "bluebird": "3.5.1", - "cacache": "10.0.4", - "call-limit": "1.1.0", - "chownr": "1.0.1", - "cli-table2": "0.2.0", - "cmd-shim": "2.0.2", - "columnify": "1.5.4", - "config-chain": "1.1.11", - "debuglog": "1.0.1", - "detect-indent": "5.0.0", - "detect-newline": "2.1.0", - "dezalgo": "1.0.3", - "editor": "1.0.0", - "find-npm-prefix": "1.0.2", - "fs-vacuum": "1.2.10", - "fs-write-stream-atomic": "1.0.10", - "gentle-fs": "2.0.1", - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "has-unicode": "2.0.1", - "hosted-git-info": "2.6.0", - "iferr": "0.1.5", - "imurmurhash": "0.1.4", - "inflight": "1.0.6", - "inherits": "2.0.3", - "ini": "1.3.5", - "init-package-json": "1.10.3", - "is-cidr": "1.0.0", - "json-parse-better-errors": "1.0.1", - "lazy-property": "1.0.0", - "libcipm": "1.6.0", - "libnpx": "10.0.1", - "lockfile": "1.0.3", - "lodash._baseindexof": "3.1.0", - "lodash._baseuniq": "4.6.0", - "lodash._bindcallback": "3.0.1", - "lodash._cacheindexof": "3.0.2", - "lodash._createcache": "3.1.2", - "lodash._getnative": "3.9.1", - "lodash.clonedeep": "4.5.0", - "lodash.restparam": "3.6.1", - "lodash.union": "4.6.0", - "lodash.uniq": "4.5.0", - "lodash.without": "4.4.0", - "lru-cache": "4.1.1", - "meant": "1.0.1", - "mississippi": "3.0.0", - "mkdirp": "0.5.1", - "move-concurrently": "1.0.1", - "nopt": "4.0.1", - "normalize-package-data": "2.4.0", - "npm-cache-filename": "1.0.2", - "npm-install-checks": "3.0.0", - "npm-lifecycle": "2.0.1", - "npm-package-arg": "6.0.0", - "npm-packlist": "1.1.10", - "npm-profile": "3.0.1", - "npm-registry-client": "8.5.1", - "npm-user-validate": "1.0.0", - "npmlog": "4.1.2", - "once": "1.4.0", - "opener": "1.4.3", - "osenv": "0.1.5", - "pacote": "7.6.1", - "path-is-inside": "1.0.2", - "promise-inflight": "1.0.1", - "qrcode-terminal": "0.11.0", - "query-string": "5.1.0", - "qw": "1.0.1", - "read": "1.0.7", - "read-cmd-shim": "1.0.1", - "read-installed": "4.0.3", - "read-package-json": "2.0.13", - "read-package-tree": "5.1.6", - "readable-stream": "2.3.5", - "readdir-scoped-modules": "1.0.2", - "request": "2.83.0", - "retry": "0.10.1", - "rimraf": "2.6.2", - "safe-buffer": "5.1.1", - "semver": "5.5.0", - "sha": "2.0.1", - "slide": "1.1.6", - "sorted-object": "2.0.1", - "sorted-union-stream": "2.1.3", - "ssri": "5.2.4", - "strip-ansi": "4.0.0", - "tar": "4.4.0", - "text-table": "0.2.0", - "uid-number": "0.0.6", - "umask": "1.1.0", - "unique-filename": "1.1.0", - "unpipe": "1.0.0", - "update-notifier": "2.3.0", - "uuid": "3.2.1", - "validate-npm-package-license": "3.0.1", - "validate-npm-package-name": "3.0.0", - "which": "1.3.0", - "worker-farm": "1.5.4", - "wrappy": "1.0.2", - "write-file-atomic": "2.3.0" + "remove-trailing-separator": "^1.0.1" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "nwmatcher": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz", + "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==", + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" }, "dependencies": { - "JSONStream": { - "version": "1.3.2", - "bundled": true, - "requires": { - "jsonparse": "1.3.1", - "through": "2.3.8" - }, - "dependencies": { - "jsonparse": { - "version": "1.3.1", - "bundled": true - }, - "through": { - "version": "2.3.8", - "bundled": true - } - } - }, - "abbrev": { - "version": "1.1.1", - "bundled": true - }, - "ansi-regex": { - "version": "3.0.0", - "bundled": true - }, - "ansicolors": { - "version": "0.3.2", - "bundled": true - }, - "ansistyles": { - "version": "0.1.3", - "bundled": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true - }, - "archy": { - "version": "1.0.0", - "bundled": true - }, - "bin-links": { - "version": "1.1.0", - "bundled": true, - "requires": { - "bluebird": "3.5.1", - "cmd-shim": "2.0.2", - "fs-write-stream-atomic": "1.0.10", - "gentle-fs": "2.0.1", - "graceful-fs": "4.1.11", - "slide": "1.1.6" - } - }, - "bluebird": { - "version": "3.5.1", - "bundled": true - }, - "cacache": { - "version": "10.0.4", - "bundled": true, - "requires": { - "bluebird": "3.5.1", - "chownr": "1.0.1", - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "lru-cache": "4.1.1", - "mississippi": "2.0.0", - "mkdirp": "0.5.1", - "move-concurrently": "1.0.1", - "promise-inflight": "1.0.1", - "rimraf": "2.6.2", - "ssri": "5.2.4", - "unique-filename": "1.1.0", - "y18n": "4.0.0" - }, - "dependencies": { - "mississippi": { - "version": "2.0.0", - "bundled": true, - "requires": { - "concat-stream": "1.6.1", - "duplexify": "3.5.4", - "end-of-stream": "1.4.1", - "flush-write-stream": "1.0.2", - "from2": "2.3.0", - "parallel-transform": "1.1.0", - "pump": "2.0.1", - "pumpify": "1.4.0", - "stream-each": "1.2.2", - "through2": "2.0.3" - }, - "dependencies": { - "concat-stream": { - "version": "1.6.1", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.5", - "typedarray": "0.0.6" - }, - "dependencies": { - "typedarray": { - "version": "0.0.6", - "bundled": true - } - } - }, - "duplexify": { - "version": "3.5.4", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "inherits": "2.0.3", - "readable-stream": "2.3.5", - "stream-shift": "1.0.0" - }, - "dependencies": { - "stream-shift": { - "version": "1.0.0", - "bundled": true - } - } - }, - "end-of-stream": { - "version": "1.4.1", - "bundled": true, - "requires": { - "once": "1.4.0" - } - }, - "flush-write-stream": { - "version": "1.0.2", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.5" - } - }, - "from2": { - "version": "2.3.0", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.5" - } - }, - "parallel-transform": { - "version": "1.1.0", - "bundled": true, - "requires": { - "cyclist": "0.2.2", - "inherits": "2.0.3", - "readable-stream": "2.3.5" - }, - "dependencies": { - "cyclist": { - "version": "0.2.2", - "bundled": true - } - } - }, - "pump": { - "version": "2.0.1", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" - } - }, - "pumpify": { - "version": "1.4.0", - "bundled": true, - "requires": { - "duplexify": "3.5.4", - "inherits": "2.0.3", - "pump": "2.0.1" - } - }, - "stream-each": { - "version": "1.2.2", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "stream-shift": "1.0.0" - }, - "dependencies": { - "stream-shift": { - "version": "1.0.0", - "bundled": true - } - } - }, - "through2": { - "version": "2.0.3", - "bundled": true, - "requires": { - "readable-stream": "2.3.5", - "xtend": "4.0.1" - }, - "dependencies": { - "xtend": { - "version": "4.0.1", - "bundled": true - } - } - } - } - }, - "y18n": { - "version": "4.0.0", - "bundled": true - } - } - }, - "call-limit": { - "version": "1.1.0", - "bundled": true - }, - "chownr": { - "version": "1.0.1", - "bundled": true - }, - "cli-table2": { - "version": "0.2.0", - "bundled": true, - "requires": { - "colors": "1.1.2", - "lodash": "3.10.1", - "string-width": "1.0.2" - }, - "dependencies": { - "colors": { - "version": "1.1.2", - "bundled": true, - "optional": true - }, - "lodash": { - "version": "3.10.1", - "bundled": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - }, - "dependencies": { - "code-point-at": { - "version": "1.1.0", - "bundled": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "requires": { - "number-is-nan": "1.0.1" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.1", - "bundled": true - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "requires": { - "ansi-regex": "2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "bundled": true - } - } - } - } - } - } - }, - "cmd-shim": { - "version": "2.0.2", - "bundled": true, - "requires": { - "graceful-fs": "4.1.11", - "mkdirp": "0.5.1" - } - }, - "columnify": { - "version": "1.5.4", - "bundled": true, - "requires": { - "strip-ansi": "3.0.1", - "wcwidth": "1.0.1" - }, - "dependencies": { - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "requires": { - "ansi-regex": "2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "bundled": true - } - } - }, - "wcwidth": { - "version": "1.0.1", - "bundled": true, - "requires": { - "defaults": "1.0.3" - }, - "dependencies": { - "defaults": { - "version": "1.0.3", - "bundled": true, - "requires": { - "clone": "1.0.2" - }, - "dependencies": { - "clone": { - "version": "1.0.2", - "bundled": true - } - } - } - } - } - } - }, - "config-chain": { - "version": "1.1.11", - "bundled": true, - "requires": { - "ini": "1.3.5", - "proto-list": "1.2.4" - }, - "dependencies": { - "proto-list": { - "version": "1.2.4", - "bundled": true - } - } - }, - "debuglog": { - "version": "1.0.1", - "bundled": true - }, - "detect-indent": { - "version": "5.0.0", - "bundled": true - }, - "detect-newline": { - "version": "2.1.0", - "bundled": true - }, - "dezalgo": { - "version": "1.0.3", - "bundled": true, - "requires": { - "asap": "2.0.5", - "wrappy": "1.0.2" - }, - "dependencies": { - "asap": { - "version": "2.0.5", - "bundled": true - } - } - }, - "editor": { - "version": "1.0.0", - "bundled": true - }, - "find-npm-prefix": { - "version": "1.0.2", - "bundled": true - }, - "fs-vacuum": { - "version": "1.2.10", - "bundled": true, - "requires": { - "graceful-fs": "4.1.11", - "path-is-inside": "1.0.2", - "rimraf": "2.6.2" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "bundled": true, - "requires": { - "graceful-fs": "4.1.11", - "iferr": "0.1.5", - "imurmurhash": "0.1.4", - "readable-stream": "2.3.5" - } - }, - "gentle-fs": { - "version": "2.0.1", - "bundled": true, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, "requires": { - "aproba": "1.2.0", - "fs-vacuum": "1.2.10", - "graceful-fs": "4.1.11", - "iferr": "0.1.5", - "mkdirp": "0.5.1", - "path-is-inside": "1.0.2", - "read-cmd-shim": "1.0.1", - "slide": "1.1.6" + "is-descriptor": "^0.1.0" } }, - "glob": { - "version": "7.1.2", - "bundled": true, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - }, - "dependencies": { - "fs.realpath": { - "version": "1.0.0", - "bundled": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "requires": { - "brace-expansion": "1.1.8" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.8", - "bundled": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "1.0.0", - "bundled": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true - } - } - } - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true - } + "kind-of": "^3.0.2" } }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true - }, - "hosted-git-info": { - "version": "2.6.0", - "bundled": true - }, - "iferr": { - "version": "0.1.5", - "bundled": true - }, - "imurmurhash": { + "is-data-descriptor": { "version": "0.1.4", - "bundled": true - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true - }, - "ini": { - "version": "1.3.5", - "bundled": true - }, - "init-package-json": { - "version": "1.10.3", - "bundled": true, - "requires": { - "glob": "7.1.2", - "npm-package-arg": "6.0.0", - "promzard": "0.3.0", - "read": "1.0.7", - "read-package-json": "2.0.13", - "semver": "5.5.0", - "validate-npm-package-license": "3.0.1", - "validate-npm-package-name": "3.0.0" - }, - "dependencies": { - "promzard": { - "version": "0.3.0", - "bundled": true, - "requires": { - "read": "1.0.7" - } - } - } - }, - "is-cidr": { - "version": "1.0.0", - "bundled": true, - "requires": { - "cidr-regex": "1.0.6" - }, - "dependencies": { - "cidr-regex": { - "version": "1.0.6", - "bundled": true - } - } - }, - "json-parse-better-errors": { - "version": "1.0.1", - "bundled": true - }, - "lazy-property": { - "version": "1.0.0", - "bundled": true - }, - "libcipm": { - "version": "1.6.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, "requires": { - "bin-links": "1.1.0", - "bluebird": "3.5.1", - "find-npm-prefix": "1.0.2", - "graceful-fs": "4.1.11", - "lock-verify": "2.0.0", - "npm-lifecycle": "2.0.1", - "npm-logical-tree": "1.2.1", - "npm-package-arg": "6.0.0", - "pacote": "7.6.1", - "protoduck": "5.0.0", - "read-package-json": "2.0.13", - "rimraf": "2.6.2", - "worker-farm": "1.5.4" - }, - "dependencies": { - "lock-verify": { - "version": "2.0.0", - "bundled": true, - "requires": { - "npm-package-arg": "5.1.2", - "semver": "5.5.0" - }, - "dependencies": { - "npm-package-arg": { - "version": "5.1.2", - "bundled": true, - "requires": { - "hosted-git-info": "2.6.0", - "osenv": "0.1.5", - "semver": "5.5.0", - "validate-npm-package-name": "3.0.0" - } - } - } - }, - "npm-logical-tree": { - "version": "1.2.1", - "bundled": true - }, - "protoduck": { - "version": "5.0.0", - "bundled": true, - "requires": { - "genfun": "4.0.1" - }, - "dependencies": { - "genfun": { - "version": "4.0.1", - "bundled": true - } - } - }, - "worker-farm": { - "version": "1.5.4", - "bundled": true, - "requires": { - "errno": "0.1.7", - "xtend": "4.0.1" - }, - "dependencies": { - "errno": { - "version": "0.1.7", - "bundled": true, - "requires": { - "prr": "1.0.1" - }, - "dependencies": { - "prr": { - "version": "1.0.1", - "bundled": true - } - } - }, - "xtend": { - "version": "4.0.1", - "bundled": true - } - } - } + "kind-of": "^3.0.2" } }, - "libnpx": { - "version": "10.0.1", - "bundled": true, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, "requires": { - "dotenv": "5.0.1", - "npm-package-arg": "6.0.0", - "rimraf": "2.6.2", - "safe-buffer": "5.1.1", - "update-notifier": "2.3.0", - "which": "1.3.0", - "y18n": "4.0.0", - "yargs": "11.0.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" }, "dependencies": { - "dotenv": { - "version": "5.0.1", - "bundled": true - }, - "y18n": { - "version": "4.0.0", - "bundled": true - }, - "yargs": { - "version": "11.0.0", - "bundled": true, - "requires": { - "cliui": "4.0.0", - "decamelize": "1.2.0", - "find-up": "2.1.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "9.0.2" - }, - "dependencies": { - "cliui": { - "version": "4.0.0", - "bundled": true, - "requires": { - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "wrap-ansi": "2.1.0" - }, - "dependencies": { - "wrap-ansi": { - "version": "2.1.0", - "bundled": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "bundled": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - }, - "dependencies": { - "code-point-at": { - "version": "1.1.0", - "bundled": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "requires": { - "number-is-nan": "1.0.1" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.1", - "bundled": true - } - } - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "requires": { - "ansi-regex": "2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "bundled": true - } - } - } - } - } - } - }, - "decamelize": { - "version": "1.2.0", - "bundled": true - }, - "find-up": { - "version": "2.1.0", - "bundled": true, - "requires": { - "locate-path": "2.0.0" - }, - "dependencies": { - "locate-path": { - "version": "2.0.0", - "bundled": true, - "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" - }, - "dependencies": { - "p-locate": { - "version": "2.0.0", - "bundled": true, - "requires": { - "p-limit": "1.2.0" - }, - "dependencies": { - "p-limit": { - "version": "1.2.0", - "bundled": true, - "requires": { - "p-try": "1.0.0" - }, - "dependencies": { - "p-try": { - "version": "1.0.0", - "bundled": true - } - } - } - } - }, - "path-exists": { - "version": "3.0.0", - "bundled": true - } - } - } - } - }, - "get-caller-file": { - "version": "1.0.2", - "bundled": true - }, - "os-locale": { - "version": "2.1.0", - "bundled": true, - "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" - }, - "dependencies": { - "execa": { - "version": "0.7.0", - "bundled": true, - "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "bundled": true, - "requires": { - "lru-cache": "4.1.1", - "shebang-command": "1.2.0", - "which": "1.3.0" - }, - "dependencies": { - "shebang-command": { - "version": "1.2.0", - "bundled": true, - "requires": { - "shebang-regex": "1.0.0" - }, - "dependencies": { - "shebang-regex": { - "version": "1.0.0", - "bundled": true - } - } - } - } - }, - "get-stream": { - "version": "3.0.0", - "bundled": true - }, - "is-stream": { - "version": "1.1.0", - "bundled": true - }, - "npm-run-path": { - "version": "2.0.2", - "bundled": true, - "requires": { - "path-key": "2.0.1" - }, - "dependencies": { - "path-key": { - "version": "2.0.1", - "bundled": true - } - } - }, - "p-finally": { - "version": "1.0.0", - "bundled": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true - }, - "strip-eof": { - "version": "1.0.0", - "bundled": true - } - } - }, - "lcid": { - "version": "1.0.0", - "bundled": true, - "requires": { - "invert-kv": "1.0.0" - }, - "dependencies": { - "invert-kv": { - "version": "1.0.0", - "bundled": true - } - } - }, - "mem": { - "version": "1.1.0", - "bundled": true, - "requires": { - "mimic-fn": "1.2.0" - }, - "dependencies": { - "mimic-fn": { - "version": "1.2.0", - "bundled": true - } - } - } - } - }, - "require-directory": { - "version": "2.1.1", - "bundled": true - }, - "require-main-filename": { - "version": "1.0.1", - "bundled": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true - }, - "string-width": { - "version": "2.1.1", - "bundled": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "bundled": true - } - } - }, - "which-module": { - "version": "2.0.0", - "bundled": true - }, - "y18n": { - "version": "3.2.1", - "bundled": true - }, - "yargs-parser": { - "version": "9.0.2", - "bundled": true, - "requires": { - "camelcase": "4.1.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "bundled": true - } - } - } - } - } - } - }, - "lockfile": { - "version": "1.0.3", - "bundled": true - }, - "lodash._baseindexof": { - "version": "3.1.0", - "bundled": true - }, - "lodash._baseuniq": { - "version": "4.6.0", - "bundled": true, - "requires": { - "lodash._createset": "4.0.3", - "lodash._root": "3.0.1" - }, - "dependencies": { - "lodash._createset": { - "version": "4.0.3", - "bundled": true - }, - "lodash._root": { - "version": "3.0.1", - "bundled": true - } - } - }, - "lodash._bindcallback": { - "version": "3.0.1", - "bundled": true - }, - "lodash._cacheindexof": { - "version": "3.0.2", - "bundled": true - }, - "lodash._createcache": { - "version": "3.1.2", - "bundled": true, - "requires": { - "lodash._getnative": "3.9.1" - } - }, - "lodash._getnative": { - "version": "3.9.1", - "bundled": true - }, - "lodash.clonedeep": { - "version": "4.5.0", - "bundled": true - }, - "lodash.restparam": { - "version": "3.6.1", - "bundled": true - }, - "lodash.union": { - "version": "4.6.0", - "bundled": true - }, - "lodash.uniq": { - "version": "4.5.0", - "bundled": true - }, - "lodash.without": { - "version": "4.4.0", - "bundled": true - }, - "lru-cache": { - "version": "4.1.1", - "bundled": true, - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" - }, - "dependencies": { - "pseudomap": { - "version": "1.0.2", - "bundled": true - }, - "yallist": { - "version": "2.1.2", - "bundled": true - } - } - }, - "meant": { - "version": "1.0.1", - "bundled": true - }, - "mississippi": { - "version": "3.0.0", - "bundled": true, - "requires": { - "concat-stream": "1.6.1", - "duplexify": "3.5.4", - "end-of-stream": "1.4.1", - "flush-write-stream": "1.0.2", - "from2": "2.3.0", - "parallel-transform": "1.1.0", - "pump": "3.0.0", - "pumpify": "1.4.0", - "stream-each": "1.2.2", - "through2": "2.0.3" - }, - "dependencies": { - "concat-stream": { - "version": "1.6.1", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.5", - "typedarray": "0.0.6" - }, - "dependencies": { - "typedarray": { - "version": "0.0.6", - "bundled": true - } - } - }, - "duplexify": { - "version": "3.5.4", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "inherits": "2.0.3", - "readable-stream": "2.3.5", - "stream-shift": "1.0.0" - }, - "dependencies": { - "stream-shift": { - "version": "1.0.0", - "bundled": true - } - } - }, - "end-of-stream": { - "version": "1.4.1", - "bundled": true, - "requires": { - "once": "1.4.0" - } - }, - "flush-write-stream": { - "version": "1.0.2", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.5" - } - }, - "from2": { - "version": "2.3.0", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.5" - } - }, - "parallel-transform": { - "version": "1.1.0", - "bundled": true, - "requires": { - "cyclist": "0.2.2", - "inherits": "2.0.3", - "readable-stream": "2.3.5" - }, - "dependencies": { - "cyclist": { - "version": "0.2.2", - "bundled": true - } - } - }, - "pump": { - "version": "3.0.0", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" - } - }, - "pumpify": { - "version": "1.4.0", - "bundled": true, - "requires": { - "duplexify": "3.5.4", - "inherits": "2.0.3", - "pump": "2.0.1" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" - } - } - } - }, - "stream-each": { - "version": "1.2.2", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "stream-shift": "1.0.0" - }, - "dependencies": { - "stream-shift": { - "version": "1.0.0", - "bundled": true - } - } - }, - "through2": { - "version": "2.0.3", - "bundled": true, - "requires": { - "readable-stream": "2.3.5", - "xtend": "4.0.1" - }, - "dependencies": { - "xtend": { - "version": "4.0.1", - "bundled": true - } - } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "bundled": true - } - } - }, - "move-concurrently": { - "version": "1.0.1", - "bundled": true, - "requires": { - "aproba": "1.2.0", - "copy-concurrently": "1.0.5", - "fs-write-stream-atomic": "1.0.10", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "run-queue": "1.0.3" - }, - "dependencies": { - "copy-concurrently": { - "version": "1.0.5", - "bundled": true, - "requires": { - "aproba": "1.2.0", - "fs-write-stream-atomic": "1.0.10", - "iferr": "0.1.5", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "run-queue": "1.0.3" - } - }, - "run-queue": { - "version": "1.0.3", - "bundled": true, - "requires": { - "aproba": "1.2.0" - } - } - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "requires": { - "abbrev": "1.1.1", - "osenv": "0.1.5" - } - }, - "normalize-package-data": { - "version": "2.4.0", - "bundled": true, - "requires": { - "hosted-git-info": "2.6.0", - "is-builtin-module": "1.0.0", - "semver": "5.5.0", - "validate-npm-package-license": "3.0.1" - }, - "dependencies": { - "is-builtin-module": { - "version": "1.0.0", - "bundled": true, - "requires": { - "builtin-modules": "1.1.1" - }, - "dependencies": { - "builtin-modules": { - "version": "1.1.1", - "bundled": true - } - } - } - } - }, - "npm-cache-filename": { - "version": "1.0.2", - "bundled": true - }, - "npm-install-checks": { - "version": "3.0.0", - "bundled": true, - "requires": { - "semver": "5.5.0" - } - }, - "npm-lifecycle": { - "version": "2.0.1", - "bundled": true, - "requires": { - "byline": "5.0.0", - "graceful-fs": "4.1.11", - "node-gyp": "3.6.2", - "resolve-from": "4.0.0", - "slide": "1.1.6", - "uid-number": "0.0.6", - "umask": "1.1.0", - "which": "1.3.0" - }, - "dependencies": { - "byline": { - "version": "5.0.0", - "bundled": true - }, - "node-gyp": { - "version": "3.6.2", - "bundled": true, - "requires": { - "fstream": "1.0.11", - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "nopt": "3.0.6", - "npmlog": "4.1.2", - "osenv": "0.1.5", - "request": "2.83.0", - "rimraf": "2.6.2", - "semver": "5.3.0", - "tar": "2.2.1", - "which": "1.3.0" - }, - "dependencies": { - "fstream": { - "version": "1.0.11", - "bundled": true, - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.2" - } - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "requires": { - "brace-expansion": "1.1.11" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "1.0.0", - "bundled": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true - } - } - } - } - }, - "nopt": { - "version": "3.0.6", - "bundled": true, - "requires": { - "abbrev": "1.1.1" - } - }, - "semver": { - "version": "5.3.0", - "bundled": true - }, - "tar": { - "version": "2.2.1", - "bundled": true, - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - }, - "dependencies": { - "block-stream": { - "version": "0.0.9", - "bundled": true, - "requires": { - "inherits": "2.0.3" - } - } - } - } - } - }, - "resolve-from": { - "version": "4.0.0", - "bundled": true - } - } - }, - "npm-package-arg": { - "version": "6.0.0", - "bundled": true, - "requires": { - "hosted-git-info": "2.6.0", - "osenv": "0.1.5", - "semver": "5.5.0", - "validate-npm-package-name": "3.0.0" - } - }, - "npm-packlist": { - "version": "1.1.10", - "bundled": true, - "requires": { - "ignore-walk": "3.0.1", - "npm-bundled": "1.0.3" - }, - "dependencies": { - "ignore-walk": { - "version": "3.0.1", - "bundled": true, - "requires": { - "minimatch": "3.0.4" - }, - "dependencies": { - "minimatch": { - "version": "3.0.4", - "bundled": true, - "requires": { - "brace-expansion": "1.1.8" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.8", - "bundled": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "1.0.0", - "bundled": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true - } - } - } - } - } - } - }, - "npm-bundled": { - "version": "1.0.3", - "bundled": true - } - } - }, - "npm-profile": { - "version": "3.0.1", - "bundled": true, - "requires": { - "aproba": "1.2.0", - "make-fetch-happen": "2.6.0" - }, - "dependencies": { - "make-fetch-happen": { - "version": "2.6.0", - "bundled": true, - "requires": { - "agentkeepalive": "3.3.0", - "cacache": "10.0.4", - "http-cache-semantics": "3.8.1", - "http-proxy-agent": "2.0.0", - "https-proxy-agent": "2.1.1", - "lru-cache": "4.1.1", - "mississippi": "1.3.1", - "node-fetch-npm": "2.0.2", - "promise-retry": "1.1.1", - "socks-proxy-agent": "3.0.1", - "ssri": "5.2.4" - }, - "dependencies": { - "agentkeepalive": { - "version": "3.3.0", - "bundled": true, - "requires": { - "humanize-ms": "1.2.1" - }, - "dependencies": { - "humanize-ms": { - "version": "1.2.1", - "bundled": true, - "requires": { - "ms": "2.1.1" - }, - "dependencies": { - "ms": { - "version": "2.1.1", - "bundled": true - } - } - } - } - }, - "http-cache-semantics": { - "version": "3.8.1", - "bundled": true - }, - "http-proxy-agent": { - "version": "2.0.0", - "bundled": true, - "requires": { - "agent-base": "4.2.0", - "debug": "2.6.9" - }, - "dependencies": { - "agent-base": { - "version": "4.2.0", - "bundled": true, - "requires": { - "es6-promisify": "5.0.0" - }, - "dependencies": { - "es6-promisify": { - "version": "5.0.0", - "bundled": true, - "requires": { - "es6-promise": "4.2.4" - }, - "dependencies": { - "es6-promise": { - "version": "4.2.4", - "bundled": true - } - } - } - } - }, - "debug": { - "version": "2.6.9", - "bundled": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "bundled": true - } - } - } - } - }, - "https-proxy-agent": { - "version": "2.1.1", - "bundled": true, - "requires": { - "agent-base": "4.2.0", - "debug": "3.1.0" - }, - "dependencies": { - "agent-base": { - "version": "4.2.0", - "bundled": true, - "requires": { - "es6-promisify": "5.0.0" - }, - "dependencies": { - "es6-promisify": { - "version": "5.0.0", - "bundled": true, - "requires": { - "es6-promise": "4.2.4" - }, - "dependencies": { - "es6-promise": { - "version": "4.2.4", - "bundled": true - } - } - } - } - }, - "debug": { - "version": "3.1.0", - "bundled": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "bundled": true - } - } - } - } - }, - "mississippi": { - "version": "1.3.1", - "bundled": true, - "requires": { - "concat-stream": "1.6.0", - "duplexify": "3.5.3", - "end-of-stream": "1.4.1", - "flush-write-stream": "1.0.2", - "from2": "2.3.0", - "parallel-transform": "1.1.0", - "pump": "1.0.3", - "pumpify": "1.4.0", - "stream-each": "1.2.2", - "through2": "2.0.3" - }, - "dependencies": { - "concat-stream": { - "version": "1.6.0", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.5", - "typedarray": "0.0.6" - }, - "dependencies": { - "typedarray": { - "version": "0.0.6", - "bundled": true - } - } - }, - "duplexify": { - "version": "3.5.3", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "inherits": "2.0.3", - "readable-stream": "2.3.5", - "stream-shift": "1.0.0" - }, - "dependencies": { - "stream-shift": { - "version": "1.0.0", - "bundled": true - } - } - }, - "end-of-stream": { - "version": "1.4.1", - "bundled": true, - "requires": { - "once": "1.4.0" - } - }, - "flush-write-stream": { - "version": "1.0.2", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.5" - } - }, - "from2": { - "version": "2.3.0", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.5" - } - }, - "parallel-transform": { - "version": "1.1.0", - "bundled": true, - "requires": { - "cyclist": "0.2.2", - "inherits": "2.0.3", - "readable-stream": "2.3.5" - }, - "dependencies": { - "cyclist": { - "version": "0.2.2", - "bundled": true - } - } - }, - "pump": { - "version": "1.0.3", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" - } - }, - "pumpify": { - "version": "1.4.0", - "bundled": true, - "requires": { - "duplexify": "3.5.3", - "inherits": "2.0.3", - "pump": "2.0.1" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" - } - } - } - }, - "stream-each": { - "version": "1.2.2", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "stream-shift": "1.0.0" - }, - "dependencies": { - "stream-shift": { - "version": "1.0.0", - "bundled": true - } - } - }, - "through2": { - "version": "2.0.3", - "bundled": true, - "requires": { - "readable-stream": "2.3.5", - "xtend": "4.0.1" - }, - "dependencies": { - "xtend": { - "version": "4.0.1", - "bundled": true - } - } - } - } - }, - "node-fetch-npm": { - "version": "2.0.2", - "bundled": true, - "requires": { - "encoding": "0.1.12", - "json-parse-better-errors": "1.0.1", - "safe-buffer": "5.1.1" - }, - "dependencies": { - "encoding": { - "version": "0.1.12", - "bundled": true, - "requires": { - "iconv-lite": "0.4.19" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.19", - "bundled": true - } - } - }, - "json-parse-better-errors": { - "version": "1.0.1", - "bundled": true - } - } - }, - "promise-retry": { - "version": "1.1.1", - "bundled": true, - "requires": { - "err-code": "1.1.2", - "retry": "0.10.1" - }, - "dependencies": { - "err-code": { - "version": "1.1.2", - "bundled": true - } - } - }, - "socks-proxy-agent": { - "version": "3.0.1", - "bundled": true, - "requires": { - "agent-base": "4.2.0", - "socks": "1.1.10" - }, - "dependencies": { - "agent-base": { - "version": "4.2.0", - "bundled": true, - "requires": { - "es6-promisify": "5.0.0" - }, - "dependencies": { - "es6-promisify": { - "version": "5.0.0", - "bundled": true, - "requires": { - "es6-promise": "4.2.4" - }, - "dependencies": { - "es6-promise": { - "version": "4.2.4", - "bundled": true - } - } - } - } - }, - "socks": { - "version": "1.1.10", - "bundled": true, - "requires": { - "ip": "1.1.5", - "smart-buffer": "1.1.15" - }, - "dependencies": { - "ip": { - "version": "1.1.5", - "bundled": true - }, - "smart-buffer": { - "version": "1.1.15", - "bundled": true - } - } - } - } - } - } - } - } - }, - "npm-registry-client": { - "version": "8.5.1", - "bundled": true, - "requires": { - "concat-stream": "1.6.1", - "graceful-fs": "4.1.11", - "normalize-package-data": "2.4.0", - "npm-package-arg": "6.0.0", - "npmlog": "4.1.2", - "once": "1.4.0", - "request": "2.83.0", - "retry": "0.10.1", - "safe-buffer": "5.1.1", - "semver": "5.5.0", - "slide": "1.1.6", - "ssri": "5.2.4" - }, - "dependencies": { - "concat-stream": { - "version": "1.6.1", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.5", - "typedarray": "0.0.6" - }, - "dependencies": { - "typedarray": { - "version": "0.0.6", - "bundled": true - } - } - } - } - }, - "npm-user-validate": { - "version": "1.0.0", - "bundled": true - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - }, - "dependencies": { - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.5" - }, - "dependencies": { - "delegates": { - "version": "1.0.0", - "bundled": true - } - } - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "requires": { - "aproba": "1.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "bundled": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - }, - "dependencies": { - "code-point-at": { - "version": "1.1.0", - "bundled": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "requires": { - "number-is-nan": "1.0.1" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.1", - "bundled": true - } - } - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "requires": { - "ansi-regex": "2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "bundled": true - } - } - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "requires": { - "string-width": "1.0.2" - } - } - } - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true - } - } - }, - "once": { - "version": "1.4.0", - "bundled": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "opener": { - "version": "1.4.3", - "bundled": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - }, - "dependencies": { - "os-homedir": { - "version": "1.0.2", - "bundled": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true - } - } - }, - "pacote": { - "version": "7.6.1", - "bundled": true, - "requires": { - "bluebird": "3.5.1", - "cacache": "10.0.4", - "get-stream": "3.0.0", - "glob": "7.1.2", - "lru-cache": "4.1.1", - "make-fetch-happen": "2.6.0", - "minimatch": "3.0.4", - "mississippi": "3.0.0", - "mkdirp": "0.5.1", - "normalize-package-data": "2.4.0", - "npm-package-arg": "6.0.0", - "npm-packlist": "1.1.10", - "npm-pick-manifest": "2.1.0", - "osenv": "0.1.5", - "promise-inflight": "1.0.1", - "promise-retry": "1.1.1", - "protoduck": "5.0.0", - "rimraf": "2.6.2", - "safe-buffer": "5.1.1", - "semver": "5.5.0", - "ssri": "5.2.4", - "tar": "4.4.0", - "unique-filename": "1.1.0", - "which": "1.3.0" - }, - "dependencies": { - "get-stream": { - "version": "3.0.0", - "bundled": true - }, - "make-fetch-happen": { - "version": "2.6.0", - "bundled": true, - "requires": { - "agentkeepalive": "3.4.0", - "cacache": "10.0.4", - "http-cache-semantics": "3.8.1", - "http-proxy-agent": "2.1.0", - "https-proxy-agent": "2.2.0", - "lru-cache": "4.1.1", - "mississippi": "1.3.1", - "node-fetch-npm": "2.0.2", - "promise-retry": "1.1.1", - "socks-proxy-agent": "3.0.1", - "ssri": "5.2.4" - }, - "dependencies": { - "agentkeepalive": { - "version": "3.4.0", - "bundled": true, - "requires": { - "humanize-ms": "1.2.1" - }, - "dependencies": { - "humanize-ms": { - "version": "1.2.1", - "bundled": true, - "requires": { - "ms": "2.1.1" - }, - "dependencies": { - "ms": { - "version": "2.1.1", - "bundled": true - } - } - } - } - }, - "http-cache-semantics": { - "version": "3.8.1", - "bundled": true - }, - "http-proxy-agent": { - "version": "2.1.0", - "bundled": true, - "requires": { - "agent-base": "4.2.0", - "debug": "3.1.0" - }, - "dependencies": { - "agent-base": { - "version": "4.2.0", - "bundled": true, - "requires": { - "es6-promisify": "5.0.0" - }, - "dependencies": { - "es6-promisify": { - "version": "5.0.0", - "bundled": true, - "requires": { - "es6-promise": "4.2.4" - }, - "dependencies": { - "es6-promise": { - "version": "4.2.4", - "bundled": true - } - } - } - } - }, - "debug": { - "version": "3.1.0", - "bundled": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "bundled": true - } - } - } - } - }, - "https-proxy-agent": { - "version": "2.2.0", - "bundled": true, - "requires": { - "agent-base": "4.2.0", - "debug": "3.1.0" - }, - "dependencies": { - "agent-base": { - "version": "4.2.0", - "bundled": true, - "requires": { - "es6-promisify": "5.0.0" - }, - "dependencies": { - "es6-promisify": { - "version": "5.0.0", - "bundled": true, - "requires": { - "es6-promise": "4.2.4" - }, - "dependencies": { - "es6-promise": { - "version": "4.2.4", - "bundled": true - } - } - } - } - }, - "debug": { - "version": "3.1.0", - "bundled": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "bundled": true - } - } - } - } - }, - "mississippi": { - "version": "1.3.1", - "bundled": true, - "requires": { - "concat-stream": "1.6.1", - "duplexify": "3.5.4", - "end-of-stream": "1.4.1", - "flush-write-stream": "1.0.2", - "from2": "2.3.0", - "parallel-transform": "1.1.0", - "pump": "1.0.3", - "pumpify": "1.4.0", - "stream-each": "1.2.2", - "through2": "2.0.3" - }, - "dependencies": { - "concat-stream": { - "version": "1.6.1", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.5", - "typedarray": "0.0.6" - }, - "dependencies": { - "typedarray": { - "version": "0.0.6", - "bundled": true - } - } - }, - "duplexify": { - "version": "3.5.4", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "inherits": "2.0.3", - "readable-stream": "2.3.5", - "stream-shift": "1.0.0" - }, - "dependencies": { - "stream-shift": { - "version": "1.0.0", - "bundled": true - } - } - }, - "end-of-stream": { - "version": "1.4.1", - "bundled": true, - "requires": { - "once": "1.4.0" - } - }, - "flush-write-stream": { - "version": "1.0.2", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.5" - } - }, - "from2": { - "version": "2.3.0", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.5" - } - }, - "parallel-transform": { - "version": "1.1.0", - "bundled": true, - "requires": { - "cyclist": "0.2.2", - "inherits": "2.0.3", - "readable-stream": "2.3.5" - }, - "dependencies": { - "cyclist": { - "version": "0.2.2", - "bundled": true - } - } - }, - "pump": { - "version": "1.0.3", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" - } - }, - "pumpify": { - "version": "1.4.0", - "bundled": true, - "requires": { - "duplexify": "3.5.4", - "inherits": "2.0.3", - "pump": "2.0.1" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" - } - } - } - }, - "stream-each": { - "version": "1.2.2", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "stream-shift": "1.0.0" - }, - "dependencies": { - "stream-shift": { - "version": "1.0.0", - "bundled": true - } - } - }, - "through2": { - "version": "2.0.3", - "bundled": true, - "requires": { - "readable-stream": "2.3.5", - "xtend": "4.0.1" - }, - "dependencies": { - "xtend": { - "version": "4.0.1", - "bundled": true - } - } - } - } - }, - "node-fetch-npm": { - "version": "2.0.2", - "bundled": true, - "requires": { - "encoding": "0.1.12", - "json-parse-better-errors": "1.0.1", - "safe-buffer": "5.1.1" - }, - "dependencies": { - "encoding": { - "version": "0.1.12", - "bundled": true, - "requires": { - "iconv-lite": "0.4.19" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.19", - "bundled": true - } - } - }, - "json-parse-better-errors": { - "version": "1.0.1", - "bundled": true - } - } - }, - "socks-proxy-agent": { - "version": "3.0.1", - "bundled": true, - "requires": { - "agent-base": "4.2.0", - "socks": "1.1.10" - }, - "dependencies": { - "agent-base": { - "version": "4.2.0", - "bundled": true, - "requires": { - "es6-promisify": "5.0.0" - }, - "dependencies": { - "es6-promisify": { - "version": "5.0.0", - "bundled": true, - "requires": { - "es6-promise": "4.2.4" - }, - "dependencies": { - "es6-promise": { - "version": "4.2.4", - "bundled": true - } - } - } - } - }, - "socks": { - "version": "1.1.10", - "bundled": true, - "requires": { - "ip": "1.1.5", - "smart-buffer": "1.1.15" - }, - "dependencies": { - "ip": { - "version": "1.1.5", - "bundled": true - }, - "smart-buffer": { - "version": "1.1.15", - "bundled": true - } - } - } - } - } - } - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "requires": { - "brace-expansion": "1.1.11" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "1.0.0", - "bundled": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true - } - } - } - } - }, - "npm-pick-manifest": { - "version": "2.1.0", - "bundled": true, - "requires": { - "npm-package-arg": "6.0.0", - "semver": "5.5.0" - } - }, - "promise-retry": { - "version": "1.1.1", - "bundled": true, - "requires": { - "err-code": "1.1.2", - "retry": "0.10.1" - }, - "dependencies": { - "err-code": { - "version": "1.1.2", - "bundled": true - } - } - }, - "protoduck": { - "version": "5.0.0", - "bundled": true, - "requires": { - "genfun": "4.0.1" - }, - "dependencies": { - "genfun": { - "version": "4.0.1", - "bundled": true - } - } - } - } - }, - "path-is-inside": { - "version": "1.0.2", - "bundled": true - }, - "promise-inflight": { - "version": "1.0.1", - "bundled": true - }, - "qrcode-terminal": { - "version": "0.11.0", - "bundled": true - }, - "query-string": { - "version": "5.1.0", - "bundled": true, - "requires": { - "decode-uri-component": "0.2.0", - "object-assign": "4.1.1", - "strict-uri-encode": "1.1.0" - }, - "dependencies": { - "decode-uri-component": { - "version": "0.2.0", - "bundled": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true - }, - "strict-uri-encode": { - "version": "1.1.0", - "bundled": true - } - } - }, - "qw": { - "version": "1.0.1", - "bundled": true - }, - "read": { - "version": "1.0.7", - "bundled": true, - "requires": { - "mute-stream": "0.0.7" - }, - "dependencies": { - "mute-stream": { - "version": "0.0.7", - "bundled": true - } - } - }, - "read-cmd-shim": { - "version": "1.0.1", - "bundled": true, - "requires": { - "graceful-fs": "4.1.11" - } - }, - "read-installed": { - "version": "4.0.3", - "bundled": true, - "requires": { - "debuglog": "1.0.1", - "graceful-fs": "4.1.11", - "read-package-json": "2.0.13", - "readdir-scoped-modules": "1.0.2", - "semver": "5.5.0", - "slide": "1.1.6", - "util-extend": "1.0.3" - }, - "dependencies": { - "util-extend": { - "version": "1.0.3", - "bundled": true - } - } - }, - "read-package-json": { - "version": "2.0.13", - "bundled": true, - "requires": { - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "json-parse-better-errors": "1.0.1", - "normalize-package-data": "2.4.0", - "slash": "1.0.0" - }, - "dependencies": { - "json-parse-better-errors": { - "version": "1.0.1", - "bundled": true - }, - "slash": { - "version": "1.0.0", - "bundled": true - } - } - }, - "read-package-tree": { - "version": "5.1.6", - "bundled": true, - "requires": { - "debuglog": "1.0.1", - "dezalgo": "1.0.3", - "once": "1.4.0", - "read-package-json": "2.0.13", - "readdir-scoped-modules": "1.0.2" - } - }, - "readable-stream": { - "version": "2.3.5", - "bundled": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "bundled": true - }, - "isarray": { - "version": "1.0.0", - "bundled": true - }, - "process-nextick-args": { - "version": "2.0.0", - "bundled": true - }, - "string_decoder": { - "version": "1.0.3", - "bundled": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true - } - } - }, - "readdir-scoped-modules": { - "version": "1.0.2", - "bundled": true, - "requires": { - "debuglog": "1.0.1", - "dezalgo": "1.0.3", - "graceful-fs": "4.1.11", - "once": "1.4.0" - } - }, - "request": { - "version": "2.83.0", - "bundled": true, - "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.3.1", - "har-validator": "5.0.3", - "hawk": "6.0.2", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.17", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.1", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.3", - "tunnel-agent": "0.6.0", - "uuid": "3.2.1" - }, - "dependencies": { - "aws-sign2": { - "version": "0.7.0", - "bundled": true - }, - "aws4": { - "version": "1.6.0", - "bundled": true - }, - "caseless": { - "version": "0.12.0", - "bundled": true - }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, - "requires": { - "delayed-stream": "1.0.0" - }, - "dependencies": { - "delayed-stream": { - "version": "1.0.0", - "bundled": true - } - } - }, - "extend": { - "version": "3.0.1", - "bundled": true - }, - "forever-agent": { - "version": "0.6.1", - "bundled": true - }, - "form-data": { - "version": "2.3.1", - "bundled": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.17" - }, - "dependencies": { - "asynckit": { - "version": "0.4.0", - "bundled": true - } - } - }, - "har-validator": { - "version": "5.0.3", - "bundled": true, - "requires": { - "ajv": "5.2.3", - "har-schema": "2.0.0" - }, - "dependencies": { - "ajv": { - "version": "5.2.3", - "bundled": true, - "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.0.0", - "json-schema-traverse": "0.3.1", - "json-stable-stringify": "1.0.1" - }, - "dependencies": { - "co": { - "version": "4.6.0", - "bundled": true - }, - "fast-deep-equal": { - "version": "1.0.0", - "bundled": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "bundled": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "bundled": true, - "requires": { - "jsonify": "0.0.0" - }, - "dependencies": { - "jsonify": { - "version": "0.0.0", - "bundled": true - } - } - } - } - }, - "har-schema": { - "version": "2.0.0", - "bundled": true - } - } - }, - "hawk": { - "version": "6.0.2", - "bundled": true, - "requires": { - "boom": "4.3.1", - "cryptiles": "3.1.2", - "hoek": "4.2.0", - "sntp": "2.0.2" - }, - "dependencies": { - "boom": { - "version": "4.3.1", - "bundled": true, - "requires": { - "hoek": "4.2.0" - } - }, - "cryptiles": { - "version": "3.1.2", - "bundled": true, - "requires": { - "boom": "5.2.0" - }, - "dependencies": { - "boom": { - "version": "5.2.0", - "bundled": true, - "requires": { - "hoek": "4.2.0" - } - } - } - }, - "hoek": { - "version": "4.2.0", - "bundled": true - }, - "sntp": { - "version": "2.0.2", - "bundled": true, - "requires": { - "hoek": "4.2.0" - } - } - } - }, - "http-signature": { - "version": "1.2.0", - "bundled": true, - "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.13.1" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true - }, - "jsprim": { - "version": "1.4.1", - "bundled": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - }, - "dependencies": { - "extsprintf": { - "version": "1.3.0", - "bundled": true - }, - "json-schema": { - "version": "0.2.3", - "bundled": true - }, - "verror": { - "version": "1.10.0", - "bundled": true, - "requires": { - "assert-plus": "1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "1.3.0" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "bundled": true - } - } - } - } - }, - "sshpk": { - "version": "1.13.1", - "bundled": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "asn1": { - "version": "0.2.3", - "bundled": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "bundled": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, - "requires": { - "assert-plus": "1.0.0" - } - }, - "ecc-jsbn": { - "version": "0.1.1", - "bundled": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "requires": { - "assert-plus": "1.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "bundled": true, - "optional": true - }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "optional": true - } - } - } - } - }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true - }, - "mime-types": { - "version": "2.1.17", - "bundled": true, - "requires": { - "mime-db": "1.30.0" - }, - "dependencies": { - "mime-db": { - "version": "1.30.0", - "bundled": true - } - } - }, - "oauth-sign": { - "version": "0.8.2", - "bundled": true - }, - "performance-now": { - "version": "2.1.0", - "bundled": true - }, - "qs": { - "version": "6.5.1", - "bundled": true - }, - "stringstream": { - "version": "0.0.5", - "bundled": true - }, - "tough-cookie": { - "version": "2.3.3", - "bundled": true, - "requires": { - "punycode": "1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "bundled": true - } - } - }, - "tunnel-agent": { - "version": "0.6.0", - "bundled": true, - "requires": { - "safe-buffer": "5.1.1" - } - } - } - }, - "retry": { - "version": "0.10.1", - "bundled": true - }, - "rimraf": { - "version": "2.6.2", - "bundled": true, - "requires": { - "glob": "7.1.2" - } - }, - "safe-buffer": { - "version": "5.1.1", - "bundled": true - }, - "semver": { - "version": "5.5.0", - "bundled": true - }, - "sha": { - "version": "2.0.1", - "bundled": true, - "requires": { - "graceful-fs": "4.1.11", - "readable-stream": "2.3.5" - } - }, - "slide": { - "version": "1.1.6", - "bundled": true - }, - "sorted-object": { - "version": "2.0.1", - "bundled": true - }, - "sorted-union-stream": { - "version": "2.1.3", - "bundled": true, - "requires": { - "from2": "1.3.0", - "stream-iterate": "1.2.0" - }, - "dependencies": { - "from2": { - "version": "1.3.0", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "1.1.14" - }, - "dependencies": { - "readable-stream": { - "version": "1.1.14", - "bundled": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "bundled": true - }, - "isarray": { - "version": "0.0.1", - "bundled": true - }, - "string_decoder": { - "version": "0.10.31", - "bundled": true - } - } - } - } - }, - "stream-iterate": { - "version": "1.2.0", - "bundled": true, - "requires": { - "readable-stream": "2.3.5", - "stream-shift": "1.0.0" - }, - "dependencies": { - "stream-shift": { - "version": "1.0.0", - "bundled": true - } - } - } - } - }, - "ssri": { - "version": "5.2.4", - "bundled": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "strip-ansi": { - "version": "4.0.0", - "bundled": true, - "requires": { - "ansi-regex": "3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "bundled": true - } - } - }, - "tar": { - "version": "4.4.0", - "bundled": true, - "requires": { - "chownr": "1.0.1", - "fs-minipass": "1.2.5", - "minipass": "2.2.1", - "minizlib": "1.1.0", - "mkdirp": "0.5.1", - "yallist": "3.0.2" - }, - "dependencies": { - "fs-minipass": { - "version": "1.2.5", - "bundled": true, - "requires": { - "minipass": "2.2.1" - } - }, - "minipass": { - "version": "2.2.1", - "bundled": true, - "requires": { - "yallist": "3.0.2" - } - }, - "minizlib": { - "version": "1.1.0", - "bundled": true, - "requires": { - "minipass": "2.2.1" - } - }, - "yallist": { - "version": "3.0.2", - "bundled": true - } - } - }, - "text-table": { - "version": "0.2.0", - "bundled": true - }, - "uid-number": { - "version": "0.0.6", - "bundled": true - }, - "umask": { - "version": "1.1.0", - "bundled": true - }, - "unique-filename": { - "version": "1.1.0", - "bundled": true, - "requires": { - "unique-slug": "2.0.0" - }, - "dependencies": { - "unique-slug": { - "version": "2.0.0", - "bundled": true, - "requires": { - "imurmurhash": "0.1.4" - } - } - } - }, - "unpipe": { - "version": "1.0.0", - "bundled": true - }, - "update-notifier": { - "version": "2.3.0", - "bundled": true, - "requires": { - "boxen": "1.2.1", - "chalk": "2.1.0", - "configstore": "3.1.1", - "import-lazy": "2.1.0", - "is-installed-globally": "0.1.0", - "is-npm": "1.0.0", - "latest-version": "3.1.0", - "semver-diff": "2.1.0", - "xdg-basedir": "3.0.0" - }, - "dependencies": { - "boxen": { - "version": "1.2.1", - "bundled": true, - "requires": { - "ansi-align": "2.0.0", - "camelcase": "4.1.0", - "chalk": "2.1.0", - "cli-boxes": "1.0.0", - "string-width": "2.1.1", - "term-size": "1.2.0", - "widest-line": "1.0.0" - }, - "dependencies": { - "ansi-align": { - "version": "2.0.0", - "bundled": true, - "requires": { - "string-width": "2.1.1" - } - }, - "camelcase": { - "version": "4.1.0", - "bundled": true - }, - "cli-boxes": { - "version": "1.0.0", - "bundled": true - }, - "string-width": { - "version": "2.1.1", - "bundled": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "bundled": true - } - } - }, - "term-size": { - "version": "1.2.0", - "bundled": true, - "requires": { - "execa": "0.7.0" - }, - "dependencies": { - "execa": { - "version": "0.7.0", - "bundled": true, - "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "bundled": true, - "requires": { - "lru-cache": "4.1.1", - "shebang-command": "1.2.0", - "which": "1.3.0" - }, - "dependencies": { - "shebang-command": { - "version": "1.2.0", - "bundled": true, - "requires": { - "shebang-regex": "1.0.0" - }, - "dependencies": { - "shebang-regex": { - "version": "1.0.0", - "bundled": true - } - } - } - } - }, - "get-stream": { - "version": "3.0.0", - "bundled": true - }, - "is-stream": { - "version": "1.1.0", - "bundled": true - }, - "npm-run-path": { - "version": "2.0.2", - "bundled": true, - "requires": { - "path-key": "2.0.1" - }, - "dependencies": { - "path-key": { - "version": "2.0.1", - "bundled": true - } - } - }, - "p-finally": { - "version": "1.0.0", - "bundled": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true - }, - "strip-eof": { - "version": "1.0.0", - "bundled": true - } - } - } - } - }, - "widest-line": { - "version": "1.0.0", - "bundled": true, - "requires": { - "string-width": "1.0.2" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "bundled": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - }, - "dependencies": { - "code-point-at": { - "version": "1.1.0", - "bundled": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "requires": { - "number-is-nan": "1.0.1" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.1", - "bundled": true - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "requires": { - "ansi-regex": "2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "bundled": true - } - } - } - } - } - } - } - } - }, - "chalk": { - "version": "2.1.0", - "bundled": true, - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.4.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.0", - "bundled": true, - "requires": { - "color-convert": "1.9.0" - }, - "dependencies": { - "color-convert": { - "version": "1.9.0", - "bundled": true, - "requires": { - "color-name": "1.1.3" - }, - "dependencies": { - "color-name": { - "version": "1.1.3", - "bundled": true - } - } - } - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "bundled": true - }, - "supports-color": { - "version": "4.4.0", - "bundled": true, - "requires": { - "has-flag": "2.0.0" - }, - "dependencies": { - "has-flag": { - "version": "2.0.0", - "bundled": true - } - } - } - } - }, - "configstore": { - "version": "3.1.1", - "bundled": true, - "requires": { - "dot-prop": "4.2.0", - "graceful-fs": "4.1.11", - "make-dir": "1.0.0", - "unique-string": "1.0.0", - "write-file-atomic": "2.3.0", - "xdg-basedir": "3.0.0" - }, - "dependencies": { - "dot-prop": { - "version": "4.2.0", - "bundled": true, - "requires": { - "is-obj": "1.0.1" - }, - "dependencies": { - "is-obj": { - "version": "1.0.1", - "bundled": true - } - } - }, - "make-dir": { - "version": "1.0.0", - "bundled": true, - "requires": { - "pify": "2.3.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "bundled": true - } - } - }, - "unique-string": { - "version": "1.0.0", - "bundled": true, - "requires": { - "crypto-random-string": "1.0.0" - }, - "dependencies": { - "crypto-random-string": { - "version": "1.0.0", - "bundled": true - } - } - } - } - }, - "import-lazy": { - "version": "2.1.0", - "bundled": true - }, - "is-installed-globally": { - "version": "0.1.0", - "bundled": true, - "requires": { - "global-dirs": "0.1.0", - "is-path-inside": "1.0.0" - }, - "dependencies": { - "global-dirs": { - "version": "0.1.0", - "bundled": true, - "requires": { - "ini": "1.3.5" - } - }, - "is-path-inside": { - "version": "1.0.0", - "bundled": true, - "requires": { - "path-is-inside": "1.0.2" - } - } - } - }, - "is-npm": { - "version": "1.0.0", - "bundled": true - }, - "latest-version": { - "version": "3.1.0", - "bundled": true, - "requires": { - "package-json": "4.0.1" - }, - "dependencies": { - "package-json": { - "version": "4.0.1", - "bundled": true, - "requires": { - "got": "6.7.1", - "registry-auth-token": "3.3.1", - "registry-url": "3.1.0", - "semver": "5.5.0" - }, - "dependencies": { - "got": { - "version": "6.7.1", - "bundled": true, - "requires": { - "create-error-class": "3.0.2", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "is-redirect": "1.0.0", - "is-retry-allowed": "1.1.0", - "is-stream": "1.1.0", - "lowercase-keys": "1.0.0", - "safe-buffer": "5.1.1", - "timed-out": "4.0.1", - "unzip-response": "2.0.1", - "url-parse-lax": "1.0.0" - }, - "dependencies": { - "create-error-class": { - "version": "3.0.2", - "bundled": true, - "requires": { - "capture-stack-trace": "1.0.0" - }, - "dependencies": { - "capture-stack-trace": { - "version": "1.0.0", - "bundled": true - } - } - }, - "duplexer3": { - "version": "0.1.4", - "bundled": true - }, - "get-stream": { - "version": "3.0.0", - "bundled": true - }, - "is-redirect": { - "version": "1.0.0", - "bundled": true - }, - "is-retry-allowed": { - "version": "1.1.0", - "bundled": true - }, - "is-stream": { - "version": "1.1.0", - "bundled": true - }, - "lowercase-keys": { - "version": "1.0.0", - "bundled": true - }, - "timed-out": { - "version": "4.0.1", - "bundled": true - }, - "unzip-response": { - "version": "2.0.1", - "bundled": true - }, - "url-parse-lax": { - "version": "1.0.0", - "bundled": true, - "requires": { - "prepend-http": "1.0.4" - }, - "dependencies": { - "prepend-http": { - "version": "1.0.4", - "bundled": true - } - } - } - } - }, - "registry-auth-token": { - "version": "3.3.1", - "bundled": true, - "requires": { - "rc": "1.2.1", - "safe-buffer": "5.1.1" - }, - "dependencies": { - "rc": { - "version": "1.2.1", - "bundled": true, - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "deep-extend": { - "version": "0.4.2", - "bundled": true - }, - "minimist": { - "version": "1.2.0", - "bundled": true - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true - } - } - } - } - }, - "registry-url": { - "version": "3.1.0", - "bundled": true, - "requires": { - "rc": "1.2.1" - }, - "dependencies": { - "rc": { - "version": "1.2.1", - "bundled": true, - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "deep-extend": { - "version": "0.4.2", - "bundled": true - }, - "minimist": { - "version": "1.2.0", - "bundled": true - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true - } - } - } - } - } - } - } - } - }, - "semver-diff": { - "version": "2.1.0", - "bundled": true, - "requires": { - "semver": "5.5.0" - } - }, - "xdg-basedir": { - "version": "3.0.0", - "bundled": true - } - } - }, - "uuid": { - "version": "3.2.1", - "bundled": true - }, - "validate-npm-package-license": { - "version": "3.0.1", - "bundled": true, - "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.4" - }, - "dependencies": { - "spdx-correct": { - "version": "1.0.2", - "bundled": true, - "requires": { - "spdx-license-ids": "1.2.2" - }, - "dependencies": { - "spdx-license-ids": { - "version": "1.2.2", - "bundled": true - } - } - }, - "spdx-expression-parse": { - "version": "1.0.4", - "bundled": true - } - } - }, - "validate-npm-package-name": { - "version": "3.0.0", - "bundled": true, - "requires": { - "builtins": "1.0.3" - }, - "dependencies": { - "builtins": { - "version": "1.0.3", - "bundled": true - } - } - }, - "which": { - "version": "1.3.0", - "bundled": true, - "requires": { - "isexe": "2.0.0" - }, - "dependencies": { - "isexe": { - "version": "2.0.0", - "bundled": true - } - } - }, - "worker-farm": { - "version": "1.5.4", - "bundled": true, - "requires": { - "errno": "0.1.7", - "xtend": "4.0.1" - }, - "dependencies": { - "errno": { - "version": "0.1.7", - "bundled": true, - "requires": { - "prr": "1.0.1" - }, - "dependencies": { - "prr": { - "version": "1.0.1", - "bundled": true - } - } - }, - "xtend": { - "version": "4.0.1", - "bundled": true - } - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true - }, - "write-file-atomic": { - "version": "2.3.0", - "bundled": true, - "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "signal-exit": "3.0.2" - }, - "dependencies": { - "signal-exit": { - "version": "3.0.2", - "bundled": true - } - } - } - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "2.0.1" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "nwmatcher": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz", - "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==", - "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "0.1.1", - "define-property": "0.2.5", - "kind-of": "3.2.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true } } } @@ -9412,7 +5557,7 @@ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.0" }, "dependencies": { "isobject": { @@ -9429,8 +5574,8 @@ "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", "dev": true, "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.11.0" + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" } }, "object.omit": { @@ -9439,8 +5584,8 @@ "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "dev": true, "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" } }, "object.pick": { @@ -9449,7 +5594,7 @@ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" }, "dependencies": { "isobject": { @@ -9466,7 +5611,7 @@ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "onetime": { @@ -9475,7 +5620,7 @@ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", "dev": true, "requires": { - "mimic-fn": "1.2.0" + "mimic-fn": "^1.0.0" } }, "optimist": { @@ -9484,8 +5629,8 @@ "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "dev": true, "requires": { - "minimist": "0.0.8", - "wordwrap": "0.0.3" + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" }, "dependencies": { "wordwrap": { @@ -9502,12 +5647,12 @@ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", "dev": true, "requires": { - "deep-is": "0.1.3", - "fast-levenshtein": "2.0.6", - "levn": "0.3.0", - "prelude-ls": "1.1.2", - "type-check": "0.3.2", - "wordwrap": "1.0.0" + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" } }, "os-homedir": { @@ -9522,9 +5667,9 @@ "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "dev": true, "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" } }, "os-tmpdir": { @@ -9539,9 +5684,9 @@ "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "mkdirp": "0.5.1", - "object-assign": "4.1.1" + "graceful-fs": "^4.1.4", + "mkdirp": "^0.5.1", + "object-assign": "^4.1.0" } }, "p-finally": { @@ -9556,7 +5701,7 @@ "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", "dev": true, "requires": { - "p-try": "1.0.0" + "p-try": "^1.0.0" } }, "p-locate": { @@ -9565,7 +5710,7 @@ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { - "p-limit": "1.2.0" + "p-limit": "^1.1.0" } }, "p-try": { @@ -9580,10 +5725,10 @@ "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", "dev": true, "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" } }, "parse-json": { @@ -9592,7 +5737,7 @@ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { - "error-ex": "1.3.1" + "error-ex": "^1.2.0" } }, "parse5": { @@ -9613,7 +5758,7 @@ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, "requires": { - "pinkie-promise": "2.0.1" + "pinkie-promise": "^2.0.0" } }, "path-is-absolute": { @@ -9646,7 +5791,7 @@ "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", "dev": true, "requires": { - "pify": "2.3.0" + "pify": "^2.0.0" } }, "performance-now": { @@ -9673,7 +5818,7 @@ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { - "pinkie": "2.0.4" + "pinkie": "^2.0.0" } }, "pkg-dir": { @@ -9682,7 +5827,7 @@ "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", "dev": true, "requires": { - "find-up": "1.1.2" + "find-up": "^1.0.0" } }, "pluralize": { @@ -9721,8 +5866,8 @@ "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", "dev": true, "requires": { - "ansi-regex": "3.0.0", - "ansi-styles": "3.2.1" + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" }, "dependencies": { "ansi-regex": { @@ -9737,7 +5882,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } } } @@ -9766,7 +5911,7 @@ "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "dev": true, "requires": { - "asap": "2.0.6" + "asap": "~2.0.3" } }, "prop-types": { @@ -9775,9 +5920,9 @@ "integrity": "sha512-4ec7bY1Y66LymSUOH/zARVYObB23AT2h8cf6e/O6ZALB/N0sqZFEx7rq6EYPX2MkOdKORuooI/H5k9TlR4q7kQ==", "dev": true, "requires": { - "fbjs": "0.8.16", - "loose-envify": "1.3.1", - "object-assign": "4.1.1" + "fbjs": "^0.8.16", + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" } }, "pseudomap": { @@ -9804,8 +5949,8 @@ "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", "dev": true, "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "dependencies": { "is-number": { @@ -9814,7 +5959,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -9823,7 +5968,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -9834,7 +5979,7 @@ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -9845,9 +5990,9 @@ "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", "dev": true, "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" } }, "read-pkg-up": { @@ -9856,8 +6001,8 @@ "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", "dev": true, "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" }, "dependencies": { "find-up": { @@ -9866,7 +6011,7 @@ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "locate-path": "2.0.0" + "locate-path": "^2.0.0" } } } @@ -9877,13 +6022,13 @@ "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" } }, "readdirp": { @@ -9893,10 +6038,10 @@ "dev": true, "optional": true, "requires": { - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "readable-stream": "2.3.5", - "set-immediate-shim": "1.0.1" + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "readable-stream": "^2.0.2", + "set-immediate-shim": "^1.0.1" } }, "realpath-native": { @@ -9905,7 +6050,7 @@ "integrity": "sha512-XJtlRJ9jf0E1H1SLeJyQ9PGzQD7S65h1pRXEcAeK48doKOnKxcgPeNohJvD5u/2sI9J1oke6E8bZHS/fmW1UiQ==", "dev": true, "requires": { - "util.promisify": "1.0.0" + "util.promisify": "^1.0.0" } }, "regenerate": { @@ -9926,9 +6071,9 @@ "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "private": "0.1.8" + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" } }, "regex-cache": { @@ -9937,7 +6082,7 @@ "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "dev": true, "requires": { - "is-equal-shallow": "0.1.3" + "is-equal-shallow": "^0.1.3" } }, "regex-not": { @@ -9946,8 +6091,8 @@ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, "requires": { - "extend-shallow": "3.0.2", - "safe-regex": "1.1.0" + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" } }, "regexpp": { @@ -9962,9 +6107,9 @@ "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", "dev": true, "requires": { - "regenerate": "1.3.3", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" } }, "regjsgen": { @@ -9979,7 +6124,7 @@ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", "dev": true, "requires": { - "jsesc": "0.5.0" + "jsesc": "~0.5.0" }, "dependencies": { "jsesc": { @@ -10014,7 +6159,7 @@ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "dev": true, "requires": { - "is-finite": "1.0.2" + "is-finite": "^1.0.0" } }, "request": { @@ -10023,28 +6168,28 @@ "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==", "dev": true, "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.6", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.3.2", - "har-validator": "5.0.3", - "hawk": "6.0.2", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.18", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.1", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.4", - "tunnel-agent": "0.6.0", - "uuid": "3.2.1" + "aws-sign2": "~0.7.0", + "aws4": "^1.6.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.1", + "forever-agent": "~0.6.1", + "form-data": "~2.3.1", + "har-validator": "~5.0.3", + "hawk": "~6.0.2", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.17", + "oauth-sign": "~0.8.2", + "performance-now": "^2.1.0", + "qs": "~6.5.1", + "safe-buffer": "^5.1.1", + "stringstream": "~0.0.5", + "tough-cookie": "~2.3.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.1.0" } }, "request-promise-core": { @@ -10053,7 +6198,7 @@ "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", "dev": true, "requires": { - "lodash": "4.17.5" + "lodash": "^4.13.1" } }, "request-promise-native": { @@ -10063,8 +6208,8 @@ "dev": true, "requires": { "request-promise-core": "1.1.1", - "stealthy-require": "1.1.1", - "tough-cookie": "2.3.4" + "stealthy-require": "^1.1.0", + "tough-cookie": ">=2.3.3" } }, "require-directory": { @@ -10085,8 +6230,8 @@ "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", "dev": true, "requires": { - "caller-path": "0.1.0", - "resolve-from": "1.0.1" + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" } }, "resolve": { @@ -10095,7 +6240,7 @@ "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", "dev": true, "requires": { - "path-parse": "1.0.5" + "path-parse": "^1.0.5" } }, "resolve-cwd": { @@ -10104,7 +6249,7 @@ "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", "dev": true, "requires": { - "resolve-from": "3.0.0" + "resolve-from": "^3.0.0" }, "dependencies": { "resolve-from": { @@ -10133,8 +6278,8 @@ "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", "dev": true, "requires": { - "onetime": "2.0.1", - "signal-exit": "3.0.2" + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" } }, "ret": { @@ -10150,7 +6295,7 @@ "dev": true, "optional": true, "requires": { - "align-text": "0.1.4" + "align-text": "^0.1.1" } }, "rimraf": { @@ -10159,7 +6304,7 @@ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "dev": true, "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" } }, "run-async": { @@ -10168,7 +6313,7 @@ "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", "dev": true, "requires": { - "is-promise": "2.1.0" + "is-promise": "^2.1.0" } }, "rx-lite": { @@ -10183,7 +6328,7 @@ "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", "dev": true, "requires": { - "rx-lite": "4.0.8" + "rx-lite": "*" } }, "safe-buffer": { @@ -10198,7 +6343,7 @@ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { - "ret": "0.1.15" + "ret": "~0.1.10" } }, "sane": { @@ -10207,14 +6352,14 @@ "integrity": "sha512-glfKd7YH4UCrh/7dD+UESsr8ylKWRE7UQPoXuz28FgmcF0ViJQhCTCCZHICRKxf8G8O1KdLEn20dcICK54c7ew==", "dev": true, "requires": { - "anymatch": "2.0.0", - "exec-sh": "0.2.1", - "fb-watchman": "2.0.0", - "fsevents": "1.1.3", - "micromatch": "3.1.10", - "minimist": "1.2.0", - "walker": "1.0.7", - "watch": "0.18.0" + "anymatch": "^2.0.0", + "exec-sh": "^0.2.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.1.1", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5", + "watch": "~0.18.0" }, "dependencies": { "anymatch": { @@ -10223,8 +6368,8 @@ "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { - "micromatch": "3.1.10", - "normalize-path": "2.1.1" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" } }, "arr-diff": { @@ -10245,18 +6390,18 @@ "integrity": "sha512-SO5lYHA3vO6gz66erVvedSCkp7AKWdv6VcQ2N4ysXfPxdAlxAMMAdwegGGcv1Bqwm7naF1hNdk5d6AAIEHV2nQ==", "dev": true, "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "define-property": "1.0.0", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "kind-of": "6.0.2", - "repeat-element": "1.1.2", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "kind-of": "^6.0.2", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -10265,7 +6410,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "extend-shallow": { @@ -10274,7 +6419,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -10285,13 +6430,13 @@ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -10300,7 +6445,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -10309,7 +6454,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "is-descriptor": { @@ -10318,9 +6463,9 @@ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" } }, "kind-of": { @@ -10337,14 +6482,14 @@ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -10353,7 +6498,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "extend-shallow": { @@ -10362,7 +6507,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -10373,10 +6518,10 @@ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "dependencies": { "extend-shallow": { @@ -10385,7 +6530,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -10396,7 +6541,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -10405,7 +6550,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -10416,7 +6561,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -10425,7 +6570,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -10436,7 +6581,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -10445,7 +6590,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -10468,19 +6613,19 @@ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.1", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.9", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" } }, "minimist": { @@ -10522,10 +6667,10 @@ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "split-string": "3.1.0" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" }, "dependencies": { "extend-shallow": { @@ -10534,7 +6679,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -10551,7 +6696,7 @@ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { - "shebang-regex": "1.0.0" + "shebang-regex": "^1.0.0" } }, "shebang-regex": { @@ -10584,7 +6729,7 @@ "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0" + "is-fullwidth-code-point": "^2.0.0" } }, "snapdragon": { @@ -10593,14 +6738,14 @@ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "dev": true, "requires": { - "base": "0.11.2", - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "map-cache": "0.2.2", - "source-map": "0.5.7", - "source-map-resolve": "0.5.1", - "use": "3.1.0" + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" }, "dependencies": { "define-property": { @@ -10609,7 +6754,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -10618,7 +6763,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "is-accessor-descriptor": { @@ -10627,7 +6772,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -10636,7 +6781,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -10647,7 +6792,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -10656,7 +6801,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -10667,9 +6812,9 @@ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" } }, "kind-of": { @@ -10686,9 +6831,9 @@ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, "requires": { - "define-property": "1.0.0", - "isobject": "3.0.1", - "snapdragon-util": "3.0.1" + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" }, "dependencies": { "define-property": { @@ -10697,7 +6842,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "isobject": { @@ -10714,7 +6859,7 @@ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.2.0" } }, "sntp": { @@ -10723,7 +6868,7 @@ "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", "dev": true, "requires": { - "hoek": "4.2.1" + "hoek": "4.x.x" } }, "source-map": { @@ -10738,11 +6883,11 @@ "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", "dev": true, "requires": { - "atob": "2.0.3", - "decode-uri-component": "0.2.0", - "resolve-url": "0.2.1", - "source-map-url": "0.4.0", - "urix": "0.1.0" + "atob": "^2.0.0", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" } }, "source-map-support": { @@ -10751,7 +6896,7 @@ "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "dev": true, "requires": { - "source-map": "0.5.7" + "source-map": "^0.5.6" } }, "source-map-url": { @@ -10766,8 +6911,8 @@ "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", "dev": true, "requires": { - "spdx-expression-parse": "3.0.0", - "spdx-license-ids": "3.0.0" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { @@ -10782,8 +6927,8 @@ "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "dev": true, "requires": { - "spdx-exceptions": "2.1.0", - "spdx-license-ids": "3.0.0" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, "spdx-license-ids": { @@ -10798,7 +6943,7 @@ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, "requires": { - "extend-shallow": "3.0.2" + "extend-shallow": "^3.0.0" } }, "sprintf-js": { @@ -10813,14 +6958,14 @@ "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", "dev": true, "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" } }, "stack-utils": { @@ -10835,8 +6980,8 @@ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, "requires": { - "define-property": "0.2.5", - "object-copy": "0.1.0" + "define-property": "^0.2.5", + "object-copy": "^0.1.0" }, "dependencies": { "define-property": { @@ -10845,7 +6990,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "is-accessor-descriptor": { @@ -10854,7 +6999,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -10863,7 +7008,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -10874,7 +7019,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -10883,7 +7028,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -10894,9 +7039,9 @@ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" } }, "kind-of": { @@ -10919,8 +7064,8 @@ "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", "dev": true, "requires": { - "astral-regex": "1.0.0", - "strip-ansi": "4.0.0" + "astral-regex": "^1.0.0", + "strip-ansi": "^4.0.0" }, "dependencies": { "ansi-regex": { @@ -10935,7 +7080,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -10946,8 +7091,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" }, "dependencies": { "ansi-regex": { @@ -10962,7 +7107,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -10973,7 +7118,7 @@ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } }, "stringstream": { @@ -10988,7 +7133,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-bom": { @@ -11027,12 +7172,12 @@ "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", "dev": true, "requires": { - "ajv": "5.5.2", - "ajv-keywords": "2.1.1", - "chalk": "2.3.2", - "lodash": "4.17.5", + "ajv": "^5.2.3", + "ajv-keywords": "^2.1.0", + "chalk": "^2.1.0", + "lodash": "^4.17.4", "slice-ansi": "1.0.0", - "string-width": "2.1.1" + "string-width": "^2.1.1" }, "dependencies": { "ansi-styles": { @@ -11041,7 +7186,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -11050,9 +7195,9 @@ "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.3.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "supports-color": { @@ -11061,7 +7206,7 @@ "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -11072,11 +7217,11 @@ "integrity": "sha512-qpqlP/8Zl+sosLxBcVKl9vYy26T9NPalxSzzCP/OY6K7j938ui2oKgo+kRZYfxAeIpLqpbVnsHq1tyV70E4lWQ==", "dev": true, "requires": { - "arrify": "1.0.1", - "micromatch": "3.1.10", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "require-main-filename": "1.0.1" + "arrify": "^1.0.1", + "micromatch": "^3.1.8", + "object-assign": "^4.1.0", + "read-pkg-up": "^1.0.1", + "require-main-filename": "^1.0.1" }, "dependencies": { "arr-diff": { @@ -11097,18 +7242,18 @@ "integrity": "sha512-SO5lYHA3vO6gz66erVvedSCkp7AKWdv6VcQ2N4ysXfPxdAlxAMMAdwegGGcv1Bqwm7naF1hNdk5d6AAIEHV2nQ==", "dev": true, "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "define-property": "1.0.0", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "kind-of": "6.0.2", - "repeat-element": "1.1.2", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "kind-of": "^6.0.2", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -11117,7 +7262,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "extend-shallow": { @@ -11126,7 +7271,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -11137,13 +7282,13 @@ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -11152,7 +7297,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -11161,7 +7306,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "is-descriptor": { @@ -11170,9 +7315,9 @@ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" } }, "kind-of": { @@ -11189,14 +7334,14 @@ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -11205,7 +7350,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "extend-shallow": { @@ -11214,7 +7359,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -11225,10 +7370,10 @@ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "dependencies": { "extend-shallow": { @@ -11237,7 +7382,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -11248,7 +7393,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -11257,7 +7402,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -11268,7 +7413,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -11277,7 +7422,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -11288,7 +7433,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -11297,7 +7442,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -11320,11 +7465,11 @@ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" } }, "micromatch": { @@ -11333,19 +7478,19 @@ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.1", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.9", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" } }, "path-type": { @@ -11354,9 +7499,9 @@ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "read-pkg": { @@ -11365,9 +7510,9 @@ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "dev": true, "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" } }, "read-pkg-up": { @@ -11376,8 +7521,8 @@ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "dev": true, "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" } }, "strip-bom": { @@ -11386,7 +7531,7 @@ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { - "is-utf8": "0.2.1" + "is-utf8": "^0.2.0" } } } @@ -11415,7 +7560,7 @@ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "requires": { - "os-tmpdir": "1.0.2" + "os-tmpdir": "~1.0.2" } }, "tmpl": { @@ -11436,7 +7581,7 @@ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "to-regex": { @@ -11445,10 +7590,10 @@ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "dev": true, "requires": { - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "regex-not": "1.0.2", - "safe-regex": "1.1.0" + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" } }, "to-regex-range": { @@ -11457,8 +7602,8 @@ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "requires": { - "is-number": "3.0.0", - "repeat-string": "1.6.1" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" }, "dependencies": { "is-number": { @@ -11467,7 +7612,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } } } @@ -11478,7 +7623,7 @@ "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "dev": true, "requires": { - "punycode": "1.4.1" + "punycode": "^1.4.1" } }, "tr46": { @@ -11487,7 +7632,7 @@ "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", "dev": true, "requires": { - "punycode": "2.1.0" + "punycode": "^2.1.0" }, "dependencies": { "punycode": { @@ -11510,7 +7655,7 @@ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "^5.0.1" } }, "tweetnacl": { @@ -11526,7 +7671,7 @@ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, "requires": { - "prelude-ls": "1.1.2" + "prelude-ls": "~1.1.2" } }, "typedarray": { @@ -11548,9 +7693,9 @@ "dev": true, "optional": true, "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" }, "dependencies": { "yargs": { @@ -11560,9 +7705,9 @@ "dev": true, "optional": true, "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", "window-size": "0.1.0" } } @@ -11581,10 +7726,10 @@ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", "dev": true, "requires": { - "arr-union": "3.1.0", - "get-value": "2.0.6", - "is-extendable": "0.1.1", - "set-value": "0.4.3" + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" }, "dependencies": { "extend-shallow": { @@ -11593,7 +7738,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "set-value": { @@ -11602,10 +7747,10 @@ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "to-object-path": "0.3.0" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" } } } @@ -11616,8 +7761,8 @@ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dev": true, "requires": { - "has-value": "0.3.1", - "isobject": "3.0.1" + "has-value": "^0.3.1", + "isobject": "^3.0.0" }, "dependencies": { "has-value": { @@ -11626,9 +7771,9 @@ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "dev": true, "requires": { - "get-value": "2.0.6", - "has-values": "0.1.4", - "isobject": "2.1.0" + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" }, "dependencies": { "isobject": { @@ -11674,7 +7819,7 @@ "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.2" }, "dependencies": { "kind-of": { @@ -11703,8 +7848,8 @@ "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", "dev": true, "requires": { - "define-properties": "1.1.2", - "object.getownpropertydescriptors": "2.0.3" + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" } }, "uuid": { @@ -11719,7 +7864,7 @@ "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", "dev": true, "requires": { - "user-home": "1.1.1" + "user-home": "^1.1.1" } }, "validate-npm-package-license": { @@ -11728,8 +7873,8 @@ "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", "dev": true, "requires": { - "spdx-correct": "3.0.0", - "spdx-expression-parse": "3.0.0" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, "verror": { @@ -11738,9 +7883,9 @@ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "dev": true, "requires": { - "assert-plus": "1.0.0", + "assert-plus": "^1.0.0", "core-util-is": "1.0.2", - "extsprintf": "1.3.0" + "extsprintf": "^1.2.0" } }, "w3c-hr-time": { @@ -11749,7 +7894,7 @@ "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", "dev": true, "requires": { - "browser-process-hrtime": "0.1.2" + "browser-process-hrtime": "^0.1.2" } }, "walker": { @@ -11758,7 +7903,7 @@ "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", "dev": true, "requires": { - "makeerror": "1.0.11" + "makeerror": "1.0.x" } }, "watch": { @@ -11767,8 +7912,8 @@ "integrity": "sha1-KAlUdsbffJDJYxOJkMClQj60uYY=", "dev": true, "requires": { - "exec-sh": "0.2.1", - "minimist": "1.2.0" + "exec-sh": "^0.2.0", + "minimist": "^1.2.0" }, "dependencies": { "minimist": { @@ -11806,9 +7951,9 @@ "integrity": "sha512-Z0CVh/YE217Foyb488eo+iBv+r7eAQ0wSTyApi9n06jhcA3z6Nidg/EGvl0UFkg7kMdKxfBzzr+o9JF+cevgMg==", "dev": true, "requires": { - "lodash.sortby": "4.7.0", - "tr46": "1.0.1", - "webidl-conversions": "4.0.2" + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.0", + "webidl-conversions": "^4.0.1" } }, "which": { @@ -11817,7 +7962,7 @@ "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", "dev": true, "requires": { - "isexe": "2.0.0" + "isexe": "^2.0.0" } }, "which-module": { @@ -11845,8 +7990,8 @@ "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" }, "dependencies": { "is-fullwidth-code-point": { @@ -11855,7 +8000,7 @@ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "string-width": { @@ -11864,9 +8009,9 @@ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } } } @@ -11883,7 +8028,7 @@ "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", "dev": true, "requires": { - "mkdirp": "0.5.1" + "mkdirp": "^0.5.1" } }, "write-file-atomic": { @@ -11892,9 +8037,9 @@ "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "signal-exit": "3.0.2" + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" } }, "ws": { @@ -11903,8 +8048,8 @@ "integrity": "sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==", "dev": true, "requires": { - "async-limiter": "1.0.0", - "safe-buffer": "5.1.1" + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0" } }, "xml-name-validator": { @@ -11931,18 +8076,18 @@ "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", "dev": true, "requires": { - "cliui": "4.0.0", - "decamelize": "1.2.0", - "find-up": "2.1.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "8.1.0" + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^8.1.0" }, "dependencies": { "ansi-regex": { @@ -11957,9 +8102,9 @@ "integrity": "sha512-nY3W5Gu2racvdDk//ELReY+dHjb9PlIcVDFXP72nVIhq2Gy3LuVXYwJoPVudwQnv1shtohpgkdCKT2YaKY0CKw==", "dev": true, "requires": { - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "wrap-ansi": "2.1.0" + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" } }, "find-up": { @@ -11968,7 +8113,7 @@ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "locate-path": "2.0.0" + "locate-path": "^2.0.0" } }, "strip-ansi": { @@ -11977,7 +8122,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -11988,7 +8133,7 @@ "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", "dev": true, "requires": { - "camelcase": "4.1.0" + "camelcase": "^4.1.0" }, "dependencies": { "camelcase": { diff --git a/package.json b/package.json index 48a871910..6a99788d8 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,10 @@ "type": "git", "url": "git+https://github.com/trekhleb/javascript-algorithms.git" }, + "pre-commit": [ + "lint", + "test" + ], "keywords": [ "computer-science", "cs", @@ -41,7 +45,5 @@ "eslint-plugin-react": "^7.7.0", "jest": "^22.4.3" }, - "dependencies": { - "npm": "^5.8.0" - } + "dependencies": {} } From 5d9aa65d1592cd66c1062deb393d6911a890dac9 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Fri, 27 Apr 2018 08:55:54 +0300 Subject: [PATCH 216/327] Update packages. --- package.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/package.json b/package.json index 6a99788d8..5a543c62b 100644 --- a/package.json +++ b/package.json @@ -13,10 +13,6 @@ "type": "git", "url": "git+https://github.com/trekhleb/javascript-algorithms.git" }, - "pre-commit": [ - "lint", - "test" - ], "keywords": [ "computer-science", "cs", From 92bb8d242cf4e85492c0a76736108a9a104f64cf Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Fri, 27 Apr 2018 09:03:12 +0300 Subject: [PATCH 217/327] Update packages. --- package-lock.json | 38 ++++++++++++++++++++++++++++++++++++++ package.json | 7 ++++++- 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 703a8d237..3a7c2eb05 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5672,6 +5672,12 @@ "mem": "^1.1.0" } }, + "os-shim": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz", + "integrity": "sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc=", + "dev": true + }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -5848,6 +5854,28 @@ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", "dev": true }, + "pre-commit": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/pre-commit/-/pre-commit-1.2.2.tgz", + "integrity": "sha1-287g7p3nI15X95xW186UZBpp7sY=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "spawn-sync": "^1.0.15", + "which": "1.2.x" + }, + "dependencies": { + "which": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", + "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -6905,6 +6933,16 @@ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, + "spawn-sync": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz", + "integrity": "sha1-sAeZVX63+wyDdsKdROih6mfldHY=", + "dev": true, + "requires": { + "concat-stream": "^1.4.7", + "os-shim": "^0.1.2" + } + }, "spdx-correct": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", diff --git a/package.json b/package.json index 5a543c62b..fb8fd1e55 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,10 @@ "ci": "npm run lint && npm run test -- --coverage", "codecov": "codecov" }, + "pre-commit": [ + "lint", + "test" + ], "repository": { "type": "git", "url": "git+https://github.com/trekhleb/javascript-algorithms.git" @@ -39,7 +43,8 @@ "eslint-plugin-jest": "^21.15.1", "eslint-plugin-jsx-a11y": "^6.0.3", "eslint-plugin-react": "^7.7.0", - "jest": "^22.4.3" + "jest": "^22.4.3", + "pre-commit": "^1.2.2" }, "dependencies": {} } From f32dae5879df2e77ff371924b8f7e6a71ec0a5af Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Fri, 27 Apr 2018 09:04:45 +0300 Subject: [PATCH 218/327] Update packages. --- .../__test__/longestCommonSubsequnce.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/algorithms/sets/longest-common-subsequnce/__test__/longestCommonSubsequnce.test.js b/src/algorithms/sets/longest-common-subsequnce/__test__/longestCommonSubsequnce.test.js index 01d84cabb..850b07e5c 100644 --- a/src/algorithms/sets/longest-common-subsequnce/__test__/longestCommonSubsequnce.test.js +++ b/src/algorithms/sets/longest-common-subsequnce/__test__/longestCommonSubsequnce.test.js @@ -6,7 +6,7 @@ describe('longestCommonSubsequnce', () => { expect(longestCommonSubsequnce([''], ['A', 'B', 'C'])).toEqual(['']); - expect(longestCommonSubsequnce(['A', 'B', 'C'], [''])).toEqual(['']); + expect(longestCommonSubsequnce(['A', 'B', 'C'], ['c'])).toEqual(['']); expect(longestCommonSubsequnce( ['A', 'B', 'C'], From bfebbf0cd4236a8ba6b364e42aacac33da6b32d5 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Fri, 27 Apr 2018 09:05:35 +0300 Subject: [PATCH 219/327] Update packages. --- .../__test__/longestCommonSubsequnce.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/algorithms/sets/longest-common-subsequnce/__test__/longestCommonSubsequnce.test.js b/src/algorithms/sets/longest-common-subsequnce/__test__/longestCommonSubsequnce.test.js index 850b07e5c..01d84cabb 100644 --- a/src/algorithms/sets/longest-common-subsequnce/__test__/longestCommonSubsequnce.test.js +++ b/src/algorithms/sets/longest-common-subsequnce/__test__/longestCommonSubsequnce.test.js @@ -6,7 +6,7 @@ describe('longestCommonSubsequnce', () => { expect(longestCommonSubsequnce([''], ['A', 'B', 'C'])).toEqual(['']); - expect(longestCommonSubsequnce(['A', 'B', 'C'], ['c'])).toEqual(['']); + expect(longestCommonSubsequnce(['A', 'B', 'C'], [''])).toEqual(['']); expect(longestCommonSubsequnce( ['A', 'B', 'C'], From 7526a70e759f01b4c816e61b17e44141560e2f44 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Fri, 27 Apr 2018 16:50:12 +0300 Subject: [PATCH 220/327] Create CODE_OF_CONDUCT.md --- CODE_OF_CONDUCT.md | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 CODE_OF_CONDUCT.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 000000000..f809c8b0f --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,40 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ From 07759d5b2910d002a35877546abaf7c5f5ef6849 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Fri, 27 Apr 2018 16:55:01 +0300 Subject: [PATCH 221/327] Create CONTRIBUTING.md --- CONTRIBUTING.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..e6cdc89d0 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,4 @@ +## Contributing + +As much as possible, try to follow the existing format of markdown and code. +Don't forget to run `npm run lint` and `npm test` before submitting pull requests. From b52e3e8ccd23cf733ca2a7bfb59a220a35e2740b Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Fri, 27 Apr 2018 16:57:53 +0300 Subject: [PATCH 222/327] Update docs. --- CONTRIBUTING.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e6cdc89d0..4eb24b03e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,4 +1,5 @@ ## Contributing -As much as possible, try to follow the existing format of markdown and code. -Don't forget to run `npm run lint` and `npm test` before submitting pull requests. +- As much as possible, try to follow the existing format of markdown and code. +- Don't forget to run `npm run lint` and `npm test` before submitting pull requests. +- Make sure that **100%** of your code is covered by tests. From c497ee7a2fa632fd127617b109a23a3d96a20519 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Fri, 27 Apr 2018 17:12:06 +0300 Subject: [PATCH 223/327] Update versions. --- package-lock.json | 1642 +++++++++++++++++---------------------------- 1 file changed, 607 insertions(+), 1035 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3a7c2eb05..12661d48b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,18 +5,18 @@ "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.0.0-beta.42", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.42.tgz", - "integrity": "sha512-L8i94FLSyaLQpRfDo/qqSm8Ndb44zMtXParXo0MebJICG1zoCCL4+GkzUOlB4BNTRSXXQdb3feam/qw7bKPipQ==", + "version": "7.0.0-beta.46", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.46.tgz", + "integrity": "sha512-7BKRkmYaPZm3Yff5HGZJKCz7RqZ5jUjknsXT6Gz5YKG23J3uq9hAj0epncCB0rlqmnZ8Q+UUpQB2tCR5mT37vw==", "dev": true, "requires": { - "@babel/highlight": "7.0.0-beta.42" + "@babel/highlight": "7.0.0-beta.46" } }, "@babel/highlight": { - "version": "7.0.0-beta.42", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.42.tgz", - "integrity": "sha512-X3Ur/A/lIbbP8W0pmwgqtDXIxhQmxPaiwY9SKP7kF9wvZfjZRwMvbJE92ozUhF3UDK3DCKaV7oGqmI1rP/zqWA==", + "version": "7.0.0-beta.46", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.46.tgz", + "integrity": "sha512-r4snW6Q8ICL3Y8hGzYJRvyG/+sc+kvkewXNedG9tQjoHmUFMwMSv/o45GWQUQswevGnWghiGkpRPivFfOuMsOA==", "dev": true, "requires": { "chalk": "^2.0.0", @@ -34,9 +34,9 @@ } }, "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -45,9 +45,9 @@ } }, "supports-color": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -326,9 +326,9 @@ "dev": true }, "atob": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.0.3.tgz", - "integrity": "sha1-GcenYEc3dEaPILLS0DNyrX1Mv10=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.0.tgz", + "integrity": "sha512-SuiKH8vbsOyCALjA/+EINmt/Kdl+TQPrtFgW7XZZcwtryFu9e5kQoX3bjCW6mIvGH1fbeAZZuvwGR5IlBRznGw==", "dev": true }, "aws-sign2": { @@ -338,9 +338,9 @@ "dev": true }, "aws4": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", + "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==", "dev": true }, "axobject-query": { @@ -387,9 +387,9 @@ } }, "babel-core": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", - "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", "dev": true, "requires": { "babel-code-frame": "^6.26.0", @@ -402,15 +402,15 @@ "babel-traverse": "^6.26.0", "babel-types": "^6.26.0", "babylon": "^6.18.0", - "convert-source-map": "^1.5.0", - "debug": "^2.6.8", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", "json5": "^0.5.1", "lodash": "^4.17.4", "minimatch": "^3.0.4", "path-is-absolute": "^1.0.1", - "private": "^0.1.7", + "private": "^0.1.8", "slash": "^1.0.0", - "source-map": "^0.5.6" + "source-map": "^0.5.7" } }, "babel-generator": { @@ -595,14 +595,15 @@ } }, "babel-plugin-istanbul": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.5.tgz", - "integrity": "sha1-Z2DN2Xf0EdPhdbsGTyvDJ9mbK24=", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", + "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==", "dev": true, "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.13.0", "find-up": "^2.1.0", - "istanbul-lib-instrument": "^1.7.5", - "test-exclude": "^4.1.1" + "istanbul-lib-instrument": "^1.10.1", + "test-exclude": "^4.2.1" }, "dependencies": { "find-up": { @@ -775,9 +776,9 @@ } }, "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", - "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", "dev": true, "requires": { "babel-plugin-transform-strict-mode": "^6.24.1", @@ -1091,11 +1092,46 @@ "is-descriptor": "^1.0.0" } }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true } } }, @@ -1248,9 +1284,9 @@ "optional": true }, "caniuse-lite": { - "version": "1.0.30000820", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000820.tgz", - "integrity": "sha512-E0dpVjnt1XTNmWlGgdiae/tOF0jrJ/s+dOnwk8PLmPdu5uSu8wTLJhhbhcgUWU4aO9Iy5yUMZYxT60JS259sbQ==", + "version": "1.0.30000830", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000830.tgz", + "integrity": "sha512-yMqGkujkoOIZfvOYiWdqPALgY/PVGiqCHUJb6yNq7xhI/pR+gQO0U2K6lRDqAiJv4+CIU3CtTLblNGw0QGnr6g==", "dev": true }, "caseless": { @@ -1340,68 +1376,11 @@ "is-descriptor": "^0.1.0" } }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true } } }, @@ -1540,12 +1519,6 @@ "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", "dev": true }, - "content-type-parser": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.2.tgz", - "integrity": "sha512-lM4l4CnMEwOLHAHr/P6MEZwZFPJFtAAKgL6pogbXmVZggIqXhdB6RbBtPOTsw2FcXwYhehRGERJmRrjOiIB8pQ==", - "dev": true - }, "convert-source-map": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", @@ -1559,9 +1532,9 @@ "dev": true }, "core-js": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", - "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=", + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz", + "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=", "dev": true }, "core-util-is": { @@ -1631,6 +1604,17 @@ "assert-plus": "^1.0.0" } }, + "data-urls": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.0.0.tgz", + "integrity": "sha512-ai40PPQR0Fn1lD2PPie79CibnlMN2AYiDhwFX/rZHVsxbs5kNJSjegqXIprhouGXlRdEnfybva7kqRGnB6mypA==", + "dev": true, + "requires": { + "abab": "^1.0.4", + "whatwg-mimetype": "^2.0.0", + "whatwg-url": "^6.4.0" + } + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -1698,11 +1682,46 @@ "isobject": "^3.0.1" }, "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true } } }, @@ -1777,9 +1796,9 @@ } }, "electron-to-chromium": { - "version": "1.3.40", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.40.tgz", - "integrity": "sha1-H71tl779crim+SHcONIkE9L2/d8=", + "version": "1.3.44", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.44.tgz", + "integrity": "sha1-72sVCmDVIwgjiMra2ICF7NL9RoQ=", "dev": true }, "emoji-regex": { @@ -1926,9 +1945,9 @@ } }, "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -1946,9 +1965,9 @@ } }, "globals": { - "version": "11.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.4.0.tgz", - "integrity": "sha512-Dyzmifil8n/TmSqYDEXbm+C8yitzJQqQIlJQLNRMwa+BOUJpRC19pyVeN12JAjt61xonvXjtff+hJruTRXn5HA==", + "version": "11.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.5.0.tgz", + "integrity": "sha512-hYyf+kI8dm3nORsiiXUQigOU62hDLfJ9G01uyGMxhc6BKsircrUhC4uJPQPUSuq2GrTmiiEt7ewxlMdBewfmKQ==", "dev": true }, "strip-ansi": { @@ -1961,9 +1980,9 @@ } }, "supports-color": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -2111,9 +2130,9 @@ "dev": true }, "esquery": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", - "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", "dev": true, "requires": { "estraverse": "^4.0.0" @@ -2241,9 +2260,9 @@ } }, "external-editor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", - "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", "dev": true, "requires": { "chardet": "^0.4.0", @@ -2446,39 +2465,29 @@ "dev": true }, "fsevents": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", - "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.2.tgz", + "integrity": "sha512-iownA+hC4uHFp+7gwP/y5SzaiUo7m2vpa0dhpzw8YuKtiZsz7cIXsFbXpLEeBM6WuCQyw1MH4RRe6XI8GFUctQ==", "dev": true, "optional": true, "requires": { - "nan": "^2.3.0", - "node-pre-gyp": "^0.6.39" + "nan": "^2.9.2", + "node-pre-gyp": "^0.9.0" }, "dependencies": { "abbrev": { - "version": "1.1.0", + "version": "1.1.1", "bundled": true, "dev": true, "optional": true }, - "ajv": { - "version": "4.11.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "co": "^4.6.0", - "json-stable-stringify": "^1.0.1" - } - }, "ansi-regex": { "version": "2.1.1", "bundled": true, "dev": true }, "aproba": { - "version": "1.1.1", + "version": "1.2.0", "bundled": true, "dev": true, "optional": true @@ -2493,88 +2502,22 @@ "readable-stream": "^2.0.6" } }, - "asn1": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, - "assert-plus": { - "version": "0.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws-sign2": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws4": { - "version": "1.6.0", - "bundled": true, - "dev": true, - "optional": true - }, "balanced-match": { - "version": "0.4.2", + "version": "1.0.0", "bundled": true, "dev": true }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "block-stream": { - "version": "0.0.9", - "bundled": true, - "dev": true, - "requires": { - "inherits": "~2.0.0" - } - }, - "boom": { - "version": "2.10.1", - "bundled": true, - "dev": true, - "requires": { - "hoek": "2.x.x" - } - }, "brace-expansion": { - "version": "1.1.7", + "version": "1.1.11", "bundled": true, "dev": true, "requires": { - "balanced-match": "^0.4.1", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "buffer-shims": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "caseless": { - "version": "0.12.0", - "bundled": true, - "dev": true, - "optional": true - }, - "co": { - "version": "4.6.0", + "chownr": { + "version": "1.0.1", "bundled": true, "dev": true, "optional": true @@ -2584,14 +2527,6 @@ "bundled": true, "dev": true }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, "concat-map": { "version": "0.0.1", "bundled": true, @@ -2605,35 +2540,11 @@ "core-util-is": { "version": "1.0.2", "bundled": true, - "dev": true - }, - "cryptiles": { - "version": "2.0.5", - "bundled": true, - "dev": true, - "requires": { - "boom": "2.x.x" - } - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, "dev": true, - "optional": true, - "requires": { - "assert-plus": "^1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } + "optional": true }, "debug": { - "version": "2.6.8", + "version": "2.6.9", "bundled": true, "dev": true, "optional": true, @@ -2647,11 +2558,6 @@ "dev": true, "optional": true }, - "delayed-stream": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, "delegates": { "version": "1.0.0", "bundled": true, @@ -2659,179 +2565,85 @@ "optional": true }, "detect-libc": { - "version": "1.0.2", + "version": "1.0.3", "bundled": true, "dev": true, "optional": true }, - "ecc-jsbn": { - "version": "0.1.1", + "fs-minipass": { + "version": "1.2.5", "bundled": true, "dev": true, "optional": true, "requires": { - "jsbn": "~0.1.0" + "minipass": "^2.2.1" } }, - "extend": { - "version": "3.0.1", + "fs.realpath": { + "version": "1.0.0", "bundled": true, "dev": true, "optional": true }, - "extsprintf": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "forever-agent": { - "version": "0.6.1", + "gauge": { + "version": "2.7.4", "bundled": true, "dev": true, - "optional": true + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } }, - "form-data": { - "version": "2.1.4", + "glob": { + "version": "7.1.2", "bundled": true, "dev": true, "optional": true, "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.5", - "mime-types": "^2.1.12" + "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" } }, - "fs.realpath": { - "version": "1.0.0", + "has-unicode": { + "version": "2.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, - "fstream": { - "version": "1.0.11", + "iconv-lite": { + "version": "0.4.21", "bundled": true, "dev": true, + "optional": true, "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" + "safer-buffer": "^2.1.0" } }, - "fstream-ignore": { - "version": "1.0.5", + "ignore-walk": { + "version": "3.0.1", "bundled": true, "dev": true, "optional": true, "requires": { - "fstream": "^1.0.0", - "inherits": "2", - "minimatch": "^3.0.0" + "minimatch": "^3.0.4" } }, - "gauge": { - "version": "2.7.4", + "inflight": { + "version": "1.0.6", "bundled": true, "dev": true, "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "^1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true, - "dev": true - }, - "har-schema": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "optional": true - }, - "har-validator": { - "version": "4.2.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ajv": "^4.9.1", - "har-schema": "^1.0.5" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "hawk": { - "version": "3.1.3", - "bundled": true, - "dev": true, - "requires": { - "boom": "2.x.x", - "cryptiles": "2.x.x", - "hoek": "2.x.x", - "sntp": "1.x.x" - } - }, - "hoek": { - "version": "2.16.3", - "bundled": true, - "dev": true - }, - "http-signature": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "^0.2.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -2843,7 +2655,7 @@ "dev": true }, "ini": { - "version": "1.3.4", + "version": "1.3.5", "bundled": true, "dev": true, "optional": true @@ -2856,111 +2668,43 @@ "number-is-nan": "^1.0.0" } }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, "isarray": { "version": "1.0.0", "bundled": true, - "dev": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "jodid25519": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsbn": "~0.1.0" - } - }, - "jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsonify": "~0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "jsonify": { - "version": "0.0.0", - "bundled": true, "dev": true, "optional": true }, - "jsprim": { - "version": "1.4.0", + "minimatch": { + "version": "3.0.4", "bundled": true, "dev": true, - "optional": true, "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.0.2", - "json-schema": "0.2.3", - "verror": "1.3.6" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } + "brace-expansion": "^1.1.7" } }, - "mime-db": { - "version": "1.27.0", + "minimist": { + "version": "0.0.8", "bundled": true, "dev": true }, - "mime-types": { - "version": "2.1.15", + "minipass": { + "version": "2.2.4", "bundled": true, "dev": true, "requires": { - "mime-db": "~1.27.0" + "safe-buffer": "^5.1.1", + "yallist": "^3.0.0" } }, - "minimatch": { - "version": "3.0.4", + "minizlib": { + "version": "1.1.0", "bundled": true, "dev": true, + "optional": true, "requires": { - "brace-expansion": "^1.1.7" + "minipass": "^2.2.1" } }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, "mkdirp": { "version": "0.5.1", "bundled": true, @@ -2975,23 +2719,33 @@ "dev": true, "optional": true }, + "needle": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, "node-pre-gyp": { - "version": "0.6.39", + "version": "0.9.1", "bundled": true, "dev": true, "optional": true, "requires": { "detect-libc": "^1.0.2", - "hawk": "3.1.3", "mkdirp": "^0.5.1", + "needle": "^2.2.0", "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", "npmlog": "^4.0.2", "rc": "^1.1.7", - "request": "2.81.0", "rimraf": "^2.6.1", "semver": "^5.3.0", - "tar": "^2.2.1", - "tar-pack": "^3.4.0" + "tar": "^4" } }, "nopt": { @@ -3004,8 +2758,24 @@ "osenv": "^0.1.4" } }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, "npmlog": { - "version": "4.1.0", + "version": "4.1.2", "bundled": true, "dev": true, "optional": true, @@ -3021,12 +2791,6 @@ "bundled": true, "dev": true }, - "oauth-sign": { - "version": "0.8.2", - "bundled": true, - "dev": true, - "optional": true - }, "object-assign": { "version": "4.1.1", "bundled": true, @@ -3054,7 +2818,7 @@ "optional": true }, "osenv": { - "version": "0.1.4", + "version": "0.1.5", "bundled": true, "dev": true, "optional": true, @@ -3066,33 +2830,17 @@ "path-is-absolute": { "version": "1.0.1", "bundled": true, - "dev": true - }, - "performance-now": { - "version": "0.2.0", - "bundled": true, "dev": true, "optional": true }, "process-nextick-args": { - "version": "1.0.7", - "bundled": true, - "dev": true - }, - "punycode": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "optional": true - }, - "qs": { - "version": "6.4.0", + "version": "2.0.0", "bundled": true, "dev": true, "optional": true }, "rc": { - "version": "1.2.1", + "version": "1.2.6", "bundled": true, "dev": true, "optional": true, @@ -3112,112 +2860,63 @@ } }, "readable-stream": { - "version": "2.2.9", + "version": "2.3.6", "bundled": true, "dev": true, + "optional": true, "requires": { - "buffer-shims": "~1.0.0", "core-util-is": "~1.0.0", - "inherits": "~2.0.1", + "inherits": "~2.0.3", "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, - "request": { - "version": "2.81.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "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" - } - }, "rimraf": { - "version": "2.6.1", + "version": "2.6.2", "bundled": true, "dev": true, + "optional": true, "requires": { "glob": "^7.0.5" } }, "safe-buffer": { - "version": "5.0.1", + "version": "5.1.1", "bundled": true, "dev": true }, - "semver": { - "version": "5.3.0", + "safer-buffer": { + "version": "2.1.2", "bundled": true, "dev": true, "optional": true }, - "set-blocking": { - "version": "2.0.0", + "sax": { + "version": "1.2.4", "bundled": true, "dev": true, "optional": true }, - "signal-exit": { - "version": "3.0.2", + "semver": { + "version": "5.5.0", "bundled": true, "dev": true, "optional": true }, - "sntp": { - "version": "1.0.9", + "set-blocking": { + "version": "2.0.0", "bundled": true, "dev": true, - "requires": { - "hoek": "2.x.x" - } + "optional": true }, - "sshpk": { - "version": "1.13.0", + "signal-exit": { + "version": "3.0.2", "bundled": true, "dev": true, - "optional": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jodid25519": "^1.0.0", - "jsbn": "~0.1.0", - "tweetnacl": "~0.14.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } + "optional": true }, "string-width": { "version": "1.0.2", @@ -3230,19 +2929,14 @@ } }, "string_decoder": { - "version": "1.0.1", + "version": "1.1.1", "bundled": true, "dev": true, + "optional": true, "requires": { - "safe-buffer": "^5.0.1" + "safe-buffer": "~5.1.0" } }, - "stringstream": { - "version": "0.0.5", - "bundled": true, - "dev": true, - "optional": true - }, "strip-ansi": { "version": "3.0.1", "bundled": true, @@ -3258,81 +2952,26 @@ "optional": true }, "tar": { - "version": "2.2.1", - "bundled": true, - "dev": true, - "requires": { - "block-stream": "*", - "fstream": "^1.0.2", - "inherits": "2" - } - }, - "tar-pack": { - "version": "3.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "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" - } - }, - "tough-cookie": { - "version": "2.3.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "punycode": "^1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", + "version": "4.4.1", "bundled": true, "dev": true, "optional": true, "requires": { - "safe-buffer": "^5.0.1" + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.1", + "yallist": "^3.0.2" } }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "dev": true, - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "bundled": true, - "dev": true, - "optional": true - }, "util-deprecate": { "version": "1.0.2", "bundled": true, - "dev": true - }, - "uuid": { - "version": "3.0.1", - "bundled": true, "dev": true, "optional": true }, - "verror": { - "version": "1.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "extsprintf": "1.0.2" - } - }, "wide-align": { "version": "1.1.2", "bundled": true, @@ -3346,6 +2985,11 @@ "version": "1.0.2", "bundled": true, "dev": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true, + "dev": true } } }, @@ -3637,15 +3281,18 @@ } }, "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", - "dev": true + "version": "0.4.21", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.21.tgz", + "integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==", + "dev": true, + "requires": { + "safer-buffer": "^2.1.0" + } }, "ignore": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", - "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.8.tgz", + "integrity": "sha512-pUh+xUQQhQzevjRHHFqqcTy0/dP/kS9I8HSrUydhihjuD09W6ldVWFtIrwhXdUJHis3i2rZNqEHpZH/cbinFbg==", "dev": true }, "import-local": { @@ -3738,9 +3385,9 @@ } }, "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -3758,9 +3405,9 @@ } }, "supports-color": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -3784,20 +3431,12 @@ "dev": true }, "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "^6.0.0" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } + "kind-of": "^3.0.2" } }, "is-arrayish": { @@ -3847,20 +3486,12 @@ } }, "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "^6.0.0" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } + "kind-of": "^3.0.2" } }, "is-date-object": { @@ -3870,20 +3501,20 @@ "dev": true }, "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" }, "dependencies": { "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true } } @@ -4274,9 +3905,9 @@ } }, "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -4336,9 +3967,9 @@ } }, "supports-color": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -4384,9 +4015,9 @@ } }, "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -4395,9 +4026,9 @@ } }, "supports-color": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -4427,9 +4058,9 @@ } }, "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -4438,9 +4069,9 @@ } }, "supports-color": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -4528,9 +4159,9 @@ } }, "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -4545,18 +4176,19 @@ "dev": true }, "source-map-support": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.4.tgz", - "integrity": "sha512-PETSPG6BjY1AHs2t64vS2aqAgu6dMIMXJULWFBGbh2Gr8nVLbCFDo6i/RMMvviIQ2h1Z8+5gQhVKSn2je9nmdg==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.5.tgz", + "integrity": "sha512-mR7/Nd5l1z6g99010shcXJiNEaf3fEtmLhRB/sBcQVJGodcHCULPp2y4Sfa43Kv2zq7T+Izmfp/WHCR6dYkQCA==", "dev": true, "requires": { + "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "supports-color": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -4594,9 +4226,9 @@ } }, "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -4605,9 +4237,9 @@ } }, "supports-color": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -4638,9 +4270,9 @@ } }, "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -4649,9 +4281,9 @@ } }, "supports-color": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -4691,9 +4323,9 @@ } }, "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -4702,9 +4334,9 @@ } }, "supports-color": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -4778,9 +4410,9 @@ } }, "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -4789,9 +4421,9 @@ } }, "supports-color": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -4829,9 +4461,9 @@ } }, "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -4840,9 +4472,9 @@ } }, "supports-color": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -4881,9 +4513,9 @@ "dev": true }, "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -4898,9 +4530,9 @@ "dev": true }, "supports-color": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -4931,9 +4563,9 @@ } }, "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -4942,9 +4574,9 @@ } }, "supports-color": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -4985,19 +4617,18 @@ "optional": true }, "jsdom": { - "version": "11.6.2", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.6.2.tgz", - "integrity": "sha512-pAeZhpbSlUp5yQcS6cBQJwkbzmv4tWFaYxHbFVSxzXefqjvtRA851Z5N2P+TguVG9YeUDcgb8pdeVQRJh0XR3Q==", + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.9.0.tgz", + "integrity": "sha512-sb3omwJTJ+HwAltLZevM/KQBusY+l2Ar5UfnTCWk9oUVBiDnQPBNiG1BaTAKttCnneonYbNo7vi4EFDY2lBfNA==", "dev": true, "requires": { "abab": "^1.0.4", "acorn": "^5.3.0", "acorn-globals": "^4.1.0", "array-equal": "^1.0.0", - "browser-process-hrtime": "^0.1.2", - "content-type-parser": "^1.0.2", "cssom": ">= 0.3.2 < 0.4.0", "cssstyle": ">= 0.2.37 < 0.3.0", + "data-urls": "^1.0.0", "domexception": "^1.0.0", "escodegen": "^1.9.0", "html-encoding-sniffer": "^1.0.2", @@ -5013,6 +4644,7 @@ "w3c-hr-time": "^1.0.1", "webidl-conversions": "^4.0.2", "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", "whatwg-url": "^6.4.0", "ws": "^4.0.0", "xml-name-validator": "^3.0.0" @@ -5116,9 +4748,9 @@ } }, "left-pad": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.2.0.tgz", - "integrity": "sha1-0wpzxrggHY99jnlWupYWCHpo4O4=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", "dev": true }, "leven": { @@ -5168,9 +4800,9 @@ } }, "lodash": { - "version": "4.17.5", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", - "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", "dev": true }, "lodash.sortby": { @@ -5498,49 +5130,12 @@ }, "dependencies": { "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } + "is-descriptor": "^0.1.0" } } } @@ -6045,9 +5640,9 @@ } }, "readable-stream": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.5.tgz", - "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -6055,7 +5650,7 @@ "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", + "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, @@ -6124,9 +5719,9 @@ } }, "regexpp": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.0.1.tgz", - "integrity": "sha512-8Ph721maXiOYSLtaDGKVmDn5wdsNaF6Px85qFNeMPQq0r8K5Y10tgP6YuR65Ws35n4DvzFcCxEnRNBIXQunzLw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", + "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", "dev": true }, "regexpu-core": { @@ -6360,9 +5955,9 @@ } }, "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, "safe-regex": { @@ -6374,6 +5969,12 @@ "ret": "~0.1.10" } }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, "sane": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/sane/-/sane-2.5.0.tgz", @@ -6413,18 +6014,16 @@ "dev": true }, "braces": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz", - "integrity": "sha512-SO5lYHA3vO6gz66erVvedSCkp7AKWdv6VcQ2N4ysXfPxdAlxAMMAdwegGGcv1Bqwm7naF1hNdk5d6AAIEHV2nQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", - "define-property": "^1.0.0", "extend-shallow": "^2.0.1", "fill-range": "^4.0.0", "isobject": "^3.0.1", - "kind-of": "^6.0.2", "repeat-element": "^1.1.2", "snapdragon": "^0.8.1", "snapdragon-node": "^2.0.1", @@ -6432,15 +6031,6 @@ "to-regex": "^3.0.1" }, "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", @@ -6485,6 +6075,46 @@ "is-extendable": "^0.1.0" } }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", @@ -6564,43 +6194,32 @@ } }, "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "kind-of": "^6.0.0" } }, "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "is-number": { @@ -6793,63 +6412,6 @@ "requires": { "is-extendable": "^0.1.0" } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true } } }, @@ -6873,11 +6435,46 @@ "is-descriptor": "^1.0.0" } }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true } } }, @@ -7030,63 +6627,6 @@ "requires": { "is-descriptor": "^0.1.0" } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true } } }, @@ -7151,9 +6691,9 @@ } }, "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -7228,9 +6768,9 @@ } }, "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -7239,9 +6779,9 @@ } }, "supports-color": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -7275,18 +6815,16 @@ "dev": true }, "braces": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz", - "integrity": "sha512-SO5lYHA3vO6gz66erVvedSCkp7AKWdv6VcQ2N4ysXfPxdAlxAMMAdwegGGcv1Bqwm7naF1hNdk5d6AAIEHV2nQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", - "define-property": "^1.0.0", "extend-shallow": "^2.0.1", "fill-range": "^4.0.0", "isobject": "^3.0.1", - "kind-of": "^6.0.2", "repeat-element": "^1.1.2", "snapdragon": "^0.8.1", "snapdragon-node": "^2.0.1", @@ -7294,15 +6832,6 @@ "to-regex": "^3.0.1" }, "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", @@ -7347,6 +6876,46 @@ "is-extendable": "^0.1.0" } }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", @@ -7426,43 +6995,32 @@ } }, "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "kind-of": "^6.0.0" } }, "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "is-number": { @@ -7975,23 +7533,37 @@ "dev": true, "requires": { "iconv-lite": "0.4.19" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "dev": true + } } }, "whatwg-fetch": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", - "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", + "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==", + "dev": true + }, + "whatwg-mimetype": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz", + "integrity": "sha512-FKxhYLytBQiUKjkYteN71fAUA3g6KpNXoho1isLiLSB3N1G4F35Q5vUxWfKFhBwi5IWF27VE6WxhrnnC+m0Mew==", "dev": true }, "whatwg-url": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.0.tgz", - "integrity": "sha512-Z0CVh/YE217Foyb488eo+iBv+r7eAQ0wSTyApi9n06jhcA3z6Nidg/EGvl0UFkg7kMdKxfBzzr+o9JF+cevgMg==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.1.tgz", + "integrity": "sha512-FwygsxsXx27x6XXuExA/ox3Ktwcbf+OAvrKmLulotDAiO1Q6ixchPFaHYsis2zZBZSJTR0+dR+JVtf7MlbqZjw==", "dev": true, "requires": { "lodash.sortby": "^4.7.0", - "tr46": "^1.0.0", - "webidl-conversions": "^4.0.1" + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" } }, "which": { @@ -8135,9 +7707,9 @@ "dev": true }, "cliui": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.0.0.tgz", - "integrity": "sha512-nY3W5Gu2racvdDk//ELReY+dHjb9PlIcVDFXP72nVIhq2Gy3LuVXYwJoPVudwQnv1shtohpgkdCKT2YaKY0CKw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "dev": true, "requires": { "string-width": "^2.1.1", From 01fcb505a9757091b552dd6be35362599179d210 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Fri, 27 Apr 2018 17:31:04 +0300 Subject: [PATCH 224/327] Add knapsack problem. --- README.md | 3 ++- .../sets/knapsack-problem/README.md | 23 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 src/algorithms/sets/knapsack-problem/README.md diff --git a/README.md b/README.md index 73f57b062..ed6c94b23 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,7 @@ * [Longest Common Subsequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/longest-common-subsequnce) (LCS) * [Longest Increasing subsequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/longest-increasing-subsequence) * [Shortest Common Supersequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/shortest-common-supersequence) (SCS) + * [Knapsack Problem](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/knapsack-problem) * **String** * [Levenshtein Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/levenshtein-distance) - minimum edit distance between two sequences * [Hamming Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/hamming-distance) - number of positions at which the symbols are different @@ -94,7 +95,7 @@ * [Longest Common Substring](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/longest-common-substring) * [Longest Increasing subsequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/longest-increasing-subsequence) * [Shortest Common Supersequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/shortest-common-supersequence) - * Knapsack problem + * [Knapsack Problem](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/knapsack-problem) * Maximum subarray * Maximum sum path * Integer Partition diff --git a/src/algorithms/sets/knapsack-problem/README.md b/src/algorithms/sets/knapsack-problem/README.md new file mode 100644 index 000000000..31a82a8b4 --- /dev/null +++ b/src/algorithms/sets/knapsack-problem/README.md @@ -0,0 +1,23 @@ +# Knapsack Problem + +The knapsack problem or rucksack problem is a problem in +combinatorial optimization: Given a set of items, each with +a weight and a value, determine the number of each item to +include in a collection so that the total weight is less +than or equal to a given limit and the total value is as +large as possible. + +It derives its name from the problem faced by someone who is +constrained by a fixed-size knapsack and must fill it with the +most valuable items. + +Example of a one-dimensional (constraint) knapsack problem: +which boxes should be chosen to maximize the amount of money +while still keeping the overall weight under or equal to 15 kg? + +![knapsack problem](https://upload.wikimedia.org/wikipedia/commons/f/fd/Knapsack.svg) + +## References + +- [Wikipedia](https://en.wikipedia.org/wiki/Knapsack_problem) +- [YouTube](https://www.youtube.com/watch?v=8LusJS5-AGo) From 602f7189a1a245468c981d8712abb452e0699c3e Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Mon, 30 Apr 2018 08:52:48 +0300 Subject: [PATCH 225/327] Add knapsack problem. --- .../sets/knapsack-problem/README.md | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/src/algorithms/sets/knapsack-problem/README.md b/src/algorithms/sets/knapsack-problem/README.md index 31a82a8b4..65ace34e2 100644 --- a/src/algorithms/sets/knapsack-problem/README.md +++ b/src/algorithms/sets/knapsack-problem/README.md @@ -17,6 +17,52 @@ while still keeping the overall weight under or equal to 15 kg? ![knapsack problem](https://upload.wikimedia.org/wikipedia/commons/f/fd/Knapsack.svg) +## Definition + +### 0/1 knapsack problem + +The most common problem being solved is the **0/1 knapsack problem**, +which restricts the number `xi` of copies of each kind of item to zero or one. + +Given a set of n items numbered from `1` up to `n`, each with a +weight `wi` and a value `vi`, along with a maximum weight +capacity `W`, + +maximize ![0/1 knapsack](https://wikimedia.org/api/rest_v1/media/math/render/svg/85620037d368d2136fb3361702df6a489416931b) + +subject to ![0/1 knapsack](https://wikimedia.org/api/rest_v1/media/math/render/svg/dd6e7c9bca4397980976ea6d19237500ce3b8176) +and ![0/1 knapsack](https://wikimedia.org/api/rest_v1/media/math/render/svg/07dda71da2a630762c7b21b51ea54f86f422f951) + +Here `xi` represents the number of instances of item `i` to +include in the knapsack. Informally, the problem is to maximize +the sum of the values of the items in the knapsack so that the +sum of the weights is less than or equal to the knapsack's +capacity. + +### Bounded knapsack problem (BKP) + +The **bounded knapsack problem (BKP)** removes the restriction +that there is only one of each item, but restricts the number +`xi` of copies of each kind of item to a maximum non-negative +integer value `c`: + +maximize ![bounded knapsack](https://wikimedia.org/api/rest_v1/media/math/render/svg/85620037d368d2136fb3361702df6a489416931b) + +subject to ![bounded knapsack](https://wikimedia.org/api/rest_v1/media/math/render/svg/dd6e7c9bca4397980976ea6d19237500ce3b8176) +and ![bounded knapsack](https://wikimedia.org/api/rest_v1/media/math/render/svg/6c8c5ac4f8247b3b8e01e89de76a1df0ea969821) + +### Unbounded knapsack problem (UKP) + +The **unbounded knapsack problem (UKP)** places no upper bound +on the number of copies of each kind of item and can be +formulated as above except for that the only restriction +on `xi` is that it is a non-negative integer. + +maximize ![unbounded knapsack](https://wikimedia.org/api/rest_v1/media/math/render/svg/85620037d368d2136fb3361702df6a489416931b) + +subject to ![unbounded knapsack](https://wikimedia.org/api/rest_v1/media/math/render/svg/dd6e7c9bca4397980976ea6d19237500ce3b8176) +and ![unbounded knapsack](https://wikimedia.org/api/rest_v1/media/math/render/svg/90a99710f61d5dea19e49ae5b31164d2b56b07e3) + ## References - [Wikipedia](https://en.wikipedia.org/wiki/Knapsack_problem) From 17bfc045c219d6e2f6da3d33b103f492451bdb0f Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Mon, 30 Apr 2018 08:53:49 +0300 Subject: [PATCH 226/327] Add knapsack problem. --- src/algorithms/sets/knapsack-problem/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/algorithms/sets/knapsack-problem/README.md b/src/algorithms/sets/knapsack-problem/README.md index 65ace34e2..1c719d7b4 100644 --- a/src/algorithms/sets/knapsack-problem/README.md +++ b/src/algorithms/sets/knapsack-problem/README.md @@ -66,4 +66,4 @@ and ![unbounded knapsack](https://wikimedia.org/api/rest_v1/media/math/render/sv ## References - [Wikipedia](https://en.wikipedia.org/wiki/Knapsack_problem) -- [YouTube](https://www.youtube.com/watch?v=8LusJS5-AGo) +- [0/1 Knapsack Problem on YouTube](https://www.youtube.com/watch?v=8LusJS5-AGo) From a8e8b39633440644077d48058818a4a5df9de495 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Mon, 30 Apr 2018 12:37:12 +0300 Subject: [PATCH 227/327] Add knapsack problem. --- .../sets/knapsack-problem/Knapsack.js | 154 ++++++++++++++++++ .../sets/knapsack-problem/KnapsackItem.js | 27 +++ .../__test__/Knapsack.test.js | 89 ++++++++++ .../__test__/KnapsackItem.test.js | 32 ++++ 4 files changed, 302 insertions(+) create mode 100644 src/algorithms/sets/knapsack-problem/Knapsack.js create mode 100644 src/algorithms/sets/knapsack-problem/KnapsackItem.js create mode 100644 src/algorithms/sets/knapsack-problem/__test__/Knapsack.test.js create mode 100644 src/algorithms/sets/knapsack-problem/__test__/KnapsackItem.test.js diff --git a/src/algorithms/sets/knapsack-problem/Knapsack.js b/src/algorithms/sets/knapsack-problem/Knapsack.js new file mode 100644 index 000000000..112722c11 --- /dev/null +++ b/src/algorithms/sets/knapsack-problem/Knapsack.js @@ -0,0 +1,154 @@ +import MergeSort from '../../sorting/merge-sort/MergeSort'; + +export default class Knapsack { + /** + * @param {KnapsackItem[]} possibleItems + * @param {number} weightLimit + */ + constructor(possibleItems, weightLimit) { + this.selectedItems = []; + this.weightLimit = weightLimit; + this.possibleItems = possibleItems; + // We do two sorts because in case of equal weights but different values + // we need to take the most valuable items first. + this.sortPossibleItemsByValue(); + this.sortPossibleItemsByWeight(); + } + + sortPossibleItemsByWeight() { + // Sort possible items by their weight. + // We need them to be sorted in order to solve knapsack problem using + // Dynamic Programming approach. + this.possibleItems = new MergeSort({ + /** + * @var KnapsackItem itemA + * @var KnapsackItem itemB + */ + compareCallback: (itemA, itemB) => { + if (itemA.weight === itemB.weight) { + return 0; + } + + return itemA.weight < itemB.weight ? -1 : 1; + }, + }).sort(this.possibleItems); + } + + sortPossibleItemsByValue() { + // Sort possible items by their weight. + // We need them to be sorted in order to solve knapsack problem using + // Dynamic Programming approach. + this.possibleItems = new MergeSort({ + /** + * @var KnapsackItem itemA + * @var KnapsackItem itemB + */ + compareCallback: (itemA, itemB) => { + if (itemA.value === itemB.value) { + return 0; + } + + return itemA.value > itemB.value ? -1 : 1; + }, + }).sort(this.possibleItems); + } + + // Solve 0/1 knapsack problem using dynamic programming. + solveZeroOneKnapsackProblem() { + this.selectedItems = []; + + // Create knapsack values matrix. + const numberOfRows = this.possibleItems.length; + const numberOfColumns = this.weightLimit; + const knapsackMatrix = Array(numberOfRows).fill(null).map(() => { + return Array(numberOfColumns + 1).fill(null); + }); + + // Fill the first column with zeros since it would mean that there is + // no items we can add to knapsack in case if weight limitation is zero. + for (let itemIndex = 0; itemIndex < this.possibleItems.length; itemIndex += 1) { + knapsackMatrix[itemIndex][0] = 0; + } + + // Fill the first row with max possible values we would get by just adding + // or not adding the first item to the knapsack. + for (let weightIndex = 1; weightIndex <= this.weightLimit; weightIndex += 1) { + const itemIndex = 0; + const itemWeight = this.possibleItems[itemIndex].weight; + const itemValue = this.possibleItems[itemIndex].value; + knapsackMatrix[itemIndex][weightIndex] = itemWeight <= weightIndex ? itemValue : 0; + } + + // Go through combinations of how we may add items to knapsack and + // define what weight/value we would receive using Dynamic Programming + // approach. + for (let itemIndex = 1; itemIndex < this.possibleItems.length; itemIndex += 1) { + for (let weightIndex = 1; weightIndex <= this.weightLimit; weightIndex += 1) { + const currentItemWeight = this.possibleItems[itemIndex].weight; + const currentItemValue = this.possibleItems[itemIndex].value; + + if (currentItemWeight > weightIndex) { + // In case if item's weight is bigger then currently allowed weight + // then we can't add it to knapsack and the max possible value we can + // gain at the moment is the max value we got for previous item. + knapsackMatrix[itemIndex][weightIndex] = knapsackMatrix[itemIndex - 1][weightIndex]; + } else { + // Else we need to consider the max value we can gain at this point by adding + // current value or just by keeping the previous item for current weight. + knapsackMatrix[itemIndex][weightIndex] = Math.max( + currentItemValue + knapsackMatrix[itemIndex - 1][weightIndex - currentItemWeight], + knapsackMatrix[itemIndex - 1][weightIndex], + ); + } + } + } + + // Now let's trace back the knapsack matrix to see what items we're going to add + // to the knapsack. + let itemIndex = this.possibleItems.length - 1; + let weightIndex = this.weightLimit; + + while (itemIndex > 0) { + const currentItem = this.possibleItems[itemIndex]; + const prevItem = this.possibleItems[itemIndex - 1]; + + // Check if matrix value came from top (from previous item). + // In this case this would mean that we need to include previous item + // to the list of selected items. + if ( + knapsackMatrix[itemIndex][weightIndex] && + knapsackMatrix[itemIndex][weightIndex] === knapsackMatrix[itemIndex - 1][weightIndex] + ) { + // Check if there are several items with the same weight but with the different values. + // We need to add highest item in the matrix that is possible to get the highest value. + const prevSumValue = knapsackMatrix[itemIndex - 1][weightIndex]; + const prevPrevSumValue = knapsackMatrix[itemIndex - 2][weightIndex]; + if ( + !prevSumValue || + (prevSumValue && prevPrevSumValue !== prevSumValue) + ) { + this.selectedItems.push(prevItem); + } + } else if (knapsackMatrix[itemIndex - 1][weightIndex - currentItem.weight]) { + this.selectedItems.push(prevItem); + weightIndex -= currentItem.weight; + } + + itemIndex -= 1; + } + } + + get totalValue() { + /** @var {KnapsackItem} item */ + return this.selectedItems.reduce((accumulator, item) => { + return accumulator + item.totalValue; + }, 0); + } + + get totalWeight() { + /** @var {KnapsackItem} item */ + return this.selectedItems.reduce((accumulator, item) => { + return accumulator + item.totalWeight; + }, 0); + } +} diff --git a/src/algorithms/sets/knapsack-problem/KnapsackItem.js b/src/algorithms/sets/knapsack-problem/KnapsackItem.js new file mode 100644 index 000000000..79e388638 --- /dev/null +++ b/src/algorithms/sets/knapsack-problem/KnapsackItem.js @@ -0,0 +1,27 @@ +export default class KnapsackItem { + /** + * @param {Object} itemSettings - knapsack item settings, + * @param {number} itemSettings.value - value of the item. + * @param {number} itemSettings.weight - weight of the item. + * @param {number} itemSettings.itemsInStock - how many items are available to be added. + */ + constructor({ value, weight, itemsInStock = 1 }) { + this.value = value; + this.weight = weight; + this.itemsInStock = itemsInStock; + // Actual number of items that is going to be added to knapsack. + this.quantity = 1; + } + + get totalValue() { + return this.value * this.quantity; + } + + get totalWeight() { + return this.weight * this.quantity; + } + + toString() { + return `v${this.value} w${this.weight} x ${this.quantity}`; + } +} diff --git a/src/algorithms/sets/knapsack-problem/__test__/Knapsack.test.js b/src/algorithms/sets/knapsack-problem/__test__/Knapsack.test.js new file mode 100644 index 000000000..d222e19aa --- /dev/null +++ b/src/algorithms/sets/knapsack-problem/__test__/Knapsack.test.js @@ -0,0 +1,89 @@ +import Knapsack from '../Knapsack'; +import KnapsackItem from '../KnapsackItem'; + +describe('Knapsack', () => { + it('should solve 0/1 knapsack problem', () => { + const possibleKnapsackItems = [ + new KnapsackItem({ value: 1, weight: 1 }), + new KnapsackItem({ value: 4, weight: 3 }), + new KnapsackItem({ value: 5, weight: 4 }), + new KnapsackItem({ value: 7, weight: 5 }), + ]; + + const maxKnapsackWeight = 7; + + const knapsack = new Knapsack(possibleKnapsackItems, maxKnapsackWeight); + + knapsack.solveZeroOneKnapsackProblem(); + + expect(knapsack.totalValue).toBe(9); + expect(knapsack.totalWeight).toBe(7); + expect(knapsack.selectedItems.length).toBe(2); + expect(knapsack.selectedItems[0].toString()).toBe('v5 w4 x 1'); + expect(knapsack.selectedItems[1].toString()).toBe('v4 w3 x 1'); + }); + + it('should solve 0/1 knapsack problem regardless of items order', () => { + const possibleKnapsackItems = [ + new KnapsackItem({ value: 5, weight: 4 }), + new KnapsackItem({ value: 1, weight: 1 }), + new KnapsackItem({ value: 7, weight: 5 }), + new KnapsackItem({ value: 4, weight: 3 }), + ]; + + const maxKnapsackWeight = 7; + + const knapsack = new Knapsack(possibleKnapsackItems, maxKnapsackWeight); + + knapsack.solveZeroOneKnapsackProblem(); + + expect(knapsack.totalValue).toBe(9); + expect(knapsack.totalWeight).toBe(7); + expect(knapsack.selectedItems.length).toBe(2); + expect(knapsack.selectedItems[0].toString()).toBe('v5 w4 x 1'); + expect(knapsack.selectedItems[1].toString()).toBe('v4 w3 x 1'); + }); + + it('should solve 0/1 knapsack problem with impossible items set', () => { + const possibleKnapsackItems = [ + new KnapsackItem({ value: 5, weight: 40 }), + new KnapsackItem({ value: 1, weight: 10 }), + new KnapsackItem({ value: 7, weight: 50 }), + new KnapsackItem({ value: 4, weight: 30 }), + ]; + + const maxKnapsackWeight = 7; + + const knapsack = new Knapsack(possibleKnapsackItems, maxKnapsackWeight); + + knapsack.solveZeroOneKnapsackProblem(); + + expect(knapsack.totalValue).toBe(0); + expect(knapsack.totalWeight).toBe(0); + expect(knapsack.selectedItems.length).toBe(0); + }); + + it('should solve 0/1 knapsack problem with all equal weights', () => { + const possibleKnapsackItems = [ + new KnapsackItem({ value: 5, weight: 1 }), + new KnapsackItem({ value: 1, weight: 1 }), + new KnapsackItem({ value: 7, weight: 1 }), + new KnapsackItem({ value: 4, weight: 1 }), + new KnapsackItem({ value: 4, weight: 1 }), + new KnapsackItem({ value: 4, weight: 1 }), + ]; + + const maxKnapsackWeight = 3; + + const knapsack = new Knapsack(possibleKnapsackItems, maxKnapsackWeight); + + knapsack.solveZeroOneKnapsackProblem(); + + expect(knapsack.totalValue).toBe(16); + expect(knapsack.totalWeight).toBe(3); + expect(knapsack.selectedItems.length).toBe(3); + expect(knapsack.selectedItems[0].toString()).toBe('v4 w1 x 1'); + expect(knapsack.selectedItems[1].toString()).toBe('v5 w1 x 1'); + expect(knapsack.selectedItems[2].toString()).toBe('v7 w1 x 1'); + }); +}); diff --git a/src/algorithms/sets/knapsack-problem/__test__/KnapsackItem.test.js b/src/algorithms/sets/knapsack-problem/__test__/KnapsackItem.test.js new file mode 100644 index 000000000..3a373796f --- /dev/null +++ b/src/algorithms/sets/knapsack-problem/__test__/KnapsackItem.test.js @@ -0,0 +1,32 @@ +import KnapsackItem from '../KnapsackItem'; + +describe('KnapsackItem', () => { + it('should create knapsack item and count its total weight and value', () => { + const item1 = new KnapsackItem({ value: 3, weight: 2 }); + + expect(item1.value).toBe(3); + expect(item1.weight).toBe(2); + expect(item1.quantity).toBe(1); + expect(item1.toString()).toBe('v3 w2 x 1'); + expect(item1.totalValue).toBe(3); + expect(item1.totalWeight).toBe(2); + + item1.quantity = 0; + + expect(item1.value).toBe(3); + expect(item1.weight).toBe(2); + expect(item1.quantity).toBe(0); + expect(item1.toString()).toBe('v3 w2 x 0'); + expect(item1.totalValue).toBe(0); + expect(item1.totalWeight).toBe(0); + + item1.quantity = 2; + + expect(item1.value).toBe(3); + expect(item1.weight).toBe(2); + expect(item1.quantity).toBe(2); + expect(item1.toString()).toBe('v3 w2 x 2'); + expect(item1.totalValue).toBe(6); + expect(item1.totalWeight).toBe(4); + }); +}); From 169e05c85b6d01309c6e6aa4e61ca8677628d7cc Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Mon, 30 Apr 2018 14:08:14 +0300 Subject: [PATCH 228/327] Add knapsack problem. --- README.md | 3 +- .../sets/knapsack-problem/Knapsack.js | 57 +++++++++++++++---- .../sets/knapsack-problem/KnapsackItem.js | 6 ++ .../__test__/Knapsack.test.js | 23 ++++++++ .../__test__/KnapsackItem.test.js | 45 ++++++++------- 5 files changed, 101 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index ed6c94b23..38bb5cf6b 100644 --- a/README.md +++ b/README.md @@ -80,6 +80,7 @@ ### Algorithms by Paradigm * **Greedy** + * [Unbound Knapsack Problem](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/knapsack-problem) * **Divide and Conquer** * [Euclidean Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/euclidean-algorithm) - calculate the Greatest Common Divisor (GCD) * [Permutations](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/permutations) (with and without repetitions) @@ -95,7 +96,7 @@ * [Longest Common Substring](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/longest-common-substring) * [Longest Increasing subsequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/longest-increasing-subsequence) * [Shortest Common Supersequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/shortest-common-supersequence) - * [Knapsack Problem](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/knapsack-problem) + * [0/1 Knapsack Problem](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/knapsack-problem) * Maximum subarray * Maximum sum path * Integer Partition diff --git a/src/algorithms/sets/knapsack-problem/Knapsack.js b/src/algorithms/sets/knapsack-problem/Knapsack.js index 112722c11..d23e12e0f 100644 --- a/src/algorithms/sets/knapsack-problem/Knapsack.js +++ b/src/algorithms/sets/knapsack-problem/Knapsack.js @@ -9,16 +9,9 @@ export default class Knapsack { this.selectedItems = []; this.weightLimit = weightLimit; this.possibleItems = possibleItems; - // We do two sorts because in case of equal weights but different values - // we need to take the most valuable items first. - this.sortPossibleItemsByValue(); - this.sortPossibleItemsByWeight(); } sortPossibleItemsByWeight() { - // Sort possible items by their weight. - // We need them to be sorted in order to solve knapsack problem using - // Dynamic Programming approach. this.possibleItems = new MergeSort({ /** * @var KnapsackItem itemA @@ -35,9 +28,6 @@ export default class Knapsack { } sortPossibleItemsByValue() { - // Sort possible items by their weight. - // We need them to be sorted in order to solve knapsack problem using - // Dynamic Programming approach. this.possibleItems = new MergeSort({ /** * @var KnapsackItem itemA @@ -53,8 +43,30 @@ export default class Knapsack { }).sort(this.possibleItems); } - // Solve 0/1 knapsack problem using dynamic programming. + sortPossibleItemsByValuePerWeightRatio() { + this.possibleItems = new MergeSort({ + /** + * @var KnapsackItem itemA + * @var KnapsackItem itemB + */ + compareCallback: (itemA, itemB) => { + if (itemA.valuePerWeightRatio === itemB.valuePerWeightRatio) { + return 0; + } + + return itemA.valuePerWeightRatio > itemB.valuePerWeightRatio ? -1 : 1; + }, + }).sort(this.possibleItems); + } + + // Solve 0/1 knapsack problem + // Dynamic Programming approach. solveZeroOneKnapsackProblem() { + // We do two sorts because in case of equal weights but different values + // we need to take the most valuable items first. + this.sortPossibleItemsByValue(); + this.sortPossibleItemsByWeight(); + this.selectedItems = []; // Create knapsack values matrix. @@ -138,6 +150,29 @@ export default class Knapsack { } } + + // Solve unbounded knapsack problem. + // Greedy approach. + solveUnboundedKnapsackProblem() { + this.sortPossibleItemsByValue(); + this.sortPossibleItemsByValuePerWeightRatio(); + + for (let itemIndex = 0; itemIndex < this.possibleItems.length; itemIndex += 1) { + if (this.totalWeight < this.weightLimit) { + const currentItem = this.possibleItems[itemIndex]; + + // Detect how much of current items we can push to knapsack. + const availableWeight = this.weightLimit - this.totalWeight; + const maxPossibleItemsCount = Math.floor(availableWeight / currentItem.weight); + + if (maxPossibleItemsCount) { + currentItem.quantity = maxPossibleItemsCount; + this.selectedItems.push(currentItem); + } + } + } + } + get totalValue() { /** @var {KnapsackItem} item */ return this.selectedItems.reduce((accumulator, item) => { diff --git a/src/algorithms/sets/knapsack-problem/KnapsackItem.js b/src/algorithms/sets/knapsack-problem/KnapsackItem.js index 79e388638..4c84eeee6 100644 --- a/src/algorithms/sets/knapsack-problem/KnapsackItem.js +++ b/src/algorithms/sets/knapsack-problem/KnapsackItem.js @@ -21,6 +21,12 @@ export default class KnapsackItem { return this.weight * this.quantity; } + // This coefficient shows how valuable the 1 unit of weight is + // for current item. + get valuePerWeightRatio() { + return this.value / this.weight; + } + toString() { return `v${this.value} w${this.weight} x ${this.quantity}`; } diff --git a/src/algorithms/sets/knapsack-problem/__test__/Knapsack.test.js b/src/algorithms/sets/knapsack-problem/__test__/Knapsack.test.js index d222e19aa..9569908f4 100644 --- a/src/algorithms/sets/knapsack-problem/__test__/Knapsack.test.js +++ b/src/algorithms/sets/knapsack-problem/__test__/Knapsack.test.js @@ -86,4 +86,27 @@ describe('Knapsack', () => { expect(knapsack.selectedItems[1].toString()).toBe('v5 w1 x 1'); expect(knapsack.selectedItems[2].toString()).toBe('v7 w1 x 1'); }); + + it('should solve unbound knapsack problem', () => { + const possibleKnapsackItems = [ + new KnapsackItem({ value: 84, weight: 7 }), // v/w ratio is 12 + new KnapsackItem({ value: 5, weight: 2 }), // v/w ratio is 2.5 + new KnapsackItem({ value: 12, weight: 3 }), // v/w ratio is 4 + new KnapsackItem({ value: 10, weight: 1 }), // v/w ratio is 10 + new KnapsackItem({ value: 20, weight: 2 }), // v/w ratio is 10 + ]; + + const maxKnapsackWeight = 17; + + const knapsack = new Knapsack(possibleKnapsackItems, maxKnapsackWeight); + + knapsack.solveUnboundedKnapsackProblem(); + + expect(knapsack.totalValue).toBe(84 + 84 + 20 + 10); + expect(knapsack.totalWeight).toBe(17); + expect(knapsack.selectedItems.length).toBe(3); + expect(knapsack.selectedItems[0].toString()).toBe('v84 w7 x 2'); + expect(knapsack.selectedItems[1].toString()).toBe('v20 w2 x 1'); + expect(knapsack.selectedItems[2].toString()).toBe('v10 w1 x 1'); + }); }); diff --git a/src/algorithms/sets/knapsack-problem/__test__/KnapsackItem.test.js b/src/algorithms/sets/knapsack-problem/__test__/KnapsackItem.test.js index 3a373796f..d8ea8b8b3 100644 --- a/src/algorithms/sets/knapsack-problem/__test__/KnapsackItem.test.js +++ b/src/algorithms/sets/knapsack-problem/__test__/KnapsackItem.test.js @@ -2,31 +2,34 @@ import KnapsackItem from '../KnapsackItem'; describe('KnapsackItem', () => { it('should create knapsack item and count its total weight and value', () => { - const item1 = new KnapsackItem({ value: 3, weight: 2 }); + const knapsackItem = new KnapsackItem({ value: 3, weight: 2 }); - expect(item1.value).toBe(3); - expect(item1.weight).toBe(2); - expect(item1.quantity).toBe(1); - expect(item1.toString()).toBe('v3 w2 x 1'); - expect(item1.totalValue).toBe(3); - expect(item1.totalWeight).toBe(2); + expect(knapsackItem.value).toBe(3); + expect(knapsackItem.weight).toBe(2); + expect(knapsackItem.quantity).toBe(1); + expect(knapsackItem.valuePerWeightRatio).toBe(1.5); + expect(knapsackItem.toString()).toBe('v3 w2 x 1'); + expect(knapsackItem.totalValue).toBe(3); + expect(knapsackItem.totalWeight).toBe(2); - item1.quantity = 0; + knapsackItem.quantity = 0; - expect(item1.value).toBe(3); - expect(item1.weight).toBe(2); - expect(item1.quantity).toBe(0); - expect(item1.toString()).toBe('v3 w2 x 0'); - expect(item1.totalValue).toBe(0); - expect(item1.totalWeight).toBe(0); + expect(knapsackItem.value).toBe(3); + expect(knapsackItem.weight).toBe(2); + expect(knapsackItem.quantity).toBe(0); + expect(knapsackItem.valuePerWeightRatio).toBe(1.5); + expect(knapsackItem.toString()).toBe('v3 w2 x 0'); + expect(knapsackItem.totalValue).toBe(0); + expect(knapsackItem.totalWeight).toBe(0); - item1.quantity = 2; + knapsackItem.quantity = 2; - expect(item1.value).toBe(3); - expect(item1.weight).toBe(2); - expect(item1.quantity).toBe(2); - expect(item1.toString()).toBe('v3 w2 x 2'); - expect(item1.totalValue).toBe(6); - expect(item1.totalWeight).toBe(4); + expect(knapsackItem.value).toBe(3); + expect(knapsackItem.weight).toBe(2); + expect(knapsackItem.quantity).toBe(2); + expect(knapsackItem.valuePerWeightRatio).toBe(1.5); + expect(knapsackItem.toString()).toBe('v3 w2 x 2'); + expect(knapsackItem.totalValue).toBe(6); + expect(knapsackItem.totalWeight).toBe(4); }); }); From eda0321b520bc484eb1dd8b3486f50badeabc740 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Mon, 30 Apr 2018 14:08:53 +0300 Subject: [PATCH 229/327] Add knapsack problem. --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 38bb5cf6b..3e5d8cd13 100644 --- a/README.md +++ b/README.md @@ -76,6 +76,7 @@ * **Uncategorized** * Union-Find * Maze + * Sudoku ### Algorithms by Paradigm From e3af2c06b2fb0d39a7ca46612d62220a4fe85acf Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Mon, 30 Apr 2018 18:00:17 +0300 Subject: [PATCH 230/327] Add integer partition. --- README.md | 3 +- .../math/integer-partition/README.md | 33 +++++++++++++ .../__test__/integerPartition.test.js | 11 +++++ .../integer-partition/integerPartition.js | 47 +++++++++++++++++++ 4 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 src/algorithms/math/integer-partition/README.md create mode 100644 src/algorithms/math/integer-partition/__test__/integerPartition.test.js create mode 100644 src/algorithms/math/integer-partition/integerPartition.js diff --git a/README.md b/README.md index 3e5d8cd13..67cd60550 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,7 @@ * [Primality Test](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/primality-test) (trial division method) * [Euclidean Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/euclidean-algorithm) - calculate the Greatest Common Divisor (GCD) * [Least Common Multiple](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/least-common-multiple) (LCM) + * [Integer Partition](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/integer-partition) * **Sets** * [Cartesian Product](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/cartesian-product) - product of multiple sets * [Power Set](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/power-set) - all subsets of the set @@ -98,9 +99,9 @@ * [Longest Increasing subsequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/longest-increasing-subsequence) * [Shortest Common Supersequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/shortest-common-supersequence) * [0/1 Knapsack Problem](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/knapsack-problem) + * [Integer Partition](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/integer-partition) * Maximum subarray * Maximum sum path - * Integer Partition * **Backtracking** * **Branch & Bound** diff --git a/src/algorithms/math/integer-partition/README.md b/src/algorithms/math/integer-partition/README.md new file mode 100644 index 000000000..134512d3a --- /dev/null +++ b/src/algorithms/math/integer-partition/README.md @@ -0,0 +1,33 @@ +# Integer Partition + +In number theory and combinatorics, a partition of a positive +integer `n`, also called an **integer partition**, is a way of +writing `n` as a sum of positive integers. + +Two sums that differ only in the order of their summands are +considered the same partition. For example, `4` can be partitioned +in five distinct ways: + +``` +4 +3 + 1 +2 + 2 +2 + 1 + 1 +1 + 1 + 1 + 1 +``` + +The order-dependent composition `1 + 3` is the same partition +as `3 + 1`, while the two distinct +compositions `1 + 2 + 1` and `1 + 1 + 2` represent the same +partition `2 + 1 + 1`. + +Young diagrams associated to the partitions of the positive +integers `1` through `8`. They are arranged so that images +under the reflection about the main diagonal of the square +are conjugate partitions. + +![Integer Partition](https://upload.wikimedia.org/wikipedia/commons/d/d8/Ferrer_partitioning_diagrams.svg) + +## References + +- [Wikipedia](https://en.wikipedia.org/wiki/Partition_(number_theory)) diff --git a/src/algorithms/math/integer-partition/__test__/integerPartition.test.js b/src/algorithms/math/integer-partition/__test__/integerPartition.test.js new file mode 100644 index 000000000..affcbca67 --- /dev/null +++ b/src/algorithms/math/integer-partition/__test__/integerPartition.test.js @@ -0,0 +1,11 @@ +import integerPartition from '../integerPartition'; + +describe('integerPartition', () => { + it('should partition the number', () => { + expect(integerPartition(1)).toBe(1); + expect(integerPartition(2)).toBe(2); + expect(integerPartition(3)).toBe(3); + expect(integerPartition(4)).toBe(5); + expect(integerPartition(8)).toBe(22); + }); +}); diff --git a/src/algorithms/math/integer-partition/integerPartition.js b/src/algorithms/math/integer-partition/integerPartition.js new file mode 100644 index 000000000..b77cc0a3e --- /dev/null +++ b/src/algorithms/math/integer-partition/integerPartition.js @@ -0,0 +1,47 @@ +/** + * @param {Number} number + */ +export default function integerPartition(number) { + // Create partition matrix for solving this task using Dynamic Programming. + const partitionMatrix = Array(number + 1).fill(null).map(() => { + return Array(number + 1).fill(null); + }); + + // Fill partition matrix with initial values. + + // Let's fill the first row that represents how many ways we would have + // to combine the numbers 1, 2, 3, ..., n with number 0. We would have zero + // ways obviously since with zero number we may form only zero. + for (let numberIndex = 1; numberIndex <= number; numberIndex += 1) { + partitionMatrix[0][numberIndex] = 0; + } + + // Let's fill the first row. It represents the number of way of how we can form + // number zero out of numbers 0, 1, 2, ... Obviously there is only one way we could + // form number 0 and it is with number 0 itself. + for (let summandIndex = 0; summandIndex <= number; summandIndex += 1) { + partitionMatrix[summandIndex][0] = 1; + } + + // Now let's go through other possible options of how we could form number m out of + // summands 0, 1, ..., m using Dynamic Programming approach. + for (let summandIndex = 1; summandIndex <= number; summandIndex += 1) { + for (let numberIndex = 1; numberIndex <= number; numberIndex += 1) { + if (summandIndex > numberIndex) { + // If summand number is bigger then current number itself then just it won't add + // any new ways of forming the number. Thus we may just copy the number from row above. + partitionMatrix[summandIndex][numberIndex] = partitionMatrix[summandIndex - 1][numberIndex]; + } else { + // The number of combinations would equal to number of combinations of forming the same + // number but WITHOUT current summand number plus number of combinations of forming the + // previous number but WITH current summand. + const combosWithoutSummand = partitionMatrix[summandIndex - 1][numberIndex]; + const combosWithSummand = partitionMatrix[summandIndex][numberIndex - summandIndex]; + + partitionMatrix[summandIndex][numberIndex] = combosWithoutSummand + combosWithSummand; + } + } + } + + return partitionMatrix[number][number]; +} From 5902518e14a49ef644d6469b19110b5402d79015 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Mon, 30 Apr 2018 18:01:42 +0300 Subject: [PATCH 231/327] Add integer partition. --- src/algorithms/math/integer-partition/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/src/algorithms/math/integer-partition/README.md b/src/algorithms/math/integer-partition/README.md index 134512d3a..ee6a9f0a7 100644 --- a/src/algorithms/math/integer-partition/README.md +++ b/src/algorithms/math/integer-partition/README.md @@ -31,3 +31,4 @@ are conjugate partitions. ## References - [Wikipedia](https://en.wikipedia.org/wiki/Partition_(number_theory)) +- [YouTube](https://www.youtube.com/watch?v=ZaVM057DuzE) From 51d282316138f73fb6b57d5fddbc5209caee9030 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Mon, 30 Apr 2018 18:04:09 +0300 Subject: [PATCH 232/327] Add integer partition. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 67cd60550..3bc821d8c 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ * [Longest Common Subsequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/longest-common-subsequnce) (LCS) * [Longest Increasing subsequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/longest-increasing-subsequence) * [Shortest Common Supersequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/shortest-common-supersequence) (SCS) - * [Knapsack Problem](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/knapsack-problem) + * [Knapsack Problem](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/knapsack-problem) - 0/1 and unbound versions * **String** * [Levenshtein Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/levenshtein-distance) - minimum edit distance between two sequences * [Hamming Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/hamming-distance) - number of positions at which the symbols are different From 660065a9f337949a59f784ac048bc44ea3a1d971 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Mon, 30 Apr 2018 18:05:08 +0300 Subject: [PATCH 233/327] Add integer partition. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3bc821d8c..291df780e 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ * [Longest Common Subsequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/longest-common-subsequnce) (LCS) * [Longest Increasing subsequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/longest-increasing-subsequence) * [Shortest Common Supersequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/shortest-common-supersequence) (SCS) - * [Knapsack Problem](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/knapsack-problem) - 0/1 and unbound versions + * [Knapsack Problem](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/knapsack-problem) - "0/1" and "unbound" ones * **String** * [Levenshtein Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/levenshtein-distance) - minimum edit distance between two sequences * [Hamming Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/hamming-distance) - number of positions at which the symbols are different From b2c5e9119973ba963f7b7ab1759a5df0adc40c0d Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Mon, 30 Apr 2018 18:05:41 +0300 Subject: [PATCH 234/327] Add integer partition. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 291df780e..142b71da6 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ * [Longest Common Subsequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/longest-common-subsequnce) (LCS) * [Longest Increasing subsequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/longest-increasing-subsequence) * [Shortest Common Supersequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/shortest-common-supersequence) (SCS) - * [Knapsack Problem](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/knapsack-problem) - "0/1" and "unbound" ones + * [Knapsack Problem](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/knapsack-problem) - "0/1" and "Unbound" ones * **String** * [Levenshtein Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/levenshtein-distance) - minimum edit distance between two sequences * [Hamming Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/hamming-distance) - number of positions at which the symbols are different From 81255878239fadd785ad0b431924938a3f00e4b4 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Tue, 1 May 2018 11:16:08 +0300 Subject: [PATCH 235/327] Add maximum subarray. --- README.md | 3 +- .../sets/maximum-subarray/README.md | 19 ++++++ .../__test__/bfMaximumSubarray.test.js | 12 ++++ .../__test__/dpMaximumSubarray.test.js | 12 ++++ .../maximum-subarray/bfMaximumSubarray.js | 26 ++++++++ .../maximum-subarray/dpMaximumSubarray.js | 62 +++++++++++++++++++ 6 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 src/algorithms/sets/maximum-subarray/README.md create mode 100644 src/algorithms/sets/maximum-subarray/__test__/bfMaximumSubarray.test.js create mode 100644 src/algorithms/sets/maximum-subarray/__test__/dpMaximumSubarray.test.js create mode 100644 src/algorithms/sets/maximum-subarray/bfMaximumSubarray.js create mode 100644 src/algorithms/sets/maximum-subarray/dpMaximumSubarray.js diff --git a/README.md b/README.md index 142b71da6..d10fa6ba2 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,7 @@ * [Longest Increasing subsequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/longest-increasing-subsequence) * [Shortest Common Supersequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/shortest-common-supersequence) (SCS) * [Knapsack Problem](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/knapsack-problem) - "0/1" and "Unbound" ones + * [Maximum Subarray](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/maximum-subarray) - "Brute Force" and "Dynamic Programming" versions * **String** * [Levenshtein Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/levenshtein-distance) - minimum edit distance between two sequences * [Hamming Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/hamming-distance) - number of positions at which the symbols are different @@ -100,7 +101,7 @@ * [Shortest Common Supersequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/shortest-common-supersequence) * [0/1 Knapsack Problem](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/knapsack-problem) * [Integer Partition](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/integer-partition) - * Maximum subarray + * [Maximum Subarray](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/maximum-subarray) * Maximum sum path * **Backtracking** * **Branch & Bound** diff --git a/src/algorithms/sets/maximum-subarray/README.md b/src/algorithms/sets/maximum-subarray/README.md new file mode 100644 index 000000000..b2448deee --- /dev/null +++ b/src/algorithms/sets/maximum-subarray/README.md @@ -0,0 +1,19 @@ +# Maximum subarray problem + +The maximum subarray problem is the task of finding the contiguous +subarray within a one-dimensional array, `a[1...n]`, of numbers +which has the largest sum, where, + +![Maximum subarray](https://wikimedia.org/api/rest_v1/media/math/render/svg/e8960f093107b71b21827e726e2bad8b023779b2) + +## Example + +The list usually contains both positive and negative numbers along +with `0`. For example, for the array of +values `−2, 1, −3, 4, −1, 2, 1, −5, 4` the contiguous subarray +with the largest sum is `4, −1, 2, 1`, with sum `6`. + +## References + +- [Wikipedia](https://en.wikipedia.org/wiki/Maximum_subarray_problem) +- [YouTube](https://www.youtube.com/watch?v=ohHWQf1HDfU) diff --git a/src/algorithms/sets/maximum-subarray/__test__/bfMaximumSubarray.test.js b/src/algorithms/sets/maximum-subarray/__test__/bfMaximumSubarray.test.js new file mode 100644 index 000000000..520b5c01c --- /dev/null +++ b/src/algorithms/sets/maximum-subarray/__test__/bfMaximumSubarray.test.js @@ -0,0 +1,12 @@ +import bfMaximumSubarray from '../bfMaximumSubarray'; + +describe('bfMaximumSubarray', () => { + it('should find maximum subarray using brute force algorithm', () => { + expect(bfMaximumSubarray([])).toEqual([]); + expect(bfMaximumSubarray([-1, -2, -3, -4, -5])).toEqual([-1]); + expect(bfMaximumSubarray([1, 2, 3, 2, 3, 4, 5])).toEqual([1, 2, 3, 2, 3, 4, 5]); + expect(bfMaximumSubarray([-2, 1, -3, 4, -1, 2, 1, -5, 4])).toEqual([4, -1, 2, 1]); + expect(bfMaximumSubarray([-2, -3, 4, -1, -2, 1, 5, -3])).toEqual([4, -1, -2, 1, 5]); + expect(bfMaximumSubarray([1, -3, 2, -5, 7, 6, -1, 4, 11, -23])).toEqual([7, 6, -1, 4, 11]); + }); +}); diff --git a/src/algorithms/sets/maximum-subarray/__test__/dpMaximumSubarray.test.js b/src/algorithms/sets/maximum-subarray/__test__/dpMaximumSubarray.test.js new file mode 100644 index 000000000..4ce30db8b --- /dev/null +++ b/src/algorithms/sets/maximum-subarray/__test__/dpMaximumSubarray.test.js @@ -0,0 +1,12 @@ +import dpMaximumSubarray from '../dpMaximumSubarray'; + +describe('dpMaximumSubarray', () => { + it('should find maximum subarray using dynamic programming algorithm', () => { + expect(dpMaximumSubarray([])).toEqual([]); + expect(dpMaximumSubarray([-1, -2, -3, -4, -5])).toEqual([-1]); + expect(dpMaximumSubarray([1, 2, 3, 2, 3, 4, 5])).toEqual([1, 2, 3, 2, 3, 4, 5]); + expect(dpMaximumSubarray([-2, 1, -3, 4, -1, 2, 1, -5, 4])).toEqual([4, -1, 2, 1]); + expect(dpMaximumSubarray([-2, -3, 4, -1, -2, 1, 5, -3])).toEqual([4, -1, -2, 1, 5]); + expect(dpMaximumSubarray([1, -3, 2, -5, 7, 6, -1, 4, 11, -23])).toEqual([7, 6, -1, 4, 11]); + }); +}); diff --git a/src/algorithms/sets/maximum-subarray/bfMaximumSubarray.js b/src/algorithms/sets/maximum-subarray/bfMaximumSubarray.js new file mode 100644 index 000000000..20c0b38e7 --- /dev/null +++ b/src/algorithms/sets/maximum-subarray/bfMaximumSubarray.js @@ -0,0 +1,26 @@ +/** + * Brute Force solution. + * Complexity: O(n^2) + * + * @param {Number[]} inputArray + * @return {Number[]} + */ +export default function bfMaximumSubarray(inputArray) { + let maxSubarrayStartIndex = 0; + let maxSubarrayLength = 0; + let maxSubarraySum = null; + + for (let startIndex = 0; startIndex < inputArray.length; startIndex += 1) { + let subarraySum = 0; + for (let arrLength = 1; arrLength <= (inputArray.length - startIndex); arrLength += 1) { + subarraySum += inputArray[startIndex + (arrLength - 1)]; + if (maxSubarraySum === null || subarraySum > maxSubarraySum) { + maxSubarraySum = subarraySum; + maxSubarrayStartIndex = startIndex; + maxSubarrayLength = arrLength; + } + } + } + + return inputArray.slice(maxSubarrayStartIndex, maxSubarrayStartIndex + maxSubarrayLength); +} diff --git a/src/algorithms/sets/maximum-subarray/dpMaximumSubarray.js b/src/algorithms/sets/maximum-subarray/dpMaximumSubarray.js new file mode 100644 index 000000000..12f919d73 --- /dev/null +++ b/src/algorithms/sets/maximum-subarray/dpMaximumSubarray.js @@ -0,0 +1,62 @@ +/** + * Dynamic Programming solution. + * Complexity: O(n) + * + * @param {Number[]} inputArray + * @return {Number[]} + */ +export default function dpMaximumSubarray(inputArray) { + // Check if all elements of inputArray are negative ones and return the highest + // one in this case. + let allNegative = true; + let highestElementValue = null; + for (let i = 0; i < inputArray.length; i += 1) { + if (inputArray[i] >= 0) { + allNegative = false; + } + + if (highestElementValue === null || highestElementValue < inputArray[i]) { + highestElementValue = inputArray[i]; + } + } + + if (allNegative && highestElementValue !== null) { + return [highestElementValue]; + } + + // Let's assume that there is at list one positive integer exists in array. + // And thus the maximum sum will for sure be grater then 0. Thus we're able + // to always reset max sum to zero. + let maxSum = 0; + + // This array will keep a combination that gave the highest sum. + let maxSubArray = []; + + // Current sum and subarray that will memoize all previous computations. + let currentSum = 0; + let currentSubArray = []; + + for (let i = 0; i < inputArray.length; i += 1) { + // Let's add current element value to the current sum. + currentSum += inputArray[i]; + + if (currentSum < 0) { + // If the sum went below zero then reset it and don't add current element to max subarray. + currentSum = 0; + // Reset current subarray. + currentSubArray = []; + } else { + // If current sum stays positive then add current element to current sub array. + currentSubArray.push(inputArray[i]); + + if (currentSum > maxSum) { + // If current sum became greater then max registered sum then update + // max sum and max subarray. + maxSum = currentSum; + maxSubArray = currentSubArray.slice(); + } + } + } + + return maxSubArray; +} From e0be03c4d623d6850fda0d038f186417f472bd87 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Tue, 1 May 2018 11:24:27 +0300 Subject: [PATCH 236/327] Add maximum subarray. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d10fa6ba2..8dfd71f42 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ * [Longest Increasing subsequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/longest-increasing-subsequence) * [Shortest Common Supersequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/shortest-common-supersequence) (SCS) * [Knapsack Problem](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/knapsack-problem) - "0/1" and "Unbound" ones - * [Maximum Subarray](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/maximum-subarray) - "Brute Force" and "Dynamic Programming" versions + * [Maximum Subarray](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/maximum-subarray) - "Brute Force" and "Dynamic Programming" (Kadane's) versions * **String** * [Levenshtein Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/levenshtein-distance) - minimum edit distance between two sequences * [Hamming Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/hamming-distance) - number of positions at which the symbols are different From bfe017f1c090e068fa17a4ac903c0656f644ad19 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Tue, 1 May 2018 13:12:07 +0300 Subject: [PATCH 237/327] Update README. --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 8dfd71f42..a1541cf1b 100644 --- a/README.md +++ b/README.md @@ -102,7 +102,6 @@ * [0/1 Knapsack Problem](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/knapsack-problem) * [Integer Partition](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/integer-partition) * [Maximum Subarray](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/maximum-subarray) - * Maximum sum path * **Backtracking** * **Branch & Bound** From 4d3093d290de6e193135394c9dd2307951291542 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Wed, 2 May 2018 08:15:20 +0300 Subject: [PATCH 238/327] Add dijkstra. --- README.md | 5 +- src/algorithms/graph/dijkstra/README.md | 25 ++++++++ .../graph/dijkstra/__test__/dijkstra.test.js | 59 +++++++++++++++++++ src/algorithms/graph/dijkstra/dijkstra.js | 48 +++++++++++++++ src/data-structures/graph/Graph.js | 1 + 5 files changed, 136 insertions(+), 2 deletions(-) create mode 100644 src/algorithms/graph/dijkstra/README.md create mode 100644 src/algorithms/graph/dijkstra/__test__/dijkstra.test.js create mode 100644 src/algorithms/graph/dijkstra/dijkstra.js diff --git a/README.md b/README.md index a1541cf1b..3a03cfa16 100644 --- a/README.md +++ b/README.md @@ -65,11 +65,11 @@ * **Graph** * [Depth-First Search](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/depth-first-search) (DFS) * [Breadth-First Search](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/breadth-first-search) (BFS) + * [Dijkstra Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/dijkstra) - finding shortest path + * Bellman Ford * Detect Cycle * Topological Sorting - * Dijkstra Algorithm to Find Shortest Path * Eulerian path, Eulerian circuit - * Bellman Ford * Strongly Connected Component algorithm * Shortest Path Faster Algorithm (SPFA) * **Minimum Spanning Tree** @@ -84,6 +84,7 @@ * **Greedy** * [Unbound Knapsack Problem](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/knapsack-problem) + * [Dijkstra Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/dijkstra) - finding shortest path * **Divide and Conquer** * [Euclidean Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/euclidean-algorithm) - calculate the Greatest Common Divisor (GCD) * [Permutations](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/permutations) (with and without repetitions) diff --git a/src/algorithms/graph/dijkstra/README.md b/src/algorithms/graph/dijkstra/README.md new file mode 100644 index 000000000..6fdacb0b1 --- /dev/null +++ b/src/algorithms/graph/dijkstra/README.md @@ -0,0 +1,25 @@ +# Dijkstra's Algorithm + +Dijkstra's algorithm is an algorithm for finding the shortest +paths between nodes in a graph, which may represent, for example, +road networks. + +The algorithm exists in many variants; Dijkstra's original variant +found the shortest path between two nodes, but a more common +variant fixes a single node as the "source" node and finds +shortest paths from the source to all other nodes in the graph, +producing a shortest-path tree. + +![Dijkstra](https://upload.wikimedia.org/wikipedia/commons/5/57/Dijkstra_Animation.gif) + +Dijkstra's algorithm to find the shortest path between `a` and `b`. +It picks the unvisited vertex with the lowest distance, +calculates the distance through it to each unvisited neighbor, +and updates the neighbor's distance if smaller. Mark visited +(set to red) when done with neighbors. + +## References + +- [Wikipedia](https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm) +- [On YouTube by Nathaniel Fan](https://www.youtube.com/watch?v=gdmfOwyQlcI) +- [On YouTube by Tushar Roy](https://www.youtube.com/watch?v=lAXZGERcDf4) diff --git a/src/algorithms/graph/dijkstra/__test__/dijkstra.test.js b/src/algorithms/graph/dijkstra/__test__/dijkstra.test.js new file mode 100644 index 000000000..3d76f21d7 --- /dev/null +++ b/src/algorithms/graph/dijkstra/__test__/dijkstra.test.js @@ -0,0 +1,59 @@ +import GraphVertex from '../../../../data-structures/graph/GraphVertex'; +import GraphEdge from '../../../../data-structures/graph/GraphEdge'; +import Graph from '../../../../data-structures/graph/Graph'; +import dijkstra from '../dijkstra'; + +describe('dijkstra', () => { + it('should find minimum paths to all vertices', () => { + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + const vertexC = new GraphVertex('C'); + const vertexD = new GraphVertex('D'); + const vertexE = new GraphVertex('E'); + const vertexF = new GraphVertex('F'); + const vertexG = new GraphVertex('G'); + const vertexH = new GraphVertex('H'); + + const edgeAB = new GraphEdge(vertexA, vertexB, 4); + const edgeAE = new GraphEdge(vertexA, vertexE, 7); + const edgeAC = new GraphEdge(vertexA, vertexC, 3); + const edgeBC = new GraphEdge(vertexB, vertexC, 6); + const edgeBD = new GraphEdge(vertexB, vertexD, 5); + const edgeEC = new GraphEdge(vertexE, vertexC, 8); + const edgeED = new GraphEdge(vertexE, vertexD, 2); + const edgeDC = new GraphEdge(vertexD, vertexC, 11); + const edgeDG = new GraphEdge(vertexD, vertexG, 10); + const edgeDF = new GraphEdge(vertexD, vertexF, 2); + const edgeFG = new GraphEdge(vertexF, vertexG, 3); + const edgeEG = new GraphEdge(vertexE, vertexG, 5); + + const graph = new Graph(); + graph + .addVertex(vertexH) + .addEdge(edgeAB) + .addEdge(edgeAE) + .addEdge(edgeAC) + .addEdge(edgeBC) + .addEdge(edgeBD) + .addEdge(edgeEC) + .addEdge(edgeED) + .addEdge(edgeDC) + .addEdge(edgeDG) + .addEdge(edgeDF) + .addEdge(edgeFG) + .addEdge(edgeEG); + + const distances = dijkstra(graph, vertexA); + + expect(distances).toEqual({ + H: Infinity, + A: 0, + B: 4, + E: 7, + C: 3, + D: 9, + G: 12, + F: 11, + }); + }); +}); diff --git a/src/algorithms/graph/dijkstra/dijkstra.js b/src/algorithms/graph/dijkstra/dijkstra.js new file mode 100644 index 000000000..5e192febb --- /dev/null +++ b/src/algorithms/graph/dijkstra/dijkstra.js @@ -0,0 +1,48 @@ +import PriorityQueue from '../../../data-structures/priority-queue/PriorityQueue'; + +/** + * @param {Graph} graph + * @param {GraphVertex} startVertex + */ +export default function dijkstra(graph, startVertex) { + const distances = {}; + const visitedVertices = {}; + const queue = new PriorityQueue(); + + // Init all distances with infinity assuming that currently we can't reach + // any of the vertices except start one. + Object.keys(graph.vertices).forEach((vertexKey) => { + distances[vertexKey] = Infinity; + }); + distances[startVertex.getKey()] = 0; + + // Init vertices queue. + queue.add(startVertex, distances[startVertex.getKey()]); + + while (!queue.isEmpty()) { + const currentVertex = queue.poll(); + + graph.getNeighbors(currentVertex).forEach((neighbor) => { + // Don't visit already visited vertices. + if (!visitedVertices[neighbor.getKey()]) { + // Update distances to every neighbor from current vertex. + const edge = graph.findEdge(currentVertex, neighbor); + + const existingDistanceToNeighbor = distances[neighbor.getKey()]; + const distanceToNeighborFromCurrent = distances[currentVertex.getKey()] + edge.weight; + + if (distanceToNeighborFromCurrent < existingDistanceToNeighbor) { + distances[neighbor.getKey()] = distanceToNeighborFromCurrent; + } + + // Add neighbor to the queue for further visiting. + queue.add(neighbor, distances[neighbor.getKey()]); + } + }); + + // Add current vertex to visited ones. + visitedVertices[currentVertex.getKey()] = currentVertex; + } + + return distances; +} diff --git a/src/data-structures/graph/Graph.js b/src/data-structures/graph/Graph.js index b9699d08f..fb047da18 100644 --- a/src/data-structures/graph/Graph.js +++ b/src/data-structures/graph/Graph.js @@ -71,6 +71,7 @@ export default class Graph { /** * @param {GraphVertex} startVertex * @param {GraphVertex} endVertex + * @return {(GraphEdge|null)} */ findEdge(startVertex, endVertex) { const vertex = this.getVertexByKey(startVertex.getKey()); From 06a4e832feac5c967f49f2a85e018e70ff61a459 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Wed, 2 May 2018 20:41:13 +0300 Subject: [PATCH 239/327] Update Heap. --- src/data-structures/heap/MinHeap.js | 74 +++++++++++++++++++ .../heap/__test__/MinHeap.test.js | 16 ++++ 2 files changed, 90 insertions(+) diff --git a/src/data-structures/heap/MinHeap.js b/src/data-structures/heap/MinHeap.js index 6eb2d8439..03ac243f3 100644 --- a/src/data-structures/heap/MinHeap.js +++ b/src/data-structures/heap/MinHeap.js @@ -1,54 +1,100 @@ import Comparator from '../../utils/comparator/Comparator'; export default class MinHeap { + /** + * @param {Function} [comparatorFunction] + */ constructor(comparatorFunction) { // Array representation of the heap. this.heapContainer = []; this.compare = new Comparator(comparatorFunction); } + /** + * @param {number} parentIndex + * @return {number} + */ static getLeftChildIndex(parentIndex) { return (2 * parentIndex) + 1; } + /** + * @param {number} parentIndex + * @return {number} + */ static getRightChildIndex(parentIndex) { return (2 * parentIndex) + 2; } + /** + * @param {number} childIndex + * @return {number} + */ static getParentIndex(childIndex) { return Math.floor((childIndex - 1) / 2); } + /** + * @param {number} childIndex + * @return {boolean} + */ static hasParent(childIndex) { return this.getParentIndex(childIndex) >= 0; } + /** + * @param {number} parentIndex + * @return {boolean} + */ hasLeftChild(parentIndex) { return MinHeap.getLeftChildIndex(parentIndex) < this.heapContainer.length; } + /** + * @param {number} parentIndex + * @return {boolean} + */ hasRightChild(parentIndex) { return MinHeap.getRightChildIndex(parentIndex) < this.heapContainer.length; } + /** + * @param {number} parentIndex + * @return {*} + */ leftChild(parentIndex) { return this.heapContainer[MinHeap.getLeftChildIndex(parentIndex)]; } + /** + * @param {number} parentIndex + * @return {*} + */ rightChild(parentIndex) { return this.heapContainer[MinHeap.getRightChildIndex(parentIndex)]; } + /** + * @param {number} childIndex + * @return {*} + */ parent(childIndex) { return this.heapContainer[MinHeap.getParentIndex(childIndex)]; } + /** + * @param {number} indexOne + * @param {number} indexTwo + */ swap(indexOne, indexTwo) { const tmp = this.heapContainer[indexTwo]; this.heapContainer[indexTwo] = this.heapContainer[indexOne]; this.heapContainer[indexOne] = tmp; } + /** + * @return {*} + */ peek() { if (this.heapContainer.length === 0) { return null; @@ -57,6 +103,9 @@ export default class MinHeap { return this.heapContainer[0]; } + /** + * @return {*} + */ poll() { if (this.heapContainer.length === 0) { return null; @@ -75,11 +124,30 @@ export default class MinHeap { return item; } + /** + * @param {*} item + */ add(item) { this.heapContainer.push(item); this.heapifyUp(); } + /** + * @param {*} item + * @return {Number[]} + */ + findItem(item) { + const foundItemIndices = []; + + for (let itemIndex = 0; itemIndex < this.heapContainer.length; itemIndex += 1) { + if (this.compare.equal(item, this.heapContainer[itemIndex])) { + foundItemIndices.push(itemIndex); + } + } + + return foundItemIndices; + } + heapifyUp() { // Take last element (last in array or the bottom left in a tree) in // a heap container and lift him up until we find the parent element @@ -120,10 +188,16 @@ export default class MinHeap { } } + /** + * @return {boolean} + */ isEmpty() { return !this.heapContainer.length; } + /** + * @return {string} + */ toString() { return this.heapContainer.toString(); } diff --git a/src/data-structures/heap/__test__/MinHeap.test.js b/src/data-structures/heap/__test__/MinHeap.test.js index 6dc7c1620..15c44d071 100644 --- a/src/data-structures/heap/__test__/MinHeap.test.js +++ b/src/data-structures/heap/__test__/MinHeap.test.js @@ -88,4 +88,20 @@ describe('MinHeap', () => { expect(minHeap.poll()).toBe(3); expect(minHeap.toString()).toBe('10,11,12'); }); + + it('should be possible to find item indices in heap', () => { + const minHeap = new MinHeap(); + + minHeap.add(3); + minHeap.add(12); + minHeap.add(10); + minHeap.add(11); + minHeap.add(11); + + expect(minHeap.toString()).toBe('3,11,10,12,11'); + + expect(minHeap.findItem(5)).toEqual([]); + expect(minHeap.findItem(3)).toEqual([0]); + expect(minHeap.findItem(11)).toEqual([1, 4]); + }); }); From c048ca44b8194fc821c33fe4813434e56cced79d Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Wed, 2 May 2018 21:22:12 +0300 Subject: [PATCH 240/327] Make it possible to remove from Heap. --- src/data-structures/heap/MinHeap.js | 92 +++++++++++++++---- .../heap/__test__/MinHeap.test.js | 49 +++++++++- 2 files changed, 118 insertions(+), 23 deletions(-) diff --git a/src/data-structures/heap/MinHeap.js b/src/data-structures/heap/MinHeap.js index 03ac243f3..1d2c4e3ea 100644 --- a/src/data-structures/heap/MinHeap.js +++ b/src/data-structures/heap/MinHeap.js @@ -14,7 +14,7 @@ export default class MinHeap { * @param {number} parentIndex * @return {number} */ - static getLeftChildIndex(parentIndex) { + getLeftChildIndex(parentIndex) { return (2 * parentIndex) + 1; } @@ -22,7 +22,7 @@ export default class MinHeap { * @param {number} parentIndex * @return {number} */ - static getRightChildIndex(parentIndex) { + getRightChildIndex(parentIndex) { return (2 * parentIndex) + 2; } @@ -30,7 +30,7 @@ export default class MinHeap { * @param {number} childIndex * @return {number} */ - static getParentIndex(childIndex) { + getParentIndex(childIndex) { return Math.floor((childIndex - 1) / 2); } @@ -38,7 +38,7 @@ export default class MinHeap { * @param {number} childIndex * @return {boolean} */ - static hasParent(childIndex) { + hasParent(childIndex) { return this.getParentIndex(childIndex) >= 0; } @@ -47,7 +47,7 @@ export default class MinHeap { * @return {boolean} */ hasLeftChild(parentIndex) { - return MinHeap.getLeftChildIndex(parentIndex) < this.heapContainer.length; + return this.getLeftChildIndex(parentIndex) < this.heapContainer.length; } /** @@ -55,7 +55,7 @@ export default class MinHeap { * @return {boolean} */ hasRightChild(parentIndex) { - return MinHeap.getRightChildIndex(parentIndex) < this.heapContainer.length; + return this.getRightChildIndex(parentIndex) < this.heapContainer.length; } /** @@ -63,7 +63,7 @@ export default class MinHeap { * @return {*} */ leftChild(parentIndex) { - return this.heapContainer[MinHeap.getLeftChildIndex(parentIndex)]; + return this.heapContainer[this.getLeftChildIndex(parentIndex)]; } /** @@ -71,7 +71,7 @@ export default class MinHeap { * @return {*} */ rightChild(parentIndex) { - return this.heapContainer[MinHeap.getRightChildIndex(parentIndex)]; + return this.heapContainer[this.getRightChildIndex(parentIndex)]; } /** @@ -79,7 +79,7 @@ export default class MinHeap { * @return {*} */ parent(childIndex) { - return this.heapContainer[MinHeap.getParentIndex(childIndex)]; + return this.heapContainer[this.getParentIndex(childIndex)]; } /** @@ -126,17 +126,63 @@ export default class MinHeap { /** * @param {*} item + * @return {MinHeap} */ add(item) { this.heapContainer.push(item); this.heapifyUp(); + return this; + } + + /** + * @param {*} item + * @return {MinHeap} + */ + remove(item) { + // Find number of items to remove. + const numberOfItemsToRemove = this.find(item).length; + + for (let iteration = 0; iteration < numberOfItemsToRemove; iteration += 1) { + // We need to find item index to remove each time after removal since + // indices are being change after each heapify process. + const indexToRemove = this.find(item).pop(); + + // If we need to remove last child in the heap then just remove it. + // There is no need to heapify the heap afterwards. + if (indexToRemove === (this.heapContainer.length - 1)) { + this.heapContainer.pop(); + } else { + // Move last element in heap to the vacant (removed) position. + this.heapContainer[indexToRemove] = this.heapContainer.pop(); + + // Get parent. + const parentItem = this.hasParent(indexToRemove) ? this.parent(indexToRemove) : null; + const leftChild = this.hasLeftChild(indexToRemove) ? this.leftChild(indexToRemove) : null; + + // If there is no parent or parent is less then node to delete then heapify down. + // Otherwise heapify up. + if ( + leftChild !== null && + ( + parentItem === null || + this.compare.lessThen(parentItem, this.heapContainer[indexToRemove]) + ) + ) { + this.heapifyDown(indexToRemove); + } else { + this.heapifyUp(indexToRemove); + } + } + } + + return this; } /** * @param {*} item * @return {Number[]} */ - findItem(item) { + find(item) { const foundItemIndices = []; for (let itemIndex = 0; itemIndex < this.heapContainer.length; itemIndex += 1) { @@ -148,35 +194,41 @@ export default class MinHeap { return foundItemIndices; } - heapifyUp() { + /** + * @param {number} [customStartIndex] + */ + heapifyUp(customStartIndex) { // Take last element (last in array or the bottom left in a tree) in // a heap container and lift him up until we find the parent element // that is less then the current new one. - let currentIndex = this.heapContainer.length - 1; + let currentIndex = customStartIndex || this.heapContainer.length - 1; while ( - MinHeap.hasParent(currentIndex) && + this.hasParent(currentIndex) && this.compare.lessThen(this.heapContainer[currentIndex], this.parent(currentIndex)) ) { - this.swap(currentIndex, MinHeap.getParentIndex(currentIndex)); - currentIndex = MinHeap.getParentIndex(currentIndex); + this.swap(currentIndex, this.getParentIndex(currentIndex)); + currentIndex = this.getParentIndex(currentIndex); } } - heapifyDown() { + /** + * @param {number} [customStartIndex] + */ + heapifyDown(customStartIndex) { // Compare the root element to its children and swap root with the smallest // of children. Do the same for next children after swap. - let currentIndex = 0; - let nextIndex = 0; + let currentIndex = customStartIndex || 0; + let nextIndex = null; while (this.hasLeftChild(currentIndex)) { if ( this.hasRightChild(currentIndex) && this.compare.lessThen(this.rightChild(currentIndex), this.leftChild(currentIndex)) ) { - nextIndex = MinHeap.getRightChildIndex(currentIndex); + nextIndex = this.getRightChildIndex(currentIndex); } else { - nextIndex = MinHeap.getLeftChildIndex(currentIndex); + nextIndex = this.getLeftChildIndex(currentIndex); } if (this.compare.lessThen(this.heapContainer[currentIndex], this.heapContainer[nextIndex])) { diff --git a/src/data-structures/heap/__test__/MinHeap.test.js b/src/data-structures/heap/__test__/MinHeap.test.js index 15c44d071..f4ce4ac38 100644 --- a/src/data-structures/heap/__test__/MinHeap.test.js +++ b/src/data-structures/heap/__test__/MinHeap.test.js @@ -100,8 +100,51 @@ describe('MinHeap', () => { expect(minHeap.toString()).toBe('3,11,10,12,11'); - expect(minHeap.findItem(5)).toEqual([]); - expect(minHeap.findItem(3)).toEqual([0]); - expect(minHeap.findItem(11)).toEqual([1, 4]); + expect(minHeap.find(5)).toEqual([]); + expect(minHeap.find(3)).toEqual([0]); + expect(minHeap.find(11)).toEqual([1, 4]); + }); + + it('should be possible to remove items from heap with heapify down', () => { + const minHeap = new MinHeap(); + + minHeap.add(3); + minHeap.add(12); + minHeap.add(10); + minHeap.add(11); + minHeap.add(11); + + expect(minHeap.toString()).toBe('3,11,10,12,11'); + + expect(minHeap.remove(3).toString()).toEqual('10,11,11,12'); + expect(minHeap.remove(3).peek()).toEqual(10); + expect(minHeap.remove(11).toString()).toEqual('10,12'); + expect(minHeap.remove(3).peek()).toEqual(10); + }); + + it('should be possible to remove items from heap with heapify up', () => { + const minHeap = new MinHeap(); + + minHeap.add(3); + minHeap.add(10); + minHeap.add(5); + minHeap.add(6); + minHeap.add(7); + minHeap.add(4); + minHeap.add(6); + minHeap.add(8); + minHeap.add(2); + minHeap.add(1); + + expect(minHeap.toString()).toBe('1,2,4,6,3,5,6,10,8,7'); + expect(minHeap.remove(8).toString()).toEqual('1,2,4,6,3,5,6,10,7'); + expect(minHeap.remove(7).toString()).toEqual('1,2,4,6,3,5,6,10'); + expect(minHeap.remove(1).toString()).toEqual('2,3,4,6,10,5,6'); + expect(minHeap.remove(2).toString()).toEqual('3,6,4,6,10,5'); + expect(minHeap.remove(6).toString()).toEqual('3,5,4,10'); + expect(minHeap.remove(10).toString()).toEqual('3,5,4'); + expect(minHeap.remove(5).toString()).toEqual('3,4'); + expect(minHeap.remove(3).toString()).toEqual('4'); + expect(minHeap.remove(4).toString()).toEqual(''); }); }); From 57eff6a821c45d475842b1ff09ad3a485661207c Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 3 May 2018 06:34:32 +0300 Subject: [PATCH 241/327] Make it possible to change priority of PriorityQueue. --- src/data-structures/heap/MinHeap.js | 12 +++-- .../priority-queue/PriorityQueue.js | 43 +++++++++++++++ .../__test__/PriorityQueue.test.js | 54 +++++++++++++++++++ 3 files changed, 105 insertions(+), 4 deletions(-) diff --git a/src/data-structures/heap/MinHeap.js b/src/data-structures/heap/MinHeap.js index 1d2c4e3ea..5cd52e2e7 100644 --- a/src/data-structures/heap/MinHeap.js +++ b/src/data-structures/heap/MinHeap.js @@ -136,16 +136,18 @@ export default class MinHeap { /** * @param {*} item + * @param {Comparator} [customFindingComparator] * @return {MinHeap} */ - remove(item) { + remove(item, customFindingComparator) { // Find number of items to remove. const numberOfItemsToRemove = this.find(item).length; + const customComparator = customFindingComparator || this.compare; for (let iteration = 0; iteration < numberOfItemsToRemove; iteration += 1) { // We need to find item index to remove each time after removal since // indices are being change after each heapify process. - const indexToRemove = this.find(item).pop(); + const indexToRemove = this.find(item, customComparator).pop(); // If we need to remove last child in the heap then just remove it. // There is no need to heapify the heap afterwards. @@ -180,13 +182,15 @@ export default class MinHeap { /** * @param {*} item + * @param {Comparator} [customComparator] * @return {Number[]} */ - find(item) { + find(item, customComparator) { const foundItemIndices = []; + const comparator = customComparator || this.compare; for (let itemIndex = 0; itemIndex < this.heapContainer.length; itemIndex += 1) { - if (this.compare.equal(item, this.heapContainer[itemIndex])) { + if (comparator.equal(item, this.heapContainer[itemIndex])) { foundItemIndices.push(itemIndex); } } diff --git a/src/data-structures/priority-queue/PriorityQueue.js b/src/data-structures/priority-queue/PriorityQueue.js index 0a425f5ef..32538a613 100644 --- a/src/data-structures/priority-queue/PriorityQueue.js +++ b/src/data-structures/priority-queue/PriorityQueue.js @@ -10,11 +10,54 @@ export default class PriorityQueue extends MinHeap { this.compare = new Comparator(this.comparePriority.bind(this)); } + /** + * @param {*} item + * @param {number} [priority] + * @return {PriorityQueue} + */ add(item, priority = 0) { this.priorities[item] = priority; super.add(item); + + return this; + } + + /** + * @param {*} item + * @param {Comparator} [customFindingComparator] + * @return {PriorityQueue} + */ + remove(item, customFindingComparator) { + super.remove(item, customFindingComparator); + delete this.priorities[item]; + + return this; + } + + /** + * @param {*} item + * @param {number} priority + * @return {PriorityQueue} + */ + changePriority(item, priority) { + const customFindingComparator = new Comparator((a, b) => { + if (a === b) { + return 0; + } + return a < b ? -1 : 1; + }); + + this.remove(item, customFindingComparator); + this.add(item, priority); + + return this; } + /** + * @param {*} a + * @param {*} b + * @return {number} + */ comparePriority(a, b) { if (this.priorities[a] === this.priorities[b]) { return 0; diff --git a/src/data-structures/priority-queue/__test__/PriorityQueue.test.js b/src/data-structures/priority-queue/__test__/PriorityQueue.test.js index 1473d2d8f..5d3a20fa5 100644 --- a/src/data-structures/priority-queue/__test__/PriorityQueue.test.js +++ b/src/data-structures/priority-queue/__test__/PriorityQueue.test.js @@ -33,4 +33,58 @@ describe('PriorityQueue', () => { expect(priorityQueue.poll()).toBe(10); expect(priorityQueue.poll()).toBe(5); }); + + it('should be possible to change priority of internal nodes', () => { + const priorityQueue = new PriorityQueue(); + + priorityQueue.add(10, 1); + priorityQueue.add(5, 2); + priorityQueue.add(100, 0); + priorityQueue.add(200, 0); + + priorityQueue.changePriority(100, 10); + priorityQueue.changePriority(10, 20); + + expect(priorityQueue.poll()).toBe(200); + expect(priorityQueue.poll()).toBe(5); + expect(priorityQueue.poll()).toBe(100); + expect(priorityQueue.poll()).toBe(10); + }); + + it('should be possible to change priority of head node', () => { + const priorityQueue = new PriorityQueue(); + + priorityQueue.add(10, 1); + priorityQueue.add(5, 2); + priorityQueue.add(100, 0); + priorityQueue.add(200, 0); + + priorityQueue.changePriority(200, 10); + priorityQueue.changePriority(10, 20); + + expect(priorityQueue.poll()).toBe(100); + expect(priorityQueue.poll()).toBe(5); + expect(priorityQueue.poll()).toBe(200); + expect(priorityQueue.poll()).toBe(10); + }); + + it('should be possible to change priority along with node addition', () => { + const priorityQueue = new PriorityQueue(); + + priorityQueue.add(10, 1); + priorityQueue.add(5, 2); + priorityQueue.add(100, 0); + priorityQueue.add(200, 0); + + priorityQueue.changePriority(200, 10); + priorityQueue.changePriority(10, 20); + + priorityQueue.add(15, 15); + + expect(priorityQueue.poll()).toBe(100); + expect(priorityQueue.poll()).toBe(5); + expect(priorityQueue.poll()).toBe(200); + expect(priorityQueue.poll()).toBe(15); + expect(priorityQueue.poll()).toBe(10); + }); }); From f256de0cf0c11fa354a850d7a9f0151a4caa3206 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 3 May 2018 06:47:09 +0300 Subject: [PATCH 242/327] Add Dijkstra. --- src/algorithms/graph/dijkstra/dijkstra.js | 9 ++++- .../priority-queue/PriorityQueue.js | 38 +++++++++++++++---- .../__test__/PriorityQueue.test.js | 13 +++++++ 3 files changed, 51 insertions(+), 9 deletions(-) diff --git a/src/algorithms/graph/dijkstra/dijkstra.js b/src/algorithms/graph/dijkstra/dijkstra.js index 5e192febb..439efce38 100644 --- a/src/algorithms/graph/dijkstra/dijkstra.js +++ b/src/algorithms/graph/dijkstra/dijkstra.js @@ -33,10 +33,17 @@ export default function dijkstra(graph, startVertex) { if (distanceToNeighborFromCurrent < existingDistanceToNeighbor) { distances[neighbor.getKey()] = distanceToNeighborFromCurrent; + + // Change priority. + if (queue.hasValue(neighbor)) { + queue.changePriority(neighbor, distances[neighbor.getKey()]); + } } // Add neighbor to the queue for further visiting. - queue.add(neighbor, distances[neighbor.getKey()]); + if (!queue.hasValue(neighbor)) { + queue.add(neighbor, distances[neighbor.getKey()]); + } } }); diff --git a/src/data-structures/priority-queue/PriorityQueue.js b/src/data-structures/priority-queue/PriorityQueue.js index 32538a613..2bf27bb33 100644 --- a/src/data-structures/priority-queue/PriorityQueue.js +++ b/src/data-structures/priority-queue/PriorityQueue.js @@ -40,19 +40,28 @@ export default class PriorityQueue extends MinHeap { * @return {PriorityQueue} */ changePriority(item, priority) { - const customFindingComparator = new Comparator((a, b) => { - if (a === b) { - return 0; - } - return a < b ? -1 : 1; - }); - - this.remove(item, customFindingComparator); + this.remove(item, new Comparator(this.compareValue)); this.add(item, priority); return this; } + /** + * @param {*} item + * @return {Number[]} + */ + findByValue(item) { + return this.find(item, new Comparator(this.compareValue)); + } + + /** + * @param {*} item + * @return {boolean} + */ + hasValue(item) { + return this.findByValue(item).length > 0; + } + /** * @param {*} a * @param {*} b @@ -65,4 +74,17 @@ export default class PriorityQueue extends MinHeap { return this.priorities[a] < this.priorities[b] ? -1 : 1; } + + /** + * @param {*} a + * @param {*} b + * @return {number} + */ + compareValue(a, b) { + if (a === b) { + return 0; + } + + return a < b ? -1 : 1; + } } diff --git a/src/data-structures/priority-queue/__test__/PriorityQueue.test.js b/src/data-structures/priority-queue/__test__/PriorityQueue.test.js index 5d3a20fa5..e5f490cd3 100644 --- a/src/data-structures/priority-queue/__test__/PriorityQueue.test.js +++ b/src/data-structures/priority-queue/__test__/PriorityQueue.test.js @@ -87,4 +87,17 @@ describe('PriorityQueue', () => { expect(priorityQueue.poll()).toBe(15); expect(priorityQueue.poll()).toBe(10); }); + + it('should be possible to search in priority queue by value', () => { + const priorityQueue = new PriorityQueue(); + + priorityQueue.add(10, 1); + priorityQueue.add(5, 2); + priorityQueue.add(100, 0); + priorityQueue.add(200, 0); + priorityQueue.add(15, 15); + + expect(priorityQueue.hasValue(70)).toBeFalsy(); + expect(priorityQueue.hasValue(15)).toBeTruthy(); + }); }); From 452110784ad0691abf8853b4c0272044cda89ee9 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 3 May 2018 06:54:51 +0300 Subject: [PATCH 243/327] Add Dijkstra. --- src/algorithms/graph/dijkstra/__test__/dijkstra.test.js | 8 +++++++- src/algorithms/graph/dijkstra/dijkstra.js | 9 ++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/algorithms/graph/dijkstra/__test__/dijkstra.test.js b/src/algorithms/graph/dijkstra/__test__/dijkstra.test.js index 3d76f21d7..c4ce7af8c 100644 --- a/src/algorithms/graph/dijkstra/__test__/dijkstra.test.js +++ b/src/algorithms/graph/dijkstra/__test__/dijkstra.test.js @@ -43,7 +43,7 @@ describe('dijkstra', () => { .addEdge(edgeFG) .addEdge(edgeEG); - const distances = dijkstra(graph, vertexA); + const { distances, previousVertices } = dijkstra(graph, vertexA); expect(distances).toEqual({ H: Infinity, @@ -55,5 +55,11 @@ describe('dijkstra', () => { G: 12, F: 11, }); + + expect(previousVertices.F.getKey()).toBe('D'); + expect(previousVertices.D.getKey()).toBe('B'); + expect(previousVertices.B.getKey()).toBe('A'); + expect(previousVertices.G.getKey()).toBe('E'); + expect(previousVertices.C.getKey()).toBe('A'); }); }); diff --git a/src/algorithms/graph/dijkstra/dijkstra.js b/src/algorithms/graph/dijkstra/dijkstra.js index 439efce38..8d545ecc2 100644 --- a/src/algorithms/graph/dijkstra/dijkstra.js +++ b/src/algorithms/graph/dijkstra/dijkstra.js @@ -7,6 +7,7 @@ import PriorityQueue from '../../../data-structures/priority-queue/PriorityQueue export default function dijkstra(graph, startVertex) { const distances = {}; const visitedVertices = {}; + const previousVertices = {}; const queue = new PriorityQueue(); // Init all distances with infinity assuming that currently we can't reach @@ -38,6 +39,9 @@ export default function dijkstra(graph, startVertex) { if (queue.hasValue(neighbor)) { queue.changePriority(neighbor, distances[neighbor.getKey()]); } + + // Remember previous vertex. + previousVertices[neighbor.getKey()] = currentVertex; } // Add neighbor to the queue for further visiting. @@ -51,5 +55,8 @@ export default function dijkstra(graph, startVertex) { visitedVertices[currentVertex.getKey()] = currentVertex; } - return distances; + return { + distances, + previousVertices, + }; } From 2fde66a4e4795774c7608b4341ac96b7719c6aa0 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 3 May 2018 09:58:00 +0300 Subject: [PATCH 244/327] Add Bellman-Ford. --- README.md | 7 ++- src/algorithms/graph/bellman-ford/README.md | 21 +++++++ .../bellman-ford/__test__/bellmanFord.test.js | 56 +++++++++++++++++++ .../graph/bellman-ford/bellmanFord.js | 45 +++++++++++++++ .../graph/dijkstra/__test__/dijkstra.test.js | 2 + src/algorithms/graph/dijkstra/dijkstra.js | 5 +- src/data-structures/graph/Graph.js | 7 +++ .../graph/__test__/Graph.test.js | 4 ++ 8 files changed, 142 insertions(+), 5 deletions(-) create mode 100644 src/algorithms/graph/bellman-ford/README.md create mode 100644 src/algorithms/graph/bellman-ford/__test__/bellmanFord.test.js create mode 100644 src/algorithms/graph/bellman-ford/bellmanFord.js diff --git a/README.md b/README.md index 3a03cfa16..3ecdefc52 100644 --- a/README.md +++ b/README.md @@ -65,8 +65,8 @@ * **Graph** * [Depth-First Search](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/depth-first-search) (DFS) * [Breadth-First Search](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/breadth-first-search) (BFS) - * [Dijkstra Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/dijkstra) - finding shortest path - * Bellman Ford + * [Dijkstra Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/dijkstra) - finding shortest path to all graph vertices + * [Bellman-Ford Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/bellman-ford) - finding shortest path to all graph vertices * Detect Cycle * Topological Sorting * Eulerian path, Eulerian circuit @@ -84,7 +84,7 @@ * **Greedy** * [Unbound Knapsack Problem](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/knapsack-problem) - * [Dijkstra Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/dijkstra) - finding shortest path + * [Dijkstra Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/dijkstra) - finding shortest path to all graph vertices * **Divide and Conquer** * [Euclidean Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/euclidean-algorithm) - calculate the Greatest Common Divisor (GCD) * [Permutations](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/permutations) (with and without repetitions) @@ -103,6 +103,7 @@ * [0/1 Knapsack Problem](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/knapsack-problem) * [Integer Partition](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/integer-partition) * [Maximum Subarray](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/maximum-subarray) + * [Bellman-Ford Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/bellman-ford) - finding shortest path to all graph vertices * **Backtracking** * **Branch & Bound** diff --git a/src/algorithms/graph/bellman-ford/README.md b/src/algorithms/graph/bellman-ford/README.md new file mode 100644 index 000000000..b28318b2a --- /dev/null +++ b/src/algorithms/graph/bellman-ford/README.md @@ -0,0 +1,21 @@ +# Bellman–Ford Algorithm + +The Bellman–Ford algorithm is an algorithm that computes shortest +paths from a single source vertex to all of the other vertices +in a weighted digraph. It is slower than Dijkstra's algorithm +for the same problem, but more versatile, as it is capable of +handling graphs in which some of the edge weights are negative +numbers. + +![Bellman-Ford](https://upload.wikimedia.org/wikipedia/commons/2/2e/Shortest_path_Dijkstra_vs_BellmanFord.gif) + +## Complexity + +Worst-case performance `O(|V||E|)` +Best-case performance `O(|E|)` +Worst-case space complexity `O(|V|)` + +## References + +- [Wikipedia](https://en.wikipedia.org/wiki/Bellman%E2%80%93Ford_algorithm) +- [On YouTube by Michael Sambol](https://www.youtube.com/watch?v=obWXjtg0L64) diff --git a/src/algorithms/graph/bellman-ford/__test__/bellmanFord.test.js b/src/algorithms/graph/bellman-ford/__test__/bellmanFord.test.js new file mode 100644 index 000000000..54519b09c --- /dev/null +++ b/src/algorithms/graph/bellman-ford/__test__/bellmanFord.test.js @@ -0,0 +1,56 @@ +import GraphVertex from '../../../../data-structures/graph/GraphVertex'; +import GraphEdge from '../../../../data-structures/graph/GraphEdge'; +import Graph from '../../../../data-structures/graph/Graph'; +import bellmanFord from '../bellmanFord'; + +describe('bellmanFord', () => { + it('should find minimum paths to all vertices', () => { + const vertexS = new GraphVertex('S'); + const vertexE = new GraphVertex('E'); + const vertexA = new GraphVertex('A'); + const vertexD = new GraphVertex('D'); + const vertexB = new GraphVertex('B'); + const vertexC = new GraphVertex('C'); + const vertexH = new GraphVertex('H'); + + const edgeSE = new GraphEdge(vertexS, vertexE, 8); + const edgeSA = new GraphEdge(vertexS, vertexA, 10); + const edgeED = new GraphEdge(vertexE, vertexD, 1); + const edgeDA = new GraphEdge(vertexD, vertexA, -4); + const edgeDC = new GraphEdge(vertexD, vertexC, -1); + const edgeAC = new GraphEdge(vertexA, vertexC, 2); + const edgeCB = new GraphEdge(vertexC, vertexB, -2); + const edgeBA = new GraphEdge(vertexB, vertexA, 1); + + const graph = new Graph(true); + graph + .addVertex(vertexH) + .addEdge(edgeSE) + .addEdge(edgeSA) + .addEdge(edgeED) + .addEdge(edgeDA) + .addEdge(edgeDC) + .addEdge(edgeAC) + .addEdge(edgeCB) + .addEdge(edgeBA); + + const { distances, previousVertices } = bellmanFord(graph, vertexS); + + expect(distances).toEqual({ + H: Infinity, + S: 0, + A: 5, + B: 5, + C: 7, + D: 9, + E: 8, + }); + + expect(previousVertices.H).toBeNull(); + expect(previousVertices.S).toBeNull(); + expect(previousVertices.B.getKey()).toBe('C'); + expect(previousVertices.C.getKey()).toBe('A'); + expect(previousVertices.A.getKey()).toBe('D'); + expect(previousVertices.D.getKey()).toBe('E'); + }); +}); diff --git a/src/algorithms/graph/bellman-ford/bellmanFord.js b/src/algorithms/graph/bellman-ford/bellmanFord.js new file mode 100644 index 000000000..70e811d99 --- /dev/null +++ b/src/algorithms/graph/bellman-ford/bellmanFord.js @@ -0,0 +1,45 @@ +/** + * @param {Graph} graph + * @param {GraphVertex} startVertex + * @return {{distances, previousVertices}} + */ +export default function bellmanFord(graph, startVertex) { + const distances = {}; + const previousVertices = {}; + + // Init all distances with infinity assuming that currently we can't reach + // any of the vertices except start one. + distances[startVertex.getKey()] = 0; + graph.getAllVertices().forEach((vertex) => { + previousVertices[vertex.getKey()] = null; + if (vertex.getKey() !== startVertex.getKey()) { + distances[vertex.getKey()] = Infinity; + } + }); + + // We need (|V| - 1) iterations. + for (let iteration = 0; iteration < (graph.getAllVertices().length - 1); iteration += 1) { + // During each iteration go through all vertices. + Object.keys(distances).forEach((vertexKey) => { + const vertex = graph.getVertexByKey(vertexKey); + + // Go through all vertex edges. + graph.getNeighbors(vertex).forEach((neighbor) => { + const edge = graph.findEdge(vertex, neighbor); + // Find out if the distance to the neighbor is shorter in this iteration + // then in previous one. + const distanceToVertex = distances[vertex.getKey()]; + const distanceToNeighbor = distanceToVertex + edge.weight; + if (distanceToNeighbor < distances[neighbor.getKey()]) { + distances[neighbor.getKey()] = distanceToNeighbor; + previousVertices[neighbor.getKey()] = vertex; + } + }); + }); + } + + return { + distances, + previousVertices, + }; +} diff --git a/src/algorithms/graph/dijkstra/__test__/dijkstra.test.js b/src/algorithms/graph/dijkstra/__test__/dijkstra.test.js index c4ce7af8c..bdd75c521 100644 --- a/src/algorithms/graph/dijkstra/__test__/dijkstra.test.js +++ b/src/algorithms/graph/dijkstra/__test__/dijkstra.test.js @@ -61,5 +61,7 @@ describe('dijkstra', () => { expect(previousVertices.B.getKey()).toBe('A'); expect(previousVertices.G.getKey()).toBe('E'); expect(previousVertices.C.getKey()).toBe('A'); + expect(previousVertices.A).toBeNull(); + expect(previousVertices.H).toBeNull(); }); }); diff --git a/src/algorithms/graph/dijkstra/dijkstra.js b/src/algorithms/graph/dijkstra/dijkstra.js index 8d545ecc2..3614376ea 100644 --- a/src/algorithms/graph/dijkstra/dijkstra.js +++ b/src/algorithms/graph/dijkstra/dijkstra.js @@ -12,8 +12,9 @@ export default function dijkstra(graph, startVertex) { // Init all distances with infinity assuming that currently we can't reach // any of the vertices except start one. - Object.keys(graph.vertices).forEach((vertexKey) => { - distances[vertexKey] = Infinity; + graph.getAllVertices().forEach((vertex) => { + distances[vertex.getKey()] = Infinity; + previousVertices[vertex.getKey()] = null; }); distances[startVertex.getKey()] = 0; diff --git a/src/data-structures/graph/Graph.js b/src/data-structures/graph/Graph.js index fb047da18..cff44be8f 100644 --- a/src/data-structures/graph/Graph.js +++ b/src/data-structures/graph/Graph.js @@ -32,6 +32,13 @@ export default class Graph { return vertex.getNeighbors(); } + /** + * @return {GraphVertex[]} + */ + getAllVertices() { + return Object.values(this.vertices); + } + /** * @param {GraphEdge} edge * @returns {Graph} diff --git a/src/data-structures/graph/__test__/Graph.test.js b/src/data-structures/graph/__test__/Graph.test.js index 494fbd14d..a169de6b9 100644 --- a/src/data-structures/graph/__test__/Graph.test.js +++ b/src/data-structures/graph/__test__/Graph.test.js @@ -28,6 +28,10 @@ describe('Graph', () => { graph.addEdge(edgeAB); + expect(graph.getAllVertices().length).toBe(2); + expect(graph.getAllVertices()[0]).toEqual(vertexA); + expect(graph.getAllVertices()[1]).toEqual(vertexB); + const graphVertexA = graph.findVertexByKey(vertexA.getKey()); const graphVertexB = graph.findVertexByKey(vertexB.getKey()); From 2bc3569c814bb324be443e22fe666746872579bf Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 3 May 2018 12:37:17 +0300 Subject: [PATCH 245/327] Add Bellman-Ford. --- .../bellman-ford/__test__/bellmanFord.test.js | 63 ++++++++++++++++++- .../graph/dijkstra/__test__/dijkstra.test.js | 52 ++++++++++++++- 2 files changed, 113 insertions(+), 2 deletions(-) diff --git a/src/algorithms/graph/bellman-ford/__test__/bellmanFord.test.js b/src/algorithms/graph/bellman-ford/__test__/bellmanFord.test.js index 54519b09c..ffa30eba2 100644 --- a/src/algorithms/graph/bellman-ford/__test__/bellmanFord.test.js +++ b/src/algorithms/graph/bellman-ford/__test__/bellmanFord.test.js @@ -4,7 +4,68 @@ import Graph from '../../../../data-structures/graph/Graph'; import bellmanFord from '../bellmanFord'; describe('bellmanFord', () => { - it('should find minimum paths to all vertices', () => { + it('should find minimum paths to all vertices for undirected graph', () => { + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + const vertexC = new GraphVertex('C'); + const vertexD = new GraphVertex('D'); + const vertexE = new GraphVertex('E'); + const vertexF = new GraphVertex('F'); + const vertexG = new GraphVertex('G'); + const vertexH = new GraphVertex('H'); + + const edgeAB = new GraphEdge(vertexA, vertexB, 4); + const edgeAE = new GraphEdge(vertexA, vertexE, 7); + const edgeAC = new GraphEdge(vertexA, vertexC, 3); + const edgeBC = new GraphEdge(vertexB, vertexC, 6); + const edgeBD = new GraphEdge(vertexB, vertexD, 5); + const edgeEC = new GraphEdge(vertexE, vertexC, 8); + const edgeED = new GraphEdge(vertexE, vertexD, 2); + const edgeDC = new GraphEdge(vertexD, vertexC, 11); + const edgeDG = new GraphEdge(vertexD, vertexG, 10); + const edgeDF = new GraphEdge(vertexD, vertexF, 2); + const edgeFG = new GraphEdge(vertexF, vertexG, 3); + const edgeEG = new GraphEdge(vertexE, vertexG, 5); + + const graph = new Graph(); + graph + .addVertex(vertexH) + .addEdge(edgeAB) + .addEdge(edgeAE) + .addEdge(edgeAC) + .addEdge(edgeBC) + .addEdge(edgeBD) + .addEdge(edgeEC) + .addEdge(edgeED) + .addEdge(edgeDC) + .addEdge(edgeDG) + .addEdge(edgeDF) + .addEdge(edgeFG) + .addEdge(edgeEG); + + const { distances, previousVertices } = bellmanFord(graph, vertexA); + + expect(distances).toEqual({ + H: Infinity, + A: 0, + B: 4, + E: 7, + C: 3, + D: 9, + G: 12, + F: 11, + }); + + expect(previousVertices.F.getKey()).toBe('D'); + expect(previousVertices.D.getKey()).toBe('B'); + expect(previousVertices.B.getKey()).toBe('A'); + expect(previousVertices.G.getKey()).toBe('E'); + expect(previousVertices.C.getKey()).toBe('A'); + expect(previousVertices.A).toBeNull(); + expect(previousVertices.H).toBeNull(); + }); + + it('should find minimum paths to all vertices for directed graph with negative edge weights', () => { const vertexS = new GraphVertex('S'); const vertexE = new GraphVertex('E'); const vertexA = new GraphVertex('A'); diff --git a/src/algorithms/graph/dijkstra/__test__/dijkstra.test.js b/src/algorithms/graph/dijkstra/__test__/dijkstra.test.js index bdd75c521..f6c5a263f 100644 --- a/src/algorithms/graph/dijkstra/__test__/dijkstra.test.js +++ b/src/algorithms/graph/dijkstra/__test__/dijkstra.test.js @@ -4,7 +4,7 @@ import Graph from '../../../../data-structures/graph/Graph'; import dijkstra from '../dijkstra'; describe('dijkstra', () => { - it('should find minimum paths to all vertices', () => { + it('should find minimum paths to all vertices for undirected graph', () => { const vertexA = new GraphVertex('A'); const vertexB = new GraphVertex('B'); const vertexC = new GraphVertex('C'); @@ -64,4 +64,54 @@ describe('dijkstra', () => { expect(previousVertices.A).toBeNull(); expect(previousVertices.H).toBeNull(); }); + + it('should find minimum paths to all vertices for directed graph with negative edge weights', () => { + const vertexS = new GraphVertex('S'); + const vertexE = new GraphVertex('E'); + const vertexA = new GraphVertex('A'); + const vertexD = new GraphVertex('D'); + const vertexB = new GraphVertex('B'); + const vertexC = new GraphVertex('C'); + const vertexH = new GraphVertex('H'); + + const edgeSE = new GraphEdge(vertexS, vertexE, 8); + const edgeSA = new GraphEdge(vertexS, vertexA, 10); + const edgeED = new GraphEdge(vertexE, vertexD, 1); + const edgeDA = new GraphEdge(vertexD, vertexA, -4); + const edgeDC = new GraphEdge(vertexD, vertexC, -1); + const edgeAC = new GraphEdge(vertexA, vertexC, 2); + const edgeCB = new GraphEdge(vertexC, vertexB, -2); + const edgeBA = new GraphEdge(vertexB, vertexA, 1); + + const graph = new Graph(true); + graph + .addVertex(vertexH) + .addEdge(edgeSE) + .addEdge(edgeSA) + .addEdge(edgeED) + .addEdge(edgeDA) + .addEdge(edgeDC) + .addEdge(edgeAC) + .addEdge(edgeCB) + .addEdge(edgeBA); + + const { distances, previousVertices } = dijkstra(graph, vertexS); + + expect(distances).toEqual({ + H: Infinity, + S: 0, + A: 5, + B: 5, + C: 7, + D: 9, + E: 8, + }); + + expect(previousVertices.H).toBeNull(); + expect(previousVertices.S).toBeNull(); + expect(previousVertices.B.getKey()).toBe('C'); + expect(previousVertices.C.getKey()).toBe('A'); + expect(previousVertices.A.getKey()).toBe('D'); + expect(previousVertices.D.getKey()).toBe('E'); + }); }); From 36a07623ae0c75b161da6fb929d97e30539a8fa6 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 3 May 2018 16:49:46 +0300 Subject: [PATCH 246/327] Add disjoint set. --- README.md | 1 + .../disjoint-set/DisjointSet.js | 93 ++++++++++++ .../disjoint-set/DisjointSetItem.js | 94 ++++++++++++ src/data-structures/disjoint-set/README.md | 20 +++ .../disjoint-set/__test__/DisjointSet.test.js | 140 ++++++++++++++++++ .../__test__/DisjointSetItem.test.js | 115 ++++++++++++++ 6 files changed, 463 insertions(+) create mode 100644 src/data-structures/disjoint-set/DisjointSet.js create mode 100644 src/data-structures/disjoint-set/DisjointSetItem.js create mode 100644 src/data-structures/disjoint-set/README.md create mode 100644 src/data-structures/disjoint-set/__test__/DisjointSet.test.js create mode 100644 src/data-structures/disjoint-set/__test__/DisjointSetItem.test.js diff --git a/README.md b/README.md index 3ecdefc52..faa95c899 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ * Segment Tree or Interval Tree * Binary Indexed Tree or Fenwick Tree 9. [Graph](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/graph) (both directed and undirected) +9. [Disjoint Set](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/disjoint-set) ## Algorithms diff --git a/src/data-structures/disjoint-set/DisjointSet.js b/src/data-structures/disjoint-set/DisjointSet.js new file mode 100644 index 000000000..c7f786c0d --- /dev/null +++ b/src/data-structures/disjoint-set/DisjointSet.js @@ -0,0 +1,93 @@ +import DisjointSetItem from './DisjointSetItem'; + +export default class DisjointSet { + /** + * @param {function(value: *)} [keyCallback] + */ + constructor(keyCallback) { + this.keyCallback = keyCallback; + this.items = {}; + } + + /** + * @param {*} itemValue + * @return {DisjointSet} + */ + makeSet(itemValue) { + const disjointSetItem = new DisjointSetItem(itemValue, this.keyCallback); + + if (!this.items[disjointSetItem.getKey()]) { + // Add new item only in case if it not presented yet. + this.items[disjointSetItem.getKey()] = disjointSetItem; + } + + return this; + } + + /** + * @param {*} itemValue + * @return {(string|null)} + */ + find(itemValue) { + const templateDisjointItem = new DisjointSetItem(itemValue, this.keyCallback); + + // Try to find item itself; + const requiredDisjointItem = this.items[templateDisjointItem.getKey()]; + + if (!requiredDisjointItem) { + return null; + } + + return requiredDisjointItem.getRoot().getKey(); + } + + /** + * @param {*} valueA + * @param {*} valueB + * @return {DisjointSet} + */ + union(valueA, valueB) { + const rootKeyA = this.find(valueA); + const rootKeyB = this.find(valueB); + + if (rootKeyA === null || rootKeyB === null) { + throw new Error('One or two values are not in sets'); + } + + if (rootKeyA === rootKeyB) { + // In case if both elements are already in the same set then just return its key. + return this; + } + + const rootA = this.items[rootKeyA]; + const rootB = this.items[rootKeyB]; + + if (rootA.getAncestorsCount() < rootB.getAncestorsCount()) { + // If rootB's tree is bigger then make rootB to be a new root. + rootB.addChild(rootA); + + return rootB.getKey(); + } + + // If rootA's tree is bigger then make rootA to be a new root. + rootA.addChild(rootB); + + return this; + } + + /** + * @param {*} valueA + * @param {*} valueB + * @return {boolean} + */ + inSameSet(valueA, valueB) { + const rootKeyA = this.find(valueA); + const rootKeyB = this.find(valueB); + + if (rootKeyA === null || rootKeyB === null) { + throw new Error('One or two values are not in sets'); + } + + return rootKeyA === rootKeyB; + } +} diff --git a/src/data-structures/disjoint-set/DisjointSetItem.js b/src/data-structures/disjoint-set/DisjointSetItem.js new file mode 100644 index 000000000..fece064fa --- /dev/null +++ b/src/data-structures/disjoint-set/DisjointSetItem.js @@ -0,0 +1,94 @@ +export default class DisjointSetItem { + /** + * @param {*} value + * @param {function(value: *)} [keyCallback] + */ + constructor(value, keyCallback) { + this.value = value; + this.keyCallback = keyCallback; + /** @var {DisjointSetItem} this.parent */ + this.parent = null; + this.children = {}; + } + + /** + * @return {*} + */ + getKey() { + // Allow user to define custom key generator. + if (this.keyCallback) { + return this.keyCallback(this.value); + } + + // Otherwise use value as a key by default. + return this.value; + } + + /** + * @return {DisjointSetItem} + */ + getRoot() { + return this.isRoot() ? this : this.parent.getRoot(); + } + + /** + * @return {boolean} + */ + isRoot() { + return this.parent === null; + } + + /** + * @return {number} + */ + getAncestorsCount() { + if (this.getChildren().length === 0) { + return 0; + } + + let count = 0; + + /** @var {DisjointSetItem} child */ + this.getChildren().forEach((child) => { + // Count child itself. + count += 1; + + // Also add all children of current child. + count += child.getAncestorsCount(); + }); + + return count; + } + + /** + * @return {DisjointSetItem[]} + */ + getChildren() { + return Object.values(this.children); + } + + /** + * @param {DisjointSetItem} parentItem + * @param {boolean} forceSettingParentChild + * @return {DisjointSetItem} + */ + setParent(parentItem, forceSettingParentChild = true) { + this.parent = parentItem; + if (forceSettingParentChild) { + parentItem.addChild(this); + } + + return this; + } + + /** + * @param {DisjointSetItem} childItem + * @return {DisjointSetItem} + */ + addChild(childItem) { + this.children[childItem.getKey()] = childItem; + childItem.setParent(this, false); + + return this; + } +} diff --git a/src/data-structures/disjoint-set/README.md b/src/data-structures/disjoint-set/README.md new file mode 100644 index 000000000..b5d5bfcdf --- /dev/null +++ b/src/data-structures/disjoint-set/README.md @@ -0,0 +1,20 @@ +# Disjoint Set + +**Disjoint-set** data structure (also called a union–find data structure or merge–find set) is a data +structure that tracks a set of elements partitioned into a number of disjoint (non-overlapping) subsets. +It provides near-constant-time operations (bounded by the inverse Ackermann function) to *add new sets*, +to *merge existing sets*, and to *determine whether elements are in the same set*. +In addition to many other uses (see the Applications section), disjoint-sets play a key role in Kruskal's algorithm for finding the minimum spanning tree of a graph. + +![disjoint set](https://upload.wikimedia.org/wikipedia/commons/6/67/Dsu_disjoint_sets_init.svg) + +*MakeSet* creates 8 singletons. + +![disjoint set](https://upload.wikimedia.org/wikipedia/commons/a/ac/Dsu_disjoint_sets_final.svg) + +After some operations of *Union*, some sets are grouped together. + +## References + +- [Wikipedia](https://en.wikipedia.org/wiki/Disjoint-set_data_structure) +- [By Abdul Bari on YouTube](https://www.youtube.com/watch?v=wU6udHRIkcc) diff --git a/src/data-structures/disjoint-set/__test__/DisjointSet.test.js b/src/data-structures/disjoint-set/__test__/DisjointSet.test.js new file mode 100644 index 000000000..c62e63933 --- /dev/null +++ b/src/data-structures/disjoint-set/__test__/DisjointSet.test.js @@ -0,0 +1,140 @@ +import DisjointSet from '../DisjointSet'; + +describe('DisjointSet', () => { + it('should throw error when trying to union and check not existing sets', () => { + function mergeNotExistingSets() { + const disjointSet = new DisjointSet(); + + disjointSet.union('A', 'B'); + } + + function checkNotExistingSets() { + const disjointSet = new DisjointSet(); + + disjointSet.inSameSet('A', 'B'); + } + + expect(mergeNotExistingSets).toThrow(); + expect(checkNotExistingSets).toThrow(); + }); + + it('should do basic manipulations on disjoint set', () => { + const disjointSet = new DisjointSet(); + + expect(disjointSet.find('A')).toBeNull(); + expect(disjointSet.find('B')).toBeNull(); + + disjointSet.makeSet('A'); + + expect(disjointSet.find('A')).toBe('A'); + expect(disjointSet.find('B')).toBeNull(); + + disjointSet.makeSet('B'); + + expect(disjointSet.find('A')).toBe('A'); + expect(disjointSet.find('B')).toBe('B'); + + disjointSet.makeSet('C'); + + expect(disjointSet.inSameSet('A', 'B')).toBeFalsy(); + + disjointSet.union('A', 'B'); + + expect(disjointSet.find('A')).toBe('A'); + expect(disjointSet.find('B')).toBe('A'); + expect(disjointSet.inSameSet('A', 'B')).toBeTruthy(); + expect(disjointSet.inSameSet('B', 'A')).toBeTruthy(); + expect(disjointSet.inSameSet('A', 'C')).toBeFalsy(); + + disjointSet.union('A', 'A'); + + disjointSet.union('B', 'C'); + + expect(disjointSet.find('A')).toBe('A'); + expect(disjointSet.find('B')).toBe('A'); + expect(disjointSet.find('C')).toBe('A'); + + expect(disjointSet.inSameSet('A', 'B')).toBeTruthy(); + expect(disjointSet.inSameSet('B', 'C')).toBeTruthy(); + expect(disjointSet.inSameSet('A', 'C')).toBeTruthy(); + + disjointSet + .makeSet('E') + .makeSet('F') + .makeSet('G') + .makeSet('H') + .makeSet('I'); + + disjointSet + .union('E', 'F') + .union('F', 'G') + .union('G', 'H') + .union('H', 'I'); + + expect(disjointSet.inSameSet('A', 'I')).toBeFalsy(); + expect(disjointSet.inSameSet('E', 'I')).toBeTruthy(); + + disjointSet.union('I', 'C'); + + expect(disjointSet.find('I')).toBe('E'); + expect(disjointSet.inSameSet('A', 'I')).toBeTruthy(); + }); + + it('should union smaller set with bigger one making bigger one to be new root', () => { + const disjointSet = new DisjointSet(); + + disjointSet + .makeSet('A') + .makeSet('B') + .makeSet('C') + .union('B', 'C') + .union('A', 'C'); + + expect(disjointSet.find('A')).toBe('B'); + }); + + it('should do basic manipulations on disjoint set with custom key extractor', () => { + const keyExtractor = value => value.key; + + const disjointSet = new DisjointSet(keyExtractor); + + const itemA = { key: 'A', value: 1 }; + const itemB = { key: 'B', value: 2 }; + const itemC = { key: 'C', value: 3 }; + + expect(disjointSet.find(itemA)).toBeNull(); + expect(disjointSet.find(itemB)).toBeNull(); + + disjointSet.makeSet(itemA); + + expect(disjointSet.find(itemA)).toBe('A'); + expect(disjointSet.find(itemB)).toBeNull(); + + disjointSet.makeSet(itemB); + + expect(disjointSet.find(itemA)).toBe('A'); + expect(disjointSet.find(itemB)).toBe('B'); + + disjointSet.makeSet(itemC); + + expect(disjointSet.inSameSet(itemA, itemB)).toBeFalsy(); + + disjointSet.union(itemA, itemB); + + expect(disjointSet.find(itemA)).toBe('A'); + expect(disjointSet.find(itemB)).toBe('A'); + expect(disjointSet.inSameSet(itemA, itemB)).toBeTruthy(); + expect(disjointSet.inSameSet(itemB, itemA)).toBeTruthy(); + expect(disjointSet.inSameSet(itemA, itemC)).toBeFalsy(); + + disjointSet.union(itemA, itemC); + + expect(disjointSet.find(itemA)).toBe('A'); + expect(disjointSet.find(itemB)).toBe('A'); + expect(disjointSet.find(itemC)).toBe('A'); + + expect(disjointSet.inSameSet(itemA, itemB)).toBeTruthy(); + expect(disjointSet.inSameSet(itemB, itemC)).toBeTruthy(); + expect(disjointSet.inSameSet(itemA, itemC)).toBeTruthy(); + }); +}); diff --git a/src/data-structures/disjoint-set/__test__/DisjointSetItem.test.js b/src/data-structures/disjoint-set/__test__/DisjointSetItem.test.js new file mode 100644 index 000000000..c3f1000db --- /dev/null +++ b/src/data-structures/disjoint-set/__test__/DisjointSetItem.test.js @@ -0,0 +1,115 @@ +import DisjointSetItem from '../DisjointSetItem'; + +describe('DisjointSetItem', () => { + it('should do basic manipulation with disjoint set item', () => { + const itemA = new DisjointSetItem('A'); + const itemB = new DisjointSetItem('B'); + const itemC = new DisjointSetItem('C'); + const itemD = new DisjointSetItem('D'); + + expect(itemA.getAncestorsCount()).toBe(0); + expect(itemA.getChildren()).toEqual([]); + expect(itemA.getKey()).toBe('A'); + expect(itemA.getRoot()).toEqual(itemA); + expect(itemA.isRoot()).toBeTruthy(); + expect(itemB.isRoot()).toBeTruthy(); + + itemA.addChild(itemB); + itemD.setParent(itemC); + + expect(itemA.getAncestorsCount()).toBe(1); + expect(itemC.getAncestorsCount()).toBe(1); + + expect(itemB.getAncestorsCount()).toBe(0); + expect(itemD.getAncestorsCount()).toBe(0); + + expect(itemA.getChildren().length).toBe(1); + expect(itemC.getChildren().length).toBe(1); + + expect(itemA.getChildren()[0]).toEqual(itemB); + expect(itemC.getChildren()[0]).toEqual(itemD); + + expect(itemB.getChildren().length).toBe(0); + expect(itemD.getChildren().length).toBe(0); + + expect(itemA.getRoot()).toEqual(itemA); + expect(itemB.getRoot()).toEqual(itemA); + + expect(itemC.getRoot()).toEqual(itemC); + expect(itemD.getRoot()).toEqual(itemC); + + expect(itemA.isRoot()).toBeTruthy(); + expect(itemB.isRoot()).toBeFalsy(); + expect(itemC.isRoot()).toBeTruthy(); + expect(itemD.isRoot()).toBeFalsy(); + + itemA.addChild(itemC); + + expect(itemA.isRoot()).toBeTruthy(); + expect(itemB.isRoot()).toBeFalsy(); + expect(itemC.isRoot()).toBeFalsy(); + expect(itemD.isRoot()).toBeFalsy(); + + expect(itemA.getAncestorsCount()).toEqual(3); + expect(itemB.getAncestorsCount()).toEqual(0); + expect(itemC.getAncestorsCount()).toEqual(1); + }); + + it('should do basic manipulation with disjoint set item with custom key extractor', () => { + const keyExtractor = (value) => { + return value.key; + }; + + const itemA = new DisjointSetItem({ key: 'A', value: 1 }, keyExtractor); + const itemB = new DisjointSetItem({ key: 'B', value: 2 }, keyExtractor); + const itemC = new DisjointSetItem({ key: 'C', value: 3 }, keyExtractor); + const itemD = new DisjointSetItem({ key: 'D', value: 4 }, keyExtractor); + + expect(itemA.getAncestorsCount()).toBe(0); + expect(itemA.getChildren()).toEqual([]); + expect(itemA.getKey()).toBe('A'); + expect(itemA.getRoot()).toEqual(itemA); + expect(itemA.isRoot()).toBeTruthy(); + expect(itemB.isRoot()).toBeTruthy(); + + itemA.addChild(itemB); + itemD.setParent(itemC); + + expect(itemA.getAncestorsCount()).toBe(1); + expect(itemC.getAncestorsCount()).toBe(1); + + expect(itemB.getAncestorsCount()).toBe(0); + expect(itemD.getAncestorsCount()).toBe(0); + + expect(itemA.getChildren().length).toBe(1); + expect(itemC.getChildren().length).toBe(1); + + expect(itemA.getChildren()[0]).toEqual(itemB); + expect(itemC.getChildren()[0]).toEqual(itemD); + + expect(itemB.getChildren().length).toBe(0); + expect(itemD.getChildren().length).toBe(0); + + expect(itemA.getRoot()).toEqual(itemA); + expect(itemB.getRoot()).toEqual(itemA); + + expect(itemC.getRoot()).toEqual(itemC); + expect(itemD.getRoot()).toEqual(itemC); + + expect(itemA.isRoot()).toBeTruthy(); + expect(itemB.isRoot()).toBeFalsy(); + expect(itemC.isRoot()).toBeTruthy(); + expect(itemD.isRoot()).toBeFalsy(); + + itemA.addChild(itemC); + + expect(itemA.isRoot()).toBeTruthy(); + expect(itemB.isRoot()).toBeFalsy(); + expect(itemC.isRoot()).toBeFalsy(); + expect(itemD.isRoot()).toBeFalsy(); + + expect(itemA.getAncestorsCount()).toEqual(3); + expect(itemB.getAncestorsCount()).toEqual(0); + expect(itemC.getAncestorsCount()).toEqual(1); + }); +}); From 7cb380e8131e1d1f886d76c239ea2ac40a554afc Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Fri, 4 May 2018 06:18:05 +0300 Subject: [PATCH 247/327] Add disjoint set. --- .../disjoint-set/DisjointSet.js | 6 +++- .../disjoint-set/DisjointSetItem.js | 12 ++++--- .../__test__/DisjointSetItem.test.js | 32 +++++++++---------- 3 files changed, 28 insertions(+), 22 deletions(-) diff --git a/src/data-structures/disjoint-set/DisjointSet.js b/src/data-structures/disjoint-set/DisjointSet.js index c7f786c0d..2952f0a1b 100644 --- a/src/data-structures/disjoint-set/DisjointSet.js +++ b/src/data-structures/disjoint-set/DisjointSet.js @@ -25,6 +25,8 @@ export default class DisjointSet { } /** + * Find set representation node. + * * @param {*} itemValue * @return {(string|null)} */ @@ -42,6 +44,8 @@ export default class DisjointSet { } /** + * Union by rank. + * * @param {*} valueA * @param {*} valueB * @return {DisjointSet} @@ -62,7 +66,7 @@ export default class DisjointSet { const rootA = this.items[rootKeyA]; const rootB = this.items[rootKeyB]; - if (rootA.getAncestorsCount() < rootB.getAncestorsCount()) { + if (rootA.getRank() < rootB.getRank()) { // If rootB's tree is bigger then make rootB to be a new root. rootB.addChild(rootA); diff --git a/src/data-structures/disjoint-set/DisjointSetItem.js b/src/data-structures/disjoint-set/DisjointSetItem.js index fece064fa..037d0e0ae 100644 --- a/src/data-structures/disjoint-set/DisjointSetItem.js +++ b/src/data-structures/disjoint-set/DisjointSetItem.js @@ -39,25 +39,27 @@ export default class DisjointSetItem { } /** + * Rank basically means the number of all ancestors. + * * @return {number} */ - getAncestorsCount() { + getRank() { if (this.getChildren().length === 0) { return 0; } - let count = 0; + let rank = 0; /** @var {DisjointSetItem} child */ this.getChildren().forEach((child) => { // Count child itself. - count += 1; + rank += 1; // Also add all children of current child. - count += child.getAncestorsCount(); + rank += child.getRank(); }); - return count; + return rank; } /** diff --git a/src/data-structures/disjoint-set/__test__/DisjointSetItem.test.js b/src/data-structures/disjoint-set/__test__/DisjointSetItem.test.js index c3f1000db..1610666c9 100644 --- a/src/data-structures/disjoint-set/__test__/DisjointSetItem.test.js +++ b/src/data-structures/disjoint-set/__test__/DisjointSetItem.test.js @@ -7,7 +7,7 @@ describe('DisjointSetItem', () => { const itemC = new DisjointSetItem('C'); const itemD = new DisjointSetItem('D'); - expect(itemA.getAncestorsCount()).toBe(0); + expect(itemA.getRank()).toBe(0); expect(itemA.getChildren()).toEqual([]); expect(itemA.getKey()).toBe('A'); expect(itemA.getRoot()).toEqual(itemA); @@ -17,11 +17,11 @@ describe('DisjointSetItem', () => { itemA.addChild(itemB); itemD.setParent(itemC); - expect(itemA.getAncestorsCount()).toBe(1); - expect(itemC.getAncestorsCount()).toBe(1); + expect(itemA.getRank()).toBe(1); + expect(itemC.getRank()).toBe(1); - expect(itemB.getAncestorsCount()).toBe(0); - expect(itemD.getAncestorsCount()).toBe(0); + expect(itemB.getRank()).toBe(0); + expect(itemD.getRank()).toBe(0); expect(itemA.getChildren().length).toBe(1); expect(itemC.getChildren().length).toBe(1); @@ -50,9 +50,9 @@ describe('DisjointSetItem', () => { expect(itemC.isRoot()).toBeFalsy(); expect(itemD.isRoot()).toBeFalsy(); - expect(itemA.getAncestorsCount()).toEqual(3); - expect(itemB.getAncestorsCount()).toEqual(0); - expect(itemC.getAncestorsCount()).toEqual(1); + expect(itemA.getRank()).toEqual(3); + expect(itemB.getRank()).toEqual(0); + expect(itemC.getRank()).toEqual(1); }); it('should do basic manipulation with disjoint set item with custom key extractor', () => { @@ -65,7 +65,7 @@ describe('DisjointSetItem', () => { const itemC = new DisjointSetItem({ key: 'C', value: 3 }, keyExtractor); const itemD = new DisjointSetItem({ key: 'D', value: 4 }, keyExtractor); - expect(itemA.getAncestorsCount()).toBe(0); + expect(itemA.getRank()).toBe(0); expect(itemA.getChildren()).toEqual([]); expect(itemA.getKey()).toBe('A'); expect(itemA.getRoot()).toEqual(itemA); @@ -75,11 +75,11 @@ describe('DisjointSetItem', () => { itemA.addChild(itemB); itemD.setParent(itemC); - expect(itemA.getAncestorsCount()).toBe(1); - expect(itemC.getAncestorsCount()).toBe(1); + expect(itemA.getRank()).toBe(1); + expect(itemC.getRank()).toBe(1); - expect(itemB.getAncestorsCount()).toBe(0); - expect(itemD.getAncestorsCount()).toBe(0); + expect(itemB.getRank()).toBe(0); + expect(itemD.getRank()).toBe(0); expect(itemA.getChildren().length).toBe(1); expect(itemC.getChildren().length).toBe(1); @@ -108,8 +108,8 @@ describe('DisjointSetItem', () => { expect(itemC.isRoot()).toBeFalsy(); expect(itemD.isRoot()).toBeFalsy(); - expect(itemA.getAncestorsCount()).toEqual(3); - expect(itemB.getAncestorsCount()).toEqual(0); - expect(itemC.getAncestorsCount()).toEqual(1); + expect(itemA.getRank()).toEqual(3); + expect(itemB.getRank()).toEqual(0); + expect(itemC.getRank()).toEqual(1); }); }); From 36afb6742f7780773d6fe4ea4622ba0d497a3205 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Fri, 4 May 2018 07:04:37 +0300 Subject: [PATCH 248/327] Add detect cycle. --- README.md | 2 +- src/algorithms/graph/detect-cycle/README.md | 60 +++++++++++++++++++ .../__test__/detectUndirectedCycle.test.js | 36 +++++++++++ .../detect-cycle/detectUndirectedCycle.js | 32 ++++++++++ src/data-structures/graph/Graph.js | 15 ++++- src/data-structures/graph/GraphEdge.js | 10 ++++ .../graph/__test__/Graph.test.js | 38 ++++++++++++ .../graph/__test__/GraphEdge.test.js | 1 + 8 files changed, 192 insertions(+), 2 deletions(-) create mode 100644 src/algorithms/graph/detect-cycle/README.md create mode 100644 src/algorithms/graph/detect-cycle/__test__/detectUndirectedCycle.test.js create mode 100644 src/algorithms/graph/detect-cycle/detectUndirectedCycle.js diff --git a/README.md b/README.md index faa95c899..19fb15f7a 100644 --- a/README.md +++ b/README.md @@ -68,7 +68,7 @@ * [Breadth-First Search](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/breadth-first-search) (BFS) * [Dijkstra Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/dijkstra) - finding shortest path to all graph vertices * [Bellman-Ford Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/bellman-ford) - finding shortest path to all graph vertices - * Detect Cycle + * [Detect Cycle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/detect-cycle) * Topological Sorting * Eulerian path, Eulerian circuit * Strongly Connected Component algorithm diff --git a/src/algorithms/graph/detect-cycle/README.md b/src/algorithms/graph/detect-cycle/README.md new file mode 100644 index 000000000..8e8b681ff --- /dev/null +++ b/src/algorithms/graph/detect-cycle/README.md @@ -0,0 +1,60 @@ +# Detect Cycle in Graphs + +In graph theory, a **cycle** is a path of edges and vertices +wherein a vertex is reachable from itself. There are several +different types of cycles, principally a **closed walk** and +a **simple cycle**. + +## Definitions + +A **closed walk** consists of a sequence of vertices starting +and ending at the same vertex, with each two consecutive vertices +in the sequence adjacent to each other in the graph. In a directed graph, +each edge must be traversed by the walk consistently with its direction: +the edge must be oriented from the earlier of two consecutive vertices +to the later of the two vertices in the sequence. +The choice of starting vertex is not important: traversing the same cyclic +sequence of edges from different starting vertices produces the same closed walk. + +A **simple cycle may** be defined either as a closed walk with no repetitions of +vertices and edges allowed, other than the repetition of the starting and ending +vertex, or as the set of edges in such a walk. The two definitions are equivalent +in directed graphs, where simple cycles are also called directed cycles: the cyclic +sequence of vertices and edges in a walk is completely determined by the set of +edges that it uses. In undirected graphs the set of edges of a cycle can be +traversed by a walk in either of two directions, giving two possible directed cycles +for every undirected cycle. A circuit can be a closed walk allowing repetitions of +vertices but not edges; however, it can also be a simple cycle, so explicit +definition is recommended when it is used. + +## Example + +![Cycles](https://upload.wikimedia.org/wikipedia/commons/e/e7/Graph_cycle.gif) + +A graph with edges colored to illustrate **path** `H-A-B` (green), closed path or +**walk with a repeated vertex** `B-D-E-F-D-C-B` (blue) and a **cycle with no repeated edge** or +vertex `H-D-G-H` (red) + +### Cycle in undirected graph + +![Undirected Cycle](https://www.geeksforgeeks.org/wp-content/uploads/cycleGraph.png) + +### Cycle in directed graph + +![Directed Cycle](https://cdncontribute.geeksforgeeks.org/wp-content/uploads/cycle.png) + +## References + +General information: + +- [Wikipedia](https://en.wikipedia.org/wiki/Cycle_(graph_theory)) + +Cycles in undirected graphs: + +- [Detect Cycle in Undirected Graph on GeeksForGeeks](https://www.geeksforgeeks.org/detect-cycle-undirected-graph/) +- [Detect Cycle in Undirected Graph Algorithm on YouTube](https://www.youtube.com/watch?v=n_t0a_8H8VY) + +Cycles in directed graphs: + +- [Detect Cycle in Directed Graph on GeeksForGeeks](https://www.geeksforgeeks.org/detect-cycle-in-a-graph/) +- [Detect Cycle in Directed Graph Algorithm on YouTube](https://www.youtube.com/watch?v=rKQaZuoUR4M) diff --git a/src/algorithms/graph/detect-cycle/__test__/detectUndirectedCycle.test.js b/src/algorithms/graph/detect-cycle/__test__/detectUndirectedCycle.test.js new file mode 100644 index 000000000..0e8278520 --- /dev/null +++ b/src/algorithms/graph/detect-cycle/__test__/detectUndirectedCycle.test.js @@ -0,0 +1,36 @@ +import GraphVertex from '../../../../data-structures/graph/GraphVertex'; +import GraphEdge from '../../../../data-structures/graph/GraphEdge'; +import Graph from '../../../../data-structures/graph/Graph'; +import detectUndirectedCycle from '../detectUndirectedCycle'; + +describe('detectUndirectedCycle', () => { + it('should detect undirected cycle', () => { + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + const vertexC = new GraphVertex('C'); + const vertexD = new GraphVertex('D'); + const vertexE = new GraphVertex('E'); + const vertexF = new GraphVertex('F'); + + const edgeAF = new GraphEdge(vertexA, vertexF); + const edgeAB = new GraphEdge(vertexA, vertexB); + const edgeBE = new GraphEdge(vertexB, vertexE); + const edgeBC = new GraphEdge(vertexB, vertexC); + const edgeCD = new GraphEdge(vertexC, vertexD); + const edgeDE = new GraphEdge(vertexD, vertexE); + + const graph = new Graph(); + graph + .addEdge(edgeAF) + .addEdge(edgeAB) + .addEdge(edgeBE) + .addEdge(edgeBC) + .addEdge(edgeCD); + + expect(detectUndirectedCycle(graph)).toBeFalsy(); + + graph.addEdge(edgeDE); + + expect(detectUndirectedCycle(graph)).toBeTruthy(); + }); +}); diff --git a/src/algorithms/graph/detect-cycle/detectUndirectedCycle.js b/src/algorithms/graph/detect-cycle/detectUndirectedCycle.js new file mode 100644 index 000000000..3c6b6217a --- /dev/null +++ b/src/algorithms/graph/detect-cycle/detectUndirectedCycle.js @@ -0,0 +1,32 @@ +import DisjointSet from '../../../data-structures/disjoint-set/DisjointSet'; + +/** + * Detect cycle in undirected graph using disjoint sets. + * + * @param {Graph} graph + */ + +export default function detectUndirectedCycle(graph) { + // Create initial singleton disjoint sets for each graph vertex. + /** @param {GraphVertex} graphVertex */ + const keyExtractor = graphVertex => graphVertex.getKey(); + const disjointSet = new DisjointSet(keyExtractor); + graph.getAllVertices().forEach(graphVertex => disjointSet.makeSet(graphVertex)); + + // Go trough all graph edges one by one and check if edge vertices are from the + // different sets. In this case joint those sets together. Do this until you find + // an edge where to edge vertices are already in one set. This means that current + // edge will create a cycle. + let cycleFound = false; + /** @param {GraphEdge} graphEdge */ + graph.getAllEdges().forEach((graphEdge) => { + if (disjointSet.inSameSet(graphEdge.startVertex, graphEdge.endVertex)) { + // Cycle found. + cycleFound = true; + } else { + disjointSet.union(graphEdge.startVertex, graphEdge.endVertex); + } + }); + + return cycleFound; +} diff --git a/src/data-structures/graph/Graph.js b/src/data-structures/graph/Graph.js index cff44be8f..7df7afaca 100644 --- a/src/data-structures/graph/Graph.js +++ b/src/data-structures/graph/Graph.js @@ -4,6 +4,7 @@ export default class Graph { */ constructor(isDirected = false) { this.vertices = {}; + this.edges = {}; this.isDirected = isDirected; } @@ -39,6 +40,13 @@ export default class Graph { return Object.values(this.vertices); } + /** + * @return {GraphEdge[]} + */ + getAllEdges() { + return Object.values(this.edges); + } + /** * @param {GraphEdge} edge * @returns {Graph} @@ -60,7 +68,12 @@ export default class Graph { endVertex = this.getVertexByKey(edge.endVertex.getKey()); } - // @TODO: Check if edge has been already added. + // Check if edge has been already added. + if (this.edges[edge.getKey()]) { + throw new Error('Edge has already been added before'); + } else { + this.edges[edge.getKey()] = edge; + } // Add edge to the vertices. if (this.isDirected) { diff --git a/src/data-structures/graph/GraphEdge.js b/src/data-structures/graph/GraphEdge.js index 5dc565bb0..0650240d3 100644 --- a/src/data-structures/graph/GraphEdge.js +++ b/src/data-structures/graph/GraphEdge.js @@ -9,4 +9,14 @@ export default class GraphEdge { this.endVertex = endVertex; this.weight = weight; } + + /** + * @return {string} + */ + getKey() { + const startVertexKey = this.startVertex.getKey(); + const endVertexKey = this.endVertex.getKey(); + + return `${startVertexKey}_${endVertexKey}`; + } } diff --git a/src/data-structures/graph/__test__/Graph.test.js b/src/data-structures/graph/__test__/Graph.test.js index a169de6b9..c4e1392b1 100644 --- a/src/data-structures/graph/__test__/Graph.test.js +++ b/src/data-structures/graph/__test__/Graph.test.js @@ -136,4 +136,42 @@ describe('Graph', () => { expect(neighbors[0]).toEqual(vertexB); expect(neighbors[1]).toEqual(vertexC); }); + + it('should throw an error when trying to add edge twice', () => { + function addSameEdgeTwice() { + const graph = new Graph(true); + + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + + const edgeAB = new GraphEdge(vertexA, vertexB); + + graph + .addEdge(edgeAB) + .addEdge(edgeAB); + } + + expect(addSameEdgeTwice).toThrow(); + }); + + it('should return the list of all added edges', () => { + const graph = new Graph(true); + + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + const vertexC = new GraphVertex('C'); + + const edgeAB = new GraphEdge(vertexA, vertexB); + const edgeBC = new GraphEdge(vertexB, vertexC); + + graph + .addEdge(edgeAB) + .addEdge(edgeBC); + + const edges = graph.getAllEdges(); + + expect(edges.length).toBe(2); + expect(edges[0]).toEqual(edgeAB); + expect(edges[1]).toEqual(edgeBC); + }); }); diff --git a/src/data-structures/graph/__test__/GraphEdge.test.js b/src/data-structures/graph/__test__/GraphEdge.test.js index e53dc7925..a677a81db 100644 --- a/src/data-structures/graph/__test__/GraphEdge.test.js +++ b/src/data-structures/graph/__test__/GraphEdge.test.js @@ -7,6 +7,7 @@ describe('GraphEdge', () => { const endVertex = new GraphVertex('B'); const edge = new GraphEdge(startVertex, endVertex); + expect(edge.getKey()).toBe('A_B'); expect(edge.startVertex).toEqual(startVertex); expect(edge.endVertex).toEqual(endVertex); expect(edge.weight).toEqual(1); From b600c1df1c0a493f1782ffe9d647542ed0c8ccae Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Fri, 4 May 2018 16:56:06 +0300 Subject: [PATCH 249/327] Add DFS. --- .../__test__/depthFirstSearch.test.js | 76 ++++++++++++++++--- .../depth-first-search/depthFirstSearch.js | 37 +++++---- 2 files changed, 88 insertions(+), 25 deletions(-) diff --git a/src/algorithms/graph/depth-first-search/__test__/depthFirstSearch.test.js b/src/algorithms/graph/depth-first-search/__test__/depthFirstSearch.test.js index 52806dc8b..5c264d327 100644 --- a/src/algorithms/graph/depth-first-search/__test__/depthFirstSearch.test.js +++ b/src/algorithms/graph/depth-first-search/__test__/depthFirstSearch.test.js @@ -48,11 +48,40 @@ describe('depthFirstSearch', () => { leaveVertex: leaveVertexCallback, }); - expect(enterVertexCallback).toHaveBeenCalledTimes(7); - expect(leaveVertexCallback).toHaveBeenCalledTimes(7); - - expect(enterVertexCallback.mock.calls.toString()).toBe('A,B,C,G,D,E,F'); - expect(leaveVertexCallback.mock.calls.toString()).toBe('G,C,B,D,F,E,A'); + expect(enterVertexCallback).toHaveBeenCalledTimes(graph.getAllVertices().length); + expect(leaveVertexCallback).toHaveBeenCalledTimes(graph.getAllVertices().length); + + const enterVertexParamsMap = [ + { currentVertex: vertexA, previousVertex: null }, + { currentVertex: vertexB, previousVertex: vertexA }, + { currentVertex: vertexC, previousVertex: vertexB }, + { currentVertex: vertexG, previousVertex: vertexC }, + { currentVertex: vertexD, previousVertex: vertexA }, + { currentVertex: vertexE, previousVertex: vertexA }, + { currentVertex: vertexF, previousVertex: vertexE }, + ]; + + for (let callIndex = 0; callIndex < graph.getAllVertices().length; callIndex += 1) { + const params = enterVertexCallback.mock.calls[callIndex][0]; + expect(params.currentVertex).toEqual(enterVertexParamsMap[callIndex].currentVertex); + expect(params.previousVertex).toEqual(enterVertexParamsMap[callIndex].previousVertex); + } + + const leavingVertexParamsMap = [ + { currentVertex: vertexG, previousVertex: vertexC }, + { currentVertex: vertexC, previousVertex: vertexB }, + { currentVertex: vertexB, previousVertex: vertexA }, + { currentVertex: vertexD, previousVertex: vertexA }, + { currentVertex: vertexF, previousVertex: vertexE }, + { currentVertex: vertexE, previousVertex: vertexA }, + { currentVertex: vertexA, previousVertex: null }, + ]; + + for (let callIndex = 0; callIndex < graph.getAllVertices().length; callIndex += 1) { + const params = leaveVertexCallback.mock.calls[callIndex][0]; + expect(params.currentVertex).toEqual(leavingVertexParamsMap[callIndex].currentVertex); + expect(params.previousVertex).toEqual(leavingVertexParamsMap[callIndex].previousVertex); + } }); it('allow users to redefine vertex visiting logic', () => { @@ -93,15 +122,44 @@ describe('depthFirstSearch', () => { depthFirstSearch(graph, vertexA, { enterVertex: enterVertexCallback, leaveVertex: leaveVertexCallback, - allowTraversal: (vertex, neighbor) => { - return !(vertex === vertexA && neighbor === vertexB); + allowTraversal: ({ currentVertex, nextVertex }) => { + return !(currentVertex === vertexA && nextVertex === vertexB); }, }); expect(enterVertexCallback).toHaveBeenCalledTimes(7); expect(leaveVertexCallback).toHaveBeenCalledTimes(7); - expect(enterVertexCallback.mock.calls.toString()).toBe('A,D,G,E,F,D,G'); - expect(leaveVertexCallback.mock.calls.toString()).toBe('G,D,G,D,F,E,A'); + const enterVertexParamsMap = [ + { currentVertex: vertexA, previousVertex: null }, + { currentVertex: vertexD, previousVertex: vertexA }, + { currentVertex: vertexG, previousVertex: vertexD }, + { currentVertex: vertexE, previousVertex: vertexA }, + { currentVertex: vertexF, previousVertex: vertexE }, + { currentVertex: vertexD, previousVertex: vertexF }, + { currentVertex: vertexG, previousVertex: vertexD }, + ]; + + for (let callIndex = 0; callIndex < graph.getAllVertices().length; callIndex += 1) { + const params = enterVertexCallback.mock.calls[callIndex][0]; + expect(params.currentVertex).toEqual(enterVertexParamsMap[callIndex].currentVertex); + expect(params.previousVertex).toEqual(enterVertexParamsMap[callIndex].previousVertex); + } + + const leavingVertexParamsMap = [ + { currentVertex: vertexG, previousVertex: vertexD }, + { currentVertex: vertexD, previousVertex: vertexA }, + { currentVertex: vertexG, previousVertex: vertexD }, + { currentVertex: vertexD, previousVertex: vertexF }, + { currentVertex: vertexF, previousVertex: vertexE }, + { currentVertex: vertexE, previousVertex: vertexA }, + { currentVertex: vertexA, previousVertex: null }, + ]; + + for (let callIndex = 0; callIndex < graph.getAllVertices().length; callIndex += 1) { + const params = leaveVertexCallback.mock.calls[callIndex][0]; + expect(params.currentVertex).toEqual(leavingVertexParamsMap[callIndex].currentVertex); + expect(params.previousVertex).toEqual(leavingVertexParamsMap[callIndex].previousVertex); + } }); }); diff --git a/src/algorithms/graph/depth-first-search/depthFirstSearch.js b/src/algorithms/graph/depth-first-search/depthFirstSearch.js index 85c2f98c1..a77c672f1 100644 --- a/src/algorithms/graph/depth-first-search/depthFirstSearch.js +++ b/src/algorithms/graph/depth-first-search/depthFirstSearch.js @@ -1,10 +1,13 @@ /** * @typedef {Object} Callbacks - * @property {function(vertex: GraphVertex, neighbor: GraphVertex): boolean} allowTraversal - - * Determines whether DFS should traverse from the vertex to its neighbor - * (along the edge). By default prohibits visiting the same vertex again. - * @property {function(vertex: GraphVertex)} enterVertex - Called when DFS enters the vertex. - * @property {function(vertex: GraphVertex)} leaveVertex - Called when DFS leaves the vertex. + * + * @property {function(vertices: Object): boolean} [allowTraversal] - + * Determines whether DFS should traverse from the vertex to its neighbor + * (along the edge). By default prohibits visiting the same vertex again. + * + * @property {function(vertices: Object)} [enterVertex] - Called when DFS enters the vertex. + * + * @property {function(vertices: Object)} [leaveVertex] - Called when DFS leaves the vertex. */ /** @@ -19,9 +22,9 @@ function initCallbacks(callbacks = {}) { const allowTraversalCallback = ( () => { const seen = {}; - return (vertex, neighbor) => { - if (!seen[neighbor.getKey()]) { - seen[neighbor.getKey()] = true; + return ({ nextVertex }) => { + if (!seen[nextVertex.getKey()]) { + seen[nextVertex.getKey()] = true; return true; } return false; @@ -38,19 +41,20 @@ function initCallbacks(callbacks = {}) { /** * @param {Graph} graph - * @param {GraphVertex} vertex + * @param {GraphVertex} currentVertex + * @param {GraphVertex} previousVertex * @param {Callbacks} callbacks */ -function depthFirstSearchRecursive(graph, vertex, callbacks) { - callbacks.enterVertex(vertex); +function depthFirstSearchRecursive(graph, currentVertex, previousVertex, callbacks) { + callbacks.enterVertex({ currentVertex, previousVertex }); - graph.getNeighbors(vertex).forEach((neighbor) => { - if (callbacks.allowTraversal(vertex, neighbor)) { - depthFirstSearchRecursive(graph, neighbor, callbacks); + graph.getNeighbors(currentVertex).forEach((nextVertex) => { + if (callbacks.allowTraversal({ previousVertex, currentVertex, nextVertex })) { + depthFirstSearchRecursive(graph, nextVertex, currentVertex, callbacks); } }); - callbacks.leaveVertex(vertex); + callbacks.leaveVertex({ currentVertex, previousVertex }); } /** @@ -59,5 +63,6 @@ function depthFirstSearchRecursive(graph, vertex, callbacks) { * @param {Callbacks} [callbacks] */ export default function depthFirstSearch(graph, startVertex, callbacks) { - depthFirstSearchRecursive(graph, startVertex, initCallbacks(callbacks)); + const previousVertex = null; + depthFirstSearchRecursive(graph, startVertex, previousVertex, initCallbacks(callbacks)); } From 98a109b1887e316ba14ce2ecf2633a0c8176d8ba Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Sat, 5 May 2018 10:05:09 +0300 Subject: [PATCH 250/327] Add detect cycle. --- README.md | 2 +- .../__test__/detectDirectedCycle.test.js | 42 +++++++++ .../graph/detect-cycle/detectDirectedCycle.js | 93 +++++++++++++++++++ 3 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 src/algorithms/graph/detect-cycle/__test__/detectDirectedCycle.test.js create mode 100644 src/algorithms/graph/detect-cycle/detectDirectedCycle.js diff --git a/README.md b/README.md index 19fb15f7a..56d5387b3 100644 --- a/README.md +++ b/README.md @@ -68,7 +68,7 @@ * [Breadth-First Search](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/breadth-first-search) (BFS) * [Dijkstra Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/dijkstra) - finding shortest path to all graph vertices * [Bellman-Ford Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/bellman-ford) - finding shortest path to all graph vertices - * [Detect Cycle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/detect-cycle) + * [Detect Cycle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/detect-cycle) - for both: directed and undirected graphs * Topological Sorting * Eulerian path, Eulerian circuit * Strongly Connected Component algorithm diff --git a/src/algorithms/graph/detect-cycle/__test__/detectDirectedCycle.test.js b/src/algorithms/graph/detect-cycle/__test__/detectDirectedCycle.test.js new file mode 100644 index 000000000..64a414933 --- /dev/null +++ b/src/algorithms/graph/detect-cycle/__test__/detectDirectedCycle.test.js @@ -0,0 +1,42 @@ +import GraphVertex from '../../../../data-structures/graph/GraphVertex'; +import GraphEdge from '../../../../data-structures/graph/GraphEdge'; +import Graph from '../../../../data-structures/graph/Graph'; +import detectDirectedCycle from '../detectDirectedCycle'; + +describe('detectDirectedCycle', () => { + it('should detect directed cycle', () => { + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + const vertexC = new GraphVertex('C'); + const vertexD = new GraphVertex('D'); + const vertexE = new GraphVertex('E'); + const vertexF = new GraphVertex('F'); + + const edgeAB = new GraphEdge(vertexA, vertexB); + const edgeBC = new GraphEdge(vertexB, vertexC); + const edgeAC = new GraphEdge(vertexA, vertexC); + const edgeDA = new GraphEdge(vertexD, vertexA); + const edgeDE = new GraphEdge(vertexD, vertexE); + const edgeEF = new GraphEdge(vertexE, vertexF); + const edgeFD = new GraphEdge(vertexF, vertexD); + + const graph = new Graph(true); + graph + .addEdge(edgeAB) + .addEdge(edgeBC) + .addEdge(edgeAC) + .addEdge(edgeDA) + .addEdge(edgeDE) + .addEdge(edgeEF); + + expect(detectDirectedCycle(graph)).toBeNull(); + + graph.addEdge(edgeFD); + + expect(detectDirectedCycle(graph)).toEqual({ + D: vertexF, + F: vertexE, + E: vertexD, + }); + }); +}); diff --git a/src/algorithms/graph/detect-cycle/detectDirectedCycle.js b/src/algorithms/graph/detect-cycle/detectDirectedCycle.js new file mode 100644 index 000000000..73b2b2241 --- /dev/null +++ b/src/algorithms/graph/detect-cycle/detectDirectedCycle.js @@ -0,0 +1,93 @@ +import depthFirstSearch from '../depth-first-search/depthFirstSearch'; + +/** + * Detect cycle in directed graph using Depth First Search. + * + * @param {Graph} graph + */ +export default function detectDirectedCycle(graph) { + let cycle = null; + + // Will store parents (previous vertices) for all visited nodes. + // This will be needed in order to specify what path exactly is a cycle. + const dfsParentMap = {}; + + // White set (UNVISITED) contains all the vertices that haven't been visited at all. + const whiteSet = {}; + + // Gray set (VISITING) contains all the vertices that are being visited right now + // (in current path). + const graySet = {}; + + // Black set (VISITED) contains all the vertices that has been fully visited. + // Meaning that all children of the vertex has been visited. + const blackSet = {}; + + // If we encounter vertex in gray set it means that we've found a cycle. + // Because when vertex in gray set it means that its neighbors or its neighbors + // neighbors are still being explored. + + // Init white set and add all vertices to it. + /** @param {GraphVertex} vertex */ + graph.getAllVertices().forEach((vertex) => { + whiteSet[vertex.getKey()] = vertex; + }); + + // Describe BFS callbacks. + const callbacks = { + enterVertex: ({ currentVertex, previousVertex }) => { + if (graySet[currentVertex.getKey()]) { + // If current vertex already in grey set it means that cycle is detected. + // Let's detect cycle path. + cycle = {}; + + let currentCycleVertex = currentVertex; + let previousCycleVertex = previousVertex; + + while (previousCycleVertex.getKey() !== currentVertex.getKey()) { + cycle[currentCycleVertex.getKey()] = previousCycleVertex; + currentCycleVertex = previousCycleVertex; + previousCycleVertex = dfsParentMap[previousCycleVertex.getKey()]; + } + + cycle[currentCycleVertex.getKey()] = previousCycleVertex; + } else { + // Otherwise let's add current vertex to gray set and remove it from white set. + graySet[currentVertex.getKey()] = currentVertex; + delete whiteSet[currentVertex.getKey()]; + + // Update DFS parents list. + dfsParentMap[currentVertex.getKey()] = previousVertex; + } + }, + leaveVertex: ({ currentVertex }) => { + // If all node's children has been visited let's remove it from gray set + // and move it to the black set meaning that all its neighbors are visited. + blackSet[currentVertex.getKey()] = currentVertex; + delete graySet[currentVertex.getKey()]; + }, + allowTraversal: ({ nextVertex }) => { + // If cycle was detected we must forbid all further traversing since it will + // cause infinite traversal loop. + if (cycle) { + return false; + } + + // Allow traversal only for the vertices that are not in black set + // since all black set vertices have been already visited. + return !blackSet[nextVertex.getKey()]; + }, + }; + + // Start exploring vertices. + while (Object.keys(whiteSet).length) { + // Pick fist vertex to start BFS from. + const firstWhiteKey = Object.keys(whiteSet)[0]; + const startVertex = whiteSet[firstWhiteKey]; + + // Do Depth First Search. + depthFirstSearch(graph, startVertex, callbacks); + } + + return cycle; +} From ece4a9a122862040480a2dbc283221d305913fab Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Sat, 5 May 2018 10:58:04 +0300 Subject: [PATCH 251/327] Add detect cycle. --- .eslintrc | 3 +- .../__test__/breadthFirstSearch.test.js | 72 +++++++++++++++++-- .../breadthFirstSearch.js | 30 +++++--- .../__test__/depthFirstSearch.test.js | 12 ++-- 4 files changed, 93 insertions(+), 24 deletions(-) diff --git a/.eslintrc b/.eslintrc index b05cfb68a..076399682 100644 --- a/.eslintrc +++ b/.eslintrc @@ -9,6 +9,7 @@ "no-bitwise": "off", "no-lonely-if": "off", "class-methods-use-this": "off", - "arrow-body-style": "off" + "arrow-body-style": "off", + "no-loop-func": "off" } } diff --git a/src/algorithms/graph/breadth-first-search/__test__/breadthFirstSearch.test.js b/src/algorithms/graph/breadth-first-search/__test__/breadthFirstSearch.test.js index a91572657..c9bff22fb 100644 --- a/src/algorithms/graph/breadth-first-search/__test__/breadthFirstSearch.test.js +++ b/src/algorithms/graph/breadth-first-search/__test__/breadthFirstSearch.test.js @@ -54,8 +54,39 @@ describe('breadthFirstSearch', () => { expect(enterVertexCallback).toHaveBeenCalledTimes(8); expect(leaveVertexCallback).toHaveBeenCalledTimes(8); - expect(enterVertexCallback.mock.calls.toString()).toBe('A,B,D,E,C,H,F,G'); - expect(leaveVertexCallback.mock.calls.toString()).toBe('A,B,D,E,C,H,F,G'); + const enterVertexParamsMap = [ + { currentVertex: vertexA, previousVertex: null }, + { currentVertex: vertexB, previousVertex: vertexA }, + { currentVertex: vertexD, previousVertex: vertexB }, + { currentVertex: vertexE, previousVertex: vertexD }, + { currentVertex: vertexC, previousVertex: vertexE }, + { currentVertex: vertexH, previousVertex: vertexC }, + { currentVertex: vertexF, previousVertex: vertexH }, + { currentVertex: vertexG, previousVertex: vertexF }, + ]; + + for (let callIndex = 0; callIndex < graph.getAllVertices().length; callIndex += 1) { + const params = enterVertexCallback.mock.calls[callIndex][0]; + expect(params.currentVertex).toEqual(enterVertexParamsMap[callIndex].currentVertex); + expect(params.previousVertex).toEqual(enterVertexParamsMap[callIndex].previousVertex); + } + + const leaveVertexParamsMap = [ + { currentVertex: vertexA, previousVertex: null }, + { currentVertex: vertexB, previousVertex: vertexA }, + { currentVertex: vertexD, previousVertex: vertexB }, + { currentVertex: vertexE, previousVertex: vertexD }, + { currentVertex: vertexC, previousVertex: vertexE }, + { currentVertex: vertexH, previousVertex: vertexC }, + { currentVertex: vertexF, previousVertex: vertexH }, + { currentVertex: vertexG, previousVertex: vertexF }, + ]; + + for (let callIndex = 0; callIndex < graph.getAllVertices().length; callIndex += 1) { + const params = leaveVertexCallback.mock.calls[callIndex][0]; + expect(params.currentVertex).toEqual(leaveVertexParamsMap[callIndex].currentVertex); + expect(params.previousVertex).toEqual(leaveVertexParamsMap[callIndex].previousVertex); + } }); it('should allow to create custom vertex visiting logic', () => { @@ -100,15 +131,44 @@ describe('breadthFirstSearch', () => { breadthFirstSearch(graph, vertexA, { enterVertex: enterVertexCallback, leaveVertex: leaveVertexCallback, - allowTraversal: (vertex, neighbor) => { - return !(vertex === vertexA && neighbor === vertexB); + allowTraversal: ({ currentVertex, nextVertex }) => { + return !(currentVertex === vertexA && nextVertex === vertexB); }, }); expect(enterVertexCallback).toHaveBeenCalledTimes(7); expect(leaveVertexCallback).toHaveBeenCalledTimes(7); - expect(enterVertexCallback.mock.calls.toString()).toBe('A,D,E,H,F,D,H'); - expect(leaveVertexCallback.mock.calls.toString()).toBe('A,D,E,H,F,D,H'); + const enterVertexParamsMap = [ + { currentVertex: vertexA, previousVertex: null }, + { currentVertex: vertexD, previousVertex: vertexA }, + { currentVertex: vertexE, previousVertex: vertexD }, + { currentVertex: vertexH, previousVertex: vertexE }, + { currentVertex: vertexF, previousVertex: vertexH }, + { currentVertex: vertexD, previousVertex: vertexF }, + { currentVertex: vertexH, previousVertex: vertexD }, + ]; + + for (let callIndex = 0; callIndex < 7; callIndex += 1) { + const params = enterVertexCallback.mock.calls[callIndex][0]; + expect(params.currentVertex).toEqual(enterVertexParamsMap[callIndex].currentVertex); + expect(params.previousVertex).toEqual(enterVertexParamsMap[callIndex].previousVertex); + } + + const leaveVertexParamsMap = [ + { currentVertex: vertexA, previousVertex: null }, + { currentVertex: vertexD, previousVertex: vertexA }, + { currentVertex: vertexE, previousVertex: vertexD }, + { currentVertex: vertexH, previousVertex: vertexE }, + { currentVertex: vertexF, previousVertex: vertexH }, + { currentVertex: vertexD, previousVertex: vertexF }, + { currentVertex: vertexH, previousVertex: vertexD }, + ]; + + for (let callIndex = 0; callIndex < 7; callIndex += 1) { + const params = leaveVertexCallback.mock.calls[callIndex][0]; + expect(params.currentVertex).toEqual(leaveVertexParamsMap[callIndex].currentVertex); + expect(params.previousVertex).toEqual(leaveVertexParamsMap[callIndex].previousVertex); + } }); }); diff --git a/src/algorithms/graph/breadth-first-search/breadthFirstSearch.js b/src/algorithms/graph/breadth-first-search/breadthFirstSearch.js index c49ee8a29..d4b955ece 100644 --- a/src/algorithms/graph/breadth-first-search/breadthFirstSearch.js +++ b/src/algorithms/graph/breadth-first-search/breadthFirstSearch.js @@ -2,11 +2,14 @@ import Queue from '../../../data-structures/queue/Queue'; /** * @typedef {Object} Callbacks - * @property {function(vertex: GraphVertex, neighbor: GraphVertex): boolean} allowTraversal - + * + * @property {function(vertices: Object): boolean} [allowTraversal] - * Determines whether DFS should traverse from the vertex to its neighbor * (along the edge). By default prohibits visiting the same vertex again. - * @property {function(vertex: GraphVertex)} enterVertex - Called when DFS enters the vertex. - * @property {function(vertex: GraphVertex)} leaveVertex - Called when DFS leaves the vertex. + * + * @property {function(vertices: Object)} [enterVertex] - Called when BFS enters the vertex. + * + * @property {function(vertices: Object)} [leaveVertex] - Called when BFS leaves the vertex. */ /** @@ -21,9 +24,9 @@ function initCallbacks(callbacks = {}) { const allowTraversalCallback = ( () => { const seen = {}; - return (vertex, neighbor) => { - if (!seen[neighbor.getKey()]) { - seen[neighbor.getKey()] = true; + return ({ nextVertex }) => { + if (!seen[nextVertex.getKey()]) { + seen[nextVertex.getKey()] = true; return true; } return false; @@ -50,18 +53,23 @@ export default function breadthFirstSearch(graph, startVertex, originalCallbacks // Do initial queue setup. vertexQueue.enqueue(startVertex); + let previousVertex = null; + // Traverse all vertices from the queue. while (!vertexQueue.isEmpty()) { const currentVertex = vertexQueue.dequeue(); - callbacks.enterVertex(currentVertex); + callbacks.enterVertex({ currentVertex, previousVertex }); // Add all neighbors to the queue for future traversals. - graph.getNeighbors(currentVertex).forEach((neighbor) => { - if (callbacks.allowTraversal(currentVertex, neighbor)) { - vertexQueue.enqueue(neighbor); + graph.getNeighbors(currentVertex).forEach((nextVertex) => { + if (callbacks.allowTraversal({ previousVertex, currentVertex, nextVertex })) { + vertexQueue.enqueue(nextVertex); } }); - callbacks.leaveVertex(currentVertex); + callbacks.leaveVertex({ currentVertex, previousVertex }); + + // Memorize current vertex before next loop. + previousVertex = currentVertex; } } diff --git a/src/algorithms/graph/depth-first-search/__test__/depthFirstSearch.test.js b/src/algorithms/graph/depth-first-search/__test__/depthFirstSearch.test.js index 5c264d327..93ed61091 100644 --- a/src/algorithms/graph/depth-first-search/__test__/depthFirstSearch.test.js +++ b/src/algorithms/graph/depth-first-search/__test__/depthFirstSearch.test.js @@ -67,7 +67,7 @@ describe('depthFirstSearch', () => { expect(params.previousVertex).toEqual(enterVertexParamsMap[callIndex].previousVertex); } - const leavingVertexParamsMap = [ + const leaveVertexParamsMap = [ { currentVertex: vertexG, previousVertex: vertexC }, { currentVertex: vertexC, previousVertex: vertexB }, { currentVertex: vertexB, previousVertex: vertexA }, @@ -79,8 +79,8 @@ describe('depthFirstSearch', () => { for (let callIndex = 0; callIndex < graph.getAllVertices().length; callIndex += 1) { const params = leaveVertexCallback.mock.calls[callIndex][0]; - expect(params.currentVertex).toEqual(leavingVertexParamsMap[callIndex].currentVertex); - expect(params.previousVertex).toEqual(leavingVertexParamsMap[callIndex].previousVertex); + expect(params.currentVertex).toEqual(leaveVertexParamsMap[callIndex].currentVertex); + expect(params.previousVertex).toEqual(leaveVertexParamsMap[callIndex].previousVertex); } }); @@ -146,7 +146,7 @@ describe('depthFirstSearch', () => { expect(params.previousVertex).toEqual(enterVertexParamsMap[callIndex].previousVertex); } - const leavingVertexParamsMap = [ + const leaveVertexParamsMap = [ { currentVertex: vertexG, previousVertex: vertexD }, { currentVertex: vertexD, previousVertex: vertexA }, { currentVertex: vertexG, previousVertex: vertexD }, @@ -158,8 +158,8 @@ describe('depthFirstSearch', () => { for (let callIndex = 0; callIndex < graph.getAllVertices().length; callIndex += 1) { const params = leaveVertexCallback.mock.calls[callIndex][0]; - expect(params.currentVertex).toEqual(leavingVertexParamsMap[callIndex].currentVertex); - expect(params.previousVertex).toEqual(leavingVertexParamsMap[callIndex].previousVertex); + expect(params.currentVertex).toEqual(leaveVertexParamsMap[callIndex].currentVertex); + expect(params.previousVertex).toEqual(leaveVertexParamsMap[callIndex].previousVertex); } }); }); From 31f49cffbc4bda32c47f772311384bbc6f1093a0 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Sat, 5 May 2018 10:58:41 +0300 Subject: [PATCH 252/327] Add detect cycle. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 56d5387b3..4705bda15 100644 --- a/README.md +++ b/README.md @@ -68,7 +68,7 @@ * [Breadth-First Search](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/breadth-first-search) (BFS) * [Dijkstra Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/dijkstra) - finding shortest path to all graph vertices * [Bellman-Ford Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/bellman-ford) - finding shortest path to all graph vertices - * [Detect Cycle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/detect-cycle) - for both: directed and undirected graphs + * [Detect Cycle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/detect-cycle) - for both directed and undirected graphs * Topological Sorting * Eulerian path, Eulerian circuit * Strongly Connected Component algorithm From cdd0a8b35bd0865745f0ac556e4276d03de32d4c Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Sun, 6 May 2018 17:57:45 +0300 Subject: [PATCH 253/327] Add detect cycle. --- README.md | 2 +- .../__test__/detectUndirectedCycle.test.js | 9 ++- ...ectUndirectedCycleUsingDisjointSet.test.js | 36 +++++++++ .../detect-cycle/detectUndirectedCycle.js | 77 +++++++++++++------ .../detectUndirectedCycleUsingDisjointSet.js | 31 ++++++++ 5 files changed, 127 insertions(+), 28 deletions(-) create mode 100644 src/algorithms/graph/detect-cycle/__test__/detectUndirectedCycleUsingDisjointSet.test.js create mode 100644 src/algorithms/graph/detect-cycle/detectUndirectedCycleUsingDisjointSet.js diff --git a/README.md b/README.md index 4705bda15..c990b240d 100644 --- a/README.md +++ b/README.md @@ -68,7 +68,7 @@ * [Breadth-First Search](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/breadth-first-search) (BFS) * [Dijkstra Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/dijkstra) - finding shortest path to all graph vertices * [Bellman-Ford Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/bellman-ford) - finding shortest path to all graph vertices - * [Detect Cycle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/detect-cycle) - for both directed and undirected graphs + * [Detect Cycle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/detect-cycle) - for both directed and undirected graphs (DFS and Disjoint Set based versions) * Topological Sorting * Eulerian path, Eulerian circuit * Strongly Connected Component algorithm diff --git a/src/algorithms/graph/detect-cycle/__test__/detectUndirectedCycle.test.js b/src/algorithms/graph/detect-cycle/__test__/detectUndirectedCycle.test.js index 0e8278520..c3f990310 100644 --- a/src/algorithms/graph/detect-cycle/__test__/detectUndirectedCycle.test.js +++ b/src/algorithms/graph/detect-cycle/__test__/detectUndirectedCycle.test.js @@ -27,10 +27,15 @@ describe('detectUndirectedCycle', () => { .addEdge(edgeBC) .addEdge(edgeCD); - expect(detectUndirectedCycle(graph)).toBeFalsy(); + expect(detectUndirectedCycle(graph)).toBeNull(); graph.addEdge(edgeDE); - expect(detectUndirectedCycle(graph)).toBeTruthy(); + expect(detectUndirectedCycle(graph)).toEqual({ + B: vertexC, + C: vertexD, + D: vertexE, + E: vertexB, + }); }); }); diff --git a/src/algorithms/graph/detect-cycle/__test__/detectUndirectedCycleUsingDisjointSet.test.js b/src/algorithms/graph/detect-cycle/__test__/detectUndirectedCycleUsingDisjointSet.test.js new file mode 100644 index 000000000..157273a57 --- /dev/null +++ b/src/algorithms/graph/detect-cycle/__test__/detectUndirectedCycleUsingDisjointSet.test.js @@ -0,0 +1,36 @@ +import GraphVertex from '../../../../data-structures/graph/GraphVertex'; +import GraphEdge from '../../../../data-structures/graph/GraphEdge'; +import Graph from '../../../../data-structures/graph/Graph'; +import detectUndirectedCycleUsingDisjointSet from '../detectUndirectedCycleUsingDisjointSet'; + +describe('detectUndirectedCycleUsingDisjointSet', () => { + it('should detect undirected cycle', () => { + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + const vertexC = new GraphVertex('C'); + const vertexD = new GraphVertex('D'); + const vertexE = new GraphVertex('E'); + const vertexF = new GraphVertex('F'); + + const edgeAF = new GraphEdge(vertexA, vertexF); + const edgeAB = new GraphEdge(vertexA, vertexB); + const edgeBE = new GraphEdge(vertexB, vertexE); + const edgeBC = new GraphEdge(vertexB, vertexC); + const edgeCD = new GraphEdge(vertexC, vertexD); + const edgeDE = new GraphEdge(vertexD, vertexE); + + const graph = new Graph(); + graph + .addEdge(edgeAF) + .addEdge(edgeAB) + .addEdge(edgeBE) + .addEdge(edgeBC) + .addEdge(edgeCD); + + expect(detectUndirectedCycleUsingDisjointSet(graph)).toBeFalsy(); + + graph.addEdge(edgeDE); + + expect(detectUndirectedCycleUsingDisjointSet(graph)).toBeTruthy(); + }); +}); diff --git a/src/algorithms/graph/detect-cycle/detectUndirectedCycle.js b/src/algorithms/graph/detect-cycle/detectUndirectedCycle.js index 3c6b6217a..5bcc9bb69 100644 --- a/src/algorithms/graph/detect-cycle/detectUndirectedCycle.js +++ b/src/algorithms/graph/detect-cycle/detectUndirectedCycle.js @@ -1,32 +1,59 @@ -import DisjointSet from '../../../data-structures/disjoint-set/DisjointSet'; +import depthFirstSearch from '../depth-first-search/depthFirstSearch'; /** - * Detect cycle in undirected graph using disjoint sets. + * Detect cycle in undirected graph using Depth First Search. * * @param {Graph} graph */ - export default function detectUndirectedCycle(graph) { - // Create initial singleton disjoint sets for each graph vertex. - /** @param {GraphVertex} graphVertex */ - const keyExtractor = graphVertex => graphVertex.getKey(); - const disjointSet = new DisjointSet(keyExtractor); - graph.getAllVertices().forEach(graphVertex => disjointSet.makeSet(graphVertex)); - - // Go trough all graph edges one by one and check if edge vertices are from the - // different sets. In this case joint those sets together. Do this until you find - // an edge where to edge vertices are already in one set. This means that current - // edge will create a cycle. - let cycleFound = false; - /** @param {GraphEdge} graphEdge */ - graph.getAllEdges().forEach((graphEdge) => { - if (disjointSet.inSameSet(graphEdge.startVertex, graphEdge.endVertex)) { - // Cycle found. - cycleFound = true; - } else { - disjointSet.union(graphEdge.startVertex, graphEdge.endVertex); - } - }); - - return cycleFound; + let cycle = null; + + // List of vertices that we have visited. + const visitedVertices = {}; + + // List of parents vertices for every visited vertex. + const parents = {}; + + // Callbacks for DFS traversing. + const callbacks = { + allowTraversal: ({ currentVertex, nextVertex }) => { + // Don't allow further traversal in case if cycle has been detected. + if (cycle) { + return false; + } + + // Don't allow traversal from child back to its parent. + const currentVertexParent = parents[currentVertex.getKey()]; + const currentVertexParentKey = currentVertexParent ? currentVertexParent.getKey() : null; + + return currentVertexParentKey !== nextVertex.getKey(); + }, + enterVertex: ({ currentVertex, previousVertex }) => { + if (visitedVertices[currentVertex.getKey()]) { + // Compile cycle path based on parents of previous vertices. + cycle = {}; + + let currentCycleVertex = currentVertex; + let previousCycleVertex = previousVertex; + + while (previousCycleVertex.getKey() !== currentVertex.getKey()) { + cycle[currentCycleVertex.getKey()] = previousCycleVertex; + currentCycleVertex = previousCycleVertex; + previousCycleVertex = parents[previousCycleVertex.getKey()]; + } + + cycle[currentCycleVertex.getKey()] = previousCycleVertex; + } else { + // Add next vertex to visited set. + visitedVertices[currentVertex.getKey()] = currentVertex; + parents[currentVertex.getKey()] = previousVertex; + } + }, + }; + + // Start DFS traversing. + const startVertex = graph.getAllVertices()[0]; + depthFirstSearch(graph, startVertex, callbacks); + + return cycle; } diff --git a/src/algorithms/graph/detect-cycle/detectUndirectedCycleUsingDisjointSet.js b/src/algorithms/graph/detect-cycle/detectUndirectedCycleUsingDisjointSet.js new file mode 100644 index 000000000..90ca744d8 --- /dev/null +++ b/src/algorithms/graph/detect-cycle/detectUndirectedCycleUsingDisjointSet.js @@ -0,0 +1,31 @@ +import DisjointSet from '../../../data-structures/disjoint-set/DisjointSet'; + +/** + * Detect cycle in undirected graph using disjoint sets. + * + * @param {Graph} graph + */ +export default function detectUndirectedCycleUsingDisjointSet(graph) { + // Create initial singleton disjoint sets for each graph vertex. + /** @param {GraphVertex} graphVertex */ + const keyExtractor = graphVertex => graphVertex.getKey(); + const disjointSet = new DisjointSet(keyExtractor); + graph.getAllVertices().forEach(graphVertex => disjointSet.makeSet(graphVertex)); + + // Go trough all graph edges one by one and check if edge vertices are from the + // different sets. In this case joint those sets together. Do this until you find + // an edge where to edge vertices are already in one set. This means that current + // edge will create a cycle. + let cycleFound = false; + /** @param {GraphEdge} graphEdge */ + graph.getAllEdges().forEach((graphEdge) => { + if (disjointSet.inSameSet(graphEdge.startVertex, graphEdge.endVertex)) { + // Cycle found. + cycleFound = true; + } else { + disjointSet.union(graphEdge.startVertex, graphEdge.endVertex); + } + }); + + return cycleFound; +} From 38a0d57d2d5ce44744298635c18da4f0d25226a0 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Sun, 6 May 2018 22:04:36 +0300 Subject: [PATCH 254/327] Update README. --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index c990b240d..cdc396c98 100644 --- a/README.md +++ b/README.md @@ -69,13 +69,12 @@ * [Dijkstra Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/dijkstra) - finding shortest path to all graph vertices * [Bellman-Ford Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/bellman-ford) - finding shortest path to all graph vertices * [Detect Cycle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/detect-cycle) - for both directed and undirected graphs (DFS and Disjoint Set based versions) + * Prim’s Algorithm - finding Minimum Spanning Tree (MST) + * Kruskal’s Algorithm - finding Minimum Spanning Tree (MST) * Topological Sorting * Eulerian path, Eulerian circuit * Strongly Connected Component algorithm * Shortest Path Faster Algorithm (SPFA) -* **Minimum Spanning Tree** - * Prim’s algorithm - * Kruskal’s algorithm * **Uncategorized** * Union-Find * Maze From c5762aab1aea117826d34e302a4cf8e40647899e Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Sun, 6 May 2018 22:18:09 +0300 Subject: [PATCH 255/327] Update README. --- README.md | 3 +- src/algorithms/graph/prim/README.md | 46 +++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 src/algorithms/graph/prim/README.md diff --git a/README.md b/README.md index cdc396c98..3be218bfd 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,7 @@ * [Dijkstra Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/dijkstra) - finding shortest path to all graph vertices * [Bellman-Ford Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/bellman-ford) - finding shortest path to all graph vertices * [Detect Cycle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/detect-cycle) - for both directed and undirected graphs (DFS and Disjoint Set based versions) - * Prim’s Algorithm - finding Minimum Spanning Tree (MST) + * [Prim’s Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/prim) - finding Minimum Spanning Tree (MST) * Kruskal’s Algorithm - finding Minimum Spanning Tree (MST) * Topological Sorting * Eulerian path, Eulerian circuit @@ -85,6 +85,7 @@ * **Greedy** * [Unbound Knapsack Problem](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/knapsack-problem) * [Dijkstra Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/dijkstra) - finding shortest path to all graph vertices + * [Prim’s Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/prim) - finding Minimum Spanning Tree (MST) * **Divide and Conquer** * [Euclidean Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/euclidean-algorithm) - calculate the Greatest Common Divisor (GCD) * [Permutations](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/permutations) (with and without repetitions) diff --git a/src/algorithms/graph/prim/README.md b/src/algorithms/graph/prim/README.md new file mode 100644 index 000000000..908629c2b --- /dev/null +++ b/src/algorithms/graph/prim/README.md @@ -0,0 +1,46 @@ +# Prim's Algorithm + +In computer science, **Prim's algorithm** is a greedy algorithm that +finds a minimum spanning tree for a weighted undirected graph. + +The algorithm operates by building this tree one vertex at a +time, from an arbitrary starting vertex, at each step adding +the cheapest possible connection from the tree to another vertex. + +![Prim's Algorithm](https://upload.wikimedia.org/wikipedia/commons/f/f7/Prim%27s_algorithm.svg) + +Prim's algorithm starting at vertex `A`. In the third step, edges +`BD` and `AB` both have weight `2`, so `BD` is chosen arbitrarily. +After that step, `AB` is no longer a candidate for addition +to the tree because it links two nodes that are already +in the tree. + +## Minimum Spanning Tree + +A **minimum spanning tree** (MST) or minimum weight spanning tree +is a subset of the edges of a connected, edge-weighted +(un)directed graph that connects all the vertices together, +without any cycles and with the minimum possible total edge +weight. That is, it is a spanning tree whose sum of edge weights +is as small as possible. More generally, any edge-weighted +undirected graph (not necessarily connected) has a minimum +spanning forest, which is a union of the minimum spanning +trees for its connected components. + +![Minimum Spanning Tree](https://upload.wikimedia.org/wikipedia/commons/d/d2/Minimum_spanning_tree.svg) + +A planar graph and its minimum spanning tree. Each edge is +labeled with its weight, which here is roughly proportional +to its length. + +![Minimum Spanning Tree](https://upload.wikimedia.org/wikipedia/commons/c/c9/Multiple_minimum_spanning_trees.svg) + +This figure shows there may be more than one minimum spanning +tree in a graph. In the figure, the two trees below the graph +are two possibilities of minimum spanning tree of the given graph. + +## References + +- [Minimum Spanning Tree on Wikipedia](https://en.wikipedia.org/wiki/Minimum_spanning_tree) +- [Prim's Algorithm on Wikipedia](https://en.wikipedia.org/wiki/Prim%27s_algorithm) +- [Prim's Algorithm on YouTube by Tushar Roy](https://www.youtube.com/watch?v=oP2-8ysT3QQ) From aba1f4c102dbabcaeeb6d9ee27f1a8b902563e3f Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Mon, 7 May 2018 11:06:37 +0300 Subject: [PATCH 256/327] Update Graph. --- src/data-structures/graph/Graph.js | 6 +++ src/data-structures/graph/GraphEdge.js | 2 +- .../graph/__test__/Graph.test.js | 44 +++++++++++++++++++ .../graph/__test__/GraphEdge.test.js | 2 +- 4 files changed, 52 insertions(+), 2 deletions(-) diff --git a/src/data-structures/graph/Graph.js b/src/data-structures/graph/Graph.js index 7df7afaca..ad6b886b5 100644 --- a/src/data-structures/graph/Graph.js +++ b/src/data-structures/graph/Graph.js @@ -110,6 +110,12 @@ export default class Graph { return null; } + getWeight() { + return this.getAllEdges().reduce((weight, graphEdge) => { + return weight + graphEdge.weight; + }, 0); + } + toString() { return Object.keys(this.vertices).toString(); } diff --git a/src/data-structures/graph/GraphEdge.js b/src/data-structures/graph/GraphEdge.js index 0650240d3..9da701716 100644 --- a/src/data-structures/graph/GraphEdge.js +++ b/src/data-structures/graph/GraphEdge.js @@ -4,7 +4,7 @@ export default class GraphEdge { * @param {GraphVertex} endVertex * @param {number} [weight=1] */ - constructor(startVertex, endVertex, weight = 1) { + constructor(startVertex, endVertex, weight = 0) { this.startVertex = startVertex; this.endVertex = endVertex; this.weight = weight; diff --git a/src/data-structures/graph/__test__/Graph.test.js b/src/data-structures/graph/__test__/Graph.test.js index c4e1392b1..c97cc56c7 100644 --- a/src/data-structures/graph/__test__/Graph.test.js +++ b/src/data-structures/graph/__test__/Graph.test.js @@ -174,4 +174,48 @@ describe('Graph', () => { expect(edges[0]).toEqual(edgeAB); expect(edges[1]).toEqual(edgeBC); }); + + it('should calculate total graph weight for default graph', () => { + const graph = new Graph(); + + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + const vertexC = new GraphVertex('C'); + const vertexD = new GraphVertex('D'); + + const edgeAB = new GraphEdge(vertexA, vertexB); + const edgeBC = new GraphEdge(vertexB, vertexC); + const edgeCD = new GraphEdge(vertexC, vertexD); + const edgeAD = new GraphEdge(vertexA, vertexD); + + graph + .addEdge(edgeAB) + .addEdge(edgeBC) + .addEdge(edgeCD) + .addEdge(edgeAD); + + expect(graph.getWeight()).toBe(0); + }); + + it('should calculate total graph weight for weighted graph', () => { + const graph = new Graph(); + + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + const vertexC = new GraphVertex('C'); + const vertexD = new GraphVertex('D'); + + const edgeAB = new GraphEdge(vertexA, vertexB, 1); + const edgeBC = new GraphEdge(vertexB, vertexC, 2); + const edgeCD = new GraphEdge(vertexC, vertexD, 3); + const edgeAD = new GraphEdge(vertexA, vertexD, 4); + + graph + .addEdge(edgeAB) + .addEdge(edgeBC) + .addEdge(edgeCD) + .addEdge(edgeAD); + + expect(graph.getWeight()).toBe(10); + }); }); diff --git a/src/data-structures/graph/__test__/GraphEdge.test.js b/src/data-structures/graph/__test__/GraphEdge.test.js index a677a81db..347dbca01 100644 --- a/src/data-structures/graph/__test__/GraphEdge.test.js +++ b/src/data-structures/graph/__test__/GraphEdge.test.js @@ -10,7 +10,7 @@ describe('GraphEdge', () => { expect(edge.getKey()).toBe('A_B'); expect(edge.startVertex).toEqual(startVertex); expect(edge.endVertex).toEqual(endVertex); - expect(edge.weight).toEqual(1); + expect(edge.weight).toEqual(0); }); it('should create graph edge with predefined weight', () => { From b686262a9ce411cf85c5370178ecbe47b33cc6d3 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Mon, 7 May 2018 12:45:10 +0300 Subject: [PATCH 257/327] Add Prim. --- README.md | 2 +- src/algorithms/graph/prim/README.md | 1 + .../graph/prim/__test__/prim.test.js | 91 +++++++++++++++++++ src/algorithms/graph/prim/prim.js | 73 +++++++++++++++ src/data-structures/graph/Graph.js | 6 ++ src/data-structures/graph/GraphEdge.js | 7 ++ src/data-structures/graph/GraphVertex.js | 10 ++ .../graph/__test__/GraphEdge.test.js | 1 + .../graph/__test__/GraphVertex.test.js | 5 +- 9 files changed, 194 insertions(+), 2 deletions(-) create mode 100644 src/algorithms/graph/prim/__test__/prim.test.js create mode 100644 src/algorithms/graph/prim/prim.js diff --git a/README.md b/README.md index 3be218bfd..1ca21bd6a 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,7 @@ * [Dijkstra Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/dijkstra) - finding shortest path to all graph vertices * [Bellman-Ford Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/bellman-ford) - finding shortest path to all graph vertices * [Detect Cycle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/detect-cycle) - for both directed and undirected graphs (DFS and Disjoint Set based versions) - * [Prim’s Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/prim) - finding Minimum Spanning Tree (MST) + * [Prim’s Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/prim) - finding Minimum Spanning Tree (MST) for weighted undirected graph * Kruskal’s Algorithm - finding Minimum Spanning Tree (MST) * Topological Sorting * Eulerian path, Eulerian circuit diff --git a/src/algorithms/graph/prim/README.md b/src/algorithms/graph/prim/README.md index 908629c2b..d9012c947 100644 --- a/src/algorithms/graph/prim/README.md +++ b/src/algorithms/graph/prim/README.md @@ -44,3 +44,4 @@ are two possibilities of minimum spanning tree of the given graph. - [Minimum Spanning Tree on Wikipedia](https://en.wikipedia.org/wiki/Minimum_spanning_tree) - [Prim's Algorithm on Wikipedia](https://en.wikipedia.org/wiki/Prim%27s_algorithm) - [Prim's Algorithm on YouTube by Tushar Roy](https://www.youtube.com/watch?v=oP2-8ysT3QQ) +- [Prim's Algorithm on YouTube by Michael Sambol](https://www.youtube.com/watch?v=cplfcGZmX7I) diff --git a/src/algorithms/graph/prim/__test__/prim.test.js b/src/algorithms/graph/prim/__test__/prim.test.js new file mode 100644 index 000000000..797f5f5ba --- /dev/null +++ b/src/algorithms/graph/prim/__test__/prim.test.js @@ -0,0 +1,91 @@ +import GraphVertex from '../../../../data-structures/graph/GraphVertex'; +import GraphEdge from '../../../../data-structures/graph/GraphEdge'; +import Graph from '../../../../data-structures/graph/Graph'; +import prim from '../prim'; + +describe('prim', () => { + it('should fire an error for directed graph', () => { + function applyPrimToDirectedGraph() { + const graph = new Graph(true); + + prim(graph); + } + + expect(applyPrimToDirectedGraph).toThrowError(); + }); + + it('should find minimum spanning tree', () => { + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + const vertexC = new GraphVertex('C'); + const vertexD = new GraphVertex('D'); + const vertexE = new GraphVertex('E'); + const vertexF = new GraphVertex('F'); + const vertexG = new GraphVertex('G'); + + const edgeAB = new GraphEdge(vertexA, vertexB, 2); + const edgeAD = new GraphEdge(vertexA, vertexD, 3); + const edgeAC = new GraphEdge(vertexA, vertexC, 3); + const edgeBC = new GraphEdge(vertexB, vertexC, 4); + const edgeBE = new GraphEdge(vertexB, vertexE, 3); + const edgeDF = new GraphEdge(vertexD, vertexF, 7); + const edgeEC = new GraphEdge(vertexE, vertexC, 1); + const edgeEF = new GraphEdge(vertexE, vertexF, 8); + const edgeFG = new GraphEdge(vertexF, vertexG, 9); + const edgeFC = new GraphEdge(vertexF, vertexC, 6); + + const graph = new Graph(); + + graph + .addEdge(edgeAB) + .addEdge(edgeAD) + .addEdge(edgeAC) + .addEdge(edgeBC) + .addEdge(edgeBE) + .addEdge(edgeDF) + .addEdge(edgeEC) + .addEdge(edgeEF) + .addEdge(edgeFC) + .addEdge(edgeFG); + + expect(graph.getWeight()).toEqual(46); + + const minimumSpanningTree = prim(graph); + + expect(minimumSpanningTree.getWeight()).toBe(24); + expect(minimumSpanningTree.getAllVertices().length).toBe(graph.getAllVertices().length); + expect(minimumSpanningTree.getAllEdges().length).toBe(graph.getAllVertices().length - 1); + expect(minimumSpanningTree.toString()).toBe('A,B,D,C,E,F,G'); + }); + + it('should find minimum spanning tree for simple graph', () => { + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + const vertexC = new GraphVertex('C'); + const vertexD = new GraphVertex('D'); + + const edgeAB = new GraphEdge(vertexA, vertexB, 1); + const edgeAD = new GraphEdge(vertexA, vertexD, 3); + const edgeBC = new GraphEdge(vertexB, vertexC, 1); + const edgeBD = new GraphEdge(vertexB, vertexD, 3); + const edgeCD = new GraphEdge(vertexC, vertexD, 1); + + const graph = new Graph(); + + graph + .addEdge(edgeAB) + .addEdge(edgeAD) + .addEdge(edgeBC) + .addEdge(edgeBD) + .addEdge(edgeCD); + + expect(graph.getWeight()).toEqual(9); + + const minimumSpanningTree = prim(graph); + + expect(minimumSpanningTree.getWeight()).toBe(3); + expect(minimumSpanningTree.getAllVertices().length).toBe(graph.getAllVertices().length); + expect(minimumSpanningTree.getAllEdges().length).toBe(graph.getAllVertices().length - 1); + expect(minimumSpanningTree.toString()).toBe('A,B,C,D'); + }); +}); diff --git a/src/algorithms/graph/prim/prim.js b/src/algorithms/graph/prim/prim.js new file mode 100644 index 000000000..1940e3051 --- /dev/null +++ b/src/algorithms/graph/prim/prim.js @@ -0,0 +1,73 @@ +import Graph from '../../../data-structures/graph/Graph'; +import PriorityQueue from '../../../data-structures/priority-queue/PriorityQueue'; + +/** + * @param {Graph} graph + * @return {Graph} + */ +export default function prim(graph) { + // It should fire error if graph is directed since the algorithm works only + // for undirected graphs. + if (graph.isDirected) { + throw new Error('Prim\'s algorithms works only for undirected graphs'); + } + + // Init new graph that will contain minimum spanning tree of original graph. + const minimumSpanningTree = new Graph(); + + // This priority queue will contain all the edges that are starting from + // visited nodes and they will be ranked by edge weight - so that on each step + // we would always pick the edge with minimal edge weight. + const edgesQueue = new PriorityQueue(); + + // Set of vertices that has been already visited. + const visitedVertices = {}; + + // Vertex from which we will start graph traversal. + const startVertex = graph.getAllVertices()[0]; + + // Add start vertex to the set of visited ones. + visitedVertices[startVertex.getKey()] = startVertex; + + // Add all edges of start vertex to the queue. + startVertex.getEdges().forEach((graphEdge) => { + edgesQueue.add(graphEdge, graphEdge.weight); + }); + + // Now let's explore all queued edges. + while (!edgesQueue.isEmpty()) { + // Fetch next queued edge with minimal weight. + /** @var {GraphEdge} currentEdge */ + const currentMinEdge = edgesQueue.poll(); + + // Find out the next unvisited minimal vertex to traverse. + let nextMinVertex = null; + if (!visitedVertices[currentMinEdge.startVertex.getKey()]) { + nextMinVertex = currentMinEdge.startVertex; + } else if (!visitedVertices[currentMinEdge.endVertex.getKey()]) { + nextMinVertex = currentMinEdge.endVertex; + } + + // If all vertices of current edge has been already visited then skip this round. + if (nextMinVertex) { + // Add current min edge to MST. + minimumSpanningTree.addEdge(currentMinEdge); + + // Add vertex to the set of visited ones. + visitedVertices[nextMinVertex.getKey()] = nextMinVertex; + + // Add all current vertex's edges to the queue. + nextMinVertex.getEdges().forEach((graphEdge) => { + // Add only vertices that link to unvisited nodes. + if ( + !visitedVertices[graphEdge.startVertex.getKey()] || + !visitedVertices[graphEdge.endVertex.getKey()] + ) { + edgesQueue.add(graphEdge, graphEdge.weight); + } + }); + } + } + + return minimumSpanningTree; +} diff --git a/src/data-structures/graph/Graph.js b/src/data-structures/graph/Graph.js index ad6b886b5..48a1171f7 100644 --- a/src/data-structures/graph/Graph.js +++ b/src/data-structures/graph/Graph.js @@ -110,12 +110,18 @@ export default class Graph { return null; } + /** + * @return {number} + */ getWeight() { return this.getAllEdges().reduce((weight, graphEdge) => { return weight + graphEdge.weight; }, 0); } + /** + * @return {string} + */ toString() { return Object.keys(this.vertices).toString(); } diff --git a/src/data-structures/graph/GraphEdge.js b/src/data-structures/graph/GraphEdge.js index 9da701716..618fb9e28 100644 --- a/src/data-structures/graph/GraphEdge.js +++ b/src/data-structures/graph/GraphEdge.js @@ -19,4 +19,11 @@ export default class GraphEdge { return `${startVertexKey}_${endVertexKey}`; } + + /** + * @return {string} + */ + toString() { + return this.getKey(); + } } diff --git a/src/data-structures/graph/GraphVertex.js b/src/data-structures/graph/GraphVertex.js index c0f991225..06c7d67dd 100644 --- a/src/data-structures/graph/GraphVertex.js +++ b/src/data-structures/graph/GraphVertex.js @@ -1,6 +1,9 @@ import LinkedList from '../linked-list/LinkedList'; export default class GraphVertex { + /** + * @param {*} value + */ constructor(value) { if (value === undefined) { throw new Error('Graph vertex must have a value'); @@ -37,6 +40,13 @@ export default class GraphVertex { return edges.map(neighborsConverter); } + /** + * @return {GraphEdge[]} + */ + getEdges() { + return this.edges.toArray().map(linkedListNode => linkedListNode.value); + } + /** * @param {GraphEdge} requiredEdge * @returns {boolean} diff --git a/src/data-structures/graph/__test__/GraphEdge.test.js b/src/data-structures/graph/__test__/GraphEdge.test.js index 347dbca01..765b61565 100644 --- a/src/data-structures/graph/__test__/GraphEdge.test.js +++ b/src/data-structures/graph/__test__/GraphEdge.test.js @@ -8,6 +8,7 @@ describe('GraphEdge', () => { const edge = new GraphEdge(startVertex, endVertex); expect(edge.getKey()).toBe('A_B'); + expect(edge.toString()).toBe('A_B'); expect(edge.startVertex).toEqual(startVertex); expect(edge.endVertex).toEqual(endVertex); expect(edge.weight).toEqual(0); diff --git a/src/data-structures/graph/__test__/GraphVertex.test.js b/src/data-structures/graph/__test__/GraphVertex.test.js index 4851215b1..679f587a2 100644 --- a/src/data-structures/graph/__test__/GraphVertex.test.js +++ b/src/data-structures/graph/__test__/GraphVertex.test.js @@ -21,17 +21,20 @@ describe('GraphVertex', () => { expect(vertex.toString()).toBe('A'); expect(vertex.getKey()).toBe('A'); expect(vertex.edges.toString()).toBe(''); + expect(vertex.getEdges()).toEqual([]); }); it('should add edges to vertex and check if it exists', () => { const vertexA = new GraphVertex('A'); - const vertexB = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); const edgeAB = new GraphEdge(vertexA, vertexB); vertexA.addEdge(edgeAB); expect(vertexA.hasEdge(edgeAB)).toBeTruthy(); expect(vertexB.hasEdge(edgeAB)).toBeFalsy(); + expect(vertexA.getEdges().length).toBe(1); + expect(vertexA.getEdges()[0].toString()).toBe('A_B'); }); it('should return vertex neighbors in case if current node is start one', () => { From d0083ee0119c3f7f619ed135adcceec41259489d Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Mon, 7 May 2018 13:53:13 +0300 Subject: [PATCH 258/327] Add Kruskal. --- README.md | 5 +- src/algorithms/graph/kruskal/README.md | 49 ++++++++++ .../graph/kruskal/__test__/kruskal.test.js | 91 +++++++++++++++++++ src/algorithms/graph/kruskal/kruskal.js | 62 +++++++++++++ 4 files changed, 205 insertions(+), 2 deletions(-) create mode 100644 src/algorithms/graph/kruskal/README.md create mode 100644 src/algorithms/graph/kruskal/__test__/kruskal.test.js create mode 100644 src/algorithms/graph/kruskal/kruskal.js diff --git a/README.md b/README.md index 1ca21bd6a..73e23a13c 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ * [Bellman-Ford Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/bellman-ford) - finding shortest path to all graph vertices * [Detect Cycle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/detect-cycle) - for both directed and undirected graphs (DFS and Disjoint Set based versions) * [Prim’s Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/prim) - finding Minimum Spanning Tree (MST) for weighted undirected graph - * Kruskal’s Algorithm - finding Minimum Spanning Tree (MST) + * [Kruskal’s Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/kruskal) - finding Minimum Spanning Tree (MST) for weighted undirected graph * Topological Sorting * Eulerian path, Eulerian circuit * Strongly Connected Component algorithm @@ -85,7 +85,8 @@ * **Greedy** * [Unbound Knapsack Problem](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/knapsack-problem) * [Dijkstra Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/dijkstra) - finding shortest path to all graph vertices - * [Prim’s Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/prim) - finding Minimum Spanning Tree (MST) + * [Prim’s Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/prim) - finding Minimum Spanning Tree (MST) for weighted undirected graph + * [Kruskal’s Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/kruskal) - finding Minimum Spanning Tree (MST) for weighted undirected graph * **Divide and Conquer** * [Euclidean Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/euclidean-algorithm) - calculate the Greatest Common Divisor (GCD) * [Permutations](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/permutations) (with and without repetitions) diff --git a/src/algorithms/graph/kruskal/README.md b/src/algorithms/graph/kruskal/README.md new file mode 100644 index 000000000..5ed128e7c --- /dev/null +++ b/src/algorithms/graph/kruskal/README.md @@ -0,0 +1,49 @@ +# Kruskal's Algorithm + +Kruskal's algorithm is a minimum-spanning-tree algorithm which +finds an edge of the least possible weight that connects any two +trees in the forest. It is a greedy algorithm in graph theory +as it finds a minimum spanning tree for a connected weighted +graph adding increasing cost arcs at each step. This means it +finds a subset of the edges that forms a tree that includes every +vertex, where the total weight of all the edges in the tree is +minimized. If the graph is not connected, then it finds a +minimum spanning forest (a minimum spanning tree for each +connected component). + +![Kruskal Algorithm](https://upload.wikimedia.org/wikipedia/commons/5/5c/MST_kruskal_en.gif) + +![Kruskal Demo](https://upload.wikimedia.org/wikipedia/commons/b/bb/KruskalDemo.gif) + +A demo for Kruskal's algorithm based on Euclidean distance. + +## Minimum Spanning Tree + +A **minimum spanning tree** (MST) or minimum weight spanning tree +is a subset of the edges of a connected, edge-weighted +(un)directed graph that connects all the vertices together, +without any cycles and with the minimum possible total edge +weight. That is, it is a spanning tree whose sum of edge weights +is as small as possible. More generally, any edge-weighted +undirected graph (not necessarily connected) has a minimum +spanning forest, which is a union of the minimum spanning +trees for its connected components. + +![Minimum Spanning Tree](https://upload.wikimedia.org/wikipedia/commons/d/d2/Minimum_spanning_tree.svg) + +A planar graph and its minimum spanning tree. Each edge is +labeled with its weight, which here is roughly proportional +to its length. + +![Minimum Spanning Tree](https://upload.wikimedia.org/wikipedia/commons/c/c9/Multiple_minimum_spanning_trees.svg) + +This figure shows there may be more than one minimum spanning +tree in a graph. In the figure, the two trees below the graph +are two possibilities of minimum spanning tree of the given graph. + +## References + +- [Minimum Spanning Tree on Wikipedia](https://en.wikipedia.org/wiki/Minimum_spanning_tree) +- [Kruskal's Algorithm on Wikipedia](https://en.wikipedia.org/wiki/Kruskal%27s_algorithm) +- [Kruskal's Algorithm on YouTube by Tushar Roy](https://www.youtube.com/watch?v=fAuF0EuZVCk) +- [Kruskal's Algorithm on YouTube by Michael Sambol](https://www.youtube.com/watch?v=71UQH7Pr9kU) diff --git a/src/algorithms/graph/kruskal/__test__/kruskal.test.js b/src/algorithms/graph/kruskal/__test__/kruskal.test.js new file mode 100644 index 000000000..da71d1374 --- /dev/null +++ b/src/algorithms/graph/kruskal/__test__/kruskal.test.js @@ -0,0 +1,91 @@ +import GraphVertex from '../../../../data-structures/graph/GraphVertex'; +import GraphEdge from '../../../../data-structures/graph/GraphEdge'; +import Graph from '../../../../data-structures/graph/Graph'; +import kruskal from '../kruskal'; + +describe('kruskal', () => { + it('should fire an error for directed graph', () => { + function applyPrimToDirectedGraph() { + const graph = new Graph(true); + + kruskal(graph); + } + + expect(applyPrimToDirectedGraph).toThrowError(); + }); + + it('should find minimum spanning tree', () => { + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + const vertexC = new GraphVertex('C'); + const vertexD = new GraphVertex('D'); + const vertexE = new GraphVertex('E'); + const vertexF = new GraphVertex('F'); + const vertexG = new GraphVertex('G'); + + const edgeAB = new GraphEdge(vertexA, vertexB, 2); + const edgeAD = new GraphEdge(vertexA, vertexD, 3); + const edgeAC = new GraphEdge(vertexA, vertexC, 3); + const edgeBC = new GraphEdge(vertexB, vertexC, 4); + const edgeBE = new GraphEdge(vertexB, vertexE, 3); + const edgeDF = new GraphEdge(vertexD, vertexF, 7); + const edgeEC = new GraphEdge(vertexE, vertexC, 1); + const edgeEF = new GraphEdge(vertexE, vertexF, 8); + const edgeFG = new GraphEdge(vertexF, vertexG, 9); + const edgeFC = new GraphEdge(vertexF, vertexC, 6); + + const graph = new Graph(); + + graph + .addEdge(edgeAB) + .addEdge(edgeAD) + .addEdge(edgeAC) + .addEdge(edgeBC) + .addEdge(edgeBE) + .addEdge(edgeDF) + .addEdge(edgeEC) + .addEdge(edgeEF) + .addEdge(edgeFC) + .addEdge(edgeFG); + + expect(graph.getWeight()).toEqual(46); + + const minimumSpanningTree = kruskal(graph); + + expect(minimumSpanningTree.getWeight()).toBe(24); + expect(minimumSpanningTree.getAllVertices().length).toBe(graph.getAllVertices().length); + expect(minimumSpanningTree.getAllEdges().length).toBe(graph.getAllVertices().length - 1); + expect(minimumSpanningTree.toString()).toBe('E,C,A,B,D,F,G'); + }); + + it('should find minimum spanning tree for simple graph', () => { + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + const vertexC = new GraphVertex('C'); + const vertexD = new GraphVertex('D'); + + const edgeAB = new GraphEdge(vertexA, vertexB, 1); + const edgeAD = new GraphEdge(vertexA, vertexD, 3); + const edgeBC = new GraphEdge(vertexB, vertexC, 1); + const edgeBD = new GraphEdge(vertexB, vertexD, 3); + const edgeCD = new GraphEdge(vertexC, vertexD, 1); + + const graph = new Graph(); + + graph + .addEdge(edgeAB) + .addEdge(edgeAD) + .addEdge(edgeBC) + .addEdge(edgeBD) + .addEdge(edgeCD); + + expect(graph.getWeight()).toEqual(9); + + const minimumSpanningTree = kruskal(graph); + + expect(minimumSpanningTree.getWeight()).toBe(3); + expect(minimumSpanningTree.getAllVertices().length).toBe(graph.getAllVertices().length); + expect(minimumSpanningTree.getAllEdges().length).toBe(graph.getAllVertices().length - 1); + expect(minimumSpanningTree.toString()).toBe('A,B,C,D'); + }); +}); diff --git a/src/algorithms/graph/kruskal/kruskal.js b/src/algorithms/graph/kruskal/kruskal.js new file mode 100644 index 000000000..3f0ac44ff --- /dev/null +++ b/src/algorithms/graph/kruskal/kruskal.js @@ -0,0 +1,62 @@ +import Graph from '../../../data-structures/graph/Graph'; +import QuickSort from '../../sorting/quick-sort/QuickSort'; +import DisjointSet from '../../../data-structures/disjoint-set/DisjointSet'; + +/** + * @param {Graph} graph + * @return {Graph} + */ +export default function kruskal(graph) { + // It should fire error if graph is directed since the algorithm works only + // for undirected graphs. + if (graph.isDirected) { + throw new Error('Prim\'s algorithms works only for undirected graphs'); + } + + // Init new graph that will contain minimum spanning tree of original graph. + const minimumSpanningTree = new Graph(); + + // Sort all graph edges in increasing order. + const sortingCallbacks = { + /** + * @param {GraphEdge} graphEdgeA + * @param {GraphEdge} graphEdgeB + */ + compareCallback: (graphEdgeA, graphEdgeB) => { + if (graphEdgeA.weight === graphEdgeB.weight) { + return 1; + } + + return graphEdgeA.weight <= graphEdgeB.weight ? -1 : 1; + }, + }; + const sortedEdges = new QuickSort(sortingCallbacks).sort(graph.getAllEdges()); + + // Create disjoint sets for all graph vertices. + const keyCallback = graphVertex => graphVertex.getKey(); + const disjointSet = new DisjointSet(keyCallback); + + graph.getAllVertices().forEach((graphVertex) => { + disjointSet.makeSet(graphVertex); + }); + + // Go through all edges started from the minimum one and try to add them + // to minimum spanning tree. The criteria of adding the edge would be whether + // it is forms the cycle or not (if it connects two vertices from one disjoint + // set or not). + for (let edgeIndex = 0; edgeIndex < sortedEdges.length; edgeIndex += 1) { + /** @var {GraphEdge} currentEdge */ + const currentEdge = sortedEdges[edgeIndex]; + + // Check if edge forms the cycle. If it does then skip it. + if (!disjointSet.inSameSet(currentEdge.startVertex, currentEdge.endVertex)) { + // Unite two subsets into one. + disjointSet.union(currentEdge.startVertex, currentEdge.endVertex); + + // Add this edge to spanning tree. + minimumSpanningTree.addEdge(currentEdge); + } + } + + return minimumSpanningTree; +} From b07322d94316906873d648487ef46f08e1bd8200 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Tue, 8 May 2018 19:27:42 +0300 Subject: [PATCH 259/327] Add topological sorting. --- README.md | 2 +- .../graph/topological-sorting/README.md | 55 +++++++++++++++++++ .../__test__/topologicalSort.test.js | 53 ++++++++++++++++++ .../topological-sorting/topologicalSort.js | 47 ++++++++++++++++ src/data-structures/linked-list/LinkedList.js | 31 +++++++++++ src/data-structures/stack/Stack.js | 26 +++++++++ .../stack/__test__/Stack.test.js | 12 ++++ 7 files changed, 225 insertions(+), 1 deletion(-) create mode 100644 src/algorithms/graph/topological-sorting/README.md create mode 100644 src/algorithms/graph/topological-sorting/__test__/topologicalSort.test.js create mode 100644 src/algorithms/graph/topological-sorting/topologicalSort.js diff --git a/README.md b/README.md index 73e23a13c..baef23fa1 100644 --- a/README.md +++ b/README.md @@ -71,7 +71,7 @@ * [Detect Cycle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/detect-cycle) - for both directed and undirected graphs (DFS and Disjoint Set based versions) * [Prim’s Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/prim) - finding Minimum Spanning Tree (MST) for weighted undirected graph * [Kruskal’s Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/kruskal) - finding Minimum Spanning Tree (MST) for weighted undirected graph - * Topological Sorting + * [Topological Sorting](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/topological-sorting) - DFS method * Eulerian path, Eulerian circuit * Strongly Connected Component algorithm * Shortest Path Faster Algorithm (SPFA) diff --git a/src/algorithms/graph/topological-sorting/README.md b/src/algorithms/graph/topological-sorting/README.md new file mode 100644 index 000000000..c911c1caa --- /dev/null +++ b/src/algorithms/graph/topological-sorting/README.md @@ -0,0 +1,55 @@ +# Topological Sorting + +In the field of computer science, a topological sort or +topological ordering of a directed graph is a linear ordering +of its vertices such that for every directed edge `uv` from +vertex `u` to vertex `v`, `u` comes before `v` in the ordering. + +For instance, the vertices of the graph may represent tasks to +be performed, and the edges may represent constraints that one +task must be performed before another; in this application, a +topological ordering is just a valid sequence for the tasks. + +A topological ordering is possible if and only if the graph has +no directed cycles, that is, if it is a [directed acyclic graph](https://en.wikipedia.org/wiki/Directed_acyclic_graph) +(DAG). Any DAG has at least one topological ordering, and algorithms are +known for constructing a topological ordering of any DAG in linear time. + +![Directed Acyclic Graph](https://upload.wikimedia.org/wikipedia/commons/c/c6/Topological_Ordering.svg) + +A topological ordering of a directed acyclic graph: every edge goes from +earlier in the ordering (upper left) to later in the ordering (lower right). +A directed graph is acyclic if and only if it has a topological ordering. + +## Example + +![Topologic Sorting](https://upload.wikimedia.org/wikipedia/commons/0/03/Directed_acyclic_graph_2.svg) + +The graph shown above has many valid topological sorts, including: + +- `5, 7, 3, 11, 8, 2, 9, 10` (visual left-to-right, top-to-bottom) +- `3, 5, 7, 8, 11, 2, 9, 10` (smallest-numbered available vertex first) +- `5, 7, 3, 8, 11, 10, 9, 2` (fewest edges first) +- `7, 5, 11, 3, 10, 8, 9, 2` (largest-numbered available vertex first) +- `5, 7, 11, 2, 3, 8, 9, 10` (attempting top-to-bottom, left-to-right) +- `3, 7, 8, 5, 11, 10, 2, 9` (arbitrary) + +## Application + +The canonical application of topological sorting is in +**scheduling a sequence of jobs** or tasks based on their dependencies. The jobs +are represented by vertices, and there is an edge from `x` to `y` if +job `x` must be completed before job `y` can be started (for +example, when washing clothes, the washing machine must finish +before we put the clothes in the dryer). Then, a topological sort +gives an order in which to perform the jobs. + +Other application is **dependency resolution**. Each vertex is a package +and each edge is a dependency of package `a` on package 'b'. Then topological +sorting will provide a sequence of installing dependencies in a way that every +next dependency has its dependent packages to be installed in prior. + +## References + +- [Wikipedia](https://en.wikipedia.org/wiki/Topological_sorting) +- [Topological Sorting on YouTube by Tushar Roy](https://www.youtube.com/watch?v=ddTC4Zovtbc) diff --git a/src/algorithms/graph/topological-sorting/__test__/topologicalSort.test.js b/src/algorithms/graph/topological-sorting/__test__/topologicalSort.test.js new file mode 100644 index 000000000..e2904cfb3 --- /dev/null +++ b/src/algorithms/graph/topological-sorting/__test__/topologicalSort.test.js @@ -0,0 +1,53 @@ +import GraphVertex from '../../../../data-structures/graph/GraphVertex'; +import GraphEdge from '../../../../data-structures/graph/GraphEdge'; +import Graph from '../../../../data-structures/graph/Graph'; +import topologicalSort from '../topologicalSort'; + +describe('topologicalSort', () => { + it('should do topological sorting on graph', () => { + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + const vertexC = new GraphVertex('C'); + const vertexD = new GraphVertex('D'); + const vertexE = new GraphVertex('E'); + const vertexF = new GraphVertex('F'); + const vertexG = new GraphVertex('G'); + const vertexH = new GraphVertex('H'); + + const edgeAC = new GraphEdge(vertexA, vertexC); + const edgeBC = new GraphEdge(vertexB, vertexC); + const edgeBD = new GraphEdge(vertexB, vertexD); + const edgeCE = new GraphEdge(vertexC, vertexE); + const edgeDF = new GraphEdge(vertexD, vertexF); + const edgeEF = new GraphEdge(vertexE, vertexF); + const edgeEH = new GraphEdge(vertexE, vertexH); + const edgeFG = new GraphEdge(vertexF, vertexG); + + const graph = new Graph(true); + + graph + .addEdge(edgeAC) + .addEdge(edgeBC) + .addEdge(edgeBD) + .addEdge(edgeCE) + .addEdge(edgeDF) + .addEdge(edgeEF) + .addEdge(edgeEH) + .addEdge(edgeFG); + + const sortedVertices = topologicalSort(graph); + + expect(sortedVertices).toBeDefined(); + expect(sortedVertices.length).toBe(graph.getAllVertices().length); + expect(sortedVertices).toEqual([ + vertexB, + vertexD, + vertexA, + vertexC, + vertexE, + vertexH, + vertexF, + vertexG, + ]); + }); +}); diff --git a/src/algorithms/graph/topological-sorting/topologicalSort.js b/src/algorithms/graph/topological-sorting/topologicalSort.js new file mode 100644 index 000000000..cd7bdd3dd --- /dev/null +++ b/src/algorithms/graph/topological-sorting/topologicalSort.js @@ -0,0 +1,47 @@ +import Stack from '../../../data-structures/stack/Stack'; +import depthFirstSearch from '../depth-first-search/depthFirstSearch'; + +/** + * @param {Graph} graph + */ +export default function topologicalSort(graph) { + // Create a set of all vertices we want to visit. + const unvisitedSet = {}; + graph.getAllVertices().forEach((vertex) => { + unvisitedSet[vertex.getKey()] = vertex; + }); + + // Create a set for all vertices that we've already visited. + const visitedSet = {}; + + // Create a stack of already ordered vertices. + const sortedStack = new Stack(); + + const dfsCallbacks = { + enterVertex: ({ currentVertex }) => { + // Add vertex to visited set in case if all its children has been explored. + visitedSet[currentVertex.getKey()] = currentVertex; + + // Remove this vertex from unvisited set. + delete unvisitedSet[currentVertex.getKey()]; + }, + leaveVertex: ({ currentVertex }) => { + // If the vertex has been totally explored then we may push it to stack. + sortedStack.push(currentVertex); + }, + allowTraversal: ({ nextVertex }) => { + return !visitedSet[nextVertex.getKey()]; + }, + }; + + // Let's go and do DFS for all unvisited nodes. + while (Object.keys(unvisitedSet).length) { + const currentVertexKey = Object.keys(unvisitedSet)[0]; + const currentVertex = unvisitedSet[currentVertexKey]; + + // Do DFS for current node. + depthFirstSearch(graph, currentVertex, dfsCallbacks); + } + + return sortedStack.toArray(); +} diff --git a/src/data-structures/linked-list/LinkedList.js b/src/data-structures/linked-list/LinkedList.js index 66dbdb903..13537525c 100644 --- a/src/data-structures/linked-list/LinkedList.js +++ b/src/data-structures/linked-list/LinkedList.js @@ -9,6 +9,10 @@ export default class LinkedList { this.tail = null; } + /** + * @param {*} value + * @return {LinkedList} + */ prepend(value) { // Make new node to be a head. this.head = new LinkedListNode(value, this.head); @@ -16,6 +20,10 @@ export default class LinkedList { return this; } + /** + * @param {*} value + * @return {LinkedList} + */ append(value) { const newNode = new LinkedListNode(value); @@ -34,6 +42,10 @@ export default class LinkedList { return this; } + /** + * @param {*} value + * @return {LinkedListNode} + */ delete(value) { if (!this.head) { return null; @@ -67,6 +79,12 @@ export default class LinkedList { return deletedNode; } + /** + * @param {Object} findParams + * @param {*} findParams.value + * @param {function} [findParams.callback] + * @return {LinkedListNode} + */ find({ value = undefined, callback = undefined }) { if (!this.head) { return null; @@ -91,6 +109,9 @@ export default class LinkedList { return null; } + /** + * @return {LinkedListNode} + */ deleteTail() { if (this.head === this.tail) { const deletedTail = this.tail; @@ -116,6 +137,9 @@ export default class LinkedList { return deletedTail; } + /** + * @return {LinkedListNode} + */ deleteHead() { if (!this.head) { return null; @@ -133,6 +157,9 @@ export default class LinkedList { return deletedHead; } + /** + * @return {LinkedListNode[]} + */ toArray() { const nodes = []; @@ -145,6 +172,10 @@ export default class LinkedList { return nodes; } + /** + * @param {function} [callback] + * @return {string} + */ toString(callback) { return this.toArray().map(node => node.toString(callback)).toString(); } diff --git a/src/data-structures/stack/Stack.js b/src/data-structures/stack/Stack.js index 665bec2ea..a71083007 100644 --- a/src/data-structures/stack/Stack.js +++ b/src/data-structures/stack/Stack.js @@ -5,10 +5,16 @@ export default class Stack { this.linkedList = new LinkedList(); } + /** + * @return {boolean} + */ isEmpty() { return !this.linkedList.tail; } + /** + * @return {LinkedListNode} + */ peek() { if (!this.linkedList.tail) { return null; @@ -17,15 +23,35 @@ export default class Stack { return this.linkedList.tail.value; } + /** + * @param {*} value + */ push(value) { this.linkedList.append(value); } + /** + * @return {LinkedListNode} + */ pop() { const removedTail = this.linkedList.deleteTail(); return removedTail ? removedTail.value : null; } + /** + * @return {*[]} + */ + toArray() { + return this.linkedList + .toArray() + .map(linkedListNode => linkedListNode.value) + .reverse(); + } + + /** + * @param {function} [callback] + * @return {string} + */ toString(callback) { return this.linkedList.toString(callback); } diff --git a/src/data-structures/stack/__test__/Stack.test.js b/src/data-structures/stack/__test__/Stack.test.js index 291bc430a..26d121c8a 100644 --- a/src/data-structures/stack/__test__/Stack.test.js +++ b/src/data-structures/stack/__test__/Stack.test.js @@ -62,4 +62,16 @@ describe('Stack', () => { expect(stack.pop().value).toBe('test2'); expect(stack.pop().value).toBe('test1'); }); + + it('should be possible to convert stack to array', () => { + const stack = new Stack(); + + expect(stack.peek()).toBeNull(); + + stack.push(1); + stack.push(2); + stack.push(3); + + expect(stack.toArray()).toEqual([3, 2, 1]); + }); }); From 8912d22eb3daa1aa02a661b9dea7a4ab3a547c3a Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Wed, 9 May 2018 09:35:34 +0300 Subject: [PATCH 260/327] Add degree property to GraphVertex. --- src/data-structures/graph/GraphVertex.js | 12 ++++++++-- .../graph/__test__/GraphVertex.test.js | 22 +++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/data-structures/graph/GraphVertex.js b/src/data-structures/graph/GraphVertex.js index 06c7d67dd..34be0fc5f 100644 --- a/src/data-structures/graph/GraphVertex.js +++ b/src/data-structures/graph/GraphVertex.js @@ -31,8 +31,9 @@ export default class GraphVertex { getNeighbors() { const edges = this.edges.toArray(); - const neighborsConverter = ({ value }) => { - return value.startVertex === this ? value.endVertex : value.startVertex; + /** @param {LinkedListNode} node */ + const neighborsConverter = (node) => { + return node.value.startVertex === this ? node.value.endVertex : node.value.startVertex; }; // Return either start or end vertex. @@ -47,6 +48,13 @@ export default class GraphVertex { return this.edges.toArray().map(linkedListNode => linkedListNode.value); } + /** + * @return {number} + */ + getDegree() { + return this.edges.toArray().length; + } + /** * @param {GraphEdge} requiredEdge * @returns {boolean} diff --git a/src/data-structures/graph/__test__/GraphVertex.test.js b/src/data-structures/graph/__test__/GraphVertex.test.js index 679f587a2..8512c34d3 100644 --- a/src/data-structures/graph/__test__/GraphVertex.test.js +++ b/src/data-structures/graph/__test__/GraphVertex.test.js @@ -100,4 +100,26 @@ describe('GraphVertex', () => { expect(vertexA.findEdge(vertexB)).toEqual(edgeAB); expect(vertexA.findEdge(vertexC)).toBeNull(); }); + + it('should calculate vertex degree', () => { + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + + expect(vertexA.getDegree()).toBe(0); + + const edgeAB = new GraphEdge(vertexA, vertexB); + vertexA.addEdge(edgeAB); + + expect(vertexA.getDegree()).toBe(1); + + const edgeBA = new GraphEdge(vertexB, vertexA); + vertexA.addEdge(edgeBA); + + expect(vertexA.getDegree()).toBe(2); + + vertexA.addEdge(edgeAB); + expect(vertexA.getDegree()).toBe(3); + + expect(vertexA.getEdges().length).toEqual(3); + }); }); From 04fc9985777cfcfe7bcd84225f92905bdd6e917d Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 10 May 2018 16:12:24 +0300 Subject: [PATCH 261/327] Add Tarjan's algorithm. --- README.md | 3 +- .../graph/articulation-points/README.md | 22 +++ .../__test__/articulationPoints.test.js | 143 ++++++++++++++++++ .../articulation-points/articulationPoints.js | 116 ++++++++++++++ src/algorithms/graph/eulerian-path/README.md | 34 +++++ 5 files changed, 317 insertions(+), 1 deletion(-) create mode 100644 src/algorithms/graph/articulation-points/README.md create mode 100644 src/algorithms/graph/articulation-points/__test__/articulationPoints.test.js create mode 100644 src/algorithms/graph/articulation-points/articulationPoints.js create mode 100644 src/algorithms/graph/eulerian-path/README.md diff --git a/README.md b/README.md index baef23fa1..405dc34e2 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,8 @@ * [Prim’s Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/prim) - finding Minimum Spanning Tree (MST) for weighted undirected graph * [Kruskal’s Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/kruskal) - finding Minimum Spanning Tree (MST) for weighted undirected graph * [Topological Sorting](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/topological-sorting) - DFS method - * Eulerian path, Eulerian circuit + * [Articulation Points](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/articulation-points) - Tarjan's algorithm + * [Eulerian Path and Eulerian Circuit](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/eulerian-path) * Strongly Connected Component algorithm * Shortest Path Faster Algorithm (SPFA) * **Uncategorized** diff --git a/src/algorithms/graph/articulation-points/README.md b/src/algorithms/graph/articulation-points/README.md new file mode 100644 index 000000000..d9a7eff0f --- /dev/null +++ b/src/algorithms/graph/articulation-points/README.md @@ -0,0 +1,22 @@ +# Articulation Points (or Cut Vertices) + +A vertex in an undirected connected graph is an articulation point +(or cut vertex) iff removing it (and edges through it) disconnects +the graph. Articulation points represent vulnerabilities in a +connected network – single points whose failure would split the +network into 2 or more disconnected components. They are useful for +designing reliable networks. + +For a disconnected undirected graph, an articulation point is a +vertex removing which increases number of connected components. + +![Articulation Points](https://www.geeksforgeeks.org/wp-content/uploads/ArticulationPoints.png) + +![Articulation Points](https://www.geeksforgeeks.org/wp-content/uploads/ArticulationPoints1.png) + +![Articulation Points](https://www.geeksforgeeks.org/wp-content/uploads/ArticulationPoints21.png) + +## References + +- [GeeksForGeeks](https://www.geeksforgeeks.org/articulation-points-or-cut-vertices-in-a-graph/) +- [YouTube](https://www.youtube.com/watch?v=2kREIkF9UAs) diff --git a/src/algorithms/graph/articulation-points/__test__/articulationPoints.test.js b/src/algorithms/graph/articulation-points/__test__/articulationPoints.test.js new file mode 100644 index 000000000..402dfc733 --- /dev/null +++ b/src/algorithms/graph/articulation-points/__test__/articulationPoints.test.js @@ -0,0 +1,143 @@ +import GraphVertex from '../../../../data-structures/graph/GraphVertex'; +import GraphEdge from '../../../../data-structures/graph/GraphEdge'; +import Graph from '../../../../data-structures/graph/Graph'; +import articulationPoints from '../articulationPoints'; + +describe('articulationPoints', () => { + it('should find articulation points in simple graph', () => { + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + const vertexC = new GraphVertex('C'); + const vertexD = new GraphVertex('D'); + + const edgeAB = new GraphEdge(vertexA, vertexB); + const edgeBC = new GraphEdge(vertexB, vertexC); + const edgeCD = new GraphEdge(vertexC, vertexD); + + const graph = new Graph(); + + graph + .addEdge(edgeAB) + .addEdge(edgeBC) + .addEdge(edgeCD); + + const articulationPointsSet = articulationPoints(graph); + + expect(articulationPointsSet).toEqual([ + vertexC, + vertexB, + ]); + }); + + it('should find articulation points in simple graph with back edge', () => { + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + const vertexC = new GraphVertex('C'); + const vertexD = new GraphVertex('D'); + + const edgeAB = new GraphEdge(vertexA, vertexB); + const edgeBC = new GraphEdge(vertexB, vertexC); + const edgeCD = new GraphEdge(vertexC, vertexD); + const edgeAC = new GraphEdge(vertexA, vertexC); + + const graph = new Graph(); + + graph + .addEdge(edgeAB) + .addEdge(edgeAC) + .addEdge(edgeBC) + .addEdge(edgeCD); + + const articulationPointsSet = articulationPoints(graph); + + expect(articulationPointsSet).toEqual([ + vertexC, + ]); + }); + + it('should find articulation points in graph', () => { + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + const vertexC = new GraphVertex('C'); + const vertexD = new GraphVertex('D'); + const vertexE = new GraphVertex('E'); + const vertexF = new GraphVertex('F'); + const vertexG = new GraphVertex('G'); + const vertexH = new GraphVertex('H'); + + const edgeAB = new GraphEdge(vertexA, vertexB); + const edgeBC = new GraphEdge(vertexB, vertexC); + const edgeAC = new GraphEdge(vertexA, vertexC); + const edgeCD = new GraphEdge(vertexC, vertexD); + const edgeDE = new GraphEdge(vertexD, vertexE); + const edgeEG = new GraphEdge(vertexE, vertexG); + const edgeEF = new GraphEdge(vertexE, vertexF); + const edgeGF = new GraphEdge(vertexG, vertexF); + const edgeFH = new GraphEdge(vertexF, vertexH); + + const graph = new Graph(); + + graph + .addEdge(edgeAB) + .addEdge(edgeBC) + .addEdge(edgeAC) + .addEdge(edgeCD) + .addEdge(edgeDE) + .addEdge(edgeEG) + .addEdge(edgeEF) + .addEdge(edgeGF) + .addEdge(edgeFH); + + const articulationPointsSet = articulationPoints(graph); + + expect(articulationPointsSet).toEqual([ + vertexF, + vertexE, + vertexD, + vertexC, + ]); + }); + + it('should find articulation points in graph starting with articulation root vertex', () => { + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + const vertexC = new GraphVertex('C'); + const vertexD = new GraphVertex('D'); + const vertexE = new GraphVertex('E'); + const vertexF = new GraphVertex('F'); + const vertexG = new GraphVertex('G'); + const vertexH = new GraphVertex('H'); + + const edgeAB = new GraphEdge(vertexA, vertexB); + const edgeBC = new GraphEdge(vertexB, vertexC); + const edgeAC = new GraphEdge(vertexA, vertexC); + const edgeCD = new GraphEdge(vertexC, vertexD); + const edgeDE = new GraphEdge(vertexD, vertexE); + const edgeEG = new GraphEdge(vertexE, vertexG); + const edgeEF = new GraphEdge(vertexE, vertexF); + const edgeGF = new GraphEdge(vertexG, vertexF); + const edgeFH = new GraphEdge(vertexF, vertexH); + + const graph = new Graph(); + + graph + .addEdge(edgeDE) + .addEdge(edgeAB) + .addEdge(edgeBC) + .addEdge(edgeAC) + .addEdge(edgeCD) + .addEdge(edgeEG) + .addEdge(edgeEF) + .addEdge(edgeGF) + .addEdge(edgeFH); + + const articulationPointsSet = articulationPoints(graph); + + expect(articulationPointsSet).toEqual([ + vertexF, + vertexE, + vertexC, + vertexD, + ]); + }); +}); diff --git a/src/algorithms/graph/articulation-points/articulationPoints.js b/src/algorithms/graph/articulation-points/articulationPoints.js new file mode 100644 index 000000000..f34d3e72c --- /dev/null +++ b/src/algorithms/graph/articulation-points/articulationPoints.js @@ -0,0 +1,116 @@ +import depthFirstSearch from '../depth-first-search/depthFirstSearch'; + +/** + * Helper class for visited vertex metadata. + */ +class VisitMetadata { + constructor({ discoveryTime, lowDiscoveryTime }) { + this.discoveryTime = discoveryTime; + this.lowDiscoveryTime = lowDiscoveryTime; + + // We need this to know to which vertex we need to compare discovery time + // when leaving the vertex. + this.childVertex = null; + + // We need this in order to check graph root node, whether it has two + // disconnected children or not. + this.childrenCount = 0; + } +} + +/** + * Tarjan's algorithm for rinding articulation points in graph. + * + * @param {Graph} graph + * @return {GraphVertex[]} + */ +export default function articulationPoints(graph) { + // Set of vertices we've already visited during DFS. + const visitedSet = {}; + + // Set of articulation points found so far. + const articulationPointsSet = []; + + // Time needed to get to the current vertex. + let discoveryTime = 0; + + // Peek the start vertex for DFS traversal. + const startVertex = graph.getAllVertices()[0]; + + const dfsCallbacks = { + /** + * @param {GraphVertex} currentVertex + * @param {GraphVertex} previousVertex + */ + enterVertex: ({ currentVertex, previousVertex }) => { + // Put current vertex to visited set. + visitedSet[currentVertex.getKey()] = new VisitMetadata({ + discoveryTime, + lowDiscoveryTime: discoveryTime, + }); + + // Tick discovery time. + discoveryTime += 1; + + if (previousVertex) { + // Update child vertex information for previous vertex. + visitedSet[previousVertex.getKey()].childVertex = currentVertex; + + // Update children counter for previous vertex. + visitedSet[previousVertex.getKey()].childrenCount += 1; + } + }, + /** + * @param {GraphVertex} currentVertex + * @param {GraphVertex} previousVertex + */ + leaveVertex: ({ currentVertex }) => { + // Detect whether current vertex is articulation point or not. + // To do so we need to check two (OR) conditions: + // 1. Is it a root vertex with at least two independent children. + // 2. If its visited time is <= low time of adjacent vertex. + if (currentVertex === startVertex) { + // Check that it has at least two independent children. + if (visitedSet[currentVertex.getKey()].childrenCount >= 2) { + articulationPointsSet.push(currentVertex); + } + } else { + // Get child vertex low discovery time. + let childVertexLowDiscoveryTime = null; + if (visitedSet[currentVertex.getKey()].childVertex) { + const childVertexKey = visitedSet[currentVertex.getKey()].childVertex.getKey(); + childVertexLowDiscoveryTime = visitedSet[childVertexKey].lowDiscoveryTime; + } + + // Compare child vertex low discovery time with current discovery time to if there + // are any short path (back edge) exists. If we can get to child vertex faster then + // to current one it means that there is a back edge exists (short path) and current + // vertex isn't articulation point. + const currentDiscoveryTime = visitedSet[currentVertex.getKey()].discoveryTime; + if (currentDiscoveryTime <= childVertexLowDiscoveryTime) { + articulationPointsSet.push(currentVertex); + } + + // Update the low time with the smallest time of adjacent vertices. + + // Get minimum low discovery time from all neighbors. + /** @param {GraphVertex} neighbor */ + visitedSet[currentVertex.getKey()].lowDiscoveryTime = currentVertex.getNeighbors().reduce( + (lowestDiscoveryTime, neighbor) => { + const neighborLowTime = visitedSet[neighbor.getKey()].lowDiscoveryTime; + return neighborLowTime < lowestDiscoveryTime ? neighborLowTime : lowestDiscoveryTime; + }, + visitedSet[currentVertex.getKey()].lowDiscoveryTime, + ); + } + }, + allowTraversal: ({ nextVertex }) => { + return !visitedSet[nextVertex.getKey()]; + }, + }; + + // Do Depth First Search traversal over submitted graph. + depthFirstSearch(graph, startVertex, dfsCallbacks); + + return articulationPointsSet; +} diff --git a/src/algorithms/graph/eulerian-path/README.md b/src/algorithms/graph/eulerian-path/README.md new file mode 100644 index 000000000..9f1f9e265 --- /dev/null +++ b/src/algorithms/graph/eulerian-path/README.md @@ -0,0 +1,34 @@ +# Eulerian Path + +In graph theory, an **Eulerian trail** (or **Eulerian path**) is a +trail in a finite graph which visits every edge exactly once. +Similarly, an **Eulerian circuit** or **Eulerian cycle** is an +Eulerian trail which starts and ends on the same vertex. + +Euler proved that a necessary condition for the existence of Eulerian +circuits is that all vertices in the graph have an even degree, and +stated that connected graphs with all vertices of even degree have +an Eulerian circuit. + +![Eulerian Circuit](https://upload.wikimedia.org/wikipedia/commons/7/72/Labelled_Eulergraph.svg) + +Every vertex of this graph has an even degree. Therefore, this is +an Eulerian graph. Following the edges in alphabetical order gives +an Eulerian circuit/cycle. + +For the existence of Eulerian trails it is necessary that zero or +two vertices have an odd degree; this means the Königsberg graph +is not Eulerian. If there are no vertices of odd degree, +all Eulerian trails are circuits. If there are exactly two vertices +of odd degree, all Eulerian trails start at one of them and end at +the other. A graph that has an Eulerian trail but not an Eulerian +circuit is called semi-Eulerian. + +![Königsberg graph](https://upload.wikimedia.org/wikipedia/commons/9/96/K%C3%B6nigsberg_graph.svg) + +The Königsberg Bridges multigraph. This multigraph is not Eulerian, +therefore, a solution does not exist. + +## References + +- [Wikipedia](https://en.wikipedia.org/wiki/Eulerian_path) From 133db8af9cc9c5ce25093b7db2bd0a4031a171cf Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 10 May 2018 16:28:44 +0300 Subject: [PATCH 262/327] Add Tarjan's algorithm. --- .../__test__/articulationPoints.test.js | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/src/algorithms/graph/articulation-points/__test__/articulationPoints.test.js b/src/algorithms/graph/articulation-points/__test__/articulationPoints.test.js index 402dfc733..748f5dee7 100644 --- a/src/algorithms/graph/articulation-points/__test__/articulationPoints.test.js +++ b/src/algorithms/graph/articulation-points/__test__/articulationPoints.test.js @@ -140,4 +140,71 @@ describe('articulationPoints', () => { vertexD, ]); }); + + it('should find articulation points in yet another graph #1', () => { + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + const vertexC = new GraphVertex('C'); + const vertexD = new GraphVertex('D'); + const vertexE = new GraphVertex('E'); + + const edgeAB = new GraphEdge(vertexA, vertexB); + const edgeAC = new GraphEdge(vertexA, vertexC); + const edgeBC = new GraphEdge(vertexB, vertexC); + const edgeCD = new GraphEdge(vertexC, vertexD); + const edgeDE = new GraphEdge(vertexD, vertexE); + + const graph = new Graph(); + + graph + .addEdge(edgeAB) + .addEdge(edgeAC) + .addEdge(edgeBC) + .addEdge(edgeCD) + .addEdge(edgeDE); + + const articulationPointsSet = articulationPoints(graph); + + expect(articulationPointsSet).toEqual([ + vertexD, + vertexC, + ]); + }); + + it('should find articulation points in yet another graph #2', () => { + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + const vertexC = new GraphVertex('C'); + const vertexD = new GraphVertex('D'); + const vertexE = new GraphVertex('E'); + const vertexF = new GraphVertex('F'); + const vertexG = new GraphVertex('G'); + + const edgeAB = new GraphEdge(vertexA, vertexB); + const edgeAC = new GraphEdge(vertexA, vertexC); + const edgeBC = new GraphEdge(vertexB, vertexC); + const edgeCD = new GraphEdge(vertexC, vertexD); + const edgeCE = new GraphEdge(vertexC, vertexE); + const edgeCF = new GraphEdge(vertexC, vertexF); + const edgeEG = new GraphEdge(vertexE, vertexG); + const edgeFG = new GraphEdge(vertexF, vertexG); + + const graph = new Graph(); + + graph + .addEdge(edgeAB) + .addEdge(edgeAC) + .addEdge(edgeBC) + .addEdge(edgeCD) + .addEdge(edgeCE) + .addEdge(edgeCF) + .addEdge(edgeEG) + .addEdge(edgeFG); + + const articulationPointsSet = articulationPoints(graph); + + expect(articulationPointsSet).toEqual([ + vertexC, + ]); + }); }); From 481de0e3da16155e923ed0c7f168a03cce7db11f Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Fri, 11 May 2018 06:58:19 +0300 Subject: [PATCH 263/327] Add Tarjan's algorithm. --- .../__test__/articulationPoints.test.js | 29 +++++++++++++++++++ .../articulation-points/articulationPoints.js | 6 ++-- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/algorithms/graph/articulation-points/__test__/articulationPoints.test.js b/src/algorithms/graph/articulation-points/__test__/articulationPoints.test.js index 748f5dee7..c02412410 100644 --- a/src/algorithms/graph/articulation-points/__test__/articulationPoints.test.js +++ b/src/algorithms/graph/articulation-points/__test__/articulationPoints.test.js @@ -55,6 +55,35 @@ describe('articulationPoints', () => { ]); }); + it('should find articulation points in simple graph with back edge #2', () => { + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + const vertexC = new GraphVertex('C'); + const vertexD = new GraphVertex('D'); + const vertexE = new GraphVertex('E'); + + const edgeAB = new GraphEdge(vertexA, vertexB); + const edgeBC = new GraphEdge(vertexB, vertexC); + const edgeCD = new GraphEdge(vertexC, vertexD); + const edgeAE = new GraphEdge(vertexA, vertexE); + const edgeCE = new GraphEdge(vertexC, vertexE); + + const graph = new Graph(); + + graph + .addEdge(edgeAB) + .addEdge(edgeAE) + .addEdge(edgeCE) + .addEdge(edgeBC) + .addEdge(edgeCD); + + const articulationPointsSet = articulationPoints(graph); + + expect(articulationPointsSet).toEqual([ + vertexC, + ]); + }); + it('should find articulation points in graph', () => { const vertexA = new GraphVertex('A'); const vertexB = new GraphVertex('B'); diff --git a/src/algorithms/graph/articulation-points/articulationPoints.js b/src/algorithms/graph/articulation-points/articulationPoints.js index f34d3e72c..dd653167e 100644 --- a/src/algorithms/graph/articulation-points/articulationPoints.js +++ b/src/algorithms/graph/articulation-points/articulationPoints.js @@ -14,7 +14,7 @@ class VisitMetadata { // We need this in order to check graph root node, whether it has two // disconnected children or not. - this.childrenCount = 0; + this.independantChildrenCount = 0; } } @@ -57,7 +57,7 @@ export default function articulationPoints(graph) { visitedSet[previousVertex.getKey()].childVertex = currentVertex; // Update children counter for previous vertex. - visitedSet[previousVertex.getKey()].childrenCount += 1; + visitedSet[previousVertex.getKey()].independantChildrenCount += 1; } }, /** @@ -71,7 +71,7 @@ export default function articulationPoints(graph) { // 2. If its visited time is <= low time of adjacent vertex. if (currentVertex === startVertex) { // Check that it has at least two independent children. - if (visitedSet[currentVertex.getKey()].childrenCount >= 2) { + if (visitedSet[currentVertex.getKey()].independantChildrenCount >= 2) { articulationPointsSet.push(currentVertex); } } else { From ae071cb9435acc4c33315053b625f1df501533a9 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Fri, 11 May 2018 07:42:02 +0300 Subject: [PATCH 264/327] Add Tarjan's algorithm. --- .../graph/articulation-points/README.md | 2 +- .../__test__/articulationPoints.test.js | 51 +++++------- .../articulation-points/articulationPoints.js | 81 +++++++++---------- 3 files changed, 59 insertions(+), 75 deletions(-) diff --git a/src/algorithms/graph/articulation-points/README.md b/src/algorithms/graph/articulation-points/README.md index d9a7eff0f..4c64d81e4 100644 --- a/src/algorithms/graph/articulation-points/README.md +++ b/src/algorithms/graph/articulation-points/README.md @@ -1,7 +1,7 @@ # Articulation Points (or Cut Vertices) A vertex in an undirected connected graph is an articulation point -(or cut vertex) iff removing it (and edges through it) disconnects +(or cut vertex) if removing it (and edges through it) disconnects the graph. Articulation points represent vulnerabilities in a connected network – single points whose failure would split the network into 2 or more disconnected components. They are useful for diff --git a/src/algorithms/graph/articulation-points/__test__/articulationPoints.test.js b/src/algorithms/graph/articulation-points/__test__/articulationPoints.test.js index c02412410..03b12ed92 100644 --- a/src/algorithms/graph/articulation-points/__test__/articulationPoints.test.js +++ b/src/algorithms/graph/articulation-points/__test__/articulationPoints.test.js @@ -23,10 +23,9 @@ describe('articulationPoints', () => { const articulationPointsSet = articulationPoints(graph); - expect(articulationPointsSet).toEqual([ - vertexC, - vertexB, - ]); + expect(articulationPointsSet.length).toBe(2); + expect(articulationPointsSet[0].getKey()).toBe(vertexC.getKey()); + expect(articulationPointsSet[1].getKey()).toBe(vertexB.getKey()); }); it('should find articulation points in simple graph with back edge', () => { @@ -50,9 +49,8 @@ describe('articulationPoints', () => { const articulationPointsSet = articulationPoints(graph); - expect(articulationPointsSet).toEqual([ - vertexC, - ]); + expect(articulationPointsSet.length).toBe(1); + expect(articulationPointsSet[0].getKey()).toBe(vertexC.getKey()); }); it('should find articulation points in simple graph with back edge #2', () => { @@ -79,9 +77,8 @@ describe('articulationPoints', () => { const articulationPointsSet = articulationPoints(graph); - expect(articulationPointsSet).toEqual([ - vertexC, - ]); + expect(articulationPointsSet.length).toBe(1); + expect(articulationPointsSet[0].getKey()).toBe(vertexC.getKey()); }); it('should find articulation points in graph', () => { @@ -119,12 +116,11 @@ describe('articulationPoints', () => { const articulationPointsSet = articulationPoints(graph); - expect(articulationPointsSet).toEqual([ - vertexF, - vertexE, - vertexD, - vertexC, - ]); + expect(articulationPointsSet.length).toBe(4); + expect(articulationPointsSet[0].getKey()).toBe(vertexF.getKey()); + expect(articulationPointsSet[1].getKey()).toBe(vertexE.getKey()); + expect(articulationPointsSet[2].getKey()).toBe(vertexD.getKey()); + expect(articulationPointsSet[3].getKey()).toBe(vertexC.getKey()); }); it('should find articulation points in graph starting with articulation root vertex', () => { @@ -162,12 +158,11 @@ describe('articulationPoints', () => { const articulationPointsSet = articulationPoints(graph); - expect(articulationPointsSet).toEqual([ - vertexF, - vertexE, - vertexC, - vertexD, - ]); + expect(articulationPointsSet.length).toBe(4); + expect(articulationPointsSet[0].getKey()).toBe(vertexF.getKey()); + expect(articulationPointsSet[1].getKey()).toBe(vertexE.getKey()); + expect(articulationPointsSet[2].getKey()).toBe(vertexC.getKey()); + expect(articulationPointsSet[3].getKey()).toBe(vertexD.getKey()); }); it('should find articulation points in yet another graph #1', () => { @@ -194,10 +189,9 @@ describe('articulationPoints', () => { const articulationPointsSet = articulationPoints(graph); - expect(articulationPointsSet).toEqual([ - vertexD, - vertexC, - ]); + expect(articulationPointsSet.length).toBe(2); + expect(articulationPointsSet[0].getKey()).toBe(vertexD.getKey()); + expect(articulationPointsSet[1].getKey()).toBe(vertexC.getKey()); }); it('should find articulation points in yet another graph #2', () => { @@ -232,8 +226,7 @@ describe('articulationPoints', () => { const articulationPointsSet = articulationPoints(graph); - expect(articulationPointsSet).toEqual([ - vertexC, - ]); + expect(articulationPointsSet.length).toBe(1); + expect(articulationPointsSet[0].getKey()).toBe(vertexC.getKey()); }); }); diff --git a/src/algorithms/graph/articulation-points/articulationPoints.js b/src/algorithms/graph/articulation-points/articulationPoints.js index dd653167e..d4bd9e047 100644 --- a/src/algorithms/graph/articulation-points/articulationPoints.js +++ b/src/algorithms/graph/articulation-points/articulationPoints.js @@ -7,11 +7,6 @@ class VisitMetadata { constructor({ discoveryTime, lowDiscoveryTime }) { this.discoveryTime = discoveryTime; this.lowDiscoveryTime = lowDiscoveryTime; - - // We need this to know to which vertex we need to compare discovery time - // when leaving the vertex. - this.childVertex = null; - // We need this in order to check graph root node, whether it has two // disconnected children or not. this.independantChildrenCount = 0; @@ -28,10 +23,10 @@ export default function articulationPoints(graph) { // Set of vertices we've already visited during DFS. const visitedSet = {}; - // Set of articulation points found so far. - const articulationPointsSet = []; + // Set of articulation points. + const articulationPointsSet = {}; - // Time needed to get to the current vertex. + // Time needed to discover to the current vertex. let discoveryTime = 0; // Peek the start vertex for DFS traversal. @@ -53,9 +48,6 @@ export default function articulationPoints(graph) { discoveryTime += 1; if (previousVertex) { - // Update child vertex information for previous vertex. - visitedSet[previousVertex.getKey()].childVertex = currentVertex; - // Update children counter for previous vertex. visitedSet[previousVertex.getKey()].independantChildrenCount += 1; } @@ -64,44 +56,43 @@ export default function articulationPoints(graph) { * @param {GraphVertex} currentVertex * @param {GraphVertex} previousVertex */ - leaveVertex: ({ currentVertex }) => { - // Detect whether current vertex is articulation point or not. - // To do so we need to check two (OR) conditions: + leaveVertex: ({ currentVertex, previousVertex }) => { + if (previousVertex === null) { + // Don't do anything for the root vertex if it is already current (not previous one) + return; + } + + // Update the low time with the smallest time of adjacent vertices. + // Get minimum low discovery time from all neighbors. + /** @param {GraphVertex} neighbor */ + visitedSet[currentVertex.getKey()].lowDiscoveryTime = currentVertex.getNeighbors().reduce( + (lowestDiscoveryTime, neighbor) => { + const neighborLowTime = visitedSet[neighbor.getKey()].lowDiscoveryTime; + return neighborLowTime < lowestDiscoveryTime ? neighborLowTime : lowestDiscoveryTime; + }, + visitedSet[currentVertex.getKey()].lowDiscoveryTime, + ); + + // Detect whether previous vertex is articulation point or not. + // To do so we need to check two [OR] conditions: // 1. Is it a root vertex with at least two independent children. // 2. If its visited time is <= low time of adjacent vertex. - if (currentVertex === startVertex) { - // Check that it has at least two independent children. - if (visitedSet[currentVertex.getKey()].independantChildrenCount >= 2) { - articulationPointsSet.push(currentVertex); + if (previousVertex === startVertex) { + // Check that root vertex has at least two independent children. + if (visitedSet[previousVertex.getKey()].independantChildrenCount >= 2) { + articulationPointsSet[previousVertex.getKey()] = previousVertex; } } else { - // Get child vertex low discovery time. - let childVertexLowDiscoveryTime = null; - if (visitedSet[currentVertex.getKey()].childVertex) { - const childVertexKey = visitedSet[currentVertex.getKey()].childVertex.getKey(); - childVertexLowDiscoveryTime = visitedSet[childVertexKey].lowDiscoveryTime; + // Get current vertex low discovery time. + const currentLowDiscoveryTime = visitedSet[currentVertex.getKey()].lowDiscoveryTime; + + // Compare current vertex low discovery time with parent discovery time. Check if there + // are any short path (back edge) exists. If we can't get to current vertex other then + // via parent then the parent vertex is articulation point for current one. + const parentDiscoveryTime = visitedSet[previousVertex.getKey()].discoveryTime; + if (parentDiscoveryTime <= currentLowDiscoveryTime) { + articulationPointsSet[previousVertex.getKey()] = previousVertex; } - - // Compare child vertex low discovery time with current discovery time to if there - // are any short path (back edge) exists. If we can get to child vertex faster then - // to current one it means that there is a back edge exists (short path) and current - // vertex isn't articulation point. - const currentDiscoveryTime = visitedSet[currentVertex.getKey()].discoveryTime; - if (currentDiscoveryTime <= childVertexLowDiscoveryTime) { - articulationPointsSet.push(currentVertex); - } - - // Update the low time with the smallest time of adjacent vertices. - - // Get minimum low discovery time from all neighbors. - /** @param {GraphVertex} neighbor */ - visitedSet[currentVertex.getKey()].lowDiscoveryTime = currentVertex.getNeighbors().reduce( - (lowestDiscoveryTime, neighbor) => { - const neighborLowTime = visitedSet[neighbor.getKey()].lowDiscoveryTime; - return neighborLowTime < lowestDiscoveryTime ? neighborLowTime : lowestDiscoveryTime; - }, - visitedSet[currentVertex.getKey()].lowDiscoveryTime, - ); } }, allowTraversal: ({ nextVertex }) => { @@ -112,5 +103,5 @@ export default function articulationPoints(graph) { // Do Depth First Search traversal over submitted graph. depthFirstSearch(graph, startVertex, dfsCallbacks); - return articulationPointsSet; + return Object.values(articulationPointsSet); } From 0b1b7ddec93f431d569c14bc66670c024db9ce59 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Fri, 11 May 2018 15:34:58 +0300 Subject: [PATCH 265/327] Add Tarjan's algorithm. --- README.md | 3 +- .../articulation-points/articulationPoints.js | 2 +- src/algorithms/graph/bridges/README.md | 26 +++ .../bridges/__test__/graphBridges.test.js | 203 ++++++++++++++++++ src/algorithms/graph/bridges/graphBridges.js | 95 ++++++++ 5 files changed, 327 insertions(+), 2 deletions(-) create mode 100644 src/algorithms/graph/bridges/README.md create mode 100644 src/algorithms/graph/bridges/__test__/graphBridges.test.js create mode 100644 src/algorithms/graph/bridges/graphBridges.js diff --git a/README.md b/README.md index 405dc34e2..5ea8d2450 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,8 @@ * [Prim’s Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/prim) - finding Minimum Spanning Tree (MST) for weighted undirected graph * [Kruskal’s Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/kruskal) - finding Minimum Spanning Tree (MST) for weighted undirected graph * [Topological Sorting](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/topological-sorting) - DFS method - * [Articulation Points](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/articulation-points) - Tarjan's algorithm + * [Articulation Points](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/articulation-points) - Tarjan's algorithm (DFS based) + * [Bridges](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/bridges) - DFS based algorithm * [Eulerian Path and Eulerian Circuit](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/eulerian-path) * Strongly Connected Component algorithm * Shortest Path Faster Algorithm (SPFA) diff --git a/src/algorithms/graph/articulation-points/articulationPoints.js b/src/algorithms/graph/articulation-points/articulationPoints.js index d4bd9e047..37c4bd0c5 100644 --- a/src/algorithms/graph/articulation-points/articulationPoints.js +++ b/src/algorithms/graph/articulation-points/articulationPoints.js @@ -14,7 +14,7 @@ class VisitMetadata { } /** - * Tarjan's algorithm for rinding articulation points in graph. + * Tarjan's algorithm for finding articulation points in graph. * * @param {Graph} graph * @return {GraphVertex[]} diff --git a/src/algorithms/graph/bridges/README.md b/src/algorithms/graph/bridges/README.md new file mode 100644 index 000000000..709e66b43 --- /dev/null +++ b/src/algorithms/graph/bridges/README.md @@ -0,0 +1,26 @@ +# Bridges in Graph + +In graph theory, a **bridge**, **isthmus**, **cut-edge**, or **cut arc** is an edge +of a graph whose deletion increases its number of connected components. Equivalently, +an edge is a bridge if and only if it is not contained in any cycle. A graph is said +to be bridgeless or isthmus-free if it contains no bridges. + +![Bridges in graph](https://upload.wikimedia.org/wikipedia/commons/d/df/Graph_cut_edges.svg) + +A graph with 16 vertices and 6 bridges (highlighted in red) + +![Bridgeless](https://upload.wikimedia.org/wikipedia/commons/b/bf/Undirected.svg) + +An undirected connected graph with no cut edges + +![Bridges in graph](https://www.geeksforgeeks.org/wp-content/uploads/Bridge1.png) + +![Bridges in graph](https://www.geeksforgeeks.org/wp-content/uploads/Bridge2.png) + +![Bridges in graph](https://www.geeksforgeeks.org/wp-content/uploads/Bridge3.png) + +## References + +- [Wikipedia](https://en.wikipedia.org/wiki/Bridge_%28graph_theory%29#Tarjan.27s_Bridge-finding_algorithm) +- [GeeksForGeeks](https://www.geeksforgeeks.org/bridge-in-a-graph/) +- [GeeksForGeeks on YouTube](https://www.youtube.com/watch?time_continue=110&v=thLQYBlz2DM) diff --git a/src/algorithms/graph/bridges/__test__/graphBridges.test.js b/src/algorithms/graph/bridges/__test__/graphBridges.test.js new file mode 100644 index 000000000..c50efec10 --- /dev/null +++ b/src/algorithms/graph/bridges/__test__/graphBridges.test.js @@ -0,0 +1,203 @@ +import GraphVertex from '../../../../data-structures/graph/GraphVertex'; +import GraphEdge from '../../../../data-structures/graph/GraphEdge'; +import Graph from '../../../../data-structures/graph/Graph'; +import graphBridges from '../graphBridges'; + +describe('graphBridges', () => { + it('should find bridges in simple graph', () => { + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + const vertexC = new GraphVertex('C'); + const vertexD = new GraphVertex('D'); + + const edgeAB = new GraphEdge(vertexA, vertexB); + const edgeBC = new GraphEdge(vertexB, vertexC); + const edgeCD = new GraphEdge(vertexC, vertexD); + + const graph = new Graph(); + + graph + .addEdge(edgeAB) + .addEdge(edgeBC) + .addEdge(edgeCD); + + const bridges = graphBridges(graph); + + expect(bridges.length).toBe(3); + expect(bridges[0].getKey()).toBe(edgeCD.getKey()); + expect(bridges[1].getKey()).toBe(edgeBC.getKey()); + expect(bridges[2].getKey()).toBe(edgeAB.getKey()); + }); + + it('should find bridges in simple graph with back edge', () => { + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + const vertexC = new GraphVertex('C'); + const vertexD = new GraphVertex('D'); + + const edgeAB = new GraphEdge(vertexA, vertexB); + const edgeBC = new GraphEdge(vertexB, vertexC); + const edgeCD = new GraphEdge(vertexC, vertexD); + const edgeAC = new GraphEdge(vertexA, vertexC); + + const graph = new Graph(); + + graph + .addEdge(edgeAB) + .addEdge(edgeAC) + .addEdge(edgeBC) + .addEdge(edgeCD); + + const bridges = graphBridges(graph); + + expect(bridges.length).toBe(1); + expect(bridges[0].getKey()).toBe(edgeCD.getKey()); + }); + + it('should find bridges in graph', () => { + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + const vertexC = new GraphVertex('C'); + const vertexD = new GraphVertex('D'); + const vertexE = new GraphVertex('E'); + const vertexF = new GraphVertex('F'); + const vertexG = new GraphVertex('G'); + const vertexH = new GraphVertex('H'); + + const edgeAB = new GraphEdge(vertexA, vertexB); + const edgeBC = new GraphEdge(vertexB, vertexC); + const edgeAC = new GraphEdge(vertexA, vertexC); + const edgeCD = new GraphEdge(vertexC, vertexD); + const edgeDE = new GraphEdge(vertexD, vertexE); + const edgeEG = new GraphEdge(vertexE, vertexG); + const edgeEF = new GraphEdge(vertexE, vertexF); + const edgeGF = new GraphEdge(vertexG, vertexF); + const edgeFH = new GraphEdge(vertexF, vertexH); + + const graph = new Graph(); + + graph + .addEdge(edgeAB) + .addEdge(edgeBC) + .addEdge(edgeAC) + .addEdge(edgeCD) + .addEdge(edgeDE) + .addEdge(edgeEG) + .addEdge(edgeEF) + .addEdge(edgeGF) + .addEdge(edgeFH); + + const bridges = graphBridges(graph); + + expect(bridges.length).toBe(3); + expect(bridges[0].getKey()).toBe(edgeFH.getKey()); + expect(bridges[1].getKey()).toBe(edgeDE.getKey()); + expect(bridges[2].getKey()).toBe(edgeCD.getKey()); + }); + + it('should find bridges in graph starting with different root vertex', () => { + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + const vertexC = new GraphVertex('C'); + const vertexD = new GraphVertex('D'); + const vertexE = new GraphVertex('E'); + const vertexF = new GraphVertex('F'); + const vertexG = new GraphVertex('G'); + const vertexH = new GraphVertex('H'); + + const edgeAB = new GraphEdge(vertexA, vertexB); + const edgeBC = new GraphEdge(vertexB, vertexC); + const edgeAC = new GraphEdge(vertexA, vertexC); + const edgeCD = new GraphEdge(vertexC, vertexD); + const edgeDE = new GraphEdge(vertexD, vertexE); + const edgeEG = new GraphEdge(vertexE, vertexG); + const edgeEF = new GraphEdge(vertexE, vertexF); + const edgeGF = new GraphEdge(vertexG, vertexF); + const edgeFH = new GraphEdge(vertexF, vertexH); + + const graph = new Graph(); + + graph + .addEdge(edgeDE) + .addEdge(edgeAB) + .addEdge(edgeBC) + .addEdge(edgeAC) + .addEdge(edgeCD) + .addEdge(edgeEG) + .addEdge(edgeEF) + .addEdge(edgeGF) + .addEdge(edgeFH); + + const bridges = graphBridges(graph); + + expect(bridges.length).toBe(3); + expect(bridges[0].getKey()).toBe(edgeFH.getKey()); + expect(bridges[1].getKey()).toBe(edgeDE.getKey()); + expect(bridges[2].getKey()).toBe(edgeCD.getKey()); + }); + + it('should find bridges in yet another graph #1', () => { + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + const vertexC = new GraphVertex('C'); + const vertexD = new GraphVertex('D'); + const vertexE = new GraphVertex('E'); + + const edgeAB = new GraphEdge(vertexA, vertexB); + const edgeAC = new GraphEdge(vertexA, vertexC); + const edgeBC = new GraphEdge(vertexB, vertexC); + const edgeCD = new GraphEdge(vertexC, vertexD); + const edgeDE = new GraphEdge(vertexD, vertexE); + + const graph = new Graph(); + + graph + .addEdge(edgeAB) + .addEdge(edgeAC) + .addEdge(edgeBC) + .addEdge(edgeCD) + .addEdge(edgeDE); + + const bridges = graphBridges(graph); + + expect(bridges.length).toBe(2); + expect(bridges[0].getKey()).toBe(edgeDE.getKey()); + expect(bridges[1].getKey()).toBe(edgeCD.getKey()); + }); + + it('should find bridges in yet another graph #2', () => { + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + const vertexC = new GraphVertex('C'); + const vertexD = new GraphVertex('D'); + const vertexE = new GraphVertex('E'); + const vertexF = new GraphVertex('F'); + const vertexG = new GraphVertex('G'); + + const edgeAB = new GraphEdge(vertexA, vertexB); + const edgeAC = new GraphEdge(vertexA, vertexC); + const edgeBC = new GraphEdge(vertexB, vertexC); + const edgeCD = new GraphEdge(vertexC, vertexD); + const edgeCE = new GraphEdge(vertexC, vertexE); + const edgeCF = new GraphEdge(vertexC, vertexF); + const edgeEG = new GraphEdge(vertexE, vertexG); + const edgeFG = new GraphEdge(vertexF, vertexG); + + const graph = new Graph(); + + graph + .addEdge(edgeAB) + .addEdge(edgeAC) + .addEdge(edgeBC) + .addEdge(edgeCD) + .addEdge(edgeCE) + .addEdge(edgeCF) + .addEdge(edgeEG) + .addEdge(edgeFG); + + const bridges = graphBridges(graph); + + expect(bridges.length).toBe(1); + expect(bridges[0].getKey()).toBe(edgeCD.getKey()); + }); +}); diff --git a/src/algorithms/graph/bridges/graphBridges.js b/src/algorithms/graph/bridges/graphBridges.js new file mode 100644 index 000000000..48b16b0e1 --- /dev/null +++ b/src/algorithms/graph/bridges/graphBridges.js @@ -0,0 +1,95 @@ +import depthFirstSearch from '../depth-first-search/depthFirstSearch'; + +/** + * Helper class for visited vertex metadata. + */ +class VisitMetadata { + constructor({ discoveryTime, lowDiscoveryTime }) { + this.discoveryTime = discoveryTime; + this.lowDiscoveryTime = lowDiscoveryTime; + } +} + +/** + * @param {Graph} graph + * @return {GraphVertex[]} + */ +export default function graphBridges(graph) { + // Set of vertices we've already visited during DFS. + const visitedSet = {}; + + // Set of bridges. + const bridges = {}; + + // Time needed to discover to the current vertex. + let discoveryTime = 0; + + // Peek the start vertex for DFS traversal. + const startVertex = graph.getAllVertices()[0]; + + const dfsCallbacks = { + /** + * @param {GraphVertex} currentVertex + */ + enterVertex: ({ currentVertex }) => { + // Tick discovery time. + discoveryTime += 1; + + // Put current vertex to visited set. + visitedSet[currentVertex.getKey()] = new VisitMetadata({ + discoveryTime, + lowDiscoveryTime: discoveryTime, + }); + }, + /** + * @param {GraphVertex} currentVertex + * @param {GraphVertex} previousVertex + */ + leaveVertex: ({ currentVertex, previousVertex }) => { + if (previousVertex === null) { + // Don't do anything for the root vertex if it is already current (not previous one). + return; + } + + // Check if current node is connected to any early node other then previous one. + visitedSet[currentVertex.getKey()].lowDiscoveryTime = currentVertex.getNeighbors() + .filter(earlyNeighbor => earlyNeighbor.getKey() !== previousVertex.getKey()) + .reduce( + /** + * @param {number} lowestDiscoveryTime + * @param {GraphVertex} neighbor + */ + (lowestDiscoveryTime, neighbor) => { + const neighborLowTime = visitedSet[neighbor.getKey()].lowDiscoveryTime; + return neighborLowTime < lowestDiscoveryTime ? neighborLowTime : lowestDiscoveryTime; + }, + visitedSet[currentVertex.getKey()].lowDiscoveryTime, + ); + + // Compare low discovery times. In case if current low discovery time is less than the one + // in previous vertex then update previous vertex low time. + const currentLowDiscoveryTime = visitedSet[currentVertex.getKey()].lowDiscoveryTime; + const previousLowDiscoveryTime = visitedSet[previousVertex.getKey()].lowDiscoveryTime; + if (currentLowDiscoveryTime < previousLowDiscoveryTime) { + visitedSet[previousVertex.getKey()].lowDiscoveryTime = currentLowDiscoveryTime; + } + + // Compare current vertex low discovery time with parent discovery time. Check if there + // are any short path (back edge) exists. If we can't get to current vertex other then + // via parent then the parent vertex is articulation point for current one. + const parentDiscoveryTime = visitedSet[previousVertex.getKey()].discoveryTime; + if (parentDiscoveryTime < currentLowDiscoveryTime) { + const bridge = graph.findEdge(previousVertex, currentVertex); + bridges[bridge.getKey()] = bridge; + } + }, + allowTraversal: ({ nextVertex }) => { + return !visitedSet[nextVertex.getKey()]; + }, + }; + + // Do Depth First Search traversal over submitted graph. + depthFirstSearch(graph, startVertex, dfsCallbacks); + + return Object.values(bridges); +} From b7af22b73c3870af8ca004cb24c5fb36c5402628 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Fri, 11 May 2018 15:40:59 +0300 Subject: [PATCH 266/327] Add Tarjan's algorithm. --- .../graph/articulation-points/articulationPoints.js | 6 +++--- src/algorithms/graph/bridges/README.md | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/algorithms/graph/articulation-points/articulationPoints.js b/src/algorithms/graph/articulation-points/articulationPoints.js index 37c4bd0c5..b4a5d939e 100644 --- a/src/algorithms/graph/articulation-points/articulationPoints.js +++ b/src/algorithms/graph/articulation-points/articulationPoints.js @@ -38,15 +38,15 @@ export default function articulationPoints(graph) { * @param {GraphVertex} previousVertex */ enterVertex: ({ currentVertex, previousVertex }) => { + // Tick discovery time. + discoveryTime += 1; + // Put current vertex to visited set. visitedSet[currentVertex.getKey()] = new VisitMetadata({ discoveryTime, lowDiscoveryTime: discoveryTime, }); - // Tick discovery time. - discoveryTime += 1; - if (previousVertex) { // Update children counter for previous vertex. visitedSet[previousVertex.getKey()].independantChildrenCount += 1; diff --git a/src/algorithms/graph/bridges/README.md b/src/algorithms/graph/bridges/README.md index 709e66b43..3fd721b0d 100644 --- a/src/algorithms/graph/bridges/README.md +++ b/src/algorithms/graph/bridges/README.md @@ -21,6 +21,6 @@ An undirected connected graph with no cut edges ## References +- [GeeksForGeeks on YouTube](https://www.youtube.com/watch?time_continue=110&v=thLQYBlz2DM) - [Wikipedia](https://en.wikipedia.org/wiki/Bridge_%28graph_theory%29#Tarjan.27s_Bridge-finding_algorithm) - [GeeksForGeeks](https://www.geeksforgeeks.org/bridge-in-a-graph/) -- [GeeksForGeeks on YouTube](https://www.youtube.com/watch?time_continue=110&v=thLQYBlz2DM) From d494a7f72bb696f84eda3d5d2b56b783a1b22f4d Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Fri, 11 May 2018 15:42:42 +0300 Subject: [PATCH 267/327] Add Tarjan's algorithm. --- .../articulation-points/articulationPoints.js | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/algorithms/graph/articulation-points/articulationPoints.js b/src/algorithms/graph/articulation-points/articulationPoints.js index b4a5d939e..8b0d70753 100644 --- a/src/algorithms/graph/articulation-points/articulationPoints.js +++ b/src/algorithms/graph/articulation-points/articulationPoints.js @@ -65,13 +65,19 @@ export default function articulationPoints(graph) { // Update the low time with the smallest time of adjacent vertices. // Get minimum low discovery time from all neighbors. /** @param {GraphVertex} neighbor */ - visitedSet[currentVertex.getKey()].lowDiscoveryTime = currentVertex.getNeighbors().reduce( - (lowestDiscoveryTime, neighbor) => { - const neighborLowTime = visitedSet[neighbor.getKey()].lowDiscoveryTime; - return neighborLowTime < lowestDiscoveryTime ? neighborLowTime : lowestDiscoveryTime; - }, - visitedSet[currentVertex.getKey()].lowDiscoveryTime, - ); + visitedSet[currentVertex.getKey()].lowDiscoveryTime = currentVertex.getNeighbors() + .filter(earlyNeighbor => earlyNeighbor.getKey() !== previousVertex.getKey()) + /** + * @param {number} lowestDiscoveryTime + * @param {GraphVertex} neighbor + */ + .reduce( + (lowestDiscoveryTime, neighbor) => { + const neighborLowTime = visitedSet[neighbor.getKey()].lowDiscoveryTime; + return neighborLowTime < lowestDiscoveryTime ? neighborLowTime : lowestDiscoveryTime; + }, + visitedSet[currentVertex.getKey()].lowDiscoveryTime, + ); // Detect whether previous vertex is articulation point or not. // To do so we need to check two [OR] conditions: From 844cd90cab8c30dcdf3aec877637ac77aedad9dc Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Fri, 11 May 2018 16:30:28 +0300 Subject: [PATCH 268/327] Make it possible to use custom comparators for linked lists. --- src/data-structures/linked-list/LinkedList.js | 16 ++++++++---- .../linked-list/__test__/LinkedList.test.js | 26 +++++++++++++++++++ 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/src/data-structures/linked-list/LinkedList.js b/src/data-structures/linked-list/LinkedList.js index 13537525c..0835d85a1 100644 --- a/src/data-structures/linked-list/LinkedList.js +++ b/src/data-structures/linked-list/LinkedList.js @@ -1,12 +1,18 @@ import LinkedListNode from './LinkedListNode'; +import Comparator from '../../utils/comparator/Comparator'; export default class LinkedList { - constructor() { + /** + * @param {Function} [comparatorFunction] + */ + constructor(comparatorFunction) { /** @var LinkedListNode */ this.head = null; /** @var LinkedListNode */ this.tail = null; + + this.compare = new Comparator(comparatorFunction); } /** @@ -54,7 +60,7 @@ export default class LinkedList { let deletedNode = null; // If the head must be deleted then make 2nd node to be a head. - if (this.head.value === value) { + if (this.compare.equal(this.head.value, value)) { deletedNode = this.head; this.head = this.head.next; } @@ -63,7 +69,7 @@ export default class LinkedList { // If next node must be deleted then make next node to be a next next one. while (currentNode.next) { - if (currentNode.next.value === value) { + if (this.compare.equal(currentNode.next.value, value)) { deletedNode = currentNode.next; currentNode.next = currentNode.next.next; } else { @@ -72,7 +78,7 @@ export default class LinkedList { } // Check if tail must be deleted. - if (this.tail.value === value) { + if (this.compare.equal(this.tail.value, value)) { this.tail = currentNode; } @@ -99,7 +105,7 @@ export default class LinkedList { } // If value is specified then try to compare by value.. - if (value !== undefined && currentNode.value === value) { + if (value !== undefined && this.compare.equal(currentNode.value, value)) { return currentNode; } diff --git a/src/data-structures/linked-list/__test__/LinkedList.test.js b/src/data-structures/linked-list/__test__/LinkedList.test.js index 3f877f834..e400a0ead 100644 --- a/src/data-structures/linked-list/__test__/LinkedList.test.js +++ b/src/data-structures/linked-list/__test__/LinkedList.test.js @@ -175,4 +175,30 @@ describe('LinkedList', () => { expect(node.value.key).toBe('test2'); expect(linkedList.find({ callback: value => value.key === 'test5' })).toBeNull(); }); + + it('should find node by means of custom compare function', () => { + const comparatorFunction = (a, b) => { + if (a.customValue === b.customValue) { + return 0; + } + + return a.customValue < b.customValue ? -1 : 1; + }; + + const linkedList = new LinkedList(comparatorFunction); + + linkedList + .append({ value: 1, customValue: 'test1' }) + .append({ value: 2, customValue: 'test2' }) + .append({ value: 3, customValue: 'test3' }); + + const node = linkedList.find({ + value: { value: 2, customValue: 'test2' }, + }); + + expect(node).toBeDefined(); + expect(node.value.value).toBe(2); + expect(node.value.customValue).toBe('test2'); + expect(linkedList.find({ value: 2, customValue: 'test5' })).toBeNull(); + }); }); From b6ad6c061e725d31e7ec9f177a366809c0d3c8e8 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Fri, 11 May 2018 16:50:18 +0300 Subject: [PATCH 269/327] Make it possible to delete edge from graph vertex. --- src/data-structures/graph/GraphVertex.js | 21 +++++++++++- .../graph/__test__/GraphVertex.test.js | 33 +++++++++++++++++++ src/data-structures/linked-list/LinkedList.js | 16 +++++---- .../linked-list/__test__/LinkedList.test.js | 3 ++ 4 files changed, 65 insertions(+), 8 deletions(-) diff --git a/src/data-structures/graph/GraphVertex.js b/src/data-structures/graph/GraphVertex.js index 34be0fc5f..7389e6e69 100644 --- a/src/data-structures/graph/GraphVertex.js +++ b/src/data-structures/graph/GraphVertex.js @@ -9,10 +9,22 @@ export default class GraphVertex { throw new Error('Graph vertex must have a value'); } + /** + * @param {GraphEdge} edgeA + * @param {GraphEdge} edgeB + */ + const edgeComparator = (edgeA, edgeB) => { + if (edgeA.getKey() === edgeB.getKey()) { + return 0; + } + + return edgeA.getKey() < edgeB.getKey() ? -1 : 1; + }; + // Normally you would store string value like vertex name. // But generally it may be any object as well this.value = value; - this.edges = new LinkedList(); + this.edges = new LinkedList(edgeComparator); } /** @@ -25,6 +37,13 @@ export default class GraphVertex { return this; } + /** + * @param {GraphEdge} edge + */ + deleteEdge(edge) { + this.edges.delete(edge); + } + /** * @returns {GraphVertex[]} */ diff --git a/src/data-structures/graph/__test__/GraphVertex.test.js b/src/data-structures/graph/__test__/GraphVertex.test.js index 8512c34d3..1610e377f 100644 --- a/src/data-structures/graph/__test__/GraphVertex.test.js +++ b/src/data-structures/graph/__test__/GraphVertex.test.js @@ -37,6 +37,39 @@ describe('GraphVertex', () => { expect(vertexA.getEdges()[0].toString()).toBe('A_B'); }); + it('should delete edges from vertex', () => { + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + const vertexC = new GraphVertex('C'); + + const edgeAB = new GraphEdge(vertexA, vertexB); + const edgeAC = new GraphEdge(vertexA, vertexC); + vertexA + .addEdge(edgeAB) + .addEdge(edgeAC); + + expect(vertexA.hasEdge(edgeAB)).toBeTruthy(); + expect(vertexB.hasEdge(edgeAB)).toBeFalsy(); + + expect(vertexA.hasEdge(edgeAC)).toBeTruthy(); + expect(vertexC.hasEdge(edgeAC)).toBeFalsy(); + + expect(vertexA.getEdges().length).toBe(2); + + expect(vertexA.getEdges()[0].toString()).toBe('A_B'); + expect(vertexA.getEdges()[1].toString()).toBe('A_C'); + + vertexA.deleteEdge(edgeAB); + expect(vertexA.hasEdge(edgeAB)).toBeFalsy(); + expect(vertexA.hasEdge(edgeAC)).toBeTruthy(); + expect(vertexA.getEdges()[0].toString()).toBe('A_C'); + + vertexA.deleteEdge(edgeAC); + expect(vertexA.hasEdge(edgeAB)).toBeFalsy(); + expect(vertexA.hasEdge(edgeAC)).toBeFalsy(); + expect(vertexA.getEdges().length).toBe(0); + }); + it('should return vertex neighbors in case if current node is start one', () => { const vertexA = new GraphVertex('A'); const vertexB = new GraphVertex('B'); diff --git a/src/data-structures/linked-list/LinkedList.js b/src/data-structures/linked-list/LinkedList.js index 0835d85a1..b428ad739 100644 --- a/src/data-structures/linked-list/LinkedList.js +++ b/src/data-structures/linked-list/LinkedList.js @@ -67,13 +67,15 @@ export default class LinkedList { let currentNode = this.head; - // If next node must be deleted then make next node to be a next next one. - while (currentNode.next) { - if (this.compare.equal(currentNode.next.value, value)) { - deletedNode = currentNode.next; - currentNode.next = currentNode.next.next; - } else { - currentNode = currentNode.next; + if (currentNode !== null) { + // If next node must be deleted then make next node to be a next next one. + while (currentNode.next) { + if (this.compare.equal(currentNode.next.value, value)) { + deletedNode = currentNode.next; + currentNode.next = currentNode.next.next; + } else { + currentNode = currentNode.next; + } } } diff --git a/src/data-structures/linked-list/__test__/LinkedList.test.js b/src/data-structures/linked-list/__test__/LinkedList.test.js index e400a0ead..1b938e1b1 100644 --- a/src/data-structures/linked-list/__test__/LinkedList.test.js +++ b/src/data-structures/linked-list/__test__/LinkedList.test.js @@ -67,6 +67,9 @@ describe('LinkedList', () => { expect(linkedList.head.toString()).toBe('2'); expect(linkedList.tail.toString()).toBe('2'); + + linkedList.delete(2); + expect(linkedList.toString()).toBe(''); }); it('should delete linked list tail', () => { From 3b0b702c1b908eb39367914c411e78026e1ef48b Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Fri, 11 May 2018 16:58:39 +0300 Subject: [PATCH 270/327] Make it possible to delete edge from graph. --- src/data-structures/graph/Graph.js | 19 ++++++++ .../graph/__test__/Graph.test.js | 43 +++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/src/data-structures/graph/Graph.js b/src/data-structures/graph/Graph.js index 48a1171f7..424e6c3cf 100644 --- a/src/data-structures/graph/Graph.js +++ b/src/data-structures/graph/Graph.js @@ -88,6 +88,25 @@ export default class Graph { return this; } + /** + * @param {GraphEdge} edge + */ + deleteEdge(edge) { + // Delete edge from the list of edges. + if (this.edges[edge.getKey()]) { + delete this.edges[edge.getKey()]; + } else { + throw new Error('Edge not found in graph'); + } + + // Try to find and end start vertices and delete edge from them. + const startVertex = this.getVertexByKey(edge.startVertex.getKey()); + const endVertex = this.getVertexByKey(edge.endVertex.getKey()); + + startVertex.deleteEdge(edge); + endVertex.deleteEdge(edge); + } + /** * @param {GraphVertex} startVertex * @param {GraphVertex} endVertex diff --git a/src/data-structures/graph/__test__/Graph.test.js b/src/data-structures/graph/__test__/Graph.test.js index c97cc56c7..5a544496f 100644 --- a/src/data-structures/graph/__test__/Graph.test.js +++ b/src/data-structures/graph/__test__/Graph.test.js @@ -218,4 +218,47 @@ describe('Graph', () => { expect(graph.getWeight()).toBe(10); }); + + it('should be possible to delete edges from graph', () => { + const graph = new Graph(); + + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + const vertexC = new GraphVertex('C'); + + const edgeAB = new GraphEdge(vertexA, vertexB); + const edgeBC = new GraphEdge(vertexB, vertexC); + const edgeAC = new GraphEdge(vertexA, vertexC); + + graph + .addEdge(edgeAB) + .addEdge(edgeBC) + .addEdge(edgeAC); + + expect(graph.getAllEdges().length).toBe(3); + + graph.deleteEdge(edgeAB); + + expect(graph.getAllEdges().length).toBe(2); + expect(graph.getAllEdges()[0].getKey()).toBe(edgeBC.getKey()); + expect(graph.getAllEdges()[1].getKey()).toBe(edgeAC.getKey()); + }); + + it('should should throw an error when trying to delete not existing edge', () => { + function deleteNotExistingEdge() { + const graph = new Graph(); + + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + const vertexC = new GraphVertex('C'); + + const edgeAB = new GraphEdge(vertexA, vertexB); + const edgeBC = new GraphEdge(vertexB, vertexC); + + graph.addEdge(edgeAB); + graph.deleteEdge(edgeBC); + } + + expect(deleteNotExistingEdge).toThrowError(); + }); }); From 053f9486e6d91257b9f7f20d8608faaff39278f7 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Sat, 12 May 2018 07:54:14 +0300 Subject: [PATCH 271/327] Add Eulerian Path. --- README.md | 2 +- .../__test__/articulationPoints.test.js | 14 +- .../articulation-points/articulationPoints.js | 4 +- .../bridges/__test__/graphBridges.test.js | 12 +- src/algorithms/graph/bridges/graphBridges.js | 4 +- .../__test__/eulerianPath.test.js | 139 ++++++++++++++++++ .../graph/eulerian-path/eulerianPath.js | 101 +++++++++++++ 7 files changed, 258 insertions(+), 18 deletions(-) create mode 100644 src/algorithms/graph/eulerian-path/__test__/eulerianPath.test.js create mode 100644 src/algorithms/graph/eulerian-path/eulerianPath.js diff --git a/README.md b/README.md index 5ea8d2450..96b8443a0 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,7 @@ * [Topological Sorting](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/topological-sorting) - DFS method * [Articulation Points](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/articulation-points) - Tarjan's algorithm (DFS based) * [Bridges](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/bridges) - DFS based algorithm - * [Eulerian Path and Eulerian Circuit](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/eulerian-path) + * [Eulerian Path and Eulerian Circuit](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/eulerian-path) - Fleury's algorithm * Strongly Connected Component algorithm * Shortest Path Faster Algorithm (SPFA) * **Uncategorized** diff --git a/src/algorithms/graph/articulation-points/__test__/articulationPoints.test.js b/src/algorithms/graph/articulation-points/__test__/articulationPoints.test.js index 03b12ed92..b021305c5 100644 --- a/src/algorithms/graph/articulation-points/__test__/articulationPoints.test.js +++ b/src/algorithms/graph/articulation-points/__test__/articulationPoints.test.js @@ -21,7 +21,7 @@ describe('articulationPoints', () => { .addEdge(edgeBC) .addEdge(edgeCD); - const articulationPointsSet = articulationPoints(graph); + const articulationPointsSet = Object.values(articulationPoints(graph)); expect(articulationPointsSet.length).toBe(2); expect(articulationPointsSet[0].getKey()).toBe(vertexC.getKey()); @@ -47,7 +47,7 @@ describe('articulationPoints', () => { .addEdge(edgeBC) .addEdge(edgeCD); - const articulationPointsSet = articulationPoints(graph); + const articulationPointsSet = Object.values(articulationPoints(graph)); expect(articulationPointsSet.length).toBe(1); expect(articulationPointsSet[0].getKey()).toBe(vertexC.getKey()); @@ -75,7 +75,7 @@ describe('articulationPoints', () => { .addEdge(edgeBC) .addEdge(edgeCD); - const articulationPointsSet = articulationPoints(graph); + const articulationPointsSet = Object.values(articulationPoints(graph)); expect(articulationPointsSet.length).toBe(1); expect(articulationPointsSet[0].getKey()).toBe(vertexC.getKey()); @@ -114,7 +114,7 @@ describe('articulationPoints', () => { .addEdge(edgeGF) .addEdge(edgeFH); - const articulationPointsSet = articulationPoints(graph); + const articulationPointsSet = Object.values(articulationPoints(graph)); expect(articulationPointsSet.length).toBe(4); expect(articulationPointsSet[0].getKey()).toBe(vertexF.getKey()); @@ -156,7 +156,7 @@ describe('articulationPoints', () => { .addEdge(edgeGF) .addEdge(edgeFH); - const articulationPointsSet = articulationPoints(graph); + const articulationPointsSet = Object.values(articulationPoints(graph)); expect(articulationPointsSet.length).toBe(4); expect(articulationPointsSet[0].getKey()).toBe(vertexF.getKey()); @@ -187,7 +187,7 @@ describe('articulationPoints', () => { .addEdge(edgeCD) .addEdge(edgeDE); - const articulationPointsSet = articulationPoints(graph); + const articulationPointsSet = Object.values(articulationPoints(graph)); expect(articulationPointsSet.length).toBe(2); expect(articulationPointsSet[0].getKey()).toBe(vertexD.getKey()); @@ -224,7 +224,7 @@ describe('articulationPoints', () => { .addEdge(edgeEG) .addEdge(edgeFG); - const articulationPointsSet = articulationPoints(graph); + const articulationPointsSet = Object.values(articulationPoints(graph)); expect(articulationPointsSet.length).toBe(1); expect(articulationPointsSet[0].getKey()).toBe(vertexC.getKey()); diff --git a/src/algorithms/graph/articulation-points/articulationPoints.js b/src/algorithms/graph/articulation-points/articulationPoints.js index 8b0d70753..0dc9da743 100644 --- a/src/algorithms/graph/articulation-points/articulationPoints.js +++ b/src/algorithms/graph/articulation-points/articulationPoints.js @@ -17,7 +17,7 @@ class VisitMetadata { * Tarjan's algorithm for finding articulation points in graph. * * @param {Graph} graph - * @return {GraphVertex[]} + * @return {Object} */ export default function articulationPoints(graph) { // Set of vertices we've already visited during DFS. @@ -109,5 +109,5 @@ export default function articulationPoints(graph) { // Do Depth First Search traversal over submitted graph. depthFirstSearch(graph, startVertex, dfsCallbacks); - return Object.values(articulationPointsSet); + return articulationPointsSet; } diff --git a/src/algorithms/graph/bridges/__test__/graphBridges.test.js b/src/algorithms/graph/bridges/__test__/graphBridges.test.js index c50efec10..01837528b 100644 --- a/src/algorithms/graph/bridges/__test__/graphBridges.test.js +++ b/src/algorithms/graph/bridges/__test__/graphBridges.test.js @@ -21,7 +21,7 @@ describe('graphBridges', () => { .addEdge(edgeBC) .addEdge(edgeCD); - const bridges = graphBridges(graph); + const bridges = Object.values(graphBridges(graph)); expect(bridges.length).toBe(3); expect(bridges[0].getKey()).toBe(edgeCD.getKey()); @@ -48,7 +48,7 @@ describe('graphBridges', () => { .addEdge(edgeBC) .addEdge(edgeCD); - const bridges = graphBridges(graph); + const bridges = Object.values(graphBridges(graph)); expect(bridges.length).toBe(1); expect(bridges[0].getKey()).toBe(edgeCD.getKey()); @@ -87,7 +87,7 @@ describe('graphBridges', () => { .addEdge(edgeGF) .addEdge(edgeFH); - const bridges = graphBridges(graph); + const bridges = Object.values(graphBridges(graph)); expect(bridges.length).toBe(3); expect(bridges[0].getKey()).toBe(edgeFH.getKey()); @@ -128,7 +128,7 @@ describe('graphBridges', () => { .addEdge(edgeGF) .addEdge(edgeFH); - const bridges = graphBridges(graph); + const bridges = Object.values(graphBridges(graph)); expect(bridges.length).toBe(3); expect(bridges[0].getKey()).toBe(edgeFH.getKey()); @@ -158,7 +158,7 @@ describe('graphBridges', () => { .addEdge(edgeCD) .addEdge(edgeDE); - const bridges = graphBridges(graph); + const bridges = Object.values(graphBridges(graph)); expect(bridges.length).toBe(2); expect(bridges[0].getKey()).toBe(edgeDE.getKey()); @@ -195,7 +195,7 @@ describe('graphBridges', () => { .addEdge(edgeEG) .addEdge(edgeFG); - const bridges = graphBridges(graph); + const bridges = Object.values(graphBridges(graph)); expect(bridges.length).toBe(1); expect(bridges[0].getKey()).toBe(edgeCD.getKey()); diff --git a/src/algorithms/graph/bridges/graphBridges.js b/src/algorithms/graph/bridges/graphBridges.js index 48b16b0e1..58c62866e 100644 --- a/src/algorithms/graph/bridges/graphBridges.js +++ b/src/algorithms/graph/bridges/graphBridges.js @@ -12,7 +12,7 @@ class VisitMetadata { /** * @param {Graph} graph - * @return {GraphVertex[]} + * @return {Object} */ export default function graphBridges(graph) { // Set of vertices we've already visited during DFS. @@ -91,5 +91,5 @@ export default function graphBridges(graph) { // Do Depth First Search traversal over submitted graph. depthFirstSearch(graph, startVertex, dfsCallbacks); - return Object.values(bridges); + return bridges; } diff --git a/src/algorithms/graph/eulerian-path/__test__/eulerianPath.test.js b/src/algorithms/graph/eulerian-path/__test__/eulerianPath.test.js new file mode 100644 index 000000000..d10d98080 --- /dev/null +++ b/src/algorithms/graph/eulerian-path/__test__/eulerianPath.test.js @@ -0,0 +1,139 @@ +import GraphVertex from '../../../../data-structures/graph/GraphVertex'; +import GraphEdge from '../../../../data-structures/graph/GraphEdge'; +import Graph from '../../../../data-structures/graph/Graph'; +import eulerianPath from '../eulerianPath'; + +describe('eulerianPath', () => { + it('should throw an error when graph is not Eulerian', () => { + function findEulerianPathInNotEulerianGraph() { + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + const vertexC = new GraphVertex('C'); + const vertexD = new GraphVertex('D'); + const vertexE = new GraphVertex('E'); + + const edgeAB = new GraphEdge(vertexA, vertexB); + const edgeAC = new GraphEdge(vertexA, vertexC); + const edgeBC = new GraphEdge(vertexB, vertexC); + const edgeBD = new GraphEdge(vertexB, vertexD); + const edgeCE = new GraphEdge(vertexC, vertexE); + + const graph = new Graph(); + + graph + .addEdge(edgeAB) + .addEdge(edgeAC) + .addEdge(edgeBC) + .addEdge(edgeBD) + .addEdge(edgeCE); + + eulerianPath(graph); + } + + expect(findEulerianPathInNotEulerianGraph).toThrowError(); + }); + + it('should find Eulerian Circuit in graph', () => { + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + const vertexC = new GraphVertex('C'); + const vertexD = new GraphVertex('D'); + const vertexE = new GraphVertex('E'); + const vertexF = new GraphVertex('F'); + const vertexG = new GraphVertex('G'); + + const edgeAB = new GraphEdge(vertexA, vertexB); + const edgeAE = new GraphEdge(vertexA, vertexE); + const edgeAF = new GraphEdge(vertexA, vertexF); + const edgeAG = new GraphEdge(vertexA, vertexG); + const edgeGF = new GraphEdge(vertexG, vertexF); + const edgeBE = new GraphEdge(vertexB, vertexE); + const edgeEB = new GraphEdge(vertexE, vertexB); + const edgeBC = new GraphEdge(vertexB, vertexC); + const edgeED = new GraphEdge(vertexE, vertexD); + const edgeCD = new GraphEdge(vertexC, vertexD); + + const graph = new Graph(); + + graph + .addEdge(edgeAB) + .addEdge(edgeAE) + .addEdge(edgeAF) + .addEdge(edgeAG) + .addEdge(edgeGF) + .addEdge(edgeBE) + .addEdge(edgeEB) + .addEdge(edgeBC) + .addEdge(edgeED) + .addEdge(edgeCD); + + const graphEdgesCount = graph.getAllEdges().length; + + const eulerianPathSet = eulerianPath(graph); + + expect(eulerianPathSet.length).toBe(graphEdgesCount + 1); + + expect(eulerianPathSet[0].getKey()).toBe(vertexA.getKey()); + expect(eulerianPathSet[1].getKey()).toBe(vertexB.getKey()); + expect(eulerianPathSet[2].getKey()).toBe(vertexE.getKey()); + expect(eulerianPathSet[3].getKey()).toBe(vertexB.getKey()); + expect(eulerianPathSet[4].getKey()).toBe(vertexC.getKey()); + expect(eulerianPathSet[5].getKey()).toBe(vertexD.getKey()); + expect(eulerianPathSet[6].getKey()).toBe(vertexE.getKey()); + expect(eulerianPathSet[7].getKey()).toBe(vertexA.getKey()); + expect(eulerianPathSet[8].getKey()).toBe(vertexF.getKey()); + expect(eulerianPathSet[9].getKey()).toBe(vertexG.getKey()); + expect(eulerianPathSet[10].getKey()).toBe(vertexA.getKey()); + }); + + it('should find Eulerian Path in graph', () => { + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + const vertexC = new GraphVertex('C'); + const vertexD = new GraphVertex('D'); + const vertexE = new GraphVertex('E'); + const vertexF = new GraphVertex('F'); + const vertexG = new GraphVertex('G'); + const vertexH = new GraphVertex('H'); + + const edgeAB = new GraphEdge(vertexA, vertexB); + const edgeAC = new GraphEdge(vertexA, vertexC); + const edgeBD = new GraphEdge(vertexB, vertexD); + const edgeDC = new GraphEdge(vertexD, vertexC); + const edgeCE = new GraphEdge(vertexC, vertexE); + const edgeEF = new GraphEdge(vertexE, vertexF); + const edgeFH = new GraphEdge(vertexF, vertexH); + const edgeFG = new GraphEdge(vertexF, vertexG); + const edgeHG = new GraphEdge(vertexH, vertexG); + + const graph = new Graph(); + + graph + .addEdge(edgeAB) + .addEdge(edgeAC) + .addEdge(edgeBD) + .addEdge(edgeDC) + .addEdge(edgeCE) + .addEdge(edgeEF) + .addEdge(edgeFH) + .addEdge(edgeFG) + .addEdge(edgeHG); + + const graphEdgesCount = graph.getAllEdges().length; + + const eulerianPathSet = eulerianPath(graph); + + expect(eulerianPathSet.length).toBe(graphEdgesCount + 1); + + expect(eulerianPathSet[0].getKey()).toBe(vertexC.getKey()); + expect(eulerianPathSet[1].getKey()).toBe(vertexA.getKey()); + expect(eulerianPathSet[2].getKey()).toBe(vertexB.getKey()); + expect(eulerianPathSet[3].getKey()).toBe(vertexD.getKey()); + expect(eulerianPathSet[4].getKey()).toBe(vertexC.getKey()); + expect(eulerianPathSet[5].getKey()).toBe(vertexE.getKey()); + expect(eulerianPathSet[6].getKey()).toBe(vertexF.getKey()); + expect(eulerianPathSet[7].getKey()).toBe(vertexH.getKey()); + expect(eulerianPathSet[8].getKey()).toBe(vertexG.getKey()); + expect(eulerianPathSet[9].getKey()).toBe(vertexF.getKey()); + }); +}); diff --git a/src/algorithms/graph/eulerian-path/eulerianPath.js b/src/algorithms/graph/eulerian-path/eulerianPath.js new file mode 100644 index 000000000..0222fcbff --- /dev/null +++ b/src/algorithms/graph/eulerian-path/eulerianPath.js @@ -0,0 +1,101 @@ +import graphBridges from '../bridges/graphBridges'; + +/** + * Fleury's algorithm of finding Eulerian Path (visit all graph edges exactly once). + * + * @param {Graph} graph + * @return {GraphVertex[]} + */ +export default function eulerianPath(graph) { + const eulerianPathVertices = []; + + // Set that contains all vertices with even rank (number of neighbors). + const evenRankVertices = {}; + + // Set that contains all vertices with odd rank (number of neighbors). + const oddRankVertices = {}; + + // Set of all not visited edges. + const notVisitedEdges = {}; + graph.getAllEdges().forEach((vertex) => { + notVisitedEdges[vertex.getKey()] = vertex; + }); + + // Detect whether graph contains Eulerian Circuit or Eulerian Path or none of them. + /** @params {GraphVertex} vertex */ + graph.getAllVertices().forEach((vertex) => { + if (vertex.getDegree() % 2) { + oddRankVertices[vertex.getKey()] = vertex; + } else { + evenRankVertices[vertex.getKey()] = vertex; + } + }); + + // Check whether we're dealing with Eulerian Circuit or Eulerian Path only. + // Graph would be an Eulerian Circuit in case if all its vertices has even degree. + // If not all vertices have even degree then graph must contain only two odd-degree + // vertices in order to have Euler Path. + const isCircuit = !Object.values(oddRankVertices).length; + + if (!isCircuit && Object.values(oddRankVertices).length !== 2) { + throw new Error('Eulerian path must contain two odd-ranked vertices'); + } + + // Pick start vertex for traversal. + let startVertex = null; + + if (isCircuit) { + // For Eulerian Circuit it doesn't matter from what vertex to start thus we'll just + // peek a first node. + const evenVertexKey = Object.keys(evenRankVertices)[0]; + startVertex = evenRankVertices[evenVertexKey]; + } else { + // For Eulerian Path we need to start from one of two odd-degree vertices. + const oddVertexKey = Object.keys(oddRankVertices)[0]; + startVertex = oddRankVertices[oddVertexKey]; + } + + // Start traversing the graph. + let currentVertex = startVertex; + while (Object.values(notVisitedEdges).length) { + // Add current vertex to Eulerian path. + eulerianPathVertices.push(currentVertex); + + // Detect all bridges in graph. + // We need to do it in order to not delete bridges if there are other edges + // exists for deletion. + const bridges = graphBridges(graph); + + // Peek the next edge to delete from graph. + const currentEdges = currentVertex.getEdges(); + /** @var {GraphEdge} edgeToDelete */ + let edgeToDelete = null; + if (currentEdges.length === 1) { + // If there is only one edge left we need to peek it. + [edgeToDelete] = currentEdges; + } else { + // If there are many edges left then we need to peek any of those except bridges. + [edgeToDelete] = currentEdges.filter(edge => !bridges[edge.getKey()]); + } + + // Detect next current vertex. + if (currentVertex.getKey() === edgeToDelete.startVertex.getKey()) { + currentVertex = edgeToDelete.endVertex; + } else { + currentVertex = edgeToDelete.startVertex; + } + + // Delete edge from not visited edges set. + delete notVisitedEdges[edgeToDelete.getKey()]; + + // If last edge were deleted then add finish vertex to Eulerian Path. + if (Object.values(notVisitedEdges).length === 0) { + eulerianPathVertices.push(currentVertex); + } + + // Delete the edge from graph. + graph.deleteEdge(edgeToDelete); + } + + return eulerianPathVertices; +} From 776ed5fdb2d6bf18aa2349d6b85e9b6d16ffad58 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Sat, 12 May 2018 07:57:38 +0300 Subject: [PATCH 272/327] Add Eulerian Path. --- src/algorithms/graph/eulerian-path/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/src/algorithms/graph/eulerian-path/README.md b/src/algorithms/graph/eulerian-path/README.md index 9f1f9e265..0f6b94666 100644 --- a/src/algorithms/graph/eulerian-path/README.md +++ b/src/algorithms/graph/eulerian-path/README.md @@ -32,3 +32,4 @@ therefore, a solution does not exist. ## References - [Wikipedia](https://en.wikipedia.org/wiki/Eulerian_path) +- [YouTube](https://www.youtube.com/watch?v=vvP4Fg4r-Ns) From 0ff366acca02765cf08422484e79339b3d3cacef Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Sat, 12 May 2018 10:35:54 +0300 Subject: [PATCH 273/327] Make it possible to delete all vertex edges at once. --- src/data-structures/graph/GraphVertex.js | 9 ++++++ .../graph/__test__/GraphVertex.test.js | 30 +++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/src/data-structures/graph/GraphVertex.js b/src/data-structures/graph/GraphVertex.js index 7389e6e69..b28ced323 100644 --- a/src/data-structures/graph/GraphVertex.js +++ b/src/data-structures/graph/GraphVertex.js @@ -119,6 +119,15 @@ export default class GraphVertex { return this.value; } + /** + * @return {GraphVertex} + */ + deleteAllEdges() { + this.getEdges().forEach(edge => this.deleteEdge(edge)); + + return this; + } + /** * @param {function} [callback] * @returns {string} diff --git a/src/data-structures/graph/__test__/GraphVertex.test.js b/src/data-structures/graph/__test__/GraphVertex.test.js index 1610e377f..523d79ae3 100644 --- a/src/data-structures/graph/__test__/GraphVertex.test.js +++ b/src/data-structures/graph/__test__/GraphVertex.test.js @@ -70,6 +70,36 @@ describe('GraphVertex', () => { expect(vertexA.getEdges().length).toBe(0); }); + it('should delete all edges from vertex', () => { + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + const vertexC = new GraphVertex('C'); + + const edgeAB = new GraphEdge(vertexA, vertexB); + const edgeAC = new GraphEdge(vertexA, vertexC); + vertexA + .addEdge(edgeAB) + .addEdge(edgeAC); + + expect(vertexA.hasEdge(edgeAB)).toBeTruthy(); + expect(vertexB.hasEdge(edgeAB)).toBeFalsy(); + + expect(vertexA.hasEdge(edgeAC)).toBeTruthy(); + expect(vertexC.hasEdge(edgeAC)).toBeFalsy(); + + expect(vertexA.getEdges().length).toBe(2); + + vertexA.deleteAllEdges(); + + expect(vertexA.hasEdge(edgeAB)).toBeFalsy(); + expect(vertexB.hasEdge(edgeAB)).toBeFalsy(); + + expect(vertexA.hasEdge(edgeAC)).toBeFalsy(); + expect(vertexC.hasEdge(edgeAC)).toBeFalsy(); + + expect(vertexA.getEdges().length).toBe(0); + }); + it('should return vertex neighbors in case if current node is start one', () => { const vertexA = new GraphVertex('A'); const vertexB = new GraphVertex('B'); From 58210b54606a8ec6986671a6c3e5e8687ed14e60 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Mon, 14 May 2018 06:29:55 +0300 Subject: [PATCH 274/327] Make it possible to reverse the graph. --- src/data-structures/graph/Graph.js | 20 ++++++++++ src/data-structures/graph/GraphEdge.js | 11 ++++++ .../graph/__test__/Graph.test.js | 39 +++++++++++++++++++ .../graph/__test__/GraphEdge.test.js | 16 ++++++++ 4 files changed, 86 insertions(+) diff --git a/src/data-structures/graph/Graph.js b/src/data-structures/graph/Graph.js index 424e6c3cf..4c53f8538 100644 --- a/src/data-structures/graph/Graph.js +++ b/src/data-structures/graph/Graph.js @@ -138,6 +138,26 @@ export default class Graph { }, 0); } + /** + * Reverse all the edges in directed graph. + * @return {Graph} + */ + reverse() { + /** @param {GraphEdge} edge */ + this.getAllEdges().forEach((edge) => { + // Delete straight edge from graph and from vertices. + this.deleteEdge(edge); + + // Reverse the edge. + edge.reverse(); + + // Add reversed edge back to the graph and its vertices. + this.addEdge(edge); + }); + + return this; + } + /** * @return {string} */ diff --git a/src/data-structures/graph/GraphEdge.js b/src/data-structures/graph/GraphEdge.js index 618fb9e28..9a5b5db4a 100644 --- a/src/data-structures/graph/GraphEdge.js +++ b/src/data-structures/graph/GraphEdge.js @@ -20,6 +20,17 @@ export default class GraphEdge { return `${startVertexKey}_${endVertexKey}`; } + /** + * @return {GraphEdge} + */ + reverse() { + const tmp = this.startVertex; + this.startVertex = this.endVertex; + this.endVertex = tmp; + + return this; + } + /** * @return {string} */ diff --git a/src/data-structures/graph/__test__/Graph.test.js b/src/data-structures/graph/__test__/Graph.test.js index 5a544496f..6ce000392 100644 --- a/src/data-structures/graph/__test__/Graph.test.js +++ b/src/data-structures/graph/__test__/Graph.test.js @@ -261,4 +261,43 @@ describe('Graph', () => { expect(deleteNotExistingEdge).toThrowError(); }); + + it('should be possible to reverse graph', () => { + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + const vertexC = new GraphVertex('C'); + const vertexD = new GraphVertex('D'); + + const edgeAB = new GraphEdge(vertexA, vertexB); + const edgeAC = new GraphEdge(vertexA, vertexC); + const edgeCD = new GraphEdge(vertexC, vertexD); + + const graph = new Graph(true); + graph + .addEdge(edgeAB) + .addEdge(edgeAC) + .addEdge(edgeCD); + + expect(graph.toString()).toBe('A,B,C,D'); + expect(graph.getAllEdges().length).toBe(3); + expect(graph.getNeighbors(vertexA).length).toBe(2); + expect(graph.getNeighbors(vertexA)[0].getKey()).toBe(vertexB.getKey()); + expect(graph.getNeighbors(vertexA)[1].getKey()).toBe(vertexC.getKey()); + expect(graph.getNeighbors(vertexB).length).toBe(0); + expect(graph.getNeighbors(vertexC).length).toBe(1); + expect(graph.getNeighbors(vertexC)[0].getKey()).toBe(vertexD.getKey()); + expect(graph.getNeighbors(vertexD).length).toBe(0); + + graph.reverse(); + + expect(graph.toString()).toBe('A,B,C,D'); + expect(graph.getAllEdges().length).toBe(3); + expect(graph.getNeighbors(vertexA).length).toBe(0); + expect(graph.getNeighbors(vertexB).length).toBe(1); + expect(graph.getNeighbors(vertexB)[0].getKey()).toBe(vertexA.getKey()); + expect(graph.getNeighbors(vertexC).length).toBe(1); + expect(graph.getNeighbors(vertexC)[0].getKey()).toBe(vertexA.getKey()); + expect(graph.getNeighbors(vertexD).length).toBe(1); + expect(graph.getNeighbors(vertexD)[0].getKey()).toBe(vertexC.getKey()); + }); }); diff --git a/src/data-structures/graph/__test__/GraphEdge.test.js b/src/data-structures/graph/__test__/GraphEdge.test.js index 765b61565..ceb84ab28 100644 --- a/src/data-structures/graph/__test__/GraphEdge.test.js +++ b/src/data-structures/graph/__test__/GraphEdge.test.js @@ -23,4 +23,20 @@ describe('GraphEdge', () => { expect(edge.endVertex).toEqual(endVertex); expect(edge.weight).toEqual(10); }); + + it('should be possible to do edge reverse', () => { + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + const edge = new GraphEdge(vertexA, vertexB, 10); + + expect(edge.startVertex).toEqual(vertexA); + expect(edge.endVertex).toEqual(vertexB); + expect(edge.weight).toEqual(10); + + edge.reverse(); + + expect(edge.startVertex).toEqual(vertexB); + expect(edge.endVertex).toEqual(vertexA); + expect(edge.weight).toEqual(10); + }); }); From 5a1feda1d036b7864f4523a878bd083218407190 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Mon, 14 May 2018 07:13:07 +0300 Subject: [PATCH 275/327] Add SCC. --- README.md | 2 +- .../strongly-connected-components/README.md | 16 +++ .../stronglyConnectedComponents.test.js | 102 ++++++++++++++ .../stronglyConnectedComponents.js | 133 ++++++++++++++++++ src/data-structures/stack/Stack.js | 2 +- 5 files changed, 253 insertions(+), 2 deletions(-) create mode 100644 src/algorithms/graph/strongly-connected-components/README.md create mode 100644 src/algorithms/graph/strongly-connected-components/__test__/stronglyConnectedComponents.test.js create mode 100644 src/algorithms/graph/strongly-connected-components/stronglyConnectedComponents.js diff --git a/README.md b/README.md index 96b8443a0..899e01f05 100644 --- a/README.md +++ b/README.md @@ -75,7 +75,7 @@ * [Articulation Points](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/articulation-points) - Tarjan's algorithm (DFS based) * [Bridges](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/bridges) - DFS based algorithm * [Eulerian Path and Eulerian Circuit](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/eulerian-path) - Fleury's algorithm - * Strongly Connected Component algorithm + * [Strongly Connected Components](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/strongly-connected-components) - Kosaraju's algorithm * Shortest Path Faster Algorithm (SPFA) * **Uncategorized** * Union-Find diff --git a/src/algorithms/graph/strongly-connected-components/README.md b/src/algorithms/graph/strongly-connected-components/README.md new file mode 100644 index 000000000..54faaad42 --- /dev/null +++ b/src/algorithms/graph/strongly-connected-components/README.md @@ -0,0 +1,16 @@ +# Strongly Connected Component + +A directed graph is called **strongly connected** if there is a path +in each direction between each pair of vertices of the graph. +In a directed graph G that may not itself be strongly connected, +a pair of vertices `u` and `v` are said to be strongly connected +to each other if there is a path in each direction between them. + +![Strongly Connected](https://upload.wikimedia.org/wikipedia/commons/5/5c/Scc.png) + +Graph with strongly connected components marked + +## References + +- [Wikipedia](https://en.wikipedia.org/wiki/Strongly_connected_component) +- [YouTube](https://www.youtube.com/watch?v=RpgcYiky7uw) diff --git a/src/algorithms/graph/strongly-connected-components/__test__/stronglyConnectedComponents.test.js b/src/algorithms/graph/strongly-connected-components/__test__/stronglyConnectedComponents.test.js new file mode 100644 index 000000000..3379ca75f --- /dev/null +++ b/src/algorithms/graph/strongly-connected-components/__test__/stronglyConnectedComponents.test.js @@ -0,0 +1,102 @@ +import GraphVertex from '../../../../data-structures/graph/GraphVertex'; +import GraphEdge from '../../../../data-structures/graph/GraphEdge'; +import Graph from '../../../../data-structures/graph/Graph'; +import stronglyConnectedComponents from '../stronglyConnectedComponents'; + +describe('stronglyConnectedComponents', () => { + it('should detect strongly connected components in simple graph', () => { + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + const vertexC = new GraphVertex('C'); + const vertexD = new GraphVertex('D'); + + const edgeAB = new GraphEdge(vertexA, vertexB); + const edgeBC = new GraphEdge(vertexB, vertexC); + const edgeCA = new GraphEdge(vertexC, vertexA); + const edgeCD = new GraphEdge(vertexC, vertexD); + + const graph = new Graph(true); + + graph + .addEdge(edgeAB) + .addEdge(edgeBC) + .addEdge(edgeCA) + .addEdge(edgeCD); + + const components = stronglyConnectedComponents(graph); + + expect(components).toBeDefined(); + expect(components.length).toBe(2); + + expect(components[0][0].getKey()).toBe(vertexA.getKey()); + expect(components[0][1].getKey()).toBe(vertexC.getKey()); + expect(components[0][2].getKey()).toBe(vertexB.getKey()); + + expect(components[1][0].getKey()).toBe(vertexD.getKey()); + }); + + it('should detect strongly connected components in graph', () => { + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + const vertexC = new GraphVertex('C'); + const vertexD = new GraphVertex('D'); + const vertexE = new GraphVertex('E'); + const vertexF = new GraphVertex('F'); + const vertexG = new GraphVertex('G'); + const vertexH = new GraphVertex('H'); + const vertexI = new GraphVertex('I'); + const vertexJ = new GraphVertex('J'); + const vertexK = new GraphVertex('K'); + + const edgeAB = new GraphEdge(vertexA, vertexB); + const edgeBC = new GraphEdge(vertexB, vertexC); + const edgeCA = new GraphEdge(vertexC, vertexA); + const edgeBD = new GraphEdge(vertexB, vertexD); + const edgeDE = new GraphEdge(vertexD, vertexE); + const edgeEF = new GraphEdge(vertexE, vertexF); + const edgeFD = new GraphEdge(vertexF, vertexD); + const edgeGF = new GraphEdge(vertexG, vertexF); + const edgeGH = new GraphEdge(vertexG, vertexH); + const edgeHI = new GraphEdge(vertexH, vertexI); + const edgeIJ = new GraphEdge(vertexI, vertexJ); + const edgeJG = new GraphEdge(vertexJ, vertexG); + const edgeJK = new GraphEdge(vertexJ, vertexK); + + const graph = new Graph(true); + + graph + .addEdge(edgeAB) + .addEdge(edgeBC) + .addEdge(edgeCA) + .addEdge(edgeBD) + .addEdge(edgeDE) + .addEdge(edgeEF) + .addEdge(edgeFD) + .addEdge(edgeGF) + .addEdge(edgeGH) + .addEdge(edgeHI) + .addEdge(edgeIJ) + .addEdge(edgeJG) + .addEdge(edgeJK); + + const components = stronglyConnectedComponents(graph); + + expect(components).toBeDefined(); + expect(components.length).toBe(4); + + expect(components[0][0].getKey()).toBe(vertexG.getKey()); + expect(components[0][1].getKey()).toBe(vertexJ.getKey()); + expect(components[0][2].getKey()).toBe(vertexI.getKey()); + expect(components[0][3].getKey()).toBe(vertexH.getKey()); + + expect(components[1][0].getKey()).toBe(vertexK.getKey()); + + expect(components[2][0].getKey()).toBe(vertexA.getKey()); + expect(components[2][1].getKey()).toBe(vertexC.getKey()); + expect(components[2][2].getKey()).toBe(vertexB.getKey()); + + expect(components[3][0].getKey()).toBe(vertexD.getKey()); + expect(components[3][1].getKey()).toBe(vertexF.getKey()); + expect(components[3][2].getKey()).toBe(vertexE.getKey()); + }); +}); diff --git a/src/algorithms/graph/strongly-connected-components/stronglyConnectedComponents.js b/src/algorithms/graph/strongly-connected-components/stronglyConnectedComponents.js new file mode 100644 index 000000000..809627735 --- /dev/null +++ b/src/algorithms/graph/strongly-connected-components/stronglyConnectedComponents.js @@ -0,0 +1,133 @@ +import Stack from '../../../data-structures/stack/Stack'; +import depthFirstSearch from '../depth-first-search/depthFirstSearch'; + +/** + * @param {Graph} graph + * @return {Stack} + */ +function getVerticesSortedByDfsFinishTime(graph) { + // Set of all visited vertices during DFS pass. + const visitedVerticesSet = {}; + + // Stack of vertices by finish time. + // All vertices in this stack are ordered by finished time in decreasing order. + // Vertex that has been finished first will be at the bottom of the stack and + // vertex that has been finished last will be at the top of the stack. + const verticesByDfsFinishTime = new Stack(); + + // Set of all vertices we're going to visit. + const notVisitedVerticesSet = {}; + graph.getAllVertices().forEach((vertex) => { + notVisitedVerticesSet[vertex.getKey()] = vertex; + }); + + // Specify DFS traversal callbacks. + const dfsCallbacks = { + enterVertex: ({ currentVertex }) => { + // Add current vertex to visited set. + visitedVerticesSet[currentVertex.getKey()] = currentVertex; + + // Delete current vertex from not visited set. + delete notVisitedVerticesSet[currentVertex.getKey()]; + }, + leaveVertex: ({ currentVertex }) => { + // Push vertex to the stack when leaving it. + // This will make stack to be ordered by finish time in decreasing order. + verticesByDfsFinishTime.push(currentVertex); + }, + allowTraversal: ({ nextVertex }) => { + // Don't allow to traverse the nodes that have been already visited. + return !visitedVerticesSet[nextVertex.getKey()]; + }, + }; + + // Do FIRST DFS PASS traversal for all graph vertices to fill the verticesByFinishTime stack. + while (Object.values(notVisitedVerticesSet).length) { + // Peek any vertex to start DFS traversal from. + const startVertexKey = Object.keys(notVisitedVerticesSet)[0]; + const startVertex = notVisitedVerticesSet[startVertexKey]; + delete notVisitedVerticesSet[startVertexKey]; + + depthFirstSearch(graph, startVertex, dfsCallbacks); + } + + return verticesByDfsFinishTime; +} + +/** + * @param {Graph} graph + * @param {Stack} verticesByFinishTime + * @return {*[]} + */ +function getSCCSets(graph, verticesByFinishTime) { + // Array of arrays of strongly connected vertices. + const stronglyConnectedComponentsSets = []; + + // Array that will hold all vertices that are being visited during one DFS run. + let stronglyConnectedComponentsSet = []; + + // Visited vertices set. + const visitedVerticesSet = {}; + + // Callbacks for DFS traversal. + const dfsCallbacks = { + enterVertex: ({ currentVertex }) => { + // Add current vertex to SCC set of current DFS round. + stronglyConnectedComponentsSet.push(currentVertex); + + // Add current vertex to visited set. + visitedVerticesSet[currentVertex.getKey()] = currentVertex; + }, + leaveVertex: ({ previousVertex }) => { + // Once DFS traversal is finished push the set of found strongly connected + // components during current DFS round to overall strongly connected components set. + // The sign that traversal is about to be finished is that we came back to start vertex + // which doesn't have parent. + if (previousVertex === null) { + stronglyConnectedComponentsSets.push([...stronglyConnectedComponentsSet]); + } + }, + allowTraversal: ({ nextVertex }) => { + // Don't allow traversal of already visited vertices. + return !visitedVerticesSet[nextVertex.getKey()]; + }, + }; + + while (!verticesByFinishTime.isEmpty()) { + /** @var {GraphVertex} startVertex */ + const startVertex = verticesByFinishTime.pop(); + + // Reset the set of strongly connected vertices. + stronglyConnectedComponentsSet = []; + + // Don't do DFS on already visited vertices. + if (!visitedVerticesSet[startVertex.getKey()]) { + // Do DFS traversal. + depthFirstSearch(graph, startVertex, dfsCallbacks); + } + } + + return stronglyConnectedComponentsSets; +} + +/** + * Kosaraju's algorithm. + * + * @param {Graph} graph + * @return {*[]} + */ +export default function stronglyConnectedComponents(graph) { + // In this algorithm we will need to do TWO DFS PASSES overt the graph. + + // Get stack of vertices ordered by DFS finish time. + // All vertices in this stack are ordered by finished time in decreasing order: + // Vertex that has been finished first will be at the bottom of the stack and + // vertex that has been finished last will be at the top of the stack. + const verticesByFinishTime = getVerticesSortedByDfsFinishTime(graph); + + // Reverse the graph. + graph.reverse(); + + // Do DFS once again on reversed graph. + return getSCCSets(graph, verticesByFinishTime); +} diff --git a/src/data-structures/stack/Stack.js b/src/data-structures/stack/Stack.js index a71083007..0cd95b074 100644 --- a/src/data-structures/stack/Stack.js +++ b/src/data-structures/stack/Stack.js @@ -31,7 +31,7 @@ export default class Stack { } /** - * @return {LinkedListNode} + * @return {*} */ pop() { const removedTail = this.linkedList.deleteTail(); From 8b303b07c633157463fcc1ca51f6844862ad92bd Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Mon, 14 May 2018 07:21:45 +0300 Subject: [PATCH 276/327] Update README. --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 899e01f05..577ebc946 100644 --- a/README.md +++ b/README.md @@ -76,7 +76,6 @@ * [Bridges](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/bridges) - DFS based algorithm * [Eulerian Path and Eulerian Circuit](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/eulerian-path) - Fleury's algorithm * [Strongly Connected Components](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/strongly-connected-components) - Kosaraju's algorithm - * Shortest Path Faster Algorithm (SPFA) * **Uncategorized** * Union-Find * Maze From ad19dc74d5ffe2f6f3d10f478b0e345655f8a882 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Mon, 14 May 2018 08:56:44 +0300 Subject: [PATCH 277/327] Add Tower of Hanoi. --- README.md | 2 + .../uncategorized/hanoi-tower/README.md | 29 ++++++ .../hanoi-tower/__test__/hanoiTower.test.js | 39 ++++++++ .../uncategorized/hanoi-tower/hanoiTower.js | 94 +++++++++++++++++++ src/data-structures/stack/Stack.js | 2 +- 5 files changed, 165 insertions(+), 1 deletion(-) create mode 100644 src/algorithms/uncategorized/hanoi-tower/README.md create mode 100644 src/algorithms/uncategorized/hanoi-tower/__test__/hanoiTower.test.js create mode 100644 src/algorithms/uncategorized/hanoi-tower/hanoiTower.js diff --git a/README.md b/README.md index 577ebc946..dd2ab9fe5 100644 --- a/README.md +++ b/README.md @@ -77,6 +77,7 @@ * [Eulerian Path and Eulerian Circuit](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/eulerian-path) - Fleury's algorithm * [Strongly Connected Components](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/strongly-connected-components) - Kosaraju's algorithm * **Uncategorized** + * [Tower of Hanoi](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/uncategorized/hanoi-tower) * Union-Find * Maze * Sudoku @@ -89,6 +90,7 @@ * [Prim’s Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/prim) - finding Minimum Spanning Tree (MST) for weighted undirected graph * [Kruskal’s Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/kruskal) - finding Minimum Spanning Tree (MST) for weighted undirected graph * **Divide and Conquer** + * [Tower of Hanoi](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/uncategorized/hanoi-tower) * [Euclidean Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/euclidean-algorithm) - calculate the Greatest Common Divisor (GCD) * [Permutations](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/permutations) (with and without repetitions) * [Combinations](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/combinations) (with and without repetitions) diff --git a/src/algorithms/uncategorized/hanoi-tower/README.md b/src/algorithms/uncategorized/hanoi-tower/README.md new file mode 100644 index 000000000..581d3c19a --- /dev/null +++ b/src/algorithms/uncategorized/hanoi-tower/README.md @@ -0,0 +1,29 @@ +# Tower of Hanoi + +The Tower of Hanoi (also called the Tower of Brahma or Lucas' +Tower and sometimes pluralized) is a mathematical game or puzzle. +It consists of three rods and a number of disks of different sizes, +which can slide onto any rod. The puzzle starts with the disks in +a neat stack in ascending order of size on one rod, the smallest +at the top, thus making a conical shape. + +The objective of the puzzle is to move the entire stack to another +rod, obeying the following simple rules: + +- Only one disk can be moved at a time. +- Each move consists of taking the upper disk from one of the +stacks and placing it on top of another stack or on an empty rod. +- No disk may be placed on top of a smaller disk. + +![Hanoi Tower](https://upload.wikimedia.org/wikipedia/commons/8/8d/Iterative_algorithm_solving_a_6_disks_Tower_of_Hanoi.gif) + +Animation of an iterative algorithm solving 6-disk problem + +With `3` disks, the puzzle can be solved in `7` moves. The minimal +number of moves required to solve a Tower of Hanoi puzzle +is `2n − 1`, where `n` is the number of disks. + +## References + +- [Wikipedia](https://en.wikipedia.org/wiki/Tower_of_Hanoi) +- [HackerEarth](https://www.hackerearth.com/blog/algorithms/tower-hanoi-recursion-game-algorithm-explained/) diff --git a/src/algorithms/uncategorized/hanoi-tower/__test__/hanoiTower.test.js b/src/algorithms/uncategorized/hanoi-tower/__test__/hanoiTower.test.js new file mode 100644 index 000000000..f6c9a788b --- /dev/null +++ b/src/algorithms/uncategorized/hanoi-tower/__test__/hanoiTower.test.js @@ -0,0 +1,39 @@ +import hanoiTower from '../hanoiTower'; + +describe('hanoiTower', () => { + it('should solve tower of hanoi puzzle with 2 discs', () => { + const moveCallbackMock = jest.fn(); + + hanoiTower(2, moveCallbackMock); + + expect(moveCallbackMock).toHaveBeenCalledTimes(3); + + expect(moveCallbackMock.mock.calls[0][0]).toBe(1); + expect(moveCallbackMock.mock.calls[0][1]).toEqual([1, 2]); + expect(moveCallbackMock.mock.calls[0][2]).toEqual([]); + + expect(moveCallbackMock.mock.calls[1][0]).toBe(2); + expect(moveCallbackMock.mock.calls[1][1]).toEqual([2]); + expect(moveCallbackMock.mock.calls[1][2]).toEqual([]); + + expect(moveCallbackMock.mock.calls[2][0]).toBe(1); + expect(moveCallbackMock.mock.calls[2][1]).toEqual([1]); + expect(moveCallbackMock.mock.calls[2][2]).toEqual([2]); + }); + + it('should solve tower of hanoi puzzle with 3 discs', () => { + const moveCallbackMock = jest.fn(); + + hanoiTower(3, moveCallbackMock); + + expect(moveCallbackMock).toHaveBeenCalledTimes(7); + }); + + it('should solve tower of hanoi puzzle with 6 discs', () => { + const moveCallbackMock = jest.fn(); + + hanoiTower(6, moveCallbackMock); + + expect(moveCallbackMock).toHaveBeenCalledTimes(63); + }); +}); diff --git a/src/algorithms/uncategorized/hanoi-tower/hanoiTower.js b/src/algorithms/uncategorized/hanoi-tower/hanoiTower.js new file mode 100644 index 000000000..8406bf29b --- /dev/null +++ b/src/algorithms/uncategorized/hanoi-tower/hanoiTower.js @@ -0,0 +1,94 @@ +import Stack from '../../../data-structures/stack/Stack'; + +/** + * @param {Stack} fromPole + * @param {Stack} toPole + * @param {function(disc: number, fromPole: number[], toPole: number[])} moveCallback + */ +function moveDisc(fromPole, toPole, moveCallback) { + moveCallback(fromPole.peek(), fromPole.toArray(), toPole.toArray()); + + const disc = fromPole.pop(); + toPole.push(disc); +} + +/** + * @param {number} numberOfDiscs + * @param {Stack} fromPole + * @param {Stack} withPole + * @param {Stack} toPole + * @param {function(disc: number, fromPole: number[], toPole: number[])} moveCallback + */ +function hanoiTowerRecursive({ + numberOfDiscs, + fromPole, + withPole, + toPole, + moveCallback, +}) { + if (numberOfDiscs === 1) { + // Base case with just one disc. + moveDisc(fromPole, toPole, moveCallback); + } else { + // In case if there are more discs then move them recursively. + + // Expose the bottom disc on fromPole stack. + hanoiTowerRecursive({ + numberOfDiscs: numberOfDiscs - 1, + fromPole, + withPole: toPole, + toPole: withPole, + moveCallback, + }); + + // Move the disc that was exposed to its final destination. + hanoiTowerRecursive({ + numberOfDiscs: 1, + fromPole, + withPole, + toPole, + moveCallback, + }); + + // Move temporary tower from auxiliary pole to its final destination. + hanoiTowerRecursive({ + numberOfDiscs: numberOfDiscs - 1, + fromPole: withPole, + withPole: fromPole, + toPole, + moveCallback, + }); + } +} + +/** + * @param {number} numberOfDiscs + * @param {function(disc: number, fromPole: number[], toPole: number[])} moveCallback + */ +export default function hanoiTower(numberOfDiscs, moveCallback) { + // Each of three poles of Tower of Hanoi puzzle is represented as a stack + // that might contain elements (discs). Each disc is represented as a number. + // Larger discs have bigger number equivalent. + + // The pole from where the discs should be moved. + const fromPole = new Stack(); + + // The middle pole that should be used as a helper. + const withPole = new Stack(); + + // The destination pole where all discs need to be moved. + const toPole = new Stack(); + + // Let's create the discs and put them to the fromPole. + for (let discSize = numberOfDiscs; discSize > 0; discSize -= 1) { + fromPole.push(discSize); + } + + hanoiTowerRecursive({ + numberOfDiscs, + fromPole, + withPole, + toPole, + moveCallback, + }); +} diff --git a/src/data-structures/stack/Stack.js b/src/data-structures/stack/Stack.js index 0cd95b074..daa5d9390 100644 --- a/src/data-structures/stack/Stack.js +++ b/src/data-structures/stack/Stack.js @@ -13,7 +13,7 @@ export default class Stack { } /** - * @return {LinkedListNode} + * @return {*} */ peek() { if (!this.linkedList.tail) { From 73061c90cdd3032e673442f7b955de69ceef0e06 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Mon, 14 May 2018 09:00:42 +0300 Subject: [PATCH 278/327] Add Tower of Hanoi. --- .../uncategorized/hanoi-tower/README.md | 2 +- .../hanoi-tower/__test__/hanoiTower.test.js | 15 +++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/algorithms/uncategorized/hanoi-tower/README.md b/src/algorithms/uncategorized/hanoi-tower/README.md index 581d3c19a..816df8d3d 100644 --- a/src/algorithms/uncategorized/hanoi-tower/README.md +++ b/src/algorithms/uncategorized/hanoi-tower/README.md @@ -21,7 +21,7 @@ Animation of an iterative algorithm solving 6-disk problem With `3` disks, the puzzle can be solved in `7` moves. The minimal number of moves required to solve a Tower of Hanoi puzzle -is `2n − 1`, where `n` is the number of disks. +is `2^n − 1`, where `n` is the number of disks. ## References diff --git a/src/algorithms/uncategorized/hanoi-tower/__test__/hanoiTower.test.js b/src/algorithms/uncategorized/hanoi-tower/__test__/hanoiTower.test.js index f6c9a788b..c7ef66c49 100644 --- a/src/algorithms/uncategorized/hanoi-tower/__test__/hanoiTower.test.js +++ b/src/algorithms/uncategorized/hanoi-tower/__test__/hanoiTower.test.js @@ -3,10 +3,11 @@ import hanoiTower from '../hanoiTower'; describe('hanoiTower', () => { it('should solve tower of hanoi puzzle with 2 discs', () => { const moveCallbackMock = jest.fn(); + const numberOfDiscs = 2; - hanoiTower(2, moveCallbackMock); + hanoiTower(numberOfDiscs, moveCallbackMock); - expect(moveCallbackMock).toHaveBeenCalledTimes(3); + expect(moveCallbackMock).toHaveBeenCalledTimes((2 ** numberOfDiscs) - 1); expect(moveCallbackMock.mock.calls[0][0]).toBe(1); expect(moveCallbackMock.mock.calls[0][1]).toEqual([1, 2]); @@ -23,17 +24,19 @@ describe('hanoiTower', () => { it('should solve tower of hanoi puzzle with 3 discs', () => { const moveCallbackMock = jest.fn(); + const numberOfDiscs = 3; - hanoiTower(3, moveCallbackMock); + hanoiTower(numberOfDiscs, moveCallbackMock); - expect(moveCallbackMock).toHaveBeenCalledTimes(7); + expect(moveCallbackMock).toHaveBeenCalledTimes((2 ** numberOfDiscs) - 1); }); it('should solve tower of hanoi puzzle with 6 discs', () => { const moveCallbackMock = jest.fn(); + const numberOfDiscs = 6; - hanoiTower(6, moveCallbackMock); + hanoiTower(numberOfDiscs, moveCallbackMock); - expect(moveCallbackMock).toHaveBeenCalledTimes(63); + expect(moveCallbackMock).toHaveBeenCalledTimes((2 ** numberOfDiscs) - 1); }); }); From 72e1a3b80561e2a6f595987f6482021edbc7f248 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Mon, 14 May 2018 11:28:56 +0300 Subject: [PATCH 279/327] Add Tower of Hanoi. --- .../hanoi-tower/__test__/hanoiTower.test.js | 56 +++++++++++++------ .../uncategorized/hanoi-tower/hanoiTower.js | 36 +++++------- 2 files changed, 51 insertions(+), 41 deletions(-) diff --git a/src/algorithms/uncategorized/hanoi-tower/__test__/hanoiTower.test.js b/src/algorithms/uncategorized/hanoi-tower/__test__/hanoiTower.test.js index c7ef66c49..d720d1839 100644 --- a/src/algorithms/uncategorized/hanoi-tower/__test__/hanoiTower.test.js +++ b/src/algorithms/uncategorized/hanoi-tower/__test__/hanoiTower.test.js @@ -1,42 +1,62 @@ import hanoiTower from '../hanoiTower'; +import Stack from '../../../../data-structures/stack/Stack'; describe('hanoiTower', () => { it('should solve tower of hanoi puzzle with 2 discs', () => { - const moveCallbackMock = jest.fn(); + const moveCallback = jest.fn(); const numberOfDiscs = 2; - hanoiTower(numberOfDiscs, moveCallbackMock); + const fromPole = new Stack(); + const withPole = new Stack(); + const toPole = new Stack(); - expect(moveCallbackMock).toHaveBeenCalledTimes((2 ** numberOfDiscs) - 1); + hanoiTower({ + numberOfDiscs, + moveCallback, + fromPole, + withPole, + toPole, + }); - expect(moveCallbackMock.mock.calls[0][0]).toBe(1); - expect(moveCallbackMock.mock.calls[0][1]).toEqual([1, 2]); - expect(moveCallbackMock.mock.calls[0][2]).toEqual([]); + expect(moveCallback).toHaveBeenCalledTimes((2 ** numberOfDiscs) - 1); - expect(moveCallbackMock.mock.calls[1][0]).toBe(2); - expect(moveCallbackMock.mock.calls[1][1]).toEqual([2]); - expect(moveCallbackMock.mock.calls[1][2]).toEqual([]); + expect(fromPole.toArray()).toEqual([]); + expect(toPole.toArray()).toEqual([1, 2]); - expect(moveCallbackMock.mock.calls[2][0]).toBe(1); - expect(moveCallbackMock.mock.calls[2][1]).toEqual([1]); - expect(moveCallbackMock.mock.calls[2][2]).toEqual([2]); + expect(moveCallback.mock.calls[0][0]).toBe(1); + expect(moveCallback.mock.calls[0][1]).toEqual([1, 2]); + expect(moveCallback.mock.calls[0][2]).toEqual([]); + + expect(moveCallback.mock.calls[1][0]).toBe(2); + expect(moveCallback.mock.calls[1][1]).toEqual([2]); + expect(moveCallback.mock.calls[1][2]).toEqual([]); + + expect(moveCallback.mock.calls[2][0]).toBe(1); + expect(moveCallback.mock.calls[2][1]).toEqual([1]); + expect(moveCallback.mock.calls[2][2]).toEqual([2]); }); it('should solve tower of hanoi puzzle with 3 discs', () => { - const moveCallbackMock = jest.fn(); + const moveCallback = jest.fn(); const numberOfDiscs = 3; - hanoiTower(numberOfDiscs, moveCallbackMock); + hanoiTower({ + numberOfDiscs, + moveCallback, + }); - expect(moveCallbackMock).toHaveBeenCalledTimes((2 ** numberOfDiscs) - 1); + expect(moveCallback).toHaveBeenCalledTimes((2 ** numberOfDiscs) - 1); }); it('should solve tower of hanoi puzzle with 6 discs', () => { - const moveCallbackMock = jest.fn(); + const moveCallback = jest.fn(); const numberOfDiscs = 6; - hanoiTower(numberOfDiscs, moveCallbackMock); + hanoiTower({ + numberOfDiscs, + moveCallback, + }); - expect(moveCallbackMock).toHaveBeenCalledTimes((2 ** numberOfDiscs) - 1); + expect(moveCallback).toHaveBeenCalledTimes((2 ** numberOfDiscs) - 1); }); }); diff --git a/src/algorithms/uncategorized/hanoi-tower/hanoiTower.js b/src/algorithms/uncategorized/hanoi-tower/hanoiTower.js index 8406bf29b..86d78880d 100644 --- a/src/algorithms/uncategorized/hanoi-tower/hanoiTower.js +++ b/src/algorithms/uncategorized/hanoi-tower/hanoiTower.js @@ -1,17 +1,5 @@ import Stack from '../../../data-structures/stack/Stack'; -/** - * @param {Stack} fromPole - * @param {Stack} toPole - * @param {function(disc: number, fromPole: number[], toPole: number[])} moveCallback - */ -function moveDisc(fromPole, toPole, moveCallback) { - moveCallback(fromPole.peek(), fromPole.toArray(), toPole.toArray()); - - const disc = fromPole.pop(); - toPole.push(disc); -} - /** * @param {number} numberOfDiscs * @param {Stack} fromPole @@ -28,7 +16,9 @@ function hanoiTowerRecursive({ }) { if (numberOfDiscs === 1) { // Base case with just one disc. - moveDisc(fromPole, toPole, moveCallback); + moveCallback(fromPole.peek(), fromPole.toArray(), toPole.toArray()); + const disc = fromPole.pop(); + toPole.push(disc); } else { // In case if there are more discs then move them recursively. @@ -64,21 +54,21 @@ function hanoiTowerRecursive({ /** * @param {number} numberOfDiscs * @param {function(disc: number, fromPole: number[], toPole: number[])} moveCallback + * @param {Stack} [fromPole] + * @param {Stack} [withPole] + * @param {Stack} [toPole] */ -export default function hanoiTower(numberOfDiscs, moveCallback) { +export default function hanoiTower({ + numberOfDiscs, + moveCallback, + fromPole = new Stack(), + withPole = new Stack(), + toPole = new Stack(), +}) { // Each of three poles of Tower of Hanoi puzzle is represented as a stack // that might contain elements (discs). Each disc is represented as a number. // Larger discs have bigger number equivalent. - // The pole from where the discs should be moved. - const fromPole = new Stack(); - - // The middle pole that should be used as a helper. - const withPole = new Stack(); - - // The destination pole where all discs need to be moved. - const toPole = new Stack(); - // Let's create the discs and put them to the fromPole. for (let discSize = numberOfDiscs; discSize > 0; discSize -= 1) { fromPole.push(discSize); From 04d0e3182adfbe26ff4b771e3018fc7aff1bfff6 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Wed, 16 May 2018 07:54:06 +0300 Subject: [PATCH 280/327] Add N-Queens. --- README.md | 17 ++- .../uncategorized/n-queens/QueenPosition.js | 39 +++++++ .../uncategorized/n-queens/README.md | 73 +++++++++++++ .../n-queens/__test__/QueensPosition.test.js | 16 +++ .../n-queens/__test__/nQueens.test.js | 38 +++++++ .../uncategorized/n-queens/nQueens.js | 103 ++++++++++++++++++ 6 files changed, 281 insertions(+), 5 deletions(-) create mode 100644 src/algorithms/uncategorized/n-queens/QueenPosition.js create mode 100644 src/algorithms/uncategorized/n-queens/README.md create mode 100644 src/algorithms/uncategorized/n-queens/__test__/QueensPosition.test.js create mode 100644 src/algorithms/uncategorized/n-queens/__test__/nQueens.test.js create mode 100644 src/algorithms/uncategorized/n-queens/nQueens.js diff --git a/README.md b/README.md index dd2ab9fe5..c7cc3ea25 100644 --- a/README.md +++ b/README.md @@ -78,6 +78,7 @@ * [Strongly Connected Components](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/strongly-connected-components) - Kosaraju's algorithm * **Uncategorized** * [Tower of Hanoi](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/uncategorized/hanoi-tower) + * [N-Queens Problem](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/uncategorized/n-queens) * Union-Find * Maze * Sudoku @@ -110,9 +111,15 @@ * [Maximum Subarray](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/maximum-subarray) * [Bellman-Ford Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/bellman-ford) - finding shortest path to all graph vertices * **Backtracking** + * [N-Queens Problem](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/uncategorized/n-queens) * **Branch & Bound** -## Running Tests +## How to use this repository + +**Install all dependencies** +``` +npm i +``` **Run all tests** ``` @@ -135,11 +142,11 @@ Then just simply run the following command to test if your playground code works npm test -- -t 'playground' ``` -## Useful links +## Useful Information -[▶ Data Structures and Algorithms on YouTube](https://www.youtube.com/playlist?list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) +### References -## Useful Information +[▶ Data Structures and Algorithms on YouTube](https://www.youtube.com/playlist?list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) ### Big O Notation @@ -185,4 +192,4 @@ Below is the list of some of the most used Big O notations and their performance | **Heap sort** | n log(n) | n log(n) | n log(n) | 1 | No | | **Merge sort** | n log(n) | n log(n) | n log(n) | n | Yes | | **Quick sort** | n log(n) | n log(n) | n^2 | log(n) | No | -| **Shell sort** | n log(n) | depends on gap sequence | n (log(n))^2 | 1 | No | +| **Shell sort** | n log(n) | depends on gap sequence | n (log(n))^2 | 1 | No | diff --git a/src/algorithms/uncategorized/n-queens/QueenPosition.js b/src/algorithms/uncategorized/n-queens/QueenPosition.js new file mode 100644 index 000000000..9ad278bca --- /dev/null +++ b/src/algorithms/uncategorized/n-queens/QueenPosition.js @@ -0,0 +1,39 @@ +/** + * Class that represents queen position on the chessboard. + */ +export default class QueenPosition { + /** + * @param {number} rowIndex + * @param {number} columnIndex + */ + constructor(rowIndex, columnIndex) { + this.rowIndex = rowIndex; + this.columnIndex = columnIndex; + } + + /** + * @return {number} + */ + get leftDiagonal() { + // Each position on the same left (\) diagonal has the same difference of + // rowIndex and columnIndex. This fact may be used to quickly check if two + // positions (queens) are on the same left diagonal. + // @see https://youtu.be/xouin83ebxE?t=1m59s + return this.rowIndex - this.columnIndex; + } + + /** + * @return {number} + */ + get rightDiagonal() { + // Each position on the same right diagonal (/) has the same + // sum of rowIndex and columnIndex. This fact may be used to quickly + // check if two positions (queens) are on the same right diagonal. + // @see https://youtu.be/xouin83ebxE?t=1m59s + return this.rowIndex + this.columnIndex; + } + + toString() { + return `${this.rowIndex},${this.columnIndex}`; + } +} diff --git a/src/algorithms/uncategorized/n-queens/README.md b/src/algorithms/uncategorized/n-queens/README.md new file mode 100644 index 000000000..5c0d9c837 --- /dev/null +++ b/src/algorithms/uncategorized/n-queens/README.md @@ -0,0 +1,73 @@ +# N-Queens Problem + +The **eight queens puzzle** is the problem of placing eight chess queens +on an `8×8` chessboard so that no two queens threaten each other. +Thus, a solution requires that no two queens share the same row, +column, or diagonal. The eight queens puzzle is an example of the +more general *n queens problem* of placing n non-attacking queens +on an `n×n` chessboard, for which solutions exist for all natural +numbers `n` with the exception of `n=2` and `n=3`. + +For example, following is a solution for 4 Queen problem. + +![N Queens](https://cdncontribute.geeksforgeeks.org/wp-content/uploads/N_Queen_Problem.jpg) + +The expected output is a binary matrix which has 1s for the blocks +where queens are placed. For example following is the output matrix +for above 4 queen solution. + +``` +{ 0, 1, 0, 0} +{ 0, 0, 0, 1} +{ 1, 0, 0, 0} +{ 0, 0, 1, 0} +``` + +## Naive Algorithm + +Generate all possible configurations of queens on board and print a +configuration that satisfies the given constraints. + +``` +while there are untried conflagrations +{ + generate the next configuration + if queens don't attack in this configuration then + { + print this configuration; + } +} +``` + +## Backtracking Algorithm + +The idea is to place queens one by one in different columns, +starting from the leftmost column. When we place a queen in a +column, we check for clashes with already placed queens. In +the current column, if we find a row for which there is no +clash, we mark this row and column as part of the solution. +If we do not find such a row due to clashes then we backtrack +and return false. + +``` +1) Start in the leftmost column +2) If all queens are placed + return true +3) Try all rows in the current column. Do following for every tried row. + a) If the queen can be placed safely in this row then mark this [row, + column] as part of the solution and recursively check if placing + queen here leads to a solution. + b) If placing queen in [row, column] leads to a solution then return + true. + c) If placing queen doesn't lead to a solution then umark this [row, + column] (Backtrack) and go to step (a) to try other rows. +3) If all rows have been tried and nothing worked, return false to trigger + backtracking. +``` + +## References + +- [Wikipedia](https://en.wikipedia.org/wiki/Eight_queens_puzzle) +- [GeeksForGeeks](https://www.geeksforgeeks.org/backtracking-set-3-n-queen-problem/) +- [On YouTube by Abdul Bari](https://www.youtube.com/watch?v=xFv_Hl4B83A) +- [On YouTube by Tushar Roy](https://www.youtube.com/watch?v=xouin83ebxE) diff --git a/src/algorithms/uncategorized/n-queens/__test__/QueensPosition.test.js b/src/algorithms/uncategorized/n-queens/__test__/QueensPosition.test.js new file mode 100644 index 000000000..a842dce3c --- /dev/null +++ b/src/algorithms/uncategorized/n-queens/__test__/QueensPosition.test.js @@ -0,0 +1,16 @@ +import QueenPosition from '../QueenPosition'; + +describe('QueenPosition', () => { + it('should store queen position on chessboard', () => { + const position1 = new QueenPosition(0, 0); + const position2 = new QueenPosition(2, 1); + + expect(position2.columnIndex).toBe(1); + expect(position2.rowIndex).toBe(2); + expect(position1.leftDiagonal).toBe(0); + expect(position1.rightDiagonal).toBe(0); + expect(position2.leftDiagonal).toBe(1); + expect(position2.rightDiagonal).toBe(3); + expect(position2.toString()).toBe('2,1'); + }); +}); diff --git a/src/algorithms/uncategorized/n-queens/__test__/nQueens.test.js b/src/algorithms/uncategorized/n-queens/__test__/nQueens.test.js new file mode 100644 index 000000000..1f01b3aab --- /dev/null +++ b/src/algorithms/uncategorized/n-queens/__test__/nQueens.test.js @@ -0,0 +1,38 @@ +import nQueens from '../nQueens'; + +describe('nQueens', () => { + it('should not hae solution for 3 queens', () => { + const solutions = nQueens(3); + expect(solutions.length).toBe(0); + }); + + it('should solve n-queens problem for 4 queens', () => { + const solutions = nQueens(4); + expect(solutions.length).toBe(2); + + // First solution. + expect(solutions[0][0].toString()).toBe('0,1'); + expect(solutions[0][1].toString()).toBe('1,3'); + expect(solutions[0][2].toString()).toBe('2,0'); + expect(solutions[0][3].toString()).toBe('3,2'); + + // Second solution (mirrored). + expect(solutions[1][0].toString()).toBe('0,2'); + expect(solutions[1][1].toString()).toBe('1,0'); + expect(solutions[1][2].toString()).toBe('2,3'); + expect(solutions[1][3].toString()).toBe('3,1'); + }); + + it('should solve n-queens problem for 6 queens', () => { + const solutions = nQueens(6); + expect(solutions.length).toBe(4); + + // First solution. + expect(solutions[0][0].toString()).toBe('0,1'); + expect(solutions[0][1].toString()).toBe('1,3'); + expect(solutions[0][2].toString()).toBe('2,5'); + expect(solutions[0][3].toString()).toBe('3,0'); + expect(solutions[0][4].toString()).toBe('4,2'); + expect(solutions[0][5].toString()).toBe('5,4'); + }); +}); diff --git a/src/algorithms/uncategorized/n-queens/nQueens.js b/src/algorithms/uncategorized/n-queens/nQueens.js new file mode 100644 index 000000000..f0e7eb096 --- /dev/null +++ b/src/algorithms/uncategorized/n-queens/nQueens.js @@ -0,0 +1,103 @@ +import QueenPosition from './QueenPosition'; + +/** + * @param {QueenPosition[]} queensPositions + * @param {number} rowIndex + * @param {number} columnIndex + * @return {boolean} + */ +function isSafe(queensPositions, rowIndex, columnIndex) { + // New position to which the Queen is going to be placed. + const newQueenPosition = new QueenPosition(rowIndex, columnIndex); + + // Check if new queen position conflicts with any other queens. + for (let queenIndex = 0; queenIndex < queensPositions.length; queenIndex += 1) { + const currentQueenPosition = queensPositions[queenIndex]; + + if ( + // Check if queen has been already placed. + currentQueenPosition && + ( + // Check if there are any queen on the same column. + newQueenPosition.columnIndex === currentQueenPosition.columnIndex || + // Check if there are any queen on the same row. + newQueenPosition.rowIndex === currentQueenPosition.rowIndex || + // Check if there are any queen on the same left diagonal. + newQueenPosition.leftDiagonal === currentQueenPosition.leftDiagonal || + // Check if there are any queen on the same right diagonal. + newQueenPosition.rightDiagonal === currentQueenPosition.rightDiagonal + ) + ) { + // Can't place queen into current position since there are other queens that + // are threatening it. + return false; + } + } + + // Looks like we're safe. + return true; +} + +/** + * @param {QueenPosition[][]} solutions + * @param {QueenPosition[]} previousQueensPositions + * @param {number} queensCount + * @param {number} rowIndex + * @return {boolean} + */ +function nQueensRecursive(solutions, previousQueensPositions, queensCount, rowIndex) { + // Clone positions array. + const queensPositions = [...previousQueensPositions].map((queenPosition) => { + return !queenPosition ? queenPosition : new QueenPosition( + queenPosition.rowIndex, + queenPosition.columnIndex, + ); + }); + + if (rowIndex === queensCount) { + // We've successfully reached the end of the board. + // Store solution to the list of solutions. + solutions.push(queensPositions); + + // Solution found. + return true; + } + + // Let's try to put queen at row rowIndex into its safe column position. + for (let columnIndex = 0; columnIndex < queensCount; columnIndex += 1) { + if (isSafe(queensPositions, rowIndex, columnIndex)) { + // Place current queen to its current position. + queensPositions[rowIndex] = new QueenPosition(rowIndex, columnIndex); + + // Try to place all other queens as well. + nQueensRecursive(solutions, queensPositions, queensCount, rowIndex + 1); + + // Remove the queen from the row to avoid isSafe() returning false. + queensPositions[rowIndex] = null; + } + } + + return false; +} + + +/** + * @param {number} queensCount + * @return {QueenPosition[][]} + */ +export default function nQueens(queensCount) { + // Init NxN chessboard with zeros. + // const chessboard = Array(queensCount).fill(null).map(() => Array(queensCount).fill(0)); + + // This array will hold positions or coordinates of each of + // N queens in form of [rowIndex, columnIndex]. + const queensPositions = Array(queensCount).fill(null); + + /** @var {QueenPosition[][]} solutions */ + const solutions = []; + + // Solve problem recursively. + nQueensRecursive(solutions, queensPositions, queensCount, 0); + + return solutions; +} From 35ad06c882eb6d8e47bc754bbd6493c23bb07c3f Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Wed, 16 May 2018 07:59:50 +0300 Subject: [PATCH 281/327] Add N-Queens. --- src/algorithms/uncategorized/n-queens/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/algorithms/uncategorized/n-queens/README.md b/src/algorithms/uncategorized/n-queens/README.md index 5c0d9c837..364277c6e 100644 --- a/src/algorithms/uncategorized/n-queens/README.md +++ b/src/algorithms/uncategorized/n-queens/README.md @@ -29,7 +29,7 @@ Generate all possible configurations of queens on board and print a configuration that satisfies the given constraints. ``` -while there are untried conflagrations +while there are untried configurations { generate the next configuration if queens don't attack in this configuration then From e8821ab2b9d1410882e161eaefa43853e9188084 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Wed, 16 May 2018 08:28:28 +0300 Subject: [PATCH 282/327] Update README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c7cc3ea25..16b0395ac 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,7 @@ * [Topological Sorting](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/topological-sorting) - DFS method * [Articulation Points](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/articulation-points) - Tarjan's algorithm (DFS based) * [Bridges](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/bridges) - DFS based algorithm - * [Eulerian Path and Eulerian Circuit](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/eulerian-path) - Fleury's algorithm + * [Eulerian Path and Eulerian Circuit](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/eulerian-path) - Fleury's algorithm - Visit every edge once * [Strongly Connected Components](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/strongly-connected-components) - Kosaraju's algorithm * **Uncategorized** * [Tower of Hanoi](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/uncategorized/hanoi-tower) From 96d718e364df2c4e81213269cd622a2f6157a40d Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Wed, 16 May 2018 09:21:16 +0300 Subject: [PATCH 283/327] Generate adjacency matrix for graph. --- src/data-structures/graph/Graph.js | 37 +++++++++ .../graph/__test__/Graph.test.js | 81 +++++++++++++++++++ 2 files changed, 118 insertions(+) diff --git a/src/data-structures/graph/Graph.js b/src/data-structures/graph/Graph.js index 4c53f8538..b3ee87306 100644 --- a/src/data-structures/graph/Graph.js +++ b/src/data-structures/graph/Graph.js @@ -158,6 +158,43 @@ export default class Graph { return this; } + /** + * @return {object} + */ + getVerticesIndices() { + const verticesIndices = {}; + this.getAllVertices().forEach((vertex, index) => { + verticesIndices[vertex.getKey()] = index; + }); + + return verticesIndices; + } + + /** + * @return {*[][]} + */ + getAdjacencyMatrix() { + const vertices = this.getAllVertices(); + const verticesIndices = this.getVerticesIndices(); + + // Init matrix with zeros. + const adjacencyMatrix = Array(vertices.length).fill(null).map(() => { + return Array(vertices.length).fill(0); + }); + + // Fill the columns. + vertices.forEach((vertex, vertexIndex) => { + vertex.getNeighbors().forEach((neighbor) => { + const neighborIndex = verticesIndices[neighbor.getKey()]; + adjacencyMatrix[vertexIndex][neighborIndex] = this.isDirected ? + this.findEdge(vertex, neighbor).weight : + 1; + }); + }); + + return adjacencyMatrix; + } + /** * @return {string} */ diff --git a/src/data-structures/graph/__test__/Graph.test.js b/src/data-structures/graph/__test__/Graph.test.js index 6ce000392..e89093b8b 100644 --- a/src/data-structures/graph/__test__/Graph.test.js +++ b/src/data-structures/graph/__test__/Graph.test.js @@ -300,4 +300,85 @@ describe('Graph', () => { expect(graph.getNeighbors(vertexD).length).toBe(1); expect(graph.getNeighbors(vertexD)[0].getKey()).toBe(vertexC.getKey()); }); + + it('should return vertices indices', () => { + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + const vertexC = new GraphVertex('C'); + const vertexD = new GraphVertex('D'); + + const edgeAB = new GraphEdge(vertexA, vertexB); + const edgeBC = new GraphEdge(vertexB, vertexC); + const edgeCD = new GraphEdge(vertexC, vertexD); + const edgeBD = new GraphEdge(vertexB, vertexD); + + const graph = new Graph(); + graph + .addEdge(edgeAB) + .addEdge(edgeBC) + .addEdge(edgeCD) + .addEdge(edgeBD); + + const verticesIndices = graph.getVerticesIndices(); + expect(verticesIndices).toEqual({ + A: 0, + B: 1, + C: 2, + D: 3, + }); + }); + + it('should generate adjacency matrix for undirected graph', () => { + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + const vertexC = new GraphVertex('C'); + const vertexD = new GraphVertex('D'); + + const edgeAB = new GraphEdge(vertexA, vertexB); + const edgeBC = new GraphEdge(vertexB, vertexC); + const edgeCD = new GraphEdge(vertexC, vertexD); + const edgeBD = new GraphEdge(vertexB, vertexD); + + const graph = new Graph(); + graph + .addEdge(edgeAB) + .addEdge(edgeBC) + .addEdge(edgeCD) + .addEdge(edgeBD); + + const adjacencyMatrix = graph.getAdjacencyMatrix(); + expect(adjacencyMatrix).toEqual([ + [0, 1, 0, 0], + [1, 0, 1, 1], + [0, 1, 0, 1], + [0, 1, 1, 0], + ]); + }); + + it('should generate adjacency matrix for directed graph', () => { + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + const vertexC = new GraphVertex('C'); + const vertexD = new GraphVertex('D'); + + const edgeAB = new GraphEdge(vertexA, vertexB, 2); + const edgeBC = new GraphEdge(vertexB, vertexC, 1); + const edgeCD = new GraphEdge(vertexC, vertexD, 5); + const edgeBD = new GraphEdge(vertexB, vertexD, 7); + + const graph = new Graph(true); + graph + .addEdge(edgeAB) + .addEdge(edgeBC) + .addEdge(edgeCD) + .addEdge(edgeBD); + + const adjacencyMatrix = graph.getAdjacencyMatrix(); + expect(adjacencyMatrix).toEqual([ + [0, 2, 0, 0], + [0, 0, 1, 7], + [0, 0, 0, 5], + [0, 0, 0, 0], + ]); + }); }); From c712231eb878d91c2d53a3eb24c902c182b3a679 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 17 May 2018 07:40:13 +0300 Subject: [PATCH 284/327] Add Hamiltonian cycle. --- README.md | 4 +- .../graph/hamiltonian-cycle/README.md | 48 +++++++ .../__test__/hamiltonianCycle.test.js | 90 ++++++++++++ .../hamiltonian-cycle/hamiltonianCycle.js | 133 ++++++++++++++++++ 4 files changed, 274 insertions(+), 1 deletion(-) create mode 100644 src/algorithms/graph/hamiltonian-cycle/README.md create mode 100644 src/algorithms/graph/hamiltonian-cycle/__test__/hamiltonianCycle.test.js create mode 100644 src/algorithms/graph/hamiltonian-cycle/hamiltonianCycle.js diff --git a/README.md b/README.md index 16b0395ac..30f808e34 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,8 @@ * [Topological Sorting](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/topological-sorting) - DFS method * [Articulation Points](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/articulation-points) - Tarjan's algorithm (DFS based) * [Bridges](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/bridges) - DFS based algorithm - * [Eulerian Path and Eulerian Circuit](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/eulerian-path) - Fleury's algorithm - Visit every edge once + * [Eulerian Path and Eulerian Circuit](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/eulerian-path) - Fleury's algorithm - Visit every edge exactly once + * [Hamiltonian Cycle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/hamiltonian-cycle) - Visit every vertex exactly once * [Strongly Connected Components](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/strongly-connected-components) - Kosaraju's algorithm * **Uncategorized** * [Tower of Hanoi](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/uncategorized/hanoi-tower) @@ -111,6 +112,7 @@ * [Maximum Subarray](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/maximum-subarray) * [Bellman-Ford Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/bellman-ford) - finding shortest path to all graph vertices * **Backtracking** + * [Hamiltonian Cycle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/hamiltonian-cycle) - Visit every vertex exactly once * [N-Queens Problem](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/uncategorized/n-queens) * **Branch & Bound** diff --git a/src/algorithms/graph/hamiltonian-cycle/README.md b/src/algorithms/graph/hamiltonian-cycle/README.md new file mode 100644 index 000000000..74d8ed15c --- /dev/null +++ b/src/algorithms/graph/hamiltonian-cycle/README.md @@ -0,0 +1,48 @@ +# Hamiltonian Path + +**Hamiltonian path** (or **traceable path**) is a path in an +undirected or directed graph that visits each vertex exactly once. +A **Hamiltonian cycle** (or **Hamiltonian circuit**) is a +Hamiltonian path that is a cycle. Determining whether such paths +and cycles exist in graphs is the **Hamiltonian path problem**. + +![Hamiltonian cycle](https://upload.wikimedia.org/wikipedia/commons/6/6c/Hamiltonian_path_3d.svg) + +One possible Hamiltonian cycle through every vertex of a +dodecahedron is shown in red – like all platonic solids, the +dodecahedron is Hamiltonian. + +## Naive Algorithm + +Generate all possible configurations of vertices and print a +configuration that satisfies the given constraints. There +will be `n!` (n factorial) configurations. + +``` +while there are untried configurations +{ + generate the next configuration + if ( there are edges between two consecutive vertices of this + configuration and there is an edge from the last vertex to + the first ). + { + print this configuration; + break; + } +} +``` + +## Backtracking Algorithm + +Create an empty path array and add vertex `0` to it. Add other +vertices, starting from the vertex `1`. Before adding a vertex, +check for whether it is adjacent to the previously added vertex +and not already added. If we find such a vertex, we add the +vertex as part of the solution. If we do not find a vertex +then we return false. + +## References + +- [Hamiltonian path on Wikipedia](https://en.wikipedia.org/wiki/Hamiltonian_path) +- [Hamiltonian path on YouTube](https://www.youtube.com/watch?v=dQr4wZCiJJ4) +- [Hamiltonian cycle on GeeksForGeeks](https://www.geeksforgeeks.org/backtracking-set-7-hamiltonian-cycle/) diff --git a/src/algorithms/graph/hamiltonian-cycle/__test__/hamiltonianCycle.test.js b/src/algorithms/graph/hamiltonian-cycle/__test__/hamiltonianCycle.test.js new file mode 100644 index 000000000..eab0d333d --- /dev/null +++ b/src/algorithms/graph/hamiltonian-cycle/__test__/hamiltonianCycle.test.js @@ -0,0 +1,90 @@ +import GraphVertex from '../../../../data-structures/graph/GraphVertex'; +import GraphEdge from '../../../../data-structures/graph/GraphEdge'; +import Graph from '../../../../data-structures/graph/Graph'; +import hamiltonianCycle from '../hamiltonianCycle'; + +describe('hamiltonianCycle', () => { + it('should find hamiltonian paths in graph', () => { + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + const vertexC = new GraphVertex('C'); + const vertexD = new GraphVertex('D'); + const vertexE = new GraphVertex('E'); + + const edgeAB = new GraphEdge(vertexA, vertexB); + const edgeAE = new GraphEdge(vertexA, vertexE); + const edgeAC = new GraphEdge(vertexA, vertexC); + const edgeBE = new GraphEdge(vertexB, vertexE); + const edgeBC = new GraphEdge(vertexB, vertexC); + const edgeBD = new GraphEdge(vertexB, vertexD); + const edgeCD = new GraphEdge(vertexC, vertexD); + const edgeDE = new GraphEdge(vertexD, vertexE); + + const graph = new Graph(); + graph + .addEdge(edgeAB) + .addEdge(edgeAE) + .addEdge(edgeAC) + .addEdge(edgeBE) + .addEdge(edgeBC) + .addEdge(edgeBD) + .addEdge(edgeCD) + .addEdge(edgeDE); + + const hamiltonianCycleSet = hamiltonianCycle(graph); + + expect(hamiltonianCycleSet.length).toBe(8); + + expect(hamiltonianCycleSet[0][0].getKey()).toBe(vertexA.getKey()); + expect(hamiltonianCycleSet[0][1].getKey()).toBe(vertexB.getKey()); + expect(hamiltonianCycleSet[0][2].getKey()).toBe(vertexE.getKey()); + expect(hamiltonianCycleSet[0][3].getKey()).toBe(vertexD.getKey()); + expect(hamiltonianCycleSet[0][4].getKey()).toBe(vertexC.getKey()); + + expect(hamiltonianCycleSet[1][0].getKey()).toBe(vertexA.getKey()); + expect(hamiltonianCycleSet[1][1].getKey()).toBe(vertexB.getKey()); + expect(hamiltonianCycleSet[1][2].getKey()).toBe(vertexC.getKey()); + expect(hamiltonianCycleSet[1][3].getKey()).toBe(vertexD.getKey()); + expect(hamiltonianCycleSet[1][4].getKey()).toBe(vertexE.getKey()); + + expect(hamiltonianCycleSet[2][0].getKey()).toBe(vertexA.getKey()); + expect(hamiltonianCycleSet[2][1].getKey()).toBe(vertexE.getKey()); + expect(hamiltonianCycleSet[2][2].getKey()).toBe(vertexB.getKey()); + expect(hamiltonianCycleSet[2][3].getKey()).toBe(vertexD.getKey()); + expect(hamiltonianCycleSet[2][4].getKey()).toBe(vertexC.getKey()); + + expect(hamiltonianCycleSet[3][0].getKey()).toBe(vertexA.getKey()); + expect(hamiltonianCycleSet[3][1].getKey()).toBe(vertexE.getKey()); + expect(hamiltonianCycleSet[3][2].getKey()).toBe(vertexD.getKey()); + expect(hamiltonianCycleSet[3][3].getKey()).toBe(vertexB.getKey()); + expect(hamiltonianCycleSet[3][4].getKey()).toBe(vertexC.getKey()); + }); + + it('should return false for graph without Hamiltonian path', () => { + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + const vertexC = new GraphVertex('C'); + const vertexD = new GraphVertex('D'); + const vertexE = new GraphVertex('E'); + + const edgeAB = new GraphEdge(vertexA, vertexB); + const edgeAE = new GraphEdge(vertexA, vertexE); + const edgeBE = new GraphEdge(vertexB, vertexE); + const edgeBC = new GraphEdge(vertexB, vertexC); + const edgeBD = new GraphEdge(vertexB, vertexD); + const edgeCD = new GraphEdge(vertexC, vertexD); + + const graph = new Graph(); + graph + .addEdge(edgeAB) + .addEdge(edgeAE) + .addEdge(edgeBE) + .addEdge(edgeBC) + .addEdge(edgeBD) + .addEdge(edgeCD); + + const hamiltonianCycleSet = hamiltonianCycle(graph); + + expect(hamiltonianCycleSet.length).toBe(0); + }); +}); diff --git a/src/algorithms/graph/hamiltonian-cycle/hamiltonianCycle.js b/src/algorithms/graph/hamiltonian-cycle/hamiltonianCycle.js new file mode 100644 index 000000000..9f73a564c --- /dev/null +++ b/src/algorithms/graph/hamiltonian-cycle/hamiltonianCycle.js @@ -0,0 +1,133 @@ +import GraphVertex from '../../../data-structures/graph/GraphVertex'; + +/** + * @param {number[][]} adjacencyMatrix + * @param {object} verticesIndices + * @param {GraphVertex[]} cycle + * @param {GraphVertex} vertexCandidate + * @return {boolean} + */ +function isSafe(adjacencyMatrix, verticesIndices, cycle, vertexCandidate) { + const endVertex = cycle[cycle.length - 1]; + + // Get end and candidate vertices indices in adjacency matrix. + const candidateVertexAdjacencyIndex = verticesIndices[vertexCandidate.getKey()]; + const endVertexAdjacencyIndex = verticesIndices[endVertex.getKey()]; + + // Check if last vertex in the path and candidate vertex are adjacent. + if (!adjacencyMatrix[endVertexAdjacencyIndex][candidateVertexAdjacencyIndex]) { + return false; + } + + // Check if vertexCandidate is being added to the path for the first time. + const candidateDuplicate = cycle.find(vertex => vertex.getKey() === vertexCandidate.getKey()); + + return !candidateDuplicate; +} + +/** + * @param {number[][]} adjacencyMatrix + * @param {object} verticesIndices + * @param {GraphVertex[]} cycle + * @return {boolean} + */ +function isCycle(adjacencyMatrix, verticesIndices, cycle) { + // Check if first and last vertices in hamiltonian path are adjacent. + + // Get start and end vertices from the path. + const startVertex = cycle[0]; + const endVertex = cycle[cycle.length - 1]; + + // Get start/end vertices indices in adjacency matrix. + const startVertexAdjacencyIndex = verticesIndices[startVertex.getKey()]; + const endVertexAdjacencyIndex = verticesIndices[endVertex.getKey()]; + + // Check if we can go from end vertex to the start one. + return !!adjacencyMatrix[endVertexAdjacencyIndex][startVertexAdjacencyIndex]; +} + +/** + * @param {number[][]} adjacencyMatrix + * @param {GraphVertex[]} vertices + * @param {object} verticesIndices + * @param {GraphVertex[][]} cycles + * @param {GraphVertex[]} cycle + */ +function hamiltonianCycleRecursive({ + adjacencyMatrix, + vertices, + verticesIndices, + cycles, + cycle, +}) { + // Clone cycle in order to prevent it from modification by other DFS branches. + const currentCycle = [...cycle].map(vertex => new GraphVertex(vertex.value)); + + if (vertices.length === currentCycle.length) { + // Hamiltonian path is found. + // Now we need to check if it is cycle or not. + if (isCycle(adjacencyMatrix, verticesIndices, currentCycle)) { + // Another solution has been found. Save it. + cycles.push(currentCycle); + } + return; + } + + for (let vertexIndex = 0; vertexIndex < vertices.length; vertexIndex += 1) { + // Get vertex candidate that we will try to put into next path step and see if it fits. + const vertexCandidate = vertices[vertexIndex]; + + // Check if it is safe to put vertex candidate to cycle. + if (isSafe(adjacencyMatrix, verticesIndices, currentCycle, vertexCandidate)) { + // Add candidate vertex to cycle path. + currentCycle.push(vertexCandidate); + + // Try to find other vertices in cycle. + hamiltonianCycleRecursive({ + adjacencyMatrix, + vertices, + verticesIndices, + cycles, + cycle: currentCycle, + }); + + // Remove candidate vertex from cycle path in order to try another one. + currentCycle.pop(); + } + } +} + +/** + * @param {Graph} graph + * @return {GraphVertex[][]} + */ +export default function hamiltonianCycle(graph) { + // Gather some information about the graph that we will need to during + // the problem solving. + const verticesIndices = graph.getVerticesIndices(); + const adjacencyMatrix = graph.getAdjacencyMatrix(); + const vertices = graph.getAllVertices(); + + // Define start vertex. We will always pick the first one + // this it doesn't matter which vertex to pick in a cycle. + // Every vertex is in a cycle so we can start from any of them. + const startVertex = vertices[0]; + + // Init cycles array that will hold all solutions. + const cycles = []; + + // Init cycle array that will hold current cycle path. + const cycle = [startVertex]; + + // Try to find cycles recursively in Depth First Search order. + hamiltonianCycleRecursive({ + adjacencyMatrix, + vertices, + verticesIndices, + cycles, + cycle, + }); + + // Return found cycles. + return cycles; +} From b1362e2ab690150fd11abbd27036297ec690e7df Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 17 May 2018 08:08:29 +0300 Subject: [PATCH 285/327] Add Hamiltonian cycle. --- src/algorithms/graph/hamiltonian-cycle/hamiltonianCycle.js | 1 + src/algorithms/uncategorized/n-queens/nQueens.js | 1 + 2 files changed, 2 insertions(+) diff --git a/src/algorithms/graph/hamiltonian-cycle/hamiltonianCycle.js b/src/algorithms/graph/hamiltonian-cycle/hamiltonianCycle.js index 9f73a564c..845626157 100644 --- a/src/algorithms/graph/hamiltonian-cycle/hamiltonianCycle.js +++ b/src/algorithms/graph/hamiltonian-cycle/hamiltonianCycle.js @@ -91,6 +91,7 @@ function hamiltonianCycleRecursive({ cycle: currentCycle, }); + // BACKTRACKING. // Remove candidate vertex from cycle path in order to try another one. currentCycle.pop(); } diff --git a/src/algorithms/uncategorized/n-queens/nQueens.js b/src/algorithms/uncategorized/n-queens/nQueens.js index f0e7eb096..d96748d43 100644 --- a/src/algorithms/uncategorized/n-queens/nQueens.js +++ b/src/algorithms/uncategorized/n-queens/nQueens.js @@ -72,6 +72,7 @@ function nQueensRecursive(solutions, previousQueensPositions, queensCount, rowIn // Try to place all other queens as well. nQueensRecursive(solutions, queensPositions, queensCount, rowIndex + 1); + // BACKTRACKING. // Remove the queen from the row to avoid isSafe() returning false. queensPositions[rowIndex] = null; } From 88cdea3e0bee5956aea671bab42cd7fc2ec404c8 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 17 May 2018 17:48:06 +0300 Subject: [PATCH 286/327] Add Knight's tour. --- README.md | 2 + .../uncategorized/knight-tour/README.md | 33 ++++++ .../knight-tour/__test__/knightTour.test.js | 43 +++++++ .../uncategorized/knight-tour/knightTour.js | 112 ++++++++++++++++++ 4 files changed, 190 insertions(+) create mode 100644 src/algorithms/uncategorized/knight-tour/README.md create mode 100644 src/algorithms/uncategorized/knight-tour/__test__/knightTour.test.js create mode 100644 src/algorithms/uncategorized/knight-tour/knightTour.js diff --git a/README.md b/README.md index 30f808e34..620c98ddc 100644 --- a/README.md +++ b/README.md @@ -80,6 +80,7 @@ * **Uncategorized** * [Tower of Hanoi](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/uncategorized/hanoi-tower) * [N-Queens Problem](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/uncategorized/n-queens) + * [Knight's Tour](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/uncategorized/knight-tour) * Union-Find * Maze * Sudoku @@ -114,6 +115,7 @@ * **Backtracking** * [Hamiltonian Cycle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/hamiltonian-cycle) - Visit every vertex exactly once * [N-Queens Problem](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/uncategorized/n-queens) + * [Knight's Tour](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/uncategorized/knight-tour) * **Branch & Bound** ## How to use this repository diff --git a/src/algorithms/uncategorized/knight-tour/README.md b/src/algorithms/uncategorized/knight-tour/README.md new file mode 100644 index 000000000..6696b307f --- /dev/null +++ b/src/algorithms/uncategorized/knight-tour/README.md @@ -0,0 +1,33 @@ +# Knight's Tour + +A **knight's tour** is a sequence of moves of a knight on a chessboard +such that the knight visits every square only once. If the knight +ends on a square that is one knight's move from the beginning +square (so that it could tour the board again immediately, +following the same path), the tour is **closed**, otherwise it +is **open**. + +The **knight's tour problem** is the mathematical problem of +finding a knight's tour. Creating a program to find a knight's +tour is a common problem given to computer science students. +Variations of the knight's tour problem involve chessboards of +different sizes than the usual `8×8`, as well as irregular +(non-rectangular) boards. + +The knight's tour problem is an instance of the more +general **Hamiltonian path problem** in graph theory. The problem of finding +a closed knight's tour is similarly an instance of the Hamiltonian +cycle problem. + +![Knight's Tour](https://upload.wikimedia.org/wikipedia/commons/d/da/Knight%27s_tour_anim_2.gif) + +An open knight's tour of a chessboard. + +![Knight's Tour](https://upload.wikimedia.org/wikipedia/commons/c/ca/Knights-Tour-Animation.gif) + +An animation of an open knight's tour on a 5 by 5 board. + +## References + +- [Wikipedia](https://en.wikipedia.org/wiki/Knight%27s_tour) +- [GeeksForGeeks](https://www.geeksforgeeks.org/backtracking-set-1-the-knights-tour-problem/) diff --git a/src/algorithms/uncategorized/knight-tour/__test__/knightTour.test.js b/src/algorithms/uncategorized/knight-tour/__test__/knightTour.test.js new file mode 100644 index 000000000..bc3ee0a11 --- /dev/null +++ b/src/algorithms/uncategorized/knight-tour/__test__/knightTour.test.js @@ -0,0 +1,43 @@ +import knightTour from '../knightTour'; + +describe('knightTour', () => { + it('should not find solution on 3x3 board', () => { + const moves = knightTour(3); + + expect(moves.length).toBe(0); + }); + + it('should find one solution to do knight tour on 5x5 board', () => { + const moves = knightTour(5); + + expect(moves.length).toBe(25); + + expect(moves).toEqual([ + [0, 0], + [1, 2], + [2, 0], + [0, 1], + [1, 3], + [3, 4], + [2, 2], + [4, 1], + [3, 3], + [1, 4], + [0, 2], + [1, 0], + [3, 1], + [4, 3], + [2, 4], + [0, 3], + [1, 1], + [3, 0], + [4, 2], + [2, 1], + [4, 0], + [3, 2], + [4, 4], + [2, 3], + [0, 4], + ]); + }); +}); diff --git a/src/algorithms/uncategorized/knight-tour/knightTour.js b/src/algorithms/uncategorized/knight-tour/knightTour.js new file mode 100644 index 000000000..d72791583 --- /dev/null +++ b/src/algorithms/uncategorized/knight-tour/knightTour.js @@ -0,0 +1,112 @@ +/** + * @param {number[][]} chessboard + * @param {number[]} position + * @return {number[][]} + */ +function getPossibleMoves(chessboard, position) { + // Generate all knight moves (event those that goes beyond the board). + const possibleMoves = [ + [position[0] - 1, position[1] - 2], + [position[0] - 2, position[1] - 1], + [position[0] + 1, position[1] - 2], + [position[0] + 2, position[1] - 1], + [position[0] - 2, position[1] + 1], + [position[0] - 1, position[1] + 2], + [position[0] + 1, position[1] + 2], + [position[0] + 2, position[1] + 1], + ]; + + // Filter out all moves that go beyond the board. + return possibleMoves.filter((move) => { + const boardSize = chessboard.length; + return move[0] >= 0 && move[1] >= 0 && move[0] < boardSize && move[1] < boardSize; + }); +} + +/** + * @param {number[][]} chessboard + * @param {number[]} move + * @return {boolean} + */ +function isMoveAllowed(chessboard, move) { + return chessboard[move[0]][move[1]] !== 1; +} + +/** + * @param {number[][]} chessboard + * @param {number[][]} moves + * @return {boolean} + */ +function isBoardCompletelyVisited(chessboard, moves) { + const totalPossibleMovesCount = chessboard.length ** 2; + const existingMovesCount = moves.length; + + return totalPossibleMovesCount === existingMovesCount; +} + +/** + * @param {number[][]} chessboard + * @param {number[][]} moves + * @return {boolean} + */ +function knightTourRecursive(chessboard, moves) { + const currentChessboard = chessboard; + + // If board has been completely visited then we've found a solution. + if (isBoardCompletelyVisited(currentChessboard, moves)) { + return true; + } + + // Get next possible knight moves. + const lastMove = moves[moves.length - 1]; + const possibleMoves = getPossibleMoves(currentChessboard, lastMove); + + // Try to do next possible moves. + for (let moveIndex = 0; moveIndex < possibleMoves.length; moveIndex += 1) { + const currentMove = possibleMoves[moveIndex]; + + // Check if current move is allowed. We aren't allowed to go to + // the same cells twice. + if (isMoveAllowed(currentChessboard, currentMove)) { + // Actually do the move. + moves.push(currentMove); + currentChessboard[currentMove[0]][currentMove[1]] = 1; + + // If further moves starting from current are successful then + // return true meaning the solution is found. + if (knightTourRecursive(currentChessboard, moves)) { + return true; + } + + // BACKTRACKING. + // If current move was unsuccessful then step back and try to do another move. + moves.pop(); + currentChessboard[currentMove[0]][currentMove[1]] = 0; + } + } + + // Return false if we haven't found solution. + return false; +} + +/** + * @param {number} chessboardSize + * @return {number[][]} + */ +export default function knightTour(chessboardSize) { + // Init chessboard. + const chessboard = Array(chessboardSize).fill(null).map(() => Array(chessboardSize).fill(0)); + + // Init moves array. + const moves = []; + + // Do first move and place the knight to the 0x0 cell. + const firstMove = [0, 0]; + moves.push(firstMove); + chessboard[firstMove[0]][firstMove[0]] = 1; + + // Recursively try to do the next move. + const solutionWasFound = knightTourRecursive(chessboard, moves); + + return solutionWasFound ? moves : []; +} From 5b76ab92a1b075d7abbc1c1f9c2e4a8f65a34ca9 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 17 May 2018 17:52:48 +0300 Subject: [PATCH 287/327] Update README. --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 620c98ddc..721132d1f 100644 --- a/README.md +++ b/README.md @@ -82,7 +82,6 @@ * [N-Queens Problem](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/uncategorized/n-queens) * [Knight's Tour](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/uncategorized/knight-tour) * Union-Find - * Maze * Sudoku ### Algorithms by Paradigm From 46bdedeafebbdcef3ac119e7a74bc86844fa467b Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 17 May 2018 17:55:52 +0300 Subject: [PATCH 288/327] Update README. --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 721132d1f..823f3ffe9 100644 --- a/README.md +++ b/README.md @@ -81,8 +81,6 @@ * [Tower of Hanoi](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/uncategorized/hanoi-tower) * [N-Queens Problem](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/uncategorized/n-queens) * [Knight's Tour](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/uncategorized/knight-tour) - * Union-Find - * Sudoku ### Algorithms by Paradigm From eb2f177bc1e1f2e6810b08a36fb87db6752d1ab2 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 17 May 2018 21:57:04 +0300 Subject: [PATCH 289/327] Update README. --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 823f3ffe9..5699a9c6e 100644 --- a/README.md +++ b/README.md @@ -13,12 +13,12 @@ 6. [Priority Queue](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/priority-queue) 7. [Trie](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/trie) 8. [Tree](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/tree) - * [Binary Search Tree](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/tree/binary-search-tree) - * [AVL Tree](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/tree/avl-tree) - * Red-Black Tree - * Suffix Tree - * Segment Tree or Interval Tree - * Binary Indexed Tree or Fenwick Tree + 8.1. [Binary Search Tree](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/tree/binary-search-tree) + 8.2. [AVL Tree](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/tree/avl-tree) + 8.3. Red-Black Tree + 8.4. Suffix Tree + 8.5. Segment Tree or Interval Tree + 8.6. Binary Indexed Tree or Fenwick Tree 9. [Graph](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/graph) (both directed and undirected) 9. [Disjoint Set](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/disjoint-set) @@ -26,7 +26,7 @@ ### Algorithms by Topic -* **Math** +1. **Math** * [Factorial](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/factorial) * [Fibonacci Number](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/fibonacci) * [Primality Test](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/primality-test) (trial division method) From d232090e370101667a7bece0063f9fcf2fbb8b2d Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 17 May 2018 22:01:17 +0300 Subject: [PATCH 290/327] Update README. --- README.md | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 5699a9c6e..87dbd6f4e 100644 --- a/README.md +++ b/README.md @@ -5,28 +5,28 @@ ## Data Structures -1. [Linked List](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/linked-list) -2. [Queue](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/queue) -3. [Stack](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/stack) -4. [Hash Table](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/hash-table) -5. [Heap](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/heap) -6. [Priority Queue](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/priority-queue) -7. [Trie](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/trie) -8. [Tree](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/tree) - 8.1. [Binary Search Tree](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/tree/binary-search-tree) - 8.2. [AVL Tree](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/tree/avl-tree) - 8.3. Red-Black Tree - 8.4. Suffix Tree - 8.5. Segment Tree or Interval Tree - 8.6. Binary Indexed Tree or Fenwick Tree -9. [Graph](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/graph) (both directed and undirected) -9. [Disjoint Set](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/disjoint-set) +* [Linked List](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/linked-list) +* [Queue](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/queue) +* [Stack](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/stack) +* [Hash Table](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/hash-table) +* [Heap](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/heap) +* [Priority Queue](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/priority-queue) +* [Trie](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/trie) +* [Tree](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/tree) + * [Binary Search Tree](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/tree/binary-search-tree) + * [AVL Tree](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/tree/avl-tree) + * Red-Black Tree + * Suffix Tree + * Segment Tree or Interval Tree + * Binary Indexed Tree or Fenwick Tree +* [Graph](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/graph) (both directed and undirected) +* [Disjoint Set](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/disjoint-set) ## Algorithms ### Algorithms by Topic -1. **Math** +* **Math** * [Factorial](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/factorial) * [Fibonacci Number](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/fibonacci) * [Primality Test](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/primality-test) (trial division method) From 9ff99002680544f8e975fc65c0f640e50ae4726d Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 17 May 2018 22:03:10 +0300 Subject: [PATCH 291/327] Update README. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 87dbd6f4e..baece8a21 100644 --- a/README.md +++ b/README.md @@ -119,7 +119,7 @@ **Install all dependencies** ``` -npm i +npm install ``` **Run all tests** From 239b3d6a7d4f674e81b4630be7d5baed132a1638 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 17 May 2018 22:10:39 +0300 Subject: [PATCH 292/327] Update README. --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index baece8a21..057482365 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,13 @@ [![Build Status](https://travis-ci.org/trekhleb/javascript-algorithms.svg?branch=master)](https://travis-ci.org/trekhleb/javascript-algorithms) [![codecov](https://codecov.io/gh/trekhleb/javascript-algorithms/branch/master/graph/badge.svg)](https://codecov.io/gh/trekhleb/javascript-algorithms) +This repository contains JavaScript based examples of many +popular algorithms and data structures. + +Each algorithm and data structure have its own separate READMEs +with related explanations and link for further reading and YouTube +videos. + ## Data Structures * [Linked List](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/linked-list) From ed84a50f3a5b52ae2ee5b26cdb06d5cb8a967efe Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 17 May 2018 22:11:13 +0300 Subject: [PATCH 293/327] Update README. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 057482365..411ef79ca 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ This repository contains JavaScript based examples of many popular algorithms and data structures. -Each algorithm and data structure have its own separate READMEs +Each algorithm and data structure have its own separate README with related explanations and link for further reading and YouTube videos. From e3ac4ce80f8907fd3617af10287f419eae3c4692 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 17 May 2018 22:12:08 +0300 Subject: [PATCH 294/327] Update README. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 411ef79ca..d7e5c2251 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ This repository contains JavaScript based examples of many popular algorithms and data structures. Each algorithm and data structure have its own separate README -with related explanations and link for further reading and YouTube +with related explanations and links for further reading and YouTube videos. ## Data Structures From 309a0402df43fcd893f59929fdf50d971f483513 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Fri, 18 May 2018 06:22:37 +0300 Subject: [PATCH 295/327] Update README. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d7e5c2251..e462e3200 100644 --- a/README.md +++ b/README.md @@ -139,7 +139,7 @@ npm test npm test -- -t 'LinkedList' ``` -## Playground +**Playground** You may play with data-structures and algorithms in `./src/playground/playground.js` file and write tests for it in `./src/playground/__test__/playground.test.js`. From 34a2959ca77d58c5959768f96382e9260858ddb9 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Sat, 19 May 2018 10:24:32 +0300 Subject: [PATCH 296/327] Update README. --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index e462e3200..eff9a6060 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,11 @@ videos. ## Data Structures +Data structure is a particular way of organizing and storing data in a computer so that it can +be accessed and modified efficiently. More precisely, a data structure is a collection of data +values, the relationships among them, and the functions or operations that can be applied to +the data. + * [Linked List](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/linked-list) * [Queue](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/queue) * [Stack](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/stack) From 70448b6d3a44242aedcdc220372daf561430ff0c Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Sat, 19 May 2018 10:34:22 +0300 Subject: [PATCH 297/327] Update README. --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index eff9a6060..978a85810 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,9 @@ the data. ## Algorithms +Algorithm is an unambiguous specification of how to solve a class of problems. Algorithm is +a set of rules that precisely defines a sequence of operations. + ### Algorithms by Topic * **Math** From 1b13b4525d85235d920484528bcac9118cba31a2 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Sat, 19 May 2018 22:50:46 +0300 Subject: [PATCH 298/327] Update README. --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 978a85810..86cf7444b 100644 --- a/README.md +++ b/README.md @@ -99,6 +99,10 @@ a set of rules that precisely defines a sequence of operations. ### Algorithms by Paradigm +An algorithmic paradigm is a generic method or approach which underlies the design of a class +of algorithms. It is an abstraction higher than the notion of an algorithm, just as an +algorithm is an abstraction higher than a computer program. + * **Greedy** * [Unbound Knapsack Problem](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/knapsack-problem) * [Dijkstra Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/dijkstra) - finding shortest path to all graph vertices From 85155e53628ed15ce38c64c0fd7de479c746af7d Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Sat, 19 May 2018 23:05:20 +0300 Subject: [PATCH 299/327] Update README. --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 86cf7444b..d4ca7a4cc 100644 --- a/README.md +++ b/README.md @@ -103,12 +103,14 @@ An algorithmic paradigm is a generic method or approach which underlies the desi of algorithms. It is an abstraction higher than the notion of an algorithm, just as an algorithm is an abstraction higher than a computer program. -* **Greedy** +* **Brute Force** - look at all the possibilities and selects the best solution +* **Greedy** - choose the best option at the current time, without any consideration for the future * [Unbound Knapsack Problem](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/knapsack-problem) * [Dijkstra Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/dijkstra) - finding shortest path to all graph vertices * [Prim’s Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/prim) - finding Minimum Spanning Tree (MST) for weighted undirected graph * [Kruskal’s Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/kruskal) - finding Minimum Spanning Tree (MST) for weighted undirected graph -* **Divide and Conquer** +* **Divide and Conquer** - divide the problem into smaller parts and then solve those parts + * [Binary Search](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/search/binary-search) * [Tower of Hanoi](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/uncategorized/hanoi-tower) * [Euclidean Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/euclidean-algorithm) - calculate the Greatest Common Divisor (GCD) * [Permutations](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/permutations) (with and without repetitions) @@ -117,7 +119,7 @@ algorithm is an abstraction higher than a computer program. * [Quicksort](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sorting/quick-sort) * [Tree Depth-First Search](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/tree/depth-first-search) (DFS) * [Graph Depth-First Search](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/depth-first-search) (DFS) -* **Dynamic Programming** +* **Dynamic Programming** - build up to a solution using previously found sub-solutions * [Fibonacci Number](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/fibonacci) * [Levenshtein Distance](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/levenshtein-distance) - minimum edit distance between two sequences * [Longest Common Subsequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/longest-common-subsequnce) (LCS) From 6c88870a42dabbc937800ce981096e701818629b Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Sat, 19 May 2018 23:12:30 +0300 Subject: [PATCH 300/327] Update README. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d4ca7a4cc..fecf14b37 100644 --- a/README.md +++ b/README.md @@ -130,7 +130,7 @@ algorithm is an abstraction higher than a computer program. * [Integer Partition](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/integer-partition) * [Maximum Subarray](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/maximum-subarray) * [Bellman-Ford Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/bellman-ford) - finding shortest path to all graph vertices -* **Backtracking** +* **Backtracking** - similarly to brute force try to generate all possible solutions but each time you generate a solution test if it satisfies all conditions, and only then continue generating subsequent solutions. Otherwise backtrack and go on a different path of finding solution. * [Hamiltonian Cycle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/hamiltonian-cycle) - Visit every vertex exactly once * [N-Queens Problem](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/uncategorized/n-queens) * [Knight's Tour](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/uncategorized/knight-tour) From a7d197ee08d96fe00700560514ec36e056bd6f04 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Sat, 19 May 2018 23:15:25 +0300 Subject: [PATCH 301/327] Update README. --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index fecf14b37..8f4ae7670 100644 --- a/README.md +++ b/README.md @@ -130,7 +130,9 @@ algorithm is an abstraction higher than a computer program. * [Integer Partition](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/integer-partition) * [Maximum Subarray](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/maximum-subarray) * [Bellman-Ford Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/bellman-ford) - finding shortest path to all graph vertices -* **Backtracking** - similarly to brute force try to generate all possible solutions but each time you generate a solution test if it satisfies all conditions, and only then continue generating subsequent solutions. Otherwise backtrack and go on a different path of finding solution. +* **Backtracking** - similarly to brute force try to generate all possible solutions but each time you generate a solution test +if it satisfies all conditions, and only then continue generating subsequent solutions. Otherwise backtrack and go on a +different path of finding solution * [Hamiltonian Cycle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/hamiltonian-cycle) - Visit every vertex exactly once * [N-Queens Problem](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/uncategorized/n-queens) * [Knight's Tour](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/uncategorized/knight-tour) From 50624c7abb1aedc09a9587a8a15e157432bc7fc2 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Sat, 19 May 2018 23:20:20 +0300 Subject: [PATCH 302/327] Update README. --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 8f4ae7670..4f5f9242b 100644 --- a/README.md +++ b/README.md @@ -104,6 +104,7 @@ of algorithms. It is an abstraction higher than the notion of an algorithm, just algorithm is an abstraction higher than a computer program. * **Brute Force** - look at all the possibilities and selects the best solution + * [Maximum Subarray](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/maximum-subarray) * **Greedy** - choose the best option at the current time, without any consideration for the future * [Unbound Knapsack Problem](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/knapsack-problem) * [Dijkstra Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/dijkstra) - finding shortest path to all graph vertices From e61199d833f58c3fae2219eb84fdda7bf6320921 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Mon, 21 May 2018 08:58:22 +0300 Subject: [PATCH 303/327] Add travelling salesman problem. --- README.md | 2 + .../graph/travelling-salesman/README.md | 26 +++++ .../__test__/bfTravellingSalesman.test.js | 51 +++++++++ .../bfTravellingSalesman.js | 104 ++++++++++++++++++ 4 files changed, 183 insertions(+) create mode 100644 src/algorithms/graph/travelling-salesman/README.md create mode 100644 src/algorithms/graph/travelling-salesman/__test__/bfTravellingSalesman.test.js create mode 100644 src/algorithms/graph/travelling-salesman/bfTravellingSalesman.js diff --git a/README.md b/README.md index 4f5f9242b..aedb04715 100644 --- a/README.md +++ b/README.md @@ -92,6 +92,7 @@ a set of rules that precisely defines a sequence of operations. * [Eulerian Path and Eulerian Circuit](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/eulerian-path) - Fleury's algorithm - Visit every edge exactly once * [Hamiltonian Cycle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/hamiltonian-cycle) - Visit every vertex exactly once * [Strongly Connected Components](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/strongly-connected-components) - Kosaraju's algorithm + * [Travelling Salesman Problem](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/travelling-salesman) - brute force algorithm * **Uncategorized** * [Tower of Hanoi](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/uncategorized/hanoi-tower) * [N-Queens Problem](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/uncategorized/n-queens) @@ -105,6 +106,7 @@ algorithm is an abstraction higher than a computer program. * **Brute Force** - look at all the possibilities and selects the best solution * [Maximum Subarray](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/maximum-subarray) + * [Travelling Salesman Problem](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/travelling-salesman) * **Greedy** - choose the best option at the current time, without any consideration for the future * [Unbound Knapsack Problem](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/knapsack-problem) * [Dijkstra Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/dijkstra) - finding shortest path to all graph vertices diff --git a/src/algorithms/graph/travelling-salesman/README.md b/src/algorithms/graph/travelling-salesman/README.md new file mode 100644 index 000000000..6690cd47a --- /dev/null +++ b/src/algorithms/graph/travelling-salesman/README.md @@ -0,0 +1,26 @@ +# Travelling Salesman Problem + +The travelling salesman problem (TSP) asks the following question: +"Given a list of cities and the distances between each pair of +cities, what is the shortest possible route that visits each city +and returns to the origin city?" + +![Travelling Salesman](https://upload.wikimedia.org/wikipedia/commons/1/11/GLPK_solution_of_a_travelling_salesman_problem.svg) + +Solution of a travelling salesman problem: the black line shows +the shortest possible loop that connects every red dot. + +![Travelling Salesman Graph](https://upload.wikimedia.org/wikipedia/commons/3/30/Weighted_K4.svg) + +TSP can be modelled as an undirected weighted graph, such that +cities are the graph's vertices, paths are the graph's edges, +and a path's distance is the edge's weight. It is a minimization +problem starting and finishing at a specified vertex after having +visited each other vertex exactly once. Often, the model is a +complete graph (i.e. each pair of vertices is connected by an +edge). If no path exists between two cities, adding an arbitrarily +long edge will complete the graph without affecting the optimal tour. + +## References + +- [Wikipedia](https://en.wikipedia.org/wiki/Travelling_salesman_problem) diff --git a/src/algorithms/graph/travelling-salesman/__test__/bfTravellingSalesman.test.js b/src/algorithms/graph/travelling-salesman/__test__/bfTravellingSalesman.test.js new file mode 100644 index 000000000..54eb07dcf --- /dev/null +++ b/src/algorithms/graph/travelling-salesman/__test__/bfTravellingSalesman.test.js @@ -0,0 +1,51 @@ +import GraphVertex from '../../../../data-structures/graph/GraphVertex'; +import GraphEdge from '../../../../data-structures/graph/GraphEdge'; +import Graph from '../../../../data-structures/graph/Graph'; +import bfTravellingSalesman from '../bfTravellingSalesman'; + +describe('bfTravellingSalesman', () => { + it('should solve problem for simple graph', () => { + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + const vertexC = new GraphVertex('C'); + const vertexD = new GraphVertex('D'); + + const edgeAB = new GraphEdge(vertexA, vertexB, 1); + const edgeBD = new GraphEdge(vertexB, vertexD, 1); + const edgeDC = new GraphEdge(vertexD, vertexC, 1); + const edgeCA = new GraphEdge(vertexC, vertexA, 1); + + const edgeBA = new GraphEdge(vertexB, vertexA, 5); + const edgeDB = new GraphEdge(vertexD, vertexB, 8); + const edgeCD = new GraphEdge(vertexC, vertexD, 7); + const edgeAC = new GraphEdge(vertexA, vertexC, 4); + const edgeAD = new GraphEdge(vertexA, vertexD, 2); + const edgeDA = new GraphEdge(vertexD, vertexA, 3); + const edgeBC = new GraphEdge(vertexB, vertexC, 3); + const edgeCB = new GraphEdge(vertexC, vertexB, 9); + + const graph = new Graph(true); + graph + .addEdge(edgeAB) + .addEdge(edgeBD) + .addEdge(edgeDC) + .addEdge(edgeCA) + .addEdge(edgeBA) + .addEdge(edgeDB) + .addEdge(edgeCD) + .addEdge(edgeAC) + .addEdge(edgeAD) + .addEdge(edgeDA) + .addEdge(edgeBC) + .addEdge(edgeCB); + + const salesmanPath = bfTravellingSalesman(graph); + + expect(salesmanPath.length).toBe(4); + + expect(salesmanPath[0].getKey()).toEqual(vertexA.getKey()); + expect(salesmanPath[1].getKey()).toEqual(vertexB.getKey()); + expect(salesmanPath[2].getKey()).toEqual(vertexD.getKey()); + expect(salesmanPath[3].getKey()).toEqual(vertexC.getKey()); + }); +}); diff --git a/src/algorithms/graph/travelling-salesman/bfTravellingSalesman.js b/src/algorithms/graph/travelling-salesman/bfTravellingSalesman.js new file mode 100644 index 000000000..a13fa241f --- /dev/null +++ b/src/algorithms/graph/travelling-salesman/bfTravellingSalesman.js @@ -0,0 +1,104 @@ +/** + * Get all possible paths + * @param {GraphVertex} startVertex + * @param {GraphVertex[][]} [paths] + * @param {GraphVertex[]} [path] + */ +function findAllPaths(startVertex, paths = [], path = []) { + // Clone path. + const currentPath = [...path]; + + // Add startVertex to the path. + currentPath.push(startVertex); + + // Generate visited set from path. + const visitedSet = currentPath.reduce((accumulator, vertex) => { + const updatedAccumulator = { ...accumulator }; + updatedAccumulator[vertex.getKey()] = vertex; + + return updatedAccumulator; + }, {}); + + // Get all unvisited neighbors of startVertex. + const unvisitedNeighbors = startVertex.getNeighbors().filter((neighbor) => { + return !visitedSet[neighbor.getKey()]; + }); + + // If there no unvisited neighbors then treat current path as complete and save it. + if (!unvisitedNeighbors.length) { + paths.push(currentPath); + + return paths; + } + + // Go through all the neighbors. + for (let neighborIndex = 0; neighborIndex < unvisitedNeighbors.length; neighborIndex += 1) { + const currentUnvisitedNeighbor = unvisitedNeighbors[neighborIndex]; + findAllPaths(currentUnvisitedNeighbor, paths, currentPath); + } + + return paths; +} + +/** + * @param {number[][]} adjacencyMatrix + * @param {object} verticesIndices + * @param {GraphVertex[]} cycle + * @return {number} + */ +function getCycleWeight(adjacencyMatrix, verticesIndices, cycle) { + let weight = 0; + + for (let cycleIndex = 1; cycleIndex < cycle.length; cycleIndex += 1) { + const fromVertex = cycle[cycleIndex - 1]; + const toVertex = cycle[cycleIndex]; + const fromVertexIndex = verticesIndices[fromVertex.getKey()]; + const toVertexIndex = verticesIndices[toVertex.getKey()]; + weight += adjacencyMatrix[fromVertexIndex][toVertexIndex]; + } + + return weight; +} + +/** + * BRUTE FORCE approach to solve Traveling Salesman Problem. + * + * @param {Graph} graph + * @return {GraphVertex[]} + */ +export default function bfTravellingSalesman(graph) { + // Pick starting point from where we will traverse the graph. + const startVertex = graph.getAllVertices()[0]; + + // BRUTE FORCE. + // Generate all possible paths from startVertex. + const allPossiblePaths = findAllPaths(startVertex); + + // Filter out paths that are not cycles. + const allPossibleCycles = allPossiblePaths.filter((path) => { + /** @var {GraphVertex} */ + const lastVertex = path[path.length - 1]; + const lastVertexNeighbors = lastVertex.getNeighbors(); + + return lastVertexNeighbors.includes(startVertex); + }); + + // Go through all possible cycles and pick the one with minimum overall tour weight. + const adjacencyMatrix = graph.getAdjacencyMatrix(); + const verticesIndices = graph.getVerticesIndices(); + let salesmanPath = []; + let salesmanPathWeight = null; + for (let cycleIndex = 0; cycleIndex < allPossibleCycles.length; cycleIndex += 1) { + const currentCycle = allPossibleCycles[cycleIndex]; + const currentCycleWeight = getCycleWeight(adjacencyMatrix, verticesIndices, currentCycle); + + // If current cycle weight is smaller then previous ones treat current cycle as most optimal. + if (salesmanPathWeight === null || currentCycleWeight < salesmanPathWeight) { + salesmanPath = currentCycle; + salesmanPathWeight = currentCycleWeight; + } + } + + // Return the solution. + return salesmanPath; +} From 9fa1e57e8269f8fe6145a6c2829fe02c91998afc Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Mon, 21 May 2018 09:00:38 +0300 Subject: [PATCH 304/327] Add travelling salesman problem. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index aedb04715..d7a2ff762 100644 --- a/README.md +++ b/README.md @@ -92,7 +92,7 @@ a set of rules that precisely defines a sequence of operations. * [Eulerian Path and Eulerian Circuit](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/eulerian-path) - Fleury's algorithm - Visit every edge exactly once * [Hamiltonian Cycle](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/hamiltonian-cycle) - Visit every vertex exactly once * [Strongly Connected Components](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/strongly-connected-components) - Kosaraju's algorithm - * [Travelling Salesman Problem](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/travelling-salesman) - brute force algorithm + * [Travelling Salesman Problem](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/travelling-salesman) - shortest possible route that visits each city and returns to the origin city * **Uncategorized** * [Tower of Hanoi](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/uncategorized/hanoi-tower) * [N-Queens Problem](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/uncategorized/n-queens) @@ -106,7 +106,7 @@ algorithm is an abstraction higher than a computer program. * **Brute Force** - look at all the possibilities and selects the best solution * [Maximum Subarray](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/maximum-subarray) - * [Travelling Salesman Problem](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/travelling-salesman) + * [Travelling Salesman Problem](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/travelling-salesman) - shortest possible route that visits each city and returns to the origin city * **Greedy** - choose the best option at the current time, without any consideration for the future * [Unbound Knapsack Problem](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/knapsack-problem) * [Dijkstra Algorithm](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/dijkstra) - finding shortest path to all graph vertices From ad8a15aaae5d68e41b6f5ae772e954ae04a94f34 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Mon, 21 May 2018 14:35:18 +0300 Subject: [PATCH 305/327] Update package json. --- package.json | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index fb8fd1e55..b53711424 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "javascript-algorithms", - "version": "1.0.0", + "version": "0.0.1", "description": "Algorithms and data-structures implemented on JavaScript", "main": "index.js", "scripts": { @@ -24,7 +24,10 @@ "data-structures", "javascript", "algorithm", - "javascript-algorithms" + "javascript-algorithms", + "sorting-algorithms", + "graph", + "tree" ], "author": "Oleksii Trekhleb (https://www.linkedin.com/in/trekhleb/)", "license": "MIT", From 24499d998cfaef16788e0eff0a58e6d75dd9c51b Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Mon, 21 May 2018 14:43:17 +0300 Subject: [PATCH 306/327] Update package json. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b53711424..9d1069aa3 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "javascript-algorithms", + "name": "javascript-algorithms-and-data-structures", "version": "0.0.1", "description": "Algorithms and data-structures implemented on JavaScript", "main": "index.js", From 6568f845b6cc1ec327dcb7337d4db6ecd150ee55 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Mon, 21 May 2018 14:46:42 +0300 Subject: [PATCH 307/327] Update package json. --- README.md | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d7a2ff762..e894debbc 100644 --- a/README.md +++ b/README.md @@ -179,7 +179,7 @@ npm test -- -t 'playground' Order of growth of algorithms specified in Big O notation. -![Big O graphs](https://github.com/trekhleb/javascript-algorithms/blob/master/assets/big-o-graph.png) +![Big O graphs](https://github.com/trekhleb/javascript-algorithms/blob/master/assets/big-o-graph.png?raw=true) Source: [Big O Cheat Sheet](http://bigocheatsheet.com/). diff --git a/package.json b/package.json index 9d1069aa3..f4c81a72a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "javascript-algorithms-and-data-structures", - "version": "0.0.1", + "version": "0.0.2", "description": "Algorithms and data-structures implemented on JavaScript", "main": "index.js", "scripts": { From 943997d94df16ea744f72e3361ca20e75c68fa27 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Mon, 21 May 2018 14:47:27 +0300 Subject: [PATCH 308/327] Update package json. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f4c81a72a..a00e95bbd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "javascript-algorithms-and-data-structures", - "version": "0.0.2", + "version": "0.0.3", "description": "Algorithms and data-structures implemented on JavaScript", "main": "index.js", "scripts": { From c0c77a46325730abfcb5c270f815f69b15f16cbe Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Mon, 21 May 2018 16:39:54 +0300 Subject: [PATCH 309/327] Update READMEs. --- src/data-structures/graph/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/data-structures/graph/README.md b/src/data-structures/graph/README.md index ec1d1efef..380db3aa7 100644 --- a/src/data-structures/graph/README.md +++ b/src/data-structures/graph/README.md @@ -20,4 +20,6 @@ represented by integer indices or references. ## References -[Wikipedia](https://en.wikipedia.org/wiki/Graph_(abstract_data_type)) +- [Wikipedia](https://en.wikipedia.org/wiki/Graph_(abstract_data_type)) +- [Introduction to Graphs on YouTube](https://www.youtube.com/watch?v=gXgEDyodOJU&index=9&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) +- [Graphs representation on YouTube](https://www.youtube.com/watch?v=k1wraWzqtvQ&index=10&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) From 16f30d33d78109192c1b799af9ca8c6d5e9264cb Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Mon, 21 May 2018 16:48:21 +0300 Subject: [PATCH 310/327] Update READMEs. --- src/data-structures/disjoint-set/README.md | 2 +- src/data-structures/hash-table/README.md | 3 ++- src/data-structures/heap/README.md | 3 ++- src/data-structures/linked-list/README.md | 3 ++- src/data-structures/priority-queue/README.md | 5 ++--- src/data-structures/queue/README.md | 3 ++- src/data-structures/stack/README.md | 3 ++- src/data-structures/tree/README.md | 3 ++- src/data-structures/trie/README.md | 3 ++- 9 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/data-structures/disjoint-set/README.md b/src/data-structures/disjoint-set/README.md index b5d5bfcdf..576927585 100644 --- a/src/data-structures/disjoint-set/README.md +++ b/src/data-structures/disjoint-set/README.md @@ -17,4 +17,4 @@ After some operations of *Union*, some sets are grouped together. ## References - [Wikipedia](https://en.wikipedia.org/wiki/Disjoint-set_data_structure) -- [By Abdul Bari on YouTube](https://www.youtube.com/watch?v=wU6udHRIkcc) +- [By Abdul Bari on YouTube](https://www.youtube.com/watch?v=wU6udHRIkcc&index=14&t=0s&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) diff --git a/src/data-structures/hash-table/README.md b/src/data-structures/hash-table/README.md index b26ba77b5..59b51946e 100644 --- a/src/data-structures/hash-table/README.md +++ b/src/data-structures/hash-table/README.md @@ -22,4 +22,5 @@ Hash collision resolved by separate chaining. ## References -[Wikipedia](https://en.wikipedia.org/wiki/Hash_table) +- [Wikipedia](https://en.wikipedia.org/wiki/Hash_table) +- [YouTube](https://www.youtube.com/watch?v=shs0KM3wKv8&index=4&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) diff --git a/src/data-structures/heap/README.md b/src/data-structures/heap/README.md index 69cb6342b..c4c48eff7 100644 --- a/src/data-structures/heap/README.md +++ b/src/data-structures/heap/README.md @@ -12,4 +12,5 @@ called the root node. ## References -[Wikipedia](https://en.wikipedia.org/wiki/Heap_(data_structure)) +- [Wikipedia](https://en.wikipedia.org/wiki/Heap_(data_structure)) +- [YouTube](https://www.youtube.com/watch?v=t0Cq6tVNRBA&index=5&t=0s&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) diff --git a/src/data-structures/linked-list/README.md b/src/data-structures/linked-list/README.md index 2481687b9..3f258cfd6 100644 --- a/src/data-structures/linked-list/README.md +++ b/src/data-structures/linked-list/README.md @@ -21,4 +21,5 @@ have better cache locality as compared to linked lists. ## References -[Wikipedia](https://en.wikipedia.org/wiki/Linked_list) +- [Wikipedia](https://en.wikipedia.org/wiki/Linked_list) +- [YouTube](https://www.youtube.com/watch?v=njTh_OwMljA&index=2&t=1s&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) diff --git a/src/data-structures/priority-queue/README.md b/src/data-structures/priority-queue/README.md index ed2dd55a9..ecb522285 100644 --- a/src/data-structures/priority-queue/README.md +++ b/src/data-structures/priority-queue/README.md @@ -14,8 +14,7 @@ with a linked list or an array, a priority queue can be implemented with a heap or a variety of other methods such as an unordered array. - - ## References -[Wikipedia](https://en.wikipedia.org/wiki/Priority_queue) +- [Wikipedia](https://en.wikipedia.org/wiki/Priority_queue) +- [YouTube](https://www.youtube.com/watch?v=wptevk0bshY&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8&index=6) diff --git a/src/data-structures/queue/README.md b/src/data-structures/queue/README.md index e12fe15f4..a51dc376b 100644 --- a/src/data-structures/queue/README.md +++ b/src/data-structures/queue/README.md @@ -22,4 +22,5 @@ Representation of a FIFO (first in, first out) queue ## References -[Wikipedia](https://en.wikipedia.org/wiki/Queue_(abstract_data_type)) +- [Wikipedia](https://en.wikipedia.org/wiki/Queue_(abstract_data_type)) +- [YouTube](https://www.youtube.com/watch?v=wjI1WNcIntg&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8&index=3&) diff --git a/src/data-structures/stack/README.md b/src/data-structures/stack/README.md index a37a95b42..305248d7b 100644 --- a/src/data-structures/stack/README.md +++ b/src/data-structures/stack/README.md @@ -21,4 +21,5 @@ Simple representation of a stack runtime with push and pop operations. ## References -[Wikipedia](https://en.wikipedia.org/wiki/Stack_(abstract_data_type)) +- [Wikipedia](https://en.wikipedia.org/wiki/Stack_(abstract_data_type)) +- [YouTube](https://www.youtube.com/watch?v=wjI1WNcIntg&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8&index=3&) diff --git a/src/data-structures/tree/README.md b/src/data-structures/tree/README.md index 7fd4eb77c..13445b7fd 100644 --- a/src/data-structures/tree/README.md +++ b/src/data-structures/tree/README.md @@ -24,4 +24,5 @@ root node, at the top, has no parent. ## References -[Wikipedia](https://en.wikipedia.org/wiki/Tree_(data_structure)) +- [Wikipedia](https://en.wikipedia.org/wiki/Tree_(data_structure)) +- [YouTube](https://www.youtube.com/watch?v=oSWTXtMglKE&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8&index=8) diff --git a/src/data-structures/trie/README.md b/src/data-structures/trie/README.md index 0cae22ba0..33a476815 100644 --- a/src/data-structures/trie/README.md +++ b/src/data-structures/trie/README.md @@ -19,4 +19,5 @@ prefix tree. ## References -[Wikipedia](https://en.wikipedia.org/wiki/Trie) +- [Wikipedia](https://en.wikipedia.org/wiki/Trie) +- [YouTube](https://www.youtube.com/watch?v=zIjfhVPRZCg&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8&index=7&t=0s) From 5a2964da15266f8b4c841e13909b28be1b846dbc Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Mon, 21 May 2018 16:51:21 +0300 Subject: [PATCH 311/327] Update READMEs. --- src/data-structures/tree/avl-tree/README.md | 1 + src/data-structures/tree/binary-search-tree/README.md | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/data-structures/tree/avl-tree/README.md b/src/data-structures/tree/avl-tree/README.md index ba21339ee..903da100a 100644 --- a/src/data-structures/tree/avl-tree/README.md +++ b/src/data-structures/tree/avl-tree/README.md @@ -44,3 +44,4 @@ AVL tree with balance factors (green) * [Wikipedia](https://en.wikipedia.org/wiki/AVL_tree) * [Tutorials Point](https://www.tutorialspoint.com/data_structures_algorithms/avl_tree_algorithm.htm) * [BTech](http://btechsmartclass.com/DS/U5_T2.html) +* [AVL Tree Insertion on YouTube](https://www.youtube.com/watch?v=rbg7Qf8GkQ4&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8&index=12&) diff --git a/src/data-structures/tree/binary-search-tree/README.md b/src/data-structures/tree/binary-search-tree/README.md index 811a0d7d5..0bdff61bc 100644 --- a/src/data-structures/tree/binary-search-tree/README.md +++ b/src/data-structures/tree/binary-search-tree/README.md @@ -29,4 +29,5 @@ The leaves are not drawn. ## References -[Wikipedia](https://en.wikipedia.org/wiki/Binary_search_tree) +- [Wikipedia](https://en.wikipedia.org/wiki/Binary_search_tree) +- [Inserting to BST on YouTube](https://www.youtube.com/watch?v=wcIRPqTR3Kc&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8&index=9&t=0s) From 2f34a9c0d66fc80da92b591300c6578ceb1dfd2a Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Mon, 21 May 2018 21:48:35 +0300 Subject: [PATCH 312/327] Update READMEs. --- src/algorithms/graph/articulation-points/README.md | 2 +- src/algorithms/graph/bellman-ford/README.md | 2 +- src/algorithms/graph/bridges/README.md | 2 +- src/algorithms/graph/detect-cycle/README.md | 4 ++-- src/algorithms/graph/dijkstra/README.md | 4 ++-- src/algorithms/graph/eulerian-path/README.md | 2 +- src/algorithms/graph/hamiltonian-cycle/README.md | 2 +- src/algorithms/graph/kruskal/README.md | 4 ++-- src/algorithms/graph/prim/README.md | 4 ++-- src/algorithms/graph/strongly-connected-components/README.md | 2 +- src/algorithms/graph/topological-sorting/README.md | 2 +- src/algorithms/math/integer-partition/README.md | 2 +- src/algorithms/search/binary-search/README.md | 3 ++- src/algorithms/sets/knapsack-problem/README.md | 2 +- src/algorithms/sets/longest-common-subsequnce/README.md | 2 +- src/algorithms/sets/longest-increasing-subsequence/README.md | 2 +- src/algorithms/sets/maximum-subarray/README.md | 2 +- src/algorithms/sorting/bubble-sort/README.md | 3 ++- src/algorithms/sorting/merge-sort/README.md | 3 ++- src/algorithms/sorting/quick-sort/README.md | 3 ++- src/algorithms/string/knuth-morris-pratt/README.md | 2 +- src/algorithms/string/levenshtein-distance/README.md | 2 +- src/algorithms/string/longest-common-substring/README.md | 2 +- src/algorithms/string/rabin-karp/README.md | 2 +- src/algorithms/uncategorized/n-queens/README.md | 4 ++-- 25 files changed, 34 insertions(+), 30 deletions(-) diff --git a/src/algorithms/graph/articulation-points/README.md b/src/algorithms/graph/articulation-points/README.md index 4c64d81e4..aa6bede7a 100644 --- a/src/algorithms/graph/articulation-points/README.md +++ b/src/algorithms/graph/articulation-points/README.md @@ -19,4 +19,4 @@ vertex removing which increases number of connected components. ## References - [GeeksForGeeks](https://www.geeksforgeeks.org/articulation-points-or-cut-vertices-in-a-graph/) -- [YouTube](https://www.youtube.com/watch?v=2kREIkF9UAs) +- [YouTube](https://www.youtube.com/watch?v=2kREIkF9UAs&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) diff --git a/src/algorithms/graph/bellman-ford/README.md b/src/algorithms/graph/bellman-ford/README.md index b28318b2a..9c0922659 100644 --- a/src/algorithms/graph/bellman-ford/README.md +++ b/src/algorithms/graph/bellman-ford/README.md @@ -18,4 +18,4 @@ Worst-case space complexity `O(|V|)` ## References - [Wikipedia](https://en.wikipedia.org/wiki/Bellman%E2%80%93Ford_algorithm) -- [On YouTube by Michael Sambol](https://www.youtube.com/watch?v=obWXjtg0L64) +- [On YouTube by Michael Sambol](https://www.youtube.com/watch?v=obWXjtg0L64&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) diff --git a/src/algorithms/graph/bridges/README.md b/src/algorithms/graph/bridges/README.md index 3fd721b0d..08d919ff9 100644 --- a/src/algorithms/graph/bridges/README.md +++ b/src/algorithms/graph/bridges/README.md @@ -21,6 +21,6 @@ An undirected connected graph with no cut edges ## References -- [GeeksForGeeks on YouTube](https://www.youtube.com/watch?time_continue=110&v=thLQYBlz2DM) +- [GeeksForGeeks on YouTube](https://www.youtube.com/watch?v=thLQYBlz2DM&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) - [Wikipedia](https://en.wikipedia.org/wiki/Bridge_%28graph_theory%29#Tarjan.27s_Bridge-finding_algorithm) - [GeeksForGeeks](https://www.geeksforgeeks.org/bridge-in-a-graph/) diff --git a/src/algorithms/graph/detect-cycle/README.md b/src/algorithms/graph/detect-cycle/README.md index 8e8b681ff..82641c78a 100644 --- a/src/algorithms/graph/detect-cycle/README.md +++ b/src/algorithms/graph/detect-cycle/README.md @@ -52,9 +52,9 @@ General information: Cycles in undirected graphs: - [Detect Cycle in Undirected Graph on GeeksForGeeks](https://www.geeksforgeeks.org/detect-cycle-undirected-graph/) -- [Detect Cycle in Undirected Graph Algorithm on YouTube](https://www.youtube.com/watch?v=n_t0a_8H8VY) +- [Detect Cycle in Undirected Graph Algorithm on YouTube](https://www.youtube.com/watch?v=n_t0a_8H8VY&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) Cycles in directed graphs: - [Detect Cycle in Directed Graph on GeeksForGeeks](https://www.geeksforgeeks.org/detect-cycle-in-a-graph/) -- [Detect Cycle in Directed Graph Algorithm on YouTube](https://www.youtube.com/watch?v=rKQaZuoUR4M) +- [Detect Cycle in Directed Graph Algorithm on YouTube](https://www.youtube.com/watch?v=rKQaZuoUR4M&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) diff --git a/src/algorithms/graph/dijkstra/README.md b/src/algorithms/graph/dijkstra/README.md index 6fdacb0b1..e1c5002f1 100644 --- a/src/algorithms/graph/dijkstra/README.md +++ b/src/algorithms/graph/dijkstra/README.md @@ -21,5 +21,5 @@ and updates the neighbor's distance if smaller. Mark visited ## References - [Wikipedia](https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm) -- [On YouTube by Nathaniel Fan](https://www.youtube.com/watch?v=gdmfOwyQlcI) -- [On YouTube by Tushar Roy](https://www.youtube.com/watch?v=lAXZGERcDf4) +- [On YouTube by Nathaniel Fan](https://www.youtube.com/watch?v=gdmfOwyQlcI&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) +- [On YouTube by Tushar Roy](https://www.youtube.com/watch?v=lAXZGERcDf4&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) diff --git a/src/algorithms/graph/eulerian-path/README.md b/src/algorithms/graph/eulerian-path/README.md index 0f6b94666..597a9ef32 100644 --- a/src/algorithms/graph/eulerian-path/README.md +++ b/src/algorithms/graph/eulerian-path/README.md @@ -32,4 +32,4 @@ therefore, a solution does not exist. ## References - [Wikipedia](https://en.wikipedia.org/wiki/Eulerian_path) -- [YouTube](https://www.youtube.com/watch?v=vvP4Fg4r-Ns) +- [YouTube](https://www.youtube.com/watch?v=vvP4Fg4r-Ns&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) diff --git a/src/algorithms/graph/hamiltonian-cycle/README.md b/src/algorithms/graph/hamiltonian-cycle/README.md index 74d8ed15c..ccd15481b 100644 --- a/src/algorithms/graph/hamiltonian-cycle/README.md +++ b/src/algorithms/graph/hamiltonian-cycle/README.md @@ -44,5 +44,5 @@ then we return false. ## References - [Hamiltonian path on Wikipedia](https://en.wikipedia.org/wiki/Hamiltonian_path) -- [Hamiltonian path on YouTube](https://www.youtube.com/watch?v=dQr4wZCiJJ4) +- [Hamiltonian path on YouTube](https://www.youtube.com/watch?v=dQr4wZCiJJ4&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) - [Hamiltonian cycle on GeeksForGeeks](https://www.geeksforgeeks.org/backtracking-set-7-hamiltonian-cycle/) diff --git a/src/algorithms/graph/kruskal/README.md b/src/algorithms/graph/kruskal/README.md index 5ed128e7c..eb8a0ebf4 100644 --- a/src/algorithms/graph/kruskal/README.md +++ b/src/algorithms/graph/kruskal/README.md @@ -45,5 +45,5 @@ are two possibilities of minimum spanning tree of the given graph. - [Minimum Spanning Tree on Wikipedia](https://en.wikipedia.org/wiki/Minimum_spanning_tree) - [Kruskal's Algorithm on Wikipedia](https://en.wikipedia.org/wiki/Kruskal%27s_algorithm) -- [Kruskal's Algorithm on YouTube by Tushar Roy](https://www.youtube.com/watch?v=fAuF0EuZVCk) -- [Kruskal's Algorithm on YouTube by Michael Sambol](https://www.youtube.com/watch?v=71UQH7Pr9kU) +- [Kruskal's Algorithm on YouTube by Tushar Roy](https://www.youtube.com/watch?v=fAuF0EuZVCk&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) +- [Kruskal's Algorithm on YouTube by Michael Sambol](https://www.youtube.com/watch?v=71UQH7Pr9kU&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) diff --git a/src/algorithms/graph/prim/README.md b/src/algorithms/graph/prim/README.md index d9012c947..49061a278 100644 --- a/src/algorithms/graph/prim/README.md +++ b/src/algorithms/graph/prim/README.md @@ -43,5 +43,5 @@ are two possibilities of minimum spanning tree of the given graph. - [Minimum Spanning Tree on Wikipedia](https://en.wikipedia.org/wiki/Minimum_spanning_tree) - [Prim's Algorithm on Wikipedia](https://en.wikipedia.org/wiki/Prim%27s_algorithm) -- [Prim's Algorithm on YouTube by Tushar Roy](https://www.youtube.com/watch?v=oP2-8ysT3QQ) -- [Prim's Algorithm on YouTube by Michael Sambol](https://www.youtube.com/watch?v=cplfcGZmX7I) +- [Prim's Algorithm on YouTube by Tushar Roy](https://www.youtube.com/watch?v=oP2-8ysT3QQ&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) +- [Prim's Algorithm on YouTube by Michael Sambol](https://www.youtube.com/watch?v=cplfcGZmX7I&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) diff --git a/src/algorithms/graph/strongly-connected-components/README.md b/src/algorithms/graph/strongly-connected-components/README.md index 54faaad42..74f23ce05 100644 --- a/src/algorithms/graph/strongly-connected-components/README.md +++ b/src/algorithms/graph/strongly-connected-components/README.md @@ -13,4 +13,4 @@ Graph with strongly connected components marked ## References - [Wikipedia](https://en.wikipedia.org/wiki/Strongly_connected_component) -- [YouTube](https://www.youtube.com/watch?v=RpgcYiky7uw) +- [YouTube](https://www.youtube.com/watch?v=RpgcYiky7uw&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) diff --git a/src/algorithms/graph/topological-sorting/README.md b/src/algorithms/graph/topological-sorting/README.md index c911c1caa..f4653a8b1 100644 --- a/src/algorithms/graph/topological-sorting/README.md +++ b/src/algorithms/graph/topological-sorting/README.md @@ -52,4 +52,4 @@ next dependency has its dependent packages to be installed in prior. ## References - [Wikipedia](https://en.wikipedia.org/wiki/Topological_sorting) -- [Topological Sorting on YouTube by Tushar Roy](https://www.youtube.com/watch?v=ddTC4Zovtbc) +- [Topological Sorting on YouTube by Tushar Roy](https://www.youtube.com/watch?v=ddTC4Zovtbc&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) diff --git a/src/algorithms/math/integer-partition/README.md b/src/algorithms/math/integer-partition/README.md index ee6a9f0a7..6023e1505 100644 --- a/src/algorithms/math/integer-partition/README.md +++ b/src/algorithms/math/integer-partition/README.md @@ -31,4 +31,4 @@ are conjugate partitions. ## References - [Wikipedia](https://en.wikipedia.org/wiki/Partition_(number_theory)) -- [YouTube](https://www.youtube.com/watch?v=ZaVM057DuzE) +- [YouTube](https://www.youtube.com/watch?v=ZaVM057DuzE&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) diff --git a/src/algorithms/search/binary-search/README.md b/src/algorithms/search/binary-search/README.md index 0b55e1aab..8de1f4627 100644 --- a/src/algorithms/search/binary-search/README.md +++ b/src/algorithms/search/binary-search/README.md @@ -14,4 +14,5 @@ in the array. ## References -[Wikipedia](https://en.wikipedia.org/wiki/Binary_search_algorithm) +- [Wikipedia](https://en.wikipedia.org/wiki/Binary_search_algorithm) +- [YouTube](https://www.youtube.com/watch?v=P3YID7liBug&index=29&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) diff --git a/src/algorithms/sets/knapsack-problem/README.md b/src/algorithms/sets/knapsack-problem/README.md index 1c719d7b4..1d86019f6 100644 --- a/src/algorithms/sets/knapsack-problem/README.md +++ b/src/algorithms/sets/knapsack-problem/README.md @@ -66,4 +66,4 @@ and ![unbounded knapsack](https://wikimedia.org/api/rest_v1/media/math/render/sv ## References - [Wikipedia](https://en.wikipedia.org/wiki/Knapsack_problem) -- [0/1 Knapsack Problem on YouTube](https://www.youtube.com/watch?v=8LusJS5-AGo) +- [0/1 Knapsack Problem on YouTube](https://www.youtube.com/watch?v=8LusJS5-AGo&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) diff --git a/src/algorithms/sets/longest-common-subsequnce/README.md b/src/algorithms/sets/longest-common-subsequnce/README.md index 8427072ed..7c9328e07 100644 --- a/src/algorithms/sets/longest-common-subsequnce/README.md +++ b/src/algorithms/sets/longest-common-subsequnce/README.md @@ -22,4 +22,4 @@ made to a revision-controlled collection of files. ## References - [Wikipedia](https://en.wikipedia.org/wiki/Longest_common_subsequence_problem) -- [YouTube](https://www.youtube.com/watch?v=NnD96abizww) +- [YouTube](https://www.youtube.com/watch?v=NnD96abizww&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) diff --git a/src/algorithms/sets/longest-increasing-subsequence/README.md b/src/algorithms/sets/longest-increasing-subsequence/README.md index 1011a1b84..bcb2665c2 100644 --- a/src/algorithms/sets/longest-increasing-subsequence/README.md +++ b/src/algorithms/sets/longest-increasing-subsequence/README.md @@ -43,4 +43,4 @@ input sequence. ## References - [Wikipedia](https://en.wikipedia.org/wiki/Longest_increasing_subsequence) -- [Dynamic Programming Approach on YouTube](https://www.youtube.com/watch?v=CE2b_-XfVDk) +- [Dynamic Programming Approach on YouTube](https://www.youtube.com/watch?v=CE2b_-XfVDk&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) diff --git a/src/algorithms/sets/maximum-subarray/README.md b/src/algorithms/sets/maximum-subarray/README.md index b2448deee..a254e1f83 100644 --- a/src/algorithms/sets/maximum-subarray/README.md +++ b/src/algorithms/sets/maximum-subarray/README.md @@ -16,4 +16,4 @@ with the largest sum is `4, −1, 2, 1`, with sum `6`. ## References - [Wikipedia](https://en.wikipedia.org/wiki/Maximum_subarray_problem) -- [YouTube](https://www.youtube.com/watch?v=ohHWQf1HDfU) +- [YouTube](https://www.youtube.com/watch?v=ohHWQf1HDfU&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) diff --git a/src/algorithms/sorting/bubble-sort/README.md b/src/algorithms/sorting/bubble-sort/README.md index 2c0f767b5..4861dc2e4 100644 --- a/src/algorithms/sorting/bubble-sort/README.md +++ b/src/algorithms/sorting/bubble-sort/README.md @@ -11,4 +11,5 @@ are needed, which indicates that the list is sorted. ## References -[Wikipedia](https://en.wikipedia.org/wiki/Bubble_sort) +- [Wikipedia](https://en.wikipedia.org/wiki/Bubble_sort) +- [YouTube](https://www.youtube.com/watch?v=6Gv8vg0kcHc&index=27&t=0s&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) diff --git a/src/algorithms/sorting/merge-sort/README.md b/src/algorithms/sorting/merge-sort/README.md index 00d6b9097..372cc2ac6 100644 --- a/src/algorithms/sorting/merge-sort/README.md +++ b/src/algorithms/sorting/merge-sort/README.md @@ -24,4 +24,5 @@ emulate merge sort (top-down). ## References -[Wikipedia](https://en.wikipedia.org/wiki/Merge_sort) +- [Wikipedia](https://en.wikipedia.org/wiki/Merge_sort) +- [YouTube](https://www.youtube.com/watch?v=KF2j-9iSf4Q&index=27&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) diff --git a/src/algorithms/sorting/quick-sort/README.md b/src/algorithms/sorting/quick-sort/README.md index 6ec8ca5eb..3021e6e2d 100644 --- a/src/algorithms/sorting/quick-sort/README.md +++ b/src/algorithms/sorting/quick-sort/README.md @@ -25,4 +25,5 @@ The horizontal lines are pivot values. ## References -[Wikipedia](https://en.wikipedia.org/wiki/Quicksort) +- [Wikipedia](https://en.wikipedia.org/wiki/Quicksort) +- [YouTube](https://www.youtube.com/watch?v=SLauY6PpjW4&index=28&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) diff --git a/src/algorithms/string/knuth-morris-pratt/README.md b/src/algorithms/string/knuth-morris-pratt/README.md index 8f17c9e94..907ff60c0 100644 --- a/src/algorithms/string/knuth-morris-pratt/README.md +++ b/src/algorithms/string/knuth-morris-pratt/README.md @@ -16,4 +16,4 @@ of previously matched characters. ## References - [Wikipedia](https://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm) -- [YouTube](https://www.youtube.com/watch?v=GTJr8OvyEVQ) +- [YouTube](https://www.youtube.com/watch?v=GTJr8OvyEVQ&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) diff --git a/src/algorithms/string/levenshtein-distance/README.md b/src/algorithms/string/levenshtein-distance/README.md index 0ad2d5cb7..00019e87f 100644 --- a/src/algorithms/string/levenshtein-distance/README.md +++ b/src/algorithms/string/levenshtein-distance/README.md @@ -43,4 +43,4 @@ three edits: ## References - [Wikipedia](https://en.wikipedia.org/wiki/Levenshtein_distance) -- [YouTube](https://www.youtube.com/watch?v=We3YDTzNXEk) +- [YouTube](https://www.youtube.com/watch?v=We3YDTzNXEk&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) diff --git a/src/algorithms/string/longest-common-substring/README.md b/src/algorithms/string/longest-common-substring/README.md index 3b4dded3f..9e63294f0 100644 --- a/src/algorithms/string/longest-common-substring/README.md +++ b/src/algorithms/string/longest-common-substring/README.md @@ -21,4 +21,4 @@ ABABC ## References - [Wikipedia](https://en.wikipedia.org/wiki/Longest_common_substring_problem) -- [YouTube](https://www.youtube.com/watch?v=BysNXJHzCEs) +- [YouTube](https://www.youtube.com/watch?v=BysNXJHzCEs&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) diff --git a/src/algorithms/string/rabin-karp/README.md b/src/algorithms/string/rabin-karp/README.md index 800ec5b88..d6027eeba 100644 --- a/src/algorithms/string/rabin-karp/README.md +++ b/src/algorithms/string/rabin-karp/README.md @@ -22,4 +22,4 @@ strings, single-string searching algorithms are impractical. ## References - [Wikipedia](https://en.wikipedia.org/wiki/Rabin%E2%80%93Karp_algorithm) -- [YouTube](https://www.youtube.com/watch?v=H4VrKHVG5qI) +- [YouTube](https://www.youtube.com/watch?v=H4VrKHVG5qI&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) diff --git a/src/algorithms/uncategorized/n-queens/README.md b/src/algorithms/uncategorized/n-queens/README.md index 364277c6e..703cf5e95 100644 --- a/src/algorithms/uncategorized/n-queens/README.md +++ b/src/algorithms/uncategorized/n-queens/README.md @@ -69,5 +69,5 @@ and return false. - [Wikipedia](https://en.wikipedia.org/wiki/Eight_queens_puzzle) - [GeeksForGeeks](https://www.geeksforgeeks.org/backtracking-set-3-n-queen-problem/) -- [On YouTube by Abdul Bari](https://www.youtube.com/watch?v=xFv_Hl4B83A) -- [On YouTube by Tushar Roy](https://www.youtube.com/watch?v=xouin83ebxE) +- [On YouTube by Abdul Bari](https://www.youtube.com/watch?v=xFv_Hl4B83A&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) +- [On YouTube by Tushar Roy](https://www.youtube.com/watch?v=xouin83ebxE&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) From a08b8427c457e6e3c5d9d0624a6cdf2c6ea0687d Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Tue, 22 May 2018 07:10:46 +0300 Subject: [PATCH 313/327] Use Infinity instead of zero in Graph adjacency matrix to show that vertices are not connected. --- .../graph/hamiltonian-cycle/hamiltonianCycle.js | 4 ++-- src/data-structures/graph/Graph.js | 9 ++++----- src/data-structures/graph/__test__/Graph.test.js | 16 ++++++++-------- 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/algorithms/graph/hamiltonian-cycle/hamiltonianCycle.js b/src/algorithms/graph/hamiltonian-cycle/hamiltonianCycle.js index 845626157..329821fe3 100644 --- a/src/algorithms/graph/hamiltonian-cycle/hamiltonianCycle.js +++ b/src/algorithms/graph/hamiltonian-cycle/hamiltonianCycle.js @@ -15,7 +15,7 @@ function isSafe(adjacencyMatrix, verticesIndices, cycle, vertexCandidate) { const endVertexAdjacencyIndex = verticesIndices[endVertex.getKey()]; // Check if last vertex in the path and candidate vertex are adjacent. - if (!adjacencyMatrix[endVertexAdjacencyIndex][candidateVertexAdjacencyIndex]) { + if (adjacencyMatrix[endVertexAdjacencyIndex][candidateVertexAdjacencyIndex] === Infinity) { return false; } @@ -43,7 +43,7 @@ function isCycle(adjacencyMatrix, verticesIndices, cycle) { const endVertexAdjacencyIndex = verticesIndices[endVertex.getKey()]; // Check if we can go from end vertex to the start one. - return !!adjacencyMatrix[endVertexAdjacencyIndex][startVertexAdjacencyIndex]; + return adjacencyMatrix[endVertexAdjacencyIndex][startVertexAdjacencyIndex] !== Infinity; } /** diff --git a/src/data-structures/graph/Graph.js b/src/data-structures/graph/Graph.js index b3ee87306..d9ac90899 100644 --- a/src/data-structures/graph/Graph.js +++ b/src/data-structures/graph/Graph.js @@ -177,18 +177,17 @@ export default class Graph { const vertices = this.getAllVertices(); const verticesIndices = this.getVerticesIndices(); - // Init matrix with zeros. + // Init matrix with infinities meaning that there is no ways of + // getting from one vertex to another yet. const adjacencyMatrix = Array(vertices.length).fill(null).map(() => { - return Array(vertices.length).fill(0); + return Array(vertices.length).fill(Infinity); }); // Fill the columns. vertices.forEach((vertex, vertexIndex) => { vertex.getNeighbors().forEach((neighbor) => { const neighborIndex = verticesIndices[neighbor.getKey()]; - adjacencyMatrix[vertexIndex][neighborIndex] = this.isDirected ? - this.findEdge(vertex, neighbor).weight : - 1; + adjacencyMatrix[vertexIndex][neighborIndex] = this.findEdge(vertex, neighbor).weight; }); }); diff --git a/src/data-structures/graph/__test__/Graph.test.js b/src/data-structures/graph/__test__/Graph.test.js index e89093b8b..1c6592ba5 100644 --- a/src/data-structures/graph/__test__/Graph.test.js +++ b/src/data-structures/graph/__test__/Graph.test.js @@ -348,10 +348,10 @@ describe('Graph', () => { const adjacencyMatrix = graph.getAdjacencyMatrix(); expect(adjacencyMatrix).toEqual([ - [0, 1, 0, 0], - [1, 0, 1, 1], - [0, 1, 0, 1], - [0, 1, 1, 0], + [Infinity, 0, Infinity, Infinity], + [0, Infinity, 0, 0], + [Infinity, 0, Infinity, 0], + [Infinity, 0, 0, Infinity], ]); }); @@ -375,10 +375,10 @@ describe('Graph', () => { const adjacencyMatrix = graph.getAdjacencyMatrix(); expect(adjacencyMatrix).toEqual([ - [0, 2, 0, 0], - [0, 0, 1, 7], - [0, 0, 0, 5], - [0, 0, 0, 0], + [Infinity, 2, Infinity, Infinity], + [Infinity, Infinity, 1, 7], + [Infinity, Infinity, Infinity, 5], + [Infinity, Infinity, Infinity, Infinity], ]); }); }); From f46a82b7530fe3867f5ac1d276ff20923427723c Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Wed, 23 May 2018 23:37:14 +0300 Subject: [PATCH 314/327] small refactor in bubble sort for better readablity --- .../sorting/bubble-sort/BubbleSort.js | 2 +- yarn.lock | 4265 +++++++++++++++++ 2 files changed, 4266 insertions(+), 1 deletion(-) create mode 100644 yarn.lock diff --git a/src/algorithms/sorting/bubble-sort/BubbleSort.js b/src/algorithms/sorting/bubble-sort/BubbleSort.js index 2da40d56f..542a84487 100644 --- a/src/algorithms/sorting/bubble-sort/BubbleSort.js +++ b/src/algorithms/sorting/bubble-sort/BubbleSort.js @@ -5,7 +5,7 @@ export default class BubbleSort extends Sort { // Flag that holds info about whether the swap has occur or not. let swapped = false; // Clone original array to prevent its modification. - const array = originalArray.slice(0); + const array = [...originalArray]; for (let i = 0; i < array.length; i += 1) { swapped = false; diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 000000000..f7f3096f6 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,4265 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@^7.0.0-beta.35": + version "7.0.0-beta.47" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.47.tgz#d18c2f4c4ba8d093a2bcfab5616593bfe2441a27" + dependencies: + "@babel/highlight" "7.0.0-beta.47" + +"@babel/highlight@7.0.0-beta.47": + version "7.0.0-beta.47" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.47.tgz#8fbc83fb2a21f0bd2b95cdbeb238cf9689cad494" + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^3.0.0" + +"@types/jest@^22.2.3": + version "22.2.3" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-22.2.3.tgz#0157c0316dc3722c43a7b71de3fdf3acbccef10d" + +abab@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + +acorn-globals@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538" + dependencies: + acorn "^5.0.0" + +acorn-jsx@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" + dependencies: + acorn "^3.0.4" + +acorn@^3.0.4: + version "3.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" + +acorn@^5.0.0, acorn@^5.3.0, acorn@^5.5.0: + version "5.5.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.3.tgz#f473dd47e0277a08e28e9bec5aeeb04751f0b8c9" + +ajv-keywords@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" + +ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0: + version "5.5.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" + dependencies: + co "^4.6.0" + fast-deep-equal "^1.0.0" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.3.0" + +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + +ansi-escapes@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + dependencies: + color-convert "^1.9.0" + +anymatch@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" + dependencies: + micromatch "^2.1.5" + normalize-path "^2.0.0" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +append-transform@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" + dependencies: + default-require-extensions "^1.0.0" + +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + +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.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + dependencies: + sprintf-js "~1.0.2" + +argv@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/argv/-/argv-0.0.2.tgz#ecbd16f8949b157183711b1bda334f37840185ab" + +aria-query@^0.7.0: + version "0.7.1" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-0.7.1.tgz#26cbb5aff64144b0a825be1846e0b16cfa00b11e" + dependencies: + ast-types-flow "0.0.7" + commander "^2.11.0" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + +arr-flatten@^1.0.1, arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + +array-includes@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.7.0" + +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" + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + +arrify@^1.0.0, arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + +asap@~2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + +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" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + +ast-types-flow@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + +async-each@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + +async-limiter@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" + +async@^1.4.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + +async@^2.1.4: + version "2.6.1" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" + dependencies: + lodash "^4.17.10" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +atob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + +aws4@^1.6.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289" + +axobject-query@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-0.1.0.tgz#62f59dbc59c9f9242759ca349960e7a2fe3c36c0" + dependencies: + ast-types-flow "0.0.7" + +babel-cli@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.26.0.tgz#502ab54874d7db88ad00b887a06383ce03d002f1" + dependencies: + babel-core "^6.26.0" + babel-polyfill "^6.26.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + commander "^2.11.0" + convert-source-map "^1.5.0" + fs-readdir-recursive "^1.0.0" + glob "^7.1.2" + lodash "^4.17.4" + output-file-sync "^1.1.2" + path-is-absolute "^1.0.1" + slash "^1.0.0" + source-map "^0.5.6" + v8flags "^2.1.1" + optionalDependencies: + chokidar "^1.6.1" + +babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-core@^6.0.0, babel-core@^6.26.0: + version "6.26.3" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.1" + debug "^2.6.9" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.8" + slash "^1.0.0" + source-map "^0.5.7" + +babel-generator@^6.18.0, babel-generator@^6.26.0: + version "6.26.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.7" + trim-right "^1.0.1" + +babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" + dependencies: + babel-helper-explode-assignable-expression "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-define-map@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-explode-assignable-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + dependencies: + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-regex@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" + dependencies: + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-remap-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + dependencies: + babel-helper-optimise-call-expression "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-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-jest@^22.4.4: + version "22.4.4" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-22.4.4.tgz#977259240420e227444ebe49e226a61e49ea659d" + dependencies: + babel-plugin-istanbul "^4.1.5" + babel-preset-jest "^22.4.4" + +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-istanbul@^4.1.5: + version "4.1.6" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz#36c59b2192efce81c5b378321b74175add1c9a45" + dependencies: + babel-plugin-syntax-object-rest-spread "^6.13.0" + find-up "^2.1.0" + istanbul-lib-instrument "^1.10.1" + test-exclude "^4.2.1" + +babel-plugin-jest-hoist@^22.4.4: + version "22.4.4" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.4.4.tgz#b9851906eab34c7bf6f8c895a2b08bea1a844c0b" + +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-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-object-rest-spread@^6.13.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-to-generator@^6.22.0: + 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-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.23.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" + dependencies: + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-plugin-transform-es2015-classes@^6.23.0: + 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.22.0: + 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.23.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.22.0: + 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.23.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.22.0: + 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.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.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.26.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-types "^6.26.0" + +babel-plugin-transform-es2015-modules-systemjs@^6.23.0: + 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.23.0: + 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.22.0: + 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.23.0: + 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.22.0: + 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.22.0: + 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.23.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.22.0: + 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.22.0: + 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-regenerator@^6.22.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" + dependencies: + regenerator-transform "^0.10.0" + +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-polyfill@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" + dependencies: + babel-runtime "^6.26.0" + core-js "^2.5.0" + regenerator-runtime "^0.10.5" + +babel-preset-env@^1.6.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-to-generator "^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.23.0" + babel-plugin-transform-es2015-classes "^6.23.0" + babel-plugin-transform-es2015-computed-properties "^6.22.0" + babel-plugin-transform-es2015-destructuring "^6.23.0" + babel-plugin-transform-es2015-duplicate-keys "^6.22.0" + babel-plugin-transform-es2015-for-of "^6.23.0" + babel-plugin-transform-es2015-function-name "^6.22.0" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.22.0" + babel-plugin-transform-es2015-modules-commonjs "^6.23.0" + babel-plugin-transform-es2015-modules-systemjs "^6.23.0" + babel-plugin-transform-es2015-modules-umd "^6.23.0" + babel-plugin-transform-es2015-object-super "^6.22.0" + babel-plugin-transform-es2015-parameters "^6.23.0" + babel-plugin-transform-es2015-shorthand-properties "^6.22.0" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.22.0" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.23.0" + babel-plugin-transform-es2015-unicode-regex "^6.22.0" + babel-plugin-transform-exponentiation-operator "^6.22.0" + babel-plugin-transform-regenerator "^6.22.0" + browserslist "^3.2.6" + invariant "^2.2.2" + semver "^5.3.0" + +babel-preset-jest@^22.4.4: + version "22.4.4" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-22.4.4.tgz#ec9fbd8bcd7dfd24b8b5320e0e688013235b7c39" + dependencies: + babel-plugin-jest-hoist "^22.4.4" + babel-plugin-syntax-object-rest-spread "^6.13.0" + +babel-register@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + dependencies: + babel-core "^6.26.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" + home-or-tmp "^2.0.0" + lodash "^4.17.4" + mkdirp "^0.5.1" + source-map-support "^0.4.15" + +babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +bcrypt-pbkdf@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + dependencies: + tweetnacl "^0.14.3" + +binary-extensions@^1.0.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +braces@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +browser-process-hrtime@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e" + +browser-resolve@^1.11.2: + version "1.11.2" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" + dependencies: + resolve "1.1.7" + +browserslist@^3.2.6: + version "3.2.8" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" + dependencies: + caniuse-lite "^1.0.30000844" + electron-to-chromium "^1.3.47" + +bser@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" + dependencies: + node-int64 "^0.4.0" + +buffer-from@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.0.0.tgz#4cb8832d23612589b0406e9e2956c17f06fdf531" + +builtin-modules@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +caller-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" + dependencies: + callsites "^0.2.0" + +callsites@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + +camelcase@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + +camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + +caniuse-lite@^1.0.30000844: + version "1.0.30000844" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000844.tgz#de7c84cde0582143cf4f5abdf1b98e5a0539ad4a" + +capture-exit@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" + dependencies: + rsvp "^3.3.3" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +chalk@^1.1.3: + 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.0, chalk@^2.0.1, chalk@^2.1.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chardet@^0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" + +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" + +ci-info@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.3.tgz#710193264bb05c77b8c90d02f5aaf22216a667b2" + +circular-json@^0.3.1: + version "0.3.3" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +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.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + +cliui@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + +cliui@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + +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" + +codecov@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/codecov/-/codecov-3.0.2.tgz#aea43843a5cd2fb6b7e488b2eff25d367ab70b12" + dependencies: + argv "0.0.2" + request "^2.81.0" + urlgrey "0.4.4" + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" + dependencies: + color-name "^1.1.1" + +color-name@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + +combined-stream@1.0.6, combined-stream@~1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" + dependencies: + delayed-stream "~1.0.0" + +commander@^2.11.0: + version "2.15.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" + +compare-versions@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.2.1.tgz#a49eb7689d4caaf0b6db5220173fd279614000f7" + +component-emitter@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +concat-stream@^1.4.7, concat-stream@^1.6.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +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" + +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + +convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + +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.4.0, core-js@^2.5.0: + version "2.5.6" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.6.tgz#0fe6d45bf3cac3ac364a9d72de7576f4eb221b9d" + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +cross-spawn@^5.0.1, cross-spawn@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": + version "0.3.2" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" + +"cssstyle@>= 0.2.37 < 0.3.0": + version "0.2.37" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" + dependencies: + cssom "0.3.x" + +damerau-levenshtein@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz#03191c432cb6eea168bb77f3a55ffdccb8978514" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +data-urls@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.0.0.tgz#24802de4e81c298ea8a9388bb0d8e461c774684f" + dependencies: + abab "^1.0.4" + whatwg-mimetype "^2.0.0" + whatwg-url "^6.4.0" + +debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + dependencies: + ms "2.0.0" + +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: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + +deep-extend@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.5.1.tgz#b894a9dd90d3023fbf1c55a394fb858eb2066f1f" + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + +default-require-extensions@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" + dependencies: + strip-bom "^2.0.0" + +define-properties@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" + dependencies: + foreach "^2.0.5" + object-keys "^1.0.8" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +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" + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + dependencies: + repeating "^2.0.0" + +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + +detect-newline@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" + +diff@^3.2.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + +doctrine@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +doctrine@^2.0.2, doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + dependencies: + esutils "^2.0.2" + +domexception@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + dependencies: + webidl-conversions "^4.0.2" + +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" + +electron-to-chromium@^1.3.47: + version "1.3.48" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.48.tgz#d3b0d8593814044e092ece2108fc3ac9aea4b900" + +emoji-regex@^6.1.0: + version "6.5.1" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.5.1.tgz#9baea929b155565c11ea41c6626eaa65cef992c2" + +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" + +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.5.1, es-abstract@^1.7.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.11.0.tgz#cce87d518f0496893b1a30cd8461835535480681" + dependencies: + es-to-primitive "^1.1.1" + function-bind "^1.1.1" + has "^1.0.1" + is-callable "^1.1.3" + is-regex "^1.0.4" + +es-to-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" + dependencies: + is-callable "^1.1.1" + is-date-object "^1.0.1" + is-symbol "^1.0.1" + +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.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.1.tgz#dbae17ef96c8e4bedb1356f4504fa4cc2f7cb7e2" + dependencies: + esprima "^3.1.3" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +eslint-config-airbnb-base@^12.1.0: + version "12.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-12.1.0.tgz#386441e54a12ccd957b0a92564a4bafebd747944" + dependencies: + eslint-restricted-globals "^0.1.1" + +eslint-config-airbnb@^16.1.0: + version "16.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-16.1.0.tgz#2546bfb02cc9fe92284bf1723ccf2e87bc45ca46" + dependencies: + eslint-config-airbnb-base "^12.1.0" + +eslint-import-resolver-node@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" + dependencies: + debug "^2.6.9" + resolve "^1.5.0" + +eslint-module-utils@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz#b270362cd88b1a48ad308976ce7fa54e98411746" + dependencies: + debug "^2.6.8" + pkg-dir "^1.0.0" + +eslint-plugin-import@^2.11.0: + version "2.12.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.12.0.tgz#dad31781292d6664b25317fd049d2e2b2f02205d" + dependencies: + contains-path "^0.1.0" + debug "^2.6.8" + doctrine "1.5.0" + eslint-import-resolver-node "^0.3.1" + eslint-module-utils "^2.2.0" + has "^1.0.1" + lodash "^4.17.4" + minimatch "^3.0.3" + read-pkg-up "^2.0.0" + resolve "^1.6.0" + +eslint-plugin-jest@^21.15.1: + version "21.15.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-21.15.2.tgz#d55898636291d97e0c0a5dbe205bef0235157a34" + +eslint-plugin-jsx-a11y@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.0.3.tgz#54583d1ae442483162e040e13cc31865465100e5" + dependencies: + aria-query "^0.7.0" + array-includes "^3.0.3" + ast-types-flow "0.0.7" + axobject-query "^0.1.0" + damerau-levenshtein "^1.0.0" + emoji-regex "^6.1.0" + jsx-ast-utils "^2.0.0" + +eslint-plugin-react@^7.7.0: + version "7.8.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.8.2.tgz#e95c9c47fece55d2303d1a67c9d01b930b88a51d" + dependencies: + doctrine "^2.0.2" + has "^1.0.1" + jsx-ast-utils "^2.0.1" + prop-types "^15.6.0" + +eslint-restricted-globals@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz#35f0d5cbc64c2e3ed62e93b4b1a7af05ba7ed4d7" + +eslint-scope@^3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-visitor-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" + +eslint@^4.19.1: + version "4.19.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300" + dependencies: + ajv "^5.3.0" + babel-code-frame "^6.22.0" + chalk "^2.1.0" + concat-stream "^1.6.0" + cross-spawn "^5.1.0" + debug "^3.1.0" + doctrine "^2.1.0" + eslint-scope "^3.7.1" + eslint-visitor-keys "^1.0.0" + espree "^3.5.4" + esquery "^1.0.0" + esutils "^2.0.2" + file-entry-cache "^2.0.0" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^11.0.1" + ignore "^3.3.3" + imurmurhash "^0.1.4" + inquirer "^3.0.6" + is-resolvable "^1.0.0" + js-yaml "^3.9.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.4" + minimatch "^3.0.2" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.2" + pluralize "^7.0.0" + progress "^2.0.0" + regexpp "^1.0.1" + require-uncached "^1.0.3" + semver "^5.3.0" + strip-ansi "^4.0.0" + strip-json-comments "~2.0.1" + table "4.0.2" + text-table "~0.2.0" + +espree@^3.5.4: + version "3.5.4" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" + dependencies: + acorn "^5.5.0" + acorn-jsx "^3.0.0" + +esprima@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + +esprima@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" + +esquery@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" + dependencies: + estraverse "^4.0.0" + +esrecurse@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + dependencies: + estraverse "^4.1.0" + +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +exec-sh@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.1.tgz#163b98a6e89e6b65b47c2a28d215bc1f63989c38" + dependencies: + merge "^1.1.3" + +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" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + +expect@^22.4.0: + version "22.4.3" + resolved "https://registry.yarnpkg.com/expect/-/expect-22.4.3.tgz#d5a29d0a0e1fb2153557caef2674d4547e914674" + dependencies: + ansi-styles "^3.2.0" + jest-diff "^22.4.3" + jest-get-type "^22.4.3" + jest-matcher-utils "^22.4.3" + jest-message-util "^22.4.3" + jest-regex-util "^22.4.3" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@~3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + +external-editor@^2.0.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" + dependencies: + chardet "^0.4.0" + iconv-lite "^0.4.17" + tmp "^0.0.33" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + +fast-deep-equal@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" + +fast-json-stable-stringify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + +fb-watchman@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" + dependencies: + bser "^2.0.0" + +fbjs@^0.8.16: + version "0.8.16" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db" + 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" + +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" + +fileset@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" + dependencies: + glob "^7.0.3" + minimatch "^3.0.3" + +fill-range@^2.1.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^3.0.0" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + dependencies: + locate-path "^2.0.0" + +flat-cache@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" + dependencies: + circular-json "^0.3.1" + del "^2.0.2" + graceful-fs "^4.1.2" + write "^0.2.1" + +for-in@^1.0.1, for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + dependencies: + for-in "^1.0.1" + +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.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" + dependencies: + asynckit "^0.4.0" + combined-stream "1.0.6" + mime-types "^2.1.12" + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + dependencies: + map-cache "^0.2.2" + +fs-minipass@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" + dependencies: + minipass "^2.2.1" + +fs-readdir-recursive@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fsevents@^1.0.0, fsevents@^1.2.3: + version "1.2.4" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" + dependencies: + nan "^2.9.2" + node-pre-gyp "^0.10.0" + +function-bind@^1.0.2, function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +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-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + dependencies: + assert-plus "^1.0.0" + +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.0.3, glob@^7.0.5, glob@^7.1.1, 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" + +globals@^11.0.1: + version "11.5.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.5.0.tgz#6bc840de6771173b191f13d3a9c94d441ee92642" + +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + +globby@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" + dependencies: + array-union "^1.0.1" + arrify "^1.0.0" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + +handlebars@^4.0.3: + version "4.0.11" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" + dependencies: + async "^1.4.0" + optimist "^0.6.1" + source-map "^0.4.4" + optionalDependencies: + uglify-js "^2.6" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + +har-validator@~5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" + dependencies: + ajv "^5.1.0" + har-schema "^2.0.0" + +has-ansi@^2.0.0: + 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-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" + dependencies: + function-bind "^1.0.2" + +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" + +hosted-git-info@^2.1.4: + version "2.6.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.6.0.tgz#23235b29ab230c576aab0d4f13fc046b0b038222" + +html-encoding-sniffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + dependencies: + whatwg-encoding "^1.0.1" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +iconv-lite@0.4.19: + version "0.4.19" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" + +iconv-lite@^0.4.17, iconv-lite@^0.4.4, iconv-lite@~0.4.13: + version "0.4.23" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ignore-walk@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" + dependencies: + minimatch "^3.0.4" + +ignore@^3.3.3: + version "3.3.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.8.tgz#3f8e9c35d38708a3a7e0e9abb6c73e7ee7707b2b" + +import-local@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc" + dependencies: + pkg-dir "^2.0.0" + resolve-cwd "^2.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + +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.1, inherits@^2.0.3, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +ini@~1.3.0: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + +inquirer@^3.0.6: + version "3.3.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.0.4" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx-lite "^4.0.8" + rx-lite-aggregates "^4.0.8" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + +invariant@^2.2.2: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + dependencies: + kind-of "^6.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + dependencies: + builtin-modules "^1.0.0" + +is-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.1.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.1.0.tgz#247e4162e7860cebbdaf30b774d6b0ac7dcfe7a5" + dependencies: + ci-info "^1.0.0" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + +is-generator-fn@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-1.0.0.tgz#969d49e1bb3329f6bb7f09089be26578b2ddd46a" + +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-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + dependencies: + kind-of "^3.0.2" + +is-number@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + +is-odd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24" + dependencies: + is-number "^4.0.0" + +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + +is-path-in-cwd@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" + dependencies: + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + dependencies: + path-is-inside "^1.0.1" + +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + dependencies: + isobject "^3.0.1" + +is-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-regex@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + dependencies: + has "^1.0.1" + +is-resolvable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + +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-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" + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + +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" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + +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" + +istanbul-api@^1.1.14: + version "1.3.1" + resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.3.1.tgz#4c3b05d18c0016d1022e079b98dc82c40f488954" + dependencies: + async "^2.1.4" + compare-versions "^3.1.0" + fileset "^2.0.2" + istanbul-lib-coverage "^1.2.0" + istanbul-lib-hook "^1.2.0" + istanbul-lib-instrument "^1.10.1" + istanbul-lib-report "^1.1.4" + istanbul-lib-source-maps "^1.2.4" + istanbul-reports "^1.3.0" + js-yaml "^3.7.0" + mkdirp "^0.5.1" + once "^1.4.0" + +istanbul-lib-coverage@^1.1.1, istanbul-lib-coverage@^1.1.2, istanbul-lib-coverage@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz#f7d8f2e42b97e37fe796114cb0f9d68b5e3a4341" + +istanbul-lib-hook@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.2.0.tgz#ae556fd5a41a6e8efa0b1002b1e416dfeaf9816c" + dependencies: + append-transform "^0.4.0" + +istanbul-lib-instrument@^1.10.1, istanbul-lib-instrument@^1.8.0: + version "1.10.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz#724b4b6caceba8692d3f1f9d0727e279c401af7b" + dependencies: + babel-generator "^6.18.0" + babel-template "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + babylon "^6.18.0" + istanbul-lib-coverage "^1.2.0" + semver "^5.3.0" + +istanbul-lib-report@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.4.tgz#e886cdf505c4ebbd8e099e4396a90d0a28e2acb5" + dependencies: + istanbul-lib-coverage "^1.2.0" + mkdirp "^0.5.1" + path-parse "^1.0.5" + supports-color "^3.1.2" + +istanbul-lib-source-maps@^1.2.1: + version "1.2.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.3.tgz#20fb54b14e14b3fb6edb6aca3571fd2143db44e6" + dependencies: + debug "^3.1.0" + istanbul-lib-coverage "^1.1.2" + mkdirp "^0.5.1" + rimraf "^2.6.1" + source-map "^0.5.3" + +istanbul-lib-source-maps@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.4.tgz#cc7ccad61629f4efff8e2f78adb8c522c9976ec7" + dependencies: + debug "^3.1.0" + istanbul-lib-coverage "^1.2.0" + mkdirp "^0.5.1" + rimraf "^2.6.1" + source-map "^0.5.3" + +istanbul-reports@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.3.0.tgz#2f322e81e1d9520767597dca3c20a0cce89a3554" + dependencies: + handlebars "^4.0.3" + +jest-changed-files@^22.2.0: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-22.4.3.tgz#8882181e022c38bd46a2e4d18d44d19d90a90fb2" + dependencies: + throat "^4.0.0" + +jest-cli@^22.4.4: + version "22.4.4" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-22.4.4.tgz#68cd2a2aae983adb1e6638248ca21082fd6d9e90" + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.2" + graceful-fs "^4.1.11" + import-local "^1.0.0" + is-ci "^1.0.10" + istanbul-api "^1.1.14" + istanbul-lib-coverage "^1.1.1" + istanbul-lib-instrument "^1.8.0" + istanbul-lib-source-maps "^1.2.1" + jest-changed-files "^22.2.0" + jest-config "^22.4.4" + jest-environment-jsdom "^22.4.1" + jest-get-type "^22.1.0" + jest-haste-map "^22.4.2" + jest-message-util "^22.4.0" + jest-regex-util "^22.1.0" + jest-resolve-dependencies "^22.1.0" + jest-runner "^22.4.4" + jest-runtime "^22.4.4" + jest-snapshot "^22.4.0" + jest-util "^22.4.1" + jest-validate "^22.4.4" + jest-worker "^22.2.2" + micromatch "^2.3.11" + node-notifier "^5.2.1" + realpath-native "^1.0.0" + rimraf "^2.5.4" + slash "^1.0.0" + string-length "^2.0.0" + strip-ansi "^4.0.0" + which "^1.2.12" + yargs "^10.0.3" + +jest-config@^22.4.4: + version "22.4.4" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-22.4.4.tgz#72a521188720597169cd8b4ff86934ef5752d86a" + dependencies: + chalk "^2.0.1" + glob "^7.1.1" + jest-environment-jsdom "^22.4.1" + jest-environment-node "^22.4.1" + jest-get-type "^22.1.0" + jest-jasmine2 "^22.4.4" + jest-regex-util "^22.1.0" + jest-resolve "^22.4.2" + jest-util "^22.4.1" + jest-validate "^22.4.4" + pretty-format "^22.4.0" + +jest-diff@^22.4.0, jest-diff@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-22.4.3.tgz#e18cc3feff0aeef159d02310f2686d4065378030" + dependencies: + chalk "^2.0.1" + diff "^3.2.0" + jest-get-type "^22.4.3" + pretty-format "^22.4.3" + +jest-docblock@^22.4.0, jest-docblock@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-22.4.3.tgz#50886f132b42b280c903c592373bb6e93bb68b19" + dependencies: + detect-newline "^2.1.0" + +jest-environment-jsdom@^22.4.1: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-22.4.3.tgz#d67daa4155e33516aecdd35afd82d4abf0fa8a1e" + dependencies: + jest-mock "^22.4.3" + jest-util "^22.4.3" + jsdom "^11.5.1" + +jest-environment-node@^22.4.1: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-22.4.3.tgz#54c4eaa374c83dd52a9da8759be14ebe1d0b9129" + dependencies: + jest-mock "^22.4.3" + jest-util "^22.4.3" + +jest-get-type@^22.1.0, jest-get-type@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.4.3.tgz#e3a8504d8479342dd4420236b322869f18900ce4" + +jest-haste-map@^22.4.2: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-22.4.3.tgz#25842fa2ba350200767ac27f658d58b9d5c2e20b" + dependencies: + fb-watchman "^2.0.0" + graceful-fs "^4.1.11" + jest-docblock "^22.4.3" + jest-serializer "^22.4.3" + jest-worker "^22.4.3" + micromatch "^2.3.11" + sane "^2.0.0" + +jest-jasmine2@^22.4.4: + version "22.4.4" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-22.4.4.tgz#c55f92c961a141f693f869f5f081a79a10d24e23" + dependencies: + chalk "^2.0.1" + co "^4.6.0" + expect "^22.4.0" + graceful-fs "^4.1.11" + is-generator-fn "^1.0.0" + jest-diff "^22.4.0" + jest-matcher-utils "^22.4.0" + jest-message-util "^22.4.0" + jest-snapshot "^22.4.0" + jest-util "^22.4.1" + source-map-support "^0.5.0" + +jest-leak-detector@^22.4.0: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-22.4.3.tgz#2b7b263103afae8c52b6b91241a2de40117e5b35" + dependencies: + pretty-format "^22.4.3" + +jest-matcher-utils@^22.4.0, jest-matcher-utils@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz#4632fe428ebc73ebc194d3c7b65d37b161f710ff" + dependencies: + chalk "^2.0.1" + jest-get-type "^22.4.3" + pretty-format "^22.4.3" + +jest-message-util@^22.4.0, jest-message-util@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-22.4.3.tgz#cf3d38aafe4befddbfc455e57d65d5239e399eb7" + dependencies: + "@babel/code-frame" "^7.0.0-beta.35" + chalk "^2.0.1" + micromatch "^2.3.11" + slash "^1.0.0" + stack-utils "^1.0.1" + +jest-mock@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-22.4.3.tgz#f63ba2f07a1511772cdc7979733397df770aabc7" + +jest-regex-util@^22.1.0, jest-regex-util@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-22.4.3.tgz#a826eb191cdf22502198c5401a1fc04de9cef5af" + +jest-resolve-dependencies@^22.1.0: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-22.4.3.tgz#e2256a5a846732dc3969cb72f3c9ad7725a8195e" + dependencies: + jest-regex-util "^22.4.3" + +jest-resolve@^22.4.2: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-22.4.3.tgz#0ce9d438c8438229aa9b916968ec6b05c1abb4ea" + dependencies: + browser-resolve "^1.11.2" + chalk "^2.0.1" + +jest-runner@^22.4.4: + version "22.4.4" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-22.4.4.tgz#dfca7b7553e0fa617e7b1291aeb7ce83e540a907" + dependencies: + exit "^0.1.2" + jest-config "^22.4.4" + jest-docblock "^22.4.0" + jest-haste-map "^22.4.2" + jest-jasmine2 "^22.4.4" + jest-leak-detector "^22.4.0" + jest-message-util "^22.4.0" + jest-runtime "^22.4.4" + jest-util "^22.4.1" + jest-worker "^22.2.2" + throat "^4.0.0" + +jest-runtime@^22.4.4: + version "22.4.4" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-22.4.4.tgz#9ba7792fc75582a5be0f79af6f8fe8adea314048" + dependencies: + babel-core "^6.0.0" + babel-jest "^22.4.4" + babel-plugin-istanbul "^4.1.5" + chalk "^2.0.1" + convert-source-map "^1.4.0" + exit "^0.1.2" + graceful-fs "^4.1.11" + jest-config "^22.4.4" + jest-haste-map "^22.4.2" + jest-regex-util "^22.1.0" + jest-resolve "^22.4.2" + jest-util "^22.4.1" + jest-validate "^22.4.4" + json-stable-stringify "^1.0.1" + micromatch "^2.3.11" + realpath-native "^1.0.0" + slash "^1.0.0" + strip-bom "3.0.0" + write-file-atomic "^2.1.0" + yargs "^10.0.3" + +jest-serializer@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-22.4.3.tgz#a679b81a7f111e4766235f4f0c46d230ee0f7436" + +jest-snapshot@^22.4.0: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-22.4.3.tgz#b5c9b42846ffb9faccb76b841315ba67887362d2" + dependencies: + chalk "^2.0.1" + jest-diff "^22.4.3" + jest-matcher-utils "^22.4.3" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + pretty-format "^22.4.3" + +jest-util@^22.4.1, jest-util@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-22.4.3.tgz#c70fec8eec487c37b10b0809dc064a7ecf6aafac" + dependencies: + callsites "^2.0.0" + chalk "^2.0.1" + graceful-fs "^4.1.11" + is-ci "^1.0.10" + jest-message-util "^22.4.3" + mkdirp "^0.5.1" + source-map "^0.6.0" + +jest-validate@^22.4.4: + version "22.4.4" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-22.4.4.tgz#1dd0b616ef46c995de61810d85f57119dbbcec4d" + dependencies: + chalk "^2.0.1" + jest-config "^22.4.4" + jest-get-type "^22.1.0" + leven "^2.1.0" + pretty-format "^22.4.0" + +jest-worker@^22.2.2, jest-worker@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-22.4.3.tgz#5c421417cba1c0abf64bf56bd5fb7968d79dd40b" + dependencies: + merge-stream "^1.0.1" + +jest@^22.4.3: + version "22.4.4" + resolved "https://registry.yarnpkg.com/jest/-/jest-22.4.4.tgz#ffb36c9654b339a13e10b3d4b338eb3e9d49f6eb" + dependencies: + import-local "^1.0.0" + jest-cli "^22.4.4" + +js-tokens@^3.0.0, js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + +js-yaml@^3.7.0, js-yaml@^3.9.1: + version "3.11.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.11.0.tgz#597c1a8bd57152f26d622ce4117851a51f5ebaef" + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + +jsdom@^11.5.1: + version "11.10.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.10.0.tgz#a42cd54e88895dc765f03f15b807a474962ac3b5" + dependencies: + abab "^1.0.4" + acorn "^5.3.0" + acorn-globals "^4.1.0" + array-equal "^1.0.0" + cssom ">= 0.3.2 < 0.4.0" + cssstyle ">= 0.2.37 < 0.3.0" + data-urls "^1.0.0" + domexception "^1.0.0" + escodegen "^1.9.0" + html-encoding-sniffer "^1.0.2" + left-pad "^1.2.0" + nwmatcher "^1.4.3" + parse5 "4.0.0" + pn "^1.1.0" + request "^2.83.0" + request-promise-native "^1.0.5" + sax "^1.2.4" + symbol-tree "^3.2.2" + tough-cookie "^2.3.3" + w3c-hr-time "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.3" + whatwg-mimetype "^2.1.0" + whatwg-url "^6.4.0" + ws "^4.0.0" + xml-name-validator "^3.0.0" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + +json-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-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + +json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +json5@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +jsx-ast-utils@^2.0.0, jsx-ast-utils@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz#e801b1b39985e20fffc87b40e3748080e2dcac7f" + dependencies: + array-includes "^3.0.3" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + +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" + +left-pad@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + +leven@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" + +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" + +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" + +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.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + +lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.4, lodash@^4.3.0: + version "4.17.10" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" + +longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + +loose-envify@^1.0.0, 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" + +lru-cache@^4.0.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + dependencies: + tmpl "1.0.x" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + dependencies: + object-visit "^1.0.0" + +math-random@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac" + +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" + +merge-stream@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" + dependencies: + readable-stream "^2.0.1" + +merge@^1.1.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" + +micromatch@^2.1.5, micromatch@^2.3.11: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +micromatch@^3.1.4, micromatch@^3.1.8: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +mime-db@~1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" + +mime-types@^2.1.12, mime-types@~2.1.17: + version "2.1.18" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" + dependencies: + mime-db "~1.33.0" + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + +minimatch@^3.0.2, minimatch@^3.0.3, 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.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@^1.1.1, minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + +minipass@^2.2.1, minipass@^2.2.4: + version "2.3.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233" + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" + dependencies: + minipass "^2.2.1" + +mixin-deep@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.0, mkdirp@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +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.9.2: + version "2.10.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" + +nanomatch@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-odd "^2.0.0" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + +needle@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d" + dependencies: + debug "^2.1.2" + iconv-lite "^0.4.4" + sax "^1.2.4" + +node-fetch@^1.0.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + +node-notifier@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea" + dependencies: + growly "^1.3.0" + semver "^5.4.1" + shellwords "^0.1.1" + which "^1.3.0" + +node-pre-gyp@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.0.tgz#6e4ef5bb5c5203c6552448828c852c40111aac46" + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.0" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.1.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" + +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: + version "2.4.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + dependencies: + remove-trailing-separator "^1.0.1" + +npm-bundled@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308" + +npm-packlist@^1.1.6: + version "1.1.10" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.10.tgz#1039db9e985727e464df066f4cf0ab6ef85c398a" + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + +npm-run-path@^2.0.0: + 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.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +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" + +nwmatcher@^1.4.3: + version "1.4.4" + resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.4.tgz#2285631f34a95f0d0395cd900c96ed39b58f346e" + +oauth-sign@~0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +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-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-keys@^1.0.8: + version "1.0.11" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + dependencies: + isobject "^3.0.0" + +object.getownpropertydescriptors@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.1" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + dependencies: + isobject "^3.0.1" + +once@^1.3.0, 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" + +optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +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" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-locale@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" + dependencies: + execa "^0.7.0" + lcid "^1.0.0" + mem "^1.1.0" + +os-shim@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +output-file-sync@^1.1.2: + 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" + +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.2.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c" + dependencies: + p-try "^1.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + dependencies: + p-limit "^1.1.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + +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" + +parse5@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + dependencies: + pinkie-promise "^2.0.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-is-inside@^1.0.1, path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + +path-key@^2.0.0: + 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-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" + +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: + 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" + +pkg-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" + dependencies: + find-up "^1.0.0" + +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + dependencies: + find-up "^2.1.0" + +pluralize@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" + +pn@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + +pre-commit@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/pre-commit/-/pre-commit-1.2.2.tgz#dbcee0ee9de7235e57f79c56d7ce94641a69eec6" + dependencies: + cross-spawn "^5.0.1" + spawn-sync "^1.0.15" + which "1.2.x" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + +pretty-format@^22.4.0, pretty-format@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-22.4.3.tgz#f873d780839a9c02e9664c8a082e9ee79eaac16f" + dependencies: + ansi-regex "^3.0.0" + ansi-styles "^3.2.0" + +private@^0.1.6, private@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + +process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + +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.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + dependencies: + asap "~2.0.3" + +prop-types@^15.6.0: + version "15.6.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca" + dependencies: + fbjs "^0.8.16" + loose-envify "^1.3.1" + object-assign "^4.1.1" + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + +qs@~6.5.1: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + +randomatic@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.0.0.tgz#d35490030eb4f7578de292ce6dfb04a91a128923" + dependencies: + is-number "^4.0.0" + kind-of "^6.0.0" + math-random "^1.0.1" + +rc@^1.1.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.7.tgz#8a10ca30d588d00464360372b890d06dacd02297" + dependencies: + deep-extend "^0.5.1" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +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.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.2: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +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" + +realpath-native@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.0.0.tgz#7885721a83b43bd5327609f0ddecb2482305fdf0" + dependencies: + util.promisify "^1.0.0" + +regenerate@^1.2.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + +regenerator-runtime@^0.10.5: + version "0.10.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + +regenerator-transform@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + +regex-cache@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + dependencies: + is-equal-shallow "^0.1.3" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexpp@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" + +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + dependencies: + jsesc "~0.5.0" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + +repeat-element@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + +repeat-string@^1.5.2, repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + dependencies: + is-finite "^1.0.0" + +request-promise-core@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" + dependencies: + lodash "^4.13.1" + +request-promise-native@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5" + dependencies: + request-promise-core "1.1.1" + stealthy-require "^1.1.0" + tough-cookie ">=2.3.3" + +request@^2.81.0, request@^2.83.0: + version "2.87.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.6.0" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.1" + forever-agent "~0.6.1" + form-data "~2.3.1" + har-validator "~5.0.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.17" + oauth-sign "~0.8.2" + performance-now "^2.1.0" + qs "~6.5.1" + safe-buffer "^5.1.1" + tough-cookie "~2.3.3" + tunnel-agent "^0.6.0" + uuid "^3.1.0" + +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" + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + dependencies: + resolve-from "^3.0.0" + +resolve-from@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + +resolve@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + +resolve@^1.5.0, resolve@^1.6.0: + version "1.7.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.7.1.tgz#aadd656374fd298aee895bc026b8297418677fd3" + dependencies: + path-parse "^1.0.5" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + +right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + dependencies: + align-text "^0.1.1" + +rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" + dependencies: + glob "^7.0.5" + +rsvp@^3.3.3: + version "3.6.2" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" + +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" + +safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + +sane@^2.0.0: + version "2.5.2" + resolved "https://registry.yarnpkg.com/sane/-/sane-2.5.2.tgz#b4dc1861c21b427e929507a3e751e2a2cb8ab3fa" + dependencies: + anymatch "^2.0.0" + capture-exit "^1.2.0" + exec-sh "^0.2.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" + watch "~0.18.0" + optionalDependencies: + fsevents "^1.2.3" + +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1: + version "5.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" + +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" + +set-value@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.1" + to-object-path "^0.3.0" + +set-value@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + +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" + +shellwords@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + +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" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + +slice-ansi@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" + dependencies: + is-fullwidth-code-point "^2.0.0" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +source-map-resolve@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + dependencies: + atob "^2.1.1" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.4.15: + version "0.4.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + dependencies: + source-map "^0.5.6" + +source-map-support@^0.5.0: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13" + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + +source-map@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + dependencies: + amdefine ">=0.0.4" + +source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + +source-map@^0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + +spawn-sync@^1.0.15: + version "1.0.15" + resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476" + dependencies: + concat-stream "^1.4.7" + os-shim "^0.1.2" + +spdx-correct@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9" + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87" + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + +sshpk@^1.7.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.1.tgz#130f5975eddad963f1d56f92b9ac6c51fa9f83eb" + 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" + +stack-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.1.tgz#d4f33ab54e8e38778b0ca5cfd3b3afb12db68620" + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +stealthy-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + +string-length@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" + dependencies: + astral-regex "^1.0.0" + strip-ansi "^4.0.0" + +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, string-width@^2.1.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + dependencies: + ansi-regex "^3.0.0" + +strip-bom@3.0.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-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-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + +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" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +supports-color@^3.1.2: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + dependencies: + has-flag "^1.0.0" + +supports-color@^5.3.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" + dependencies: + has-flag "^3.0.0" + +symbol-tree@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" + +table@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" + dependencies: + ajv "^5.2.3" + ajv-keywords "^2.1.0" + chalk "^2.1.0" + lodash "^4.17.4" + slice-ansi "1.0.0" + string-width "^2.1.1" + +tar@^4: + version "4.4.2" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.2.tgz#60685211ba46b38847b1ae7ee1a24d744a2cd462" + dependencies: + chownr "^1.0.1" + fs-minipass "^1.2.5" + minipass "^2.2.4" + minizlib "^1.1.0" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.2" + +test-exclude@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.1.tgz#dfa222f03480bca69207ca728b37d74b45f724fa" + dependencies: + arrify "^1.0.1" + micromatch "^3.1.8" + object-assign "^4.1.0" + read-pkg-up "^1.0.1" + require-main-filename "^1.0.1" + +text-table@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + +throat@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + dependencies: + os-tmpdir "~1.0.2" + +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +tough-cookie@>=2.3.3, tough-cookie@^2.3.3, tough-cookie@~2.3.3: + version "2.3.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" + dependencies: + punycode "^1.4.1" + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + dependencies: + punycode "^2.1.0" + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + dependencies: + prelude-ls "~1.1.2" + +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.9: + version "0.7.18" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.18.tgz#a7bfd92f56edfb117083b69e31d2aa8882d4b1ed" + +uglify-js@^2.6: + version "2.8.29" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" + optionalDependencies: + uglify-to-browserify "~1.0.0" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + +union-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^0.4.3" + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + +urlgrey@0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/urlgrey/-/urlgrey-0.4.4.tgz#892fe95960805e85519f1cd4389f2cb4cbb7652f" + +use@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.0.tgz#14716bf03fdfefd03040aef58d8b4b85f3a7c544" + dependencies: + kind-of "^6.0.2" + +user-home@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +util.promisify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + +uuid@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" + +v8flags@^2.1.1: + 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.3" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338" + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +w3c-hr-time@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" + dependencies: + browser-process-hrtime "^0.1.2" + +walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + dependencies: + makeerror "1.0.x" + +watch@~0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986" + dependencies: + exec-sh "^0.2.0" + minimist "^1.2.0" + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3" + dependencies: + iconv-lite "0.4.19" + +whatwg-fetch@>=0.10.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" + +whatwg-mimetype@^2.0.0, whatwg-mimetype@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz#f0f21d76cbba72362eb609dbed2a30cd17fcc7d4" + +whatwg-url@^6.4.0: + version "6.4.1" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.4.1.tgz#fdb94b440fd4ad836202c16e9737d511f012fd67" + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +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.2.x: + version "1.2.14" + resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" + dependencies: + isexe "^2.0.0" + +which@^1.2.12, which@^1.2.9, which@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" + 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" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + +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.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +write@^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@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-4.1.0.tgz#a979b5d7d4da68bf54efe0408967c324869a7289" + dependencies: + async-limiter "~1.0.0" + safe-buffer "~5.1.0" + +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + +y18n@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + +yallist@^3.0.0, yallist@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" + +yargs-parser@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950" + dependencies: + camelcase "^4.1.0" + +yargs@^10.0.3: + version "10.1.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.2.tgz#454d074c2b16a51a43e2fb7807e4f9de69ccb5c5" + dependencies: + cliui "^4.0.0" + decamelize "^1.1.1" + find-up "^2.1.0" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^8.1.0" + +yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0" From f4d5184829de34df97b38a1b76e9fb7f404c53fa Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Wed, 23 May 2018 22:48:17 +0200 Subject: [PATCH 315/327] Corrected typo --- src/algorithms/uncategorized/knight-tour/knightTour.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/algorithms/uncategorized/knight-tour/knightTour.js b/src/algorithms/uncategorized/knight-tour/knightTour.js index d72791583..c9c27370b 100644 --- a/src/algorithms/uncategorized/knight-tour/knightTour.js +++ b/src/algorithms/uncategorized/knight-tour/knightTour.js @@ -4,7 +4,7 @@ * @return {number[][]} */ function getPossibleMoves(chessboard, position) { - // Generate all knight moves (event those that goes beyond the board). + // Generate all knight moves (even those that go beyond the board). const possibleMoves = [ [position[0] - 1, position[1] - 2], [position[0] - 2, position[1] - 1], From 1f8f6c649b0cfe6f99c67a0cead1a0b07d2265e3 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Wed, 23 May 2018 23:57:32 +0300 Subject: [PATCH 316/327] improve readability in some sorting algorithms --- .../sorting/insertion-sort/InsertionSort.js | 2 +- .../sorting/quick-sort/QuickSort.js | 2 +- .../sorting/selection-sort/SelectionSort.js | 2 +- .../sorting/shell-sort/ShellSort.js | 2 +- yarn.lock | 4265 ----------------- 5 files changed, 4 insertions(+), 4269 deletions(-) delete mode 100644 yarn.lock diff --git a/src/algorithms/sorting/insertion-sort/InsertionSort.js b/src/algorithms/sorting/insertion-sort/InsertionSort.js index 7b74acd77..76cdd6d3d 100644 --- a/src/algorithms/sorting/insertion-sort/InsertionSort.js +++ b/src/algorithms/sorting/insertion-sort/InsertionSort.js @@ -2,7 +2,7 @@ import Sort from '../Sort'; export default class InsertionSort extends Sort { sort(originalArray) { - const array = originalArray.slice(0); + const array = [...originalArray]; // Go through all array elements... for (let i = 0; i < array.length; i += 1) { diff --git a/src/algorithms/sorting/quick-sort/QuickSort.js b/src/algorithms/sorting/quick-sort/QuickSort.js index d97e28970..e436a3054 100644 --- a/src/algorithms/sorting/quick-sort/QuickSort.js +++ b/src/algorithms/sorting/quick-sort/QuickSort.js @@ -3,7 +3,7 @@ import Sort from '../Sort'; export default class QuickSort extends Sort { sort(originalArray) { // Clone original array to prevent it from modification. - const array = originalArray.slice(0); + const array = [...originalArray]; // If array has less then or equal to one elements then it is already sorted. if (array.length <= 1) { diff --git a/src/algorithms/sorting/selection-sort/SelectionSort.js b/src/algorithms/sorting/selection-sort/SelectionSort.js index e26347ec9..575582110 100644 --- a/src/algorithms/sorting/selection-sort/SelectionSort.js +++ b/src/algorithms/sorting/selection-sort/SelectionSort.js @@ -3,7 +3,7 @@ import Sort from '../Sort'; export default class SelectionSort extends Sort { sort(originalArray) { // Clone original array to prevent its modification. - const array = originalArray.slice(0); + const array = [...originalArray]; for (let i = 0; i < array.length - 1; i += 1) { let minIndex = i; diff --git a/src/algorithms/sorting/shell-sort/ShellSort.js b/src/algorithms/sorting/shell-sort/ShellSort.js index eac410456..661654153 100644 --- a/src/algorithms/sorting/shell-sort/ShellSort.js +++ b/src/algorithms/sorting/shell-sort/ShellSort.js @@ -3,7 +3,7 @@ import Sort from '../Sort'; export default class ShellSort extends Sort { sort(originalArray) { // Prevent original array from mutations. - const array = originalArray.slice(0); + const array = [...originalArray]; // Define a gap distance. let gap = Math.floor(array.length / 2); diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index f7f3096f6..000000000 --- a/yarn.lock +++ /dev/null @@ -1,4265 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/code-frame@^7.0.0-beta.35": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.47.tgz#d18c2f4c4ba8d093a2bcfab5616593bfe2441a27" - dependencies: - "@babel/highlight" "7.0.0-beta.47" - -"@babel/highlight@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.47.tgz#8fbc83fb2a21f0bd2b95cdbeb238cf9689cad494" - dependencies: - chalk "^2.0.0" - esutils "^2.0.2" - js-tokens "^3.0.0" - -"@types/jest@^22.2.3": - version "22.2.3" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-22.2.3.tgz#0157c0316dc3722c43a7b71de3fdf3acbccef10d" - -abab@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - -acorn-globals@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538" - dependencies: - acorn "^5.0.0" - -acorn-jsx@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" - dependencies: - acorn "^3.0.4" - -acorn@^3.0.4: - version "3.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" - -acorn@^5.0.0, acorn@^5.3.0, acorn@^5.5.0: - version "5.5.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.3.tgz#f473dd47e0277a08e28e9bec5aeeb04751f0b8c9" - -ajv-keywords@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" - -ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0: - version "5.5.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" - dependencies: - co "^4.6.0" - fast-deep-equal "^1.0.0" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.3.0" - -align-text@^0.1.1, align-text@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" - dependencies: - kind-of "^3.0.2" - longest "^1.0.1" - repeat-string "^1.5.2" - -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - -ansi-escapes@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - -ansi-styles@^3.2.0, ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - dependencies: - color-convert "^1.9.0" - -anymatch@^1.3.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" - dependencies: - micromatch "^2.1.5" - normalize-path "^2.0.0" - -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - -append-transform@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" - dependencies: - default-require-extensions "^1.0.0" - -aproba@^1.0.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - -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.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - dependencies: - sprintf-js "~1.0.2" - -argv@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/argv/-/argv-0.0.2.tgz#ecbd16f8949b157183711b1bda334f37840185ab" - -aria-query@^0.7.0: - version "0.7.1" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-0.7.1.tgz#26cbb5aff64144b0a825be1846e0b16cfa00b11e" - dependencies: - ast-types-flow "0.0.7" - commander "^2.11.0" - -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - dependencies: - arr-flatten "^1.0.1" - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - -arr-flatten@^1.0.1, arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - -array-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" - -array-includes@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" - dependencies: - define-properties "^1.1.2" - es-abstract "^1.7.0" - -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" - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - -arrify@^1.0.0, arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - -asap@~2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - -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" - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - -ast-types-flow@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" - -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - -async-each@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" - -async-limiter@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" - -async@^1.4.0: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - -async@^2.1.4: - version "2.6.1" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" - dependencies: - lodash "^4.17.10" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - -atob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a" - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - -aws4@^1.6.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289" - -axobject-query@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-0.1.0.tgz#62f59dbc59c9f9242759ca349960e7a2fe3c36c0" - dependencies: - ast-types-flow "0.0.7" - -babel-cli@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.26.0.tgz#502ab54874d7db88ad00b887a06383ce03d002f1" - dependencies: - babel-core "^6.26.0" - babel-polyfill "^6.26.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - commander "^2.11.0" - convert-source-map "^1.5.0" - fs-readdir-recursive "^1.0.0" - glob "^7.1.2" - lodash "^4.17.4" - output-file-sync "^1.1.2" - path-is-absolute "^1.0.1" - slash "^1.0.0" - source-map "^0.5.6" - v8flags "^2.1.1" - optionalDependencies: - chokidar "^1.6.1" - -babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" - dependencies: - chalk "^1.1.3" - esutils "^2.0.2" - js-tokens "^3.0.2" - -babel-core@^6.0.0, babel-core@^6.26.0: - version "6.26.3" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" - dependencies: - babel-code-frame "^6.26.0" - babel-generator "^6.26.0" - babel-helpers "^6.24.1" - babel-messages "^6.23.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - convert-source-map "^1.5.1" - debug "^2.6.9" - json5 "^0.5.1" - lodash "^4.17.4" - minimatch "^3.0.4" - path-is-absolute "^1.0.1" - private "^0.1.8" - slash "^1.0.0" - source-map "^0.5.7" - -babel-generator@^6.18.0, babel-generator@^6.26.0: - version "6.26.1" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" - dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.17.4" - source-map "^0.5.7" - trim-right "^1.0.1" - -babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" - dependencies: - babel-helper-explode-assignable-expression "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-call-delegate@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-define-map@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-explode-assignable-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-function-name@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" - dependencies: - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-get-function-arity@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-hoist-variables@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-optimise-call-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-regex@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" - dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-remap-async-to-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-replace-supers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" - dependencies: - babel-helper-optimise-call-expression "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-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-jest@^22.4.4: - version "22.4.4" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-22.4.4.tgz#977259240420e227444ebe49e226a61e49ea659d" - dependencies: - babel-plugin-istanbul "^4.1.5" - babel-preset-jest "^22.4.4" - -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-istanbul@^4.1.5: - version "4.1.6" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz#36c59b2192efce81c5b378321b74175add1c9a45" - dependencies: - babel-plugin-syntax-object-rest-spread "^6.13.0" - find-up "^2.1.0" - istanbul-lib-instrument "^1.10.1" - test-exclude "^4.2.1" - -babel-plugin-jest-hoist@^22.4.4: - version "22.4.4" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.4.4.tgz#b9851906eab34c7bf6f8c895a2b08bea1a844c0b" - -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-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-object-rest-spread@^6.13.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-to-generator@^6.22.0: - 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-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.23.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" - dependencies: - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-plugin-transform-es2015-classes@^6.23.0: - 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.22.0: - 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.23.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.22.0: - 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.23.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.22.0: - 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.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.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: - version "6.26.2" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" - dependencies: - babel-plugin-transform-strict-mode "^6.24.1" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-types "^6.26.0" - -babel-plugin-transform-es2015-modules-systemjs@^6.23.0: - 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.23.0: - 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.22.0: - 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.23.0: - 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.22.0: - 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.22.0: - 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.23.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.22.0: - 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.22.0: - 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-regenerator@^6.22.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" - dependencies: - regenerator-transform "^0.10.0" - -babel-plugin-transform-strict-mode@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-polyfill@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" - dependencies: - babel-runtime "^6.26.0" - core-js "^2.5.0" - regenerator-runtime "^0.10.5" - -babel-preset-env@^1.6.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" - dependencies: - babel-plugin-check-es2015-constants "^6.22.0" - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-to-generator "^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.23.0" - babel-plugin-transform-es2015-classes "^6.23.0" - babel-plugin-transform-es2015-computed-properties "^6.22.0" - babel-plugin-transform-es2015-destructuring "^6.23.0" - babel-plugin-transform-es2015-duplicate-keys "^6.22.0" - babel-plugin-transform-es2015-for-of "^6.23.0" - babel-plugin-transform-es2015-function-name "^6.22.0" - babel-plugin-transform-es2015-literals "^6.22.0" - babel-plugin-transform-es2015-modules-amd "^6.22.0" - babel-plugin-transform-es2015-modules-commonjs "^6.23.0" - babel-plugin-transform-es2015-modules-systemjs "^6.23.0" - babel-plugin-transform-es2015-modules-umd "^6.23.0" - babel-plugin-transform-es2015-object-super "^6.22.0" - babel-plugin-transform-es2015-parameters "^6.23.0" - babel-plugin-transform-es2015-shorthand-properties "^6.22.0" - babel-plugin-transform-es2015-spread "^6.22.0" - babel-plugin-transform-es2015-sticky-regex "^6.22.0" - babel-plugin-transform-es2015-template-literals "^6.22.0" - babel-plugin-transform-es2015-typeof-symbol "^6.23.0" - babel-plugin-transform-es2015-unicode-regex "^6.22.0" - babel-plugin-transform-exponentiation-operator "^6.22.0" - babel-plugin-transform-regenerator "^6.22.0" - browserslist "^3.2.6" - invariant "^2.2.2" - semver "^5.3.0" - -babel-preset-jest@^22.4.4: - version "22.4.4" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-22.4.4.tgz#ec9fbd8bcd7dfd24b8b5320e0e688013235b7c39" - dependencies: - babel-plugin-jest-hoist "^22.4.4" - babel-plugin-syntax-object-rest-spread "^6.13.0" - -babel-register@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" - dependencies: - babel-core "^6.26.0" - babel-runtime "^6.26.0" - core-js "^2.5.0" - home-or-tmp "^2.0.0" - lodash "^4.17.4" - mkdirp "^0.5.1" - source-map-support "^0.4.15" - -babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - -babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" - dependencies: - babel-runtime "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - lodash "^4.17.4" - -babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" - dependencies: - babel-code-frame "^6.26.0" - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - debug "^2.6.8" - globals "^9.18.0" - invariant "^2.2.2" - lodash "^4.17.4" - -babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" - dependencies: - babel-runtime "^6.26.0" - esutils "^2.0.2" - lodash "^4.17.4" - to-fast-properties "^1.0.3" - -babylon@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -bcrypt-pbkdf@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" - dependencies: - tweetnacl "^0.14.3" - -binary-extensions@^1.0.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^1.8.2: - version "1.8.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" - repeat-element "^1.1.2" - -braces@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -browser-process-hrtime@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e" - -browser-resolve@^1.11.2: - version "1.11.2" - resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" - dependencies: - resolve "1.1.7" - -browserslist@^3.2.6: - version "3.2.8" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" - dependencies: - caniuse-lite "^1.0.30000844" - electron-to-chromium "^1.3.47" - -bser@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" - dependencies: - node-int64 "^0.4.0" - -buffer-from@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.0.0.tgz#4cb8832d23612589b0406e9e2956c17f06fdf531" - -builtin-modules@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -caller-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" - dependencies: - callsites "^0.2.0" - -callsites@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" - -callsites@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" - -camelcase@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" - -camelcase@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - -caniuse-lite@^1.0.30000844: - version "1.0.30000844" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000844.tgz#de7c84cde0582143cf4f5abdf1b98e5a0539ad4a" - -capture-exit@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" - dependencies: - rsvp "^3.3.3" - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - -center-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" - dependencies: - align-text "^0.1.3" - lazy-cache "^1.0.3" - -chalk@^1.1.3: - 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.0, chalk@^2.0.1, chalk@^2.1.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chardet@^0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" - -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" - -ci-info@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.3.tgz#710193264bb05c77b8c90d02f5aaf22216a667b2" - -circular-json@^0.3.1: - version "0.3.3" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -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.2.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - -cliui@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" - dependencies: - center-align "^0.1.1" - right-align "^0.1.1" - wordwrap "0.0.2" - -cliui@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" - dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - wrap-ansi "^2.0.0" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - -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" - -codecov@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/codecov/-/codecov-3.0.2.tgz#aea43843a5cd2fb6b7e488b2eff25d367ab70b12" - dependencies: - argv "0.0.2" - request "^2.81.0" - urlgrey "0.4.4" - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" - dependencies: - color-name "^1.1.1" - -color-name@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - -combined-stream@1.0.6, combined-stream@~1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" - dependencies: - delayed-stream "~1.0.0" - -commander@^2.11.0: - version "2.15.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" - -compare-versions@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.2.1.tgz#a49eb7689d4caaf0b6db5220173fd279614000f7" - -component-emitter@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - -concat-stream@^1.4.7, concat-stream@^1.6.0: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -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" - -contains-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" - -convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - -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.4.0, core-js@^2.5.0: - version "2.5.6" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.6.tgz#0fe6d45bf3cac3ac364a9d72de7576f4eb221b9d" - -core-util-is@1.0.2, core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - -cross-spawn@^5.0.1, cross-spawn@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" - -cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": - version "0.3.2" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" - -"cssstyle@>= 0.2.37 < 0.3.0": - version "0.2.37" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" - dependencies: - cssom "0.3.x" - -damerau-levenshtein@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz#03191c432cb6eea168bb77f3a55ffdccb8978514" - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - dependencies: - assert-plus "^1.0.0" - -data-urls@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.0.0.tgz#24802de4e81c298ea8a9388bb0d8e461c774684f" - dependencies: - abab "^1.0.4" - whatwg-mimetype "^2.0.0" - whatwg-url "^6.4.0" - -debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - dependencies: - ms "2.0.0" - -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: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - -deep-extend@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.5.1.tgz#b894a9dd90d3023fbf1c55a394fb858eb2066f1f" - -deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - -default-require-extensions@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" - dependencies: - strip-bom "^2.0.0" - -define-properties@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" - dependencies: - foreach "^2.0.5" - object-keys "^1.0.8" - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -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" - -detect-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - dependencies: - repeating "^2.0.0" - -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - -detect-newline@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" - -diff@^3.2.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - -doctrine@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" - dependencies: - esutils "^2.0.2" - isarray "^1.0.0" - -doctrine@^2.0.2, doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - dependencies: - esutils "^2.0.2" - -domexception@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" - dependencies: - webidl-conversions "^4.0.2" - -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" - -electron-to-chromium@^1.3.47: - version "1.3.48" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.48.tgz#d3b0d8593814044e092ece2108fc3ac9aea4b900" - -emoji-regex@^6.1.0: - version "6.5.1" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.5.1.tgz#9baea929b155565c11ea41c6626eaa65cef992c2" - -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" - -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.5.1, es-abstract@^1.7.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.11.0.tgz#cce87d518f0496893b1a30cd8461835535480681" - dependencies: - es-to-primitive "^1.1.1" - function-bind "^1.1.1" - has "^1.0.1" - is-callable "^1.1.3" - is-regex "^1.0.4" - -es-to-primitive@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" - dependencies: - is-callable "^1.1.1" - is-date-object "^1.0.1" - is-symbol "^1.0.1" - -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.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.1.tgz#dbae17ef96c8e4bedb1356f4504fa4cc2f7cb7e2" - dependencies: - esprima "^3.1.3" - estraverse "^4.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -eslint-config-airbnb-base@^12.1.0: - version "12.1.0" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-12.1.0.tgz#386441e54a12ccd957b0a92564a4bafebd747944" - dependencies: - eslint-restricted-globals "^0.1.1" - -eslint-config-airbnb@^16.1.0: - version "16.1.0" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-16.1.0.tgz#2546bfb02cc9fe92284bf1723ccf2e87bc45ca46" - dependencies: - eslint-config-airbnb-base "^12.1.0" - -eslint-import-resolver-node@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" - dependencies: - debug "^2.6.9" - resolve "^1.5.0" - -eslint-module-utils@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz#b270362cd88b1a48ad308976ce7fa54e98411746" - dependencies: - debug "^2.6.8" - pkg-dir "^1.0.0" - -eslint-plugin-import@^2.11.0: - version "2.12.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.12.0.tgz#dad31781292d6664b25317fd049d2e2b2f02205d" - dependencies: - contains-path "^0.1.0" - debug "^2.6.8" - doctrine "1.5.0" - eslint-import-resolver-node "^0.3.1" - eslint-module-utils "^2.2.0" - has "^1.0.1" - lodash "^4.17.4" - minimatch "^3.0.3" - read-pkg-up "^2.0.0" - resolve "^1.6.0" - -eslint-plugin-jest@^21.15.1: - version "21.15.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-21.15.2.tgz#d55898636291d97e0c0a5dbe205bef0235157a34" - -eslint-plugin-jsx-a11y@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.0.3.tgz#54583d1ae442483162e040e13cc31865465100e5" - dependencies: - aria-query "^0.7.0" - array-includes "^3.0.3" - ast-types-flow "0.0.7" - axobject-query "^0.1.0" - damerau-levenshtein "^1.0.0" - emoji-regex "^6.1.0" - jsx-ast-utils "^2.0.0" - -eslint-plugin-react@^7.7.0: - version "7.8.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.8.2.tgz#e95c9c47fece55d2303d1a67c9d01b930b88a51d" - dependencies: - doctrine "^2.0.2" - has "^1.0.1" - jsx-ast-utils "^2.0.1" - prop-types "^15.6.0" - -eslint-restricted-globals@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz#35f0d5cbc64c2e3ed62e93b4b1a7af05ba7ed4d7" - -eslint-scope@^3.7.1: - version "3.7.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-visitor-keys@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" - -eslint@^4.19.1: - version "4.19.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300" - dependencies: - ajv "^5.3.0" - babel-code-frame "^6.22.0" - chalk "^2.1.0" - concat-stream "^1.6.0" - cross-spawn "^5.1.0" - debug "^3.1.0" - doctrine "^2.1.0" - eslint-scope "^3.7.1" - eslint-visitor-keys "^1.0.0" - espree "^3.5.4" - esquery "^1.0.0" - esutils "^2.0.2" - file-entry-cache "^2.0.0" - functional-red-black-tree "^1.0.1" - glob "^7.1.2" - globals "^11.0.1" - ignore "^3.3.3" - imurmurhash "^0.1.4" - inquirer "^3.0.6" - is-resolvable "^1.0.0" - js-yaml "^3.9.1" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.4" - minimatch "^3.0.2" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.2" - pluralize "^7.0.0" - progress "^2.0.0" - regexpp "^1.0.1" - require-uncached "^1.0.3" - semver "^5.3.0" - strip-ansi "^4.0.0" - strip-json-comments "~2.0.1" - table "4.0.2" - text-table "~0.2.0" - -espree@^3.5.4: - version "3.5.4" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" - dependencies: - acorn "^5.5.0" - acorn-jsx "^3.0.0" - -esprima@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" - -esprima@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" - -esquery@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" - dependencies: - estraverse "^4.0.0" - -esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - dependencies: - estraverse "^4.1.0" - -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" - -esutils@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" - -exec-sh@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.1.tgz#163b98a6e89e6b65b47c2a28d215bc1f63989c38" - dependencies: - merge "^1.1.3" - -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" - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - -expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - dependencies: - is-posix-bracket "^0.1.0" - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -expand-range@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - dependencies: - fill-range "^2.1.0" - -expect@^22.4.0: - version "22.4.3" - resolved "https://registry.yarnpkg.com/expect/-/expect-22.4.3.tgz#d5a29d0a0e1fb2153557caef2674d4547e914674" - dependencies: - ansi-styles "^3.2.0" - jest-diff "^22.4.3" - jest-get-type "^22.4.3" - jest-matcher-utils "^22.4.3" - jest-message-util "^22.4.3" - jest-regex-util "^22.4.3" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extend@~3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" - -external-editor@^2.0.4: - version "2.2.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" - dependencies: - chardet "^0.4.0" - iconv-lite "^0.4.17" - tmp "^0.0.33" - -extglob@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - dependencies: - is-extglob "^1.0.0" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - -extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - -fast-deep-equal@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" - -fast-json-stable-stringify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" - -fast-levenshtein@~2.0.4: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - -fb-watchman@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" - dependencies: - bser "^2.0.0" - -fbjs@^0.8.16: - version "0.8.16" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db" - 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" - -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" - -fileset@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" - dependencies: - glob "^7.0.3" - minimatch "^3.0.3" - -fill-range@^2.1.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" - dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^3.0.0" - repeat-element "^1.1.2" - repeat-string "^1.5.2" - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - -find-up@^2.0.0, find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - dependencies: - locate-path "^2.0.0" - -flat-cache@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" - dependencies: - circular-json "^0.3.1" - del "^2.0.2" - graceful-fs "^4.1.2" - write "^0.2.1" - -for-in@^1.0.1, for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - -for-own@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - dependencies: - for-in "^1.0.1" - -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.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" - dependencies: - asynckit "^0.4.0" - combined-stream "1.0.6" - mime-types "^2.1.12" - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - dependencies: - map-cache "^0.2.2" - -fs-minipass@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" - dependencies: - minipass "^2.2.1" - -fs-readdir-recursive@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - -fsevents@^1.0.0, fsevents@^1.2.3: - version "1.2.4" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" - dependencies: - nan "^2.9.2" - node-pre-gyp "^0.10.0" - -function-bind@^1.0.2, function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - -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-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - dependencies: - assert-plus "^1.0.0" - -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.0.3, glob@^7.0.5, glob@^7.1.1, 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" - -globals@^11.0.1: - version "11.5.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.5.0.tgz#6bc840de6771173b191f13d3a9c94d441ee92642" - -globals@^9.18.0: - version "9.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" - -globby@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" - dependencies: - array-union "^1.0.1" - arrify "^1.0.0" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4: - version "4.1.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" - -growly@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" - -handlebars@^4.0.3: - version "4.0.11" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" - dependencies: - async "^1.4.0" - optimist "^0.6.1" - source-map "^0.4.4" - optionalDependencies: - uglify-js "^2.6" - -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - -har-validator@~5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" - dependencies: - ajv "^5.1.0" - har-schema "^2.0.0" - -has-ansi@^2.0.0: - 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-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" - dependencies: - function-bind "^1.0.2" - -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" - -hosted-git-info@^2.1.4: - version "2.6.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.6.0.tgz#23235b29ab230c576aab0d4f13fc046b0b038222" - -html-encoding-sniffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" - dependencies: - whatwg-encoding "^1.0.1" - -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -iconv-lite@0.4.19: - version "0.4.19" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" - -iconv-lite@^0.4.17, iconv-lite@^0.4.4, iconv-lite@~0.4.13: - version "0.4.23" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" - dependencies: - safer-buffer ">= 2.1.2 < 3" - -ignore-walk@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" - dependencies: - minimatch "^3.0.4" - -ignore@^3.3.3: - version "3.3.8" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.8.tgz#3f8e9c35d38708a3a7e0e9abb6c73e7ee7707b2b" - -import-local@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc" - dependencies: - pkg-dir "^2.0.0" - resolve-cwd "^2.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - -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.1, inherits@^2.0.3, inherits@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - -ini@~1.3.0: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - -inquirer@^3.0.6: - version "3.3.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" - dependencies: - ansi-escapes "^3.0.0" - chalk "^2.0.0" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^2.0.4" - figures "^2.0.0" - lodash "^4.3.0" - mute-stream "0.0.7" - run-async "^2.2.0" - rx-lite "^4.0.8" - rx-lite-aggregates "^4.0.8" - string-width "^2.1.0" - strip-ansi "^4.0.0" - through "^2.3.6" - -invariant@^2.2.2: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - dependencies: - loose-envify "^1.0.0" - -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - dependencies: - kind-of "^6.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - dependencies: - binary-extensions "^1.0.0" - -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - -is-builtin-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" - dependencies: - builtin-modules "^1.0.0" - -is-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.1.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.1.0.tgz#247e4162e7860cebbdaf30b774d6b0ac7dcfe7a5" - dependencies: - ci-info "^1.0.0" - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - dependencies: - kind-of "^6.0.0" - -is-date-object@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-dotfile@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" - -is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - dependencies: - is-primitive "^2.0.0" - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - -is-finite@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - -is-generator-fn@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-1.0.0.tgz#969d49e1bb3329f6bb7f09089be26578b2ddd46a" - -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-number@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - dependencies: - kind-of "^3.0.2" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - dependencies: - kind-of "^3.0.2" - -is-number@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" - -is-odd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24" - dependencies: - is-number "^4.0.0" - -is-path-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" - -is-path-in-cwd@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" - dependencies: - is-path-inside "^1.0.0" - -is-path-inside@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" - dependencies: - path-is-inside "^1.0.1" - -is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - dependencies: - isobject "^3.0.1" - -is-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-regex@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" - dependencies: - has "^1.0.1" - -is-resolvable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" - -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-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" - -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - -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" - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - -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" - -istanbul-api@^1.1.14: - version "1.3.1" - resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.3.1.tgz#4c3b05d18c0016d1022e079b98dc82c40f488954" - dependencies: - async "^2.1.4" - compare-versions "^3.1.0" - fileset "^2.0.2" - istanbul-lib-coverage "^1.2.0" - istanbul-lib-hook "^1.2.0" - istanbul-lib-instrument "^1.10.1" - istanbul-lib-report "^1.1.4" - istanbul-lib-source-maps "^1.2.4" - istanbul-reports "^1.3.0" - js-yaml "^3.7.0" - mkdirp "^0.5.1" - once "^1.4.0" - -istanbul-lib-coverage@^1.1.1, istanbul-lib-coverage@^1.1.2, istanbul-lib-coverage@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz#f7d8f2e42b97e37fe796114cb0f9d68b5e3a4341" - -istanbul-lib-hook@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.2.0.tgz#ae556fd5a41a6e8efa0b1002b1e416dfeaf9816c" - dependencies: - append-transform "^0.4.0" - -istanbul-lib-instrument@^1.10.1, istanbul-lib-instrument@^1.8.0: - version "1.10.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz#724b4b6caceba8692d3f1f9d0727e279c401af7b" - dependencies: - babel-generator "^6.18.0" - babel-template "^6.16.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" - babylon "^6.18.0" - istanbul-lib-coverage "^1.2.0" - semver "^5.3.0" - -istanbul-lib-report@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.4.tgz#e886cdf505c4ebbd8e099e4396a90d0a28e2acb5" - dependencies: - istanbul-lib-coverage "^1.2.0" - mkdirp "^0.5.1" - path-parse "^1.0.5" - supports-color "^3.1.2" - -istanbul-lib-source-maps@^1.2.1: - version "1.2.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.3.tgz#20fb54b14e14b3fb6edb6aca3571fd2143db44e6" - dependencies: - debug "^3.1.0" - istanbul-lib-coverage "^1.1.2" - mkdirp "^0.5.1" - rimraf "^2.6.1" - source-map "^0.5.3" - -istanbul-lib-source-maps@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.4.tgz#cc7ccad61629f4efff8e2f78adb8c522c9976ec7" - dependencies: - debug "^3.1.0" - istanbul-lib-coverage "^1.2.0" - mkdirp "^0.5.1" - rimraf "^2.6.1" - source-map "^0.5.3" - -istanbul-reports@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.3.0.tgz#2f322e81e1d9520767597dca3c20a0cce89a3554" - dependencies: - handlebars "^4.0.3" - -jest-changed-files@^22.2.0: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-22.4.3.tgz#8882181e022c38bd46a2e4d18d44d19d90a90fb2" - dependencies: - throat "^4.0.0" - -jest-cli@^22.4.4: - version "22.4.4" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-22.4.4.tgz#68cd2a2aae983adb1e6638248ca21082fd6d9e90" - dependencies: - ansi-escapes "^3.0.0" - chalk "^2.0.1" - exit "^0.1.2" - glob "^7.1.2" - graceful-fs "^4.1.11" - import-local "^1.0.0" - is-ci "^1.0.10" - istanbul-api "^1.1.14" - istanbul-lib-coverage "^1.1.1" - istanbul-lib-instrument "^1.8.0" - istanbul-lib-source-maps "^1.2.1" - jest-changed-files "^22.2.0" - jest-config "^22.4.4" - jest-environment-jsdom "^22.4.1" - jest-get-type "^22.1.0" - jest-haste-map "^22.4.2" - jest-message-util "^22.4.0" - jest-regex-util "^22.1.0" - jest-resolve-dependencies "^22.1.0" - jest-runner "^22.4.4" - jest-runtime "^22.4.4" - jest-snapshot "^22.4.0" - jest-util "^22.4.1" - jest-validate "^22.4.4" - jest-worker "^22.2.2" - micromatch "^2.3.11" - node-notifier "^5.2.1" - realpath-native "^1.0.0" - rimraf "^2.5.4" - slash "^1.0.0" - string-length "^2.0.0" - strip-ansi "^4.0.0" - which "^1.2.12" - yargs "^10.0.3" - -jest-config@^22.4.4: - version "22.4.4" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-22.4.4.tgz#72a521188720597169cd8b4ff86934ef5752d86a" - dependencies: - chalk "^2.0.1" - glob "^7.1.1" - jest-environment-jsdom "^22.4.1" - jest-environment-node "^22.4.1" - jest-get-type "^22.1.0" - jest-jasmine2 "^22.4.4" - jest-regex-util "^22.1.0" - jest-resolve "^22.4.2" - jest-util "^22.4.1" - jest-validate "^22.4.4" - pretty-format "^22.4.0" - -jest-diff@^22.4.0, jest-diff@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-22.4.3.tgz#e18cc3feff0aeef159d02310f2686d4065378030" - dependencies: - chalk "^2.0.1" - diff "^3.2.0" - jest-get-type "^22.4.3" - pretty-format "^22.4.3" - -jest-docblock@^22.4.0, jest-docblock@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-22.4.3.tgz#50886f132b42b280c903c592373bb6e93bb68b19" - dependencies: - detect-newline "^2.1.0" - -jest-environment-jsdom@^22.4.1: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-22.4.3.tgz#d67daa4155e33516aecdd35afd82d4abf0fa8a1e" - dependencies: - jest-mock "^22.4.3" - jest-util "^22.4.3" - jsdom "^11.5.1" - -jest-environment-node@^22.4.1: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-22.4.3.tgz#54c4eaa374c83dd52a9da8759be14ebe1d0b9129" - dependencies: - jest-mock "^22.4.3" - jest-util "^22.4.3" - -jest-get-type@^22.1.0, jest-get-type@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.4.3.tgz#e3a8504d8479342dd4420236b322869f18900ce4" - -jest-haste-map@^22.4.2: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-22.4.3.tgz#25842fa2ba350200767ac27f658d58b9d5c2e20b" - dependencies: - fb-watchman "^2.0.0" - graceful-fs "^4.1.11" - jest-docblock "^22.4.3" - jest-serializer "^22.4.3" - jest-worker "^22.4.3" - micromatch "^2.3.11" - sane "^2.0.0" - -jest-jasmine2@^22.4.4: - version "22.4.4" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-22.4.4.tgz#c55f92c961a141f693f869f5f081a79a10d24e23" - dependencies: - chalk "^2.0.1" - co "^4.6.0" - expect "^22.4.0" - graceful-fs "^4.1.11" - is-generator-fn "^1.0.0" - jest-diff "^22.4.0" - jest-matcher-utils "^22.4.0" - jest-message-util "^22.4.0" - jest-snapshot "^22.4.0" - jest-util "^22.4.1" - source-map-support "^0.5.0" - -jest-leak-detector@^22.4.0: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-22.4.3.tgz#2b7b263103afae8c52b6b91241a2de40117e5b35" - dependencies: - pretty-format "^22.4.3" - -jest-matcher-utils@^22.4.0, jest-matcher-utils@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz#4632fe428ebc73ebc194d3c7b65d37b161f710ff" - dependencies: - chalk "^2.0.1" - jest-get-type "^22.4.3" - pretty-format "^22.4.3" - -jest-message-util@^22.4.0, jest-message-util@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-22.4.3.tgz#cf3d38aafe4befddbfc455e57d65d5239e399eb7" - dependencies: - "@babel/code-frame" "^7.0.0-beta.35" - chalk "^2.0.1" - micromatch "^2.3.11" - slash "^1.0.0" - stack-utils "^1.0.1" - -jest-mock@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-22.4.3.tgz#f63ba2f07a1511772cdc7979733397df770aabc7" - -jest-regex-util@^22.1.0, jest-regex-util@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-22.4.3.tgz#a826eb191cdf22502198c5401a1fc04de9cef5af" - -jest-resolve-dependencies@^22.1.0: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-22.4.3.tgz#e2256a5a846732dc3969cb72f3c9ad7725a8195e" - dependencies: - jest-regex-util "^22.4.3" - -jest-resolve@^22.4.2: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-22.4.3.tgz#0ce9d438c8438229aa9b916968ec6b05c1abb4ea" - dependencies: - browser-resolve "^1.11.2" - chalk "^2.0.1" - -jest-runner@^22.4.4: - version "22.4.4" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-22.4.4.tgz#dfca7b7553e0fa617e7b1291aeb7ce83e540a907" - dependencies: - exit "^0.1.2" - jest-config "^22.4.4" - jest-docblock "^22.4.0" - jest-haste-map "^22.4.2" - jest-jasmine2 "^22.4.4" - jest-leak-detector "^22.4.0" - jest-message-util "^22.4.0" - jest-runtime "^22.4.4" - jest-util "^22.4.1" - jest-worker "^22.2.2" - throat "^4.0.0" - -jest-runtime@^22.4.4: - version "22.4.4" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-22.4.4.tgz#9ba7792fc75582a5be0f79af6f8fe8adea314048" - dependencies: - babel-core "^6.0.0" - babel-jest "^22.4.4" - babel-plugin-istanbul "^4.1.5" - chalk "^2.0.1" - convert-source-map "^1.4.0" - exit "^0.1.2" - graceful-fs "^4.1.11" - jest-config "^22.4.4" - jest-haste-map "^22.4.2" - jest-regex-util "^22.1.0" - jest-resolve "^22.4.2" - jest-util "^22.4.1" - jest-validate "^22.4.4" - json-stable-stringify "^1.0.1" - micromatch "^2.3.11" - realpath-native "^1.0.0" - slash "^1.0.0" - strip-bom "3.0.0" - write-file-atomic "^2.1.0" - yargs "^10.0.3" - -jest-serializer@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-22.4.3.tgz#a679b81a7f111e4766235f4f0c46d230ee0f7436" - -jest-snapshot@^22.4.0: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-22.4.3.tgz#b5c9b42846ffb9faccb76b841315ba67887362d2" - dependencies: - chalk "^2.0.1" - jest-diff "^22.4.3" - jest-matcher-utils "^22.4.3" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - pretty-format "^22.4.3" - -jest-util@^22.4.1, jest-util@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-22.4.3.tgz#c70fec8eec487c37b10b0809dc064a7ecf6aafac" - dependencies: - callsites "^2.0.0" - chalk "^2.0.1" - graceful-fs "^4.1.11" - is-ci "^1.0.10" - jest-message-util "^22.4.3" - mkdirp "^0.5.1" - source-map "^0.6.0" - -jest-validate@^22.4.4: - version "22.4.4" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-22.4.4.tgz#1dd0b616ef46c995de61810d85f57119dbbcec4d" - dependencies: - chalk "^2.0.1" - jest-config "^22.4.4" - jest-get-type "^22.1.0" - leven "^2.1.0" - pretty-format "^22.4.0" - -jest-worker@^22.2.2, jest-worker@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-22.4.3.tgz#5c421417cba1c0abf64bf56bd5fb7968d79dd40b" - dependencies: - merge-stream "^1.0.1" - -jest@^22.4.3: - version "22.4.4" - resolved "https://registry.yarnpkg.com/jest/-/jest-22.4.4.tgz#ffb36c9654b339a13e10b3d4b338eb3e9d49f6eb" - dependencies: - import-local "^1.0.0" - jest-cli "^22.4.4" - -js-tokens@^3.0.0, js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - -js-yaml@^3.7.0, js-yaml@^3.9.1: - version "3.11.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.11.0.tgz#597c1a8bd57152f26d622ce4117851a51f5ebaef" - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - -jsdom@^11.5.1: - version "11.10.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.10.0.tgz#a42cd54e88895dc765f03f15b807a474962ac3b5" - dependencies: - abab "^1.0.4" - acorn "^5.3.0" - acorn-globals "^4.1.0" - array-equal "^1.0.0" - cssom ">= 0.3.2 < 0.4.0" - cssstyle ">= 0.2.37 < 0.3.0" - data-urls "^1.0.0" - domexception "^1.0.0" - escodegen "^1.9.0" - html-encoding-sniffer "^1.0.2" - left-pad "^1.2.0" - nwmatcher "^1.4.3" - parse5 "4.0.0" - pn "^1.1.0" - request "^2.83.0" - request-promise-native "^1.0.5" - sax "^1.2.4" - symbol-tree "^3.2.2" - tough-cookie "^2.3.3" - w3c-hr-time "^1.0.1" - webidl-conversions "^4.0.2" - whatwg-encoding "^1.0.3" - whatwg-mimetype "^2.1.0" - whatwg-url "^6.4.0" - ws "^4.0.0" - xml-name-validator "^3.0.0" - -jsesc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - -json-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-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - -json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - dependencies: - jsonify "~0.0.0" - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - -json5@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - -jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" - -jsx-ast-utils@^2.0.0, jsx-ast-utils@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz#e801b1b39985e20fffc87b40e3748080e2dcac7f" - dependencies: - array-includes "^3.0.3" - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" - -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" - -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" - -left-pad@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" - -leven@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" - -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" - -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" - -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.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - -lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.4, lodash@^4.3.0: - version "4.17.10" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" - -longest@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" - -loose-envify@^1.0.0, 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" - -lru-cache@^4.0.1: - version "4.1.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - -makeerror@1.0.x: - version "1.0.11" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" - dependencies: - tmpl "1.0.x" - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - dependencies: - object-visit "^1.0.0" - -math-random@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac" - -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" - -merge-stream@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" - dependencies: - readable-stream "^2.0.1" - -merge@^1.1.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" - -micromatch@^2.1.5, micromatch@^2.3.11: - version "2.3.11" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" - -micromatch@^3.1.4, micromatch@^3.1.8: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -mime-db@~1.33.0: - version "1.33.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" - -mime-types@^2.1.12, mime-types@~2.1.17: - version "2.1.18" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" - dependencies: - mime-db "~1.33.0" - -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - -minimatch@^3.0.2, minimatch@^3.0.3, 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.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - -minimist@^1.1.1, minimist@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - -minimist@~0.0.1: - version "0.0.10" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" - -minipass@^2.2.1, minipass@^2.2.4: - version "2.3.3" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233" - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minizlib@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" - dependencies: - minipass "^2.2.1" - -mixin-deep@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp@^0.5.0, mkdirp@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - dependencies: - minimist "0.0.8" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - -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.9.2: - version "2.10.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" - -nanomatch@^1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2" - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-odd "^2.0.0" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - -needle@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d" - dependencies: - debug "^2.1.2" - iconv-lite "^0.4.4" - sax "^1.2.4" - -node-fetch@^1.0.1: - version "1.7.3" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" - dependencies: - encoding "^0.1.11" - is-stream "^1.0.1" - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - -node-notifier@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea" - dependencies: - growly "^1.3.0" - semver "^5.4.1" - shellwords "^0.1.1" - which "^1.3.0" - -node-pre-gyp@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.0.tgz#6e4ef5bb5c5203c6552448828c852c40111aac46" - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.0" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.1.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4" - -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: - version "2.4.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" - dependencies: - hosted-git-info "^2.1.4" - is-builtin-module "^1.0.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - dependencies: - remove-trailing-separator "^1.0.1" - -npm-bundled@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308" - -npm-packlist@^1.1.6: - version "1.1.10" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.10.tgz#1039db9e985727e464df066f4cf0ab6ef85c398a" - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - -npm-run-path@^2.0.0: - 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.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - -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" - -nwmatcher@^1.4.3: - version "1.4.4" - resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.4.tgz#2285631f34a95f0d0395cd900c96ed39b58f346e" - -oauth-sign@~0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" - -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-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-keys@^1.0.8: - version "1.0.11" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - dependencies: - isobject "^3.0.0" - -object.getownpropertydescriptors@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" - dependencies: - define-properties "^1.1.2" - es-abstract "^1.5.1" - -object.omit@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" - dependencies: - for-own "^0.1.4" - is-extendable "^0.1.1" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - dependencies: - isobject "^3.0.1" - -once@^1.3.0, 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" - -optimist@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" - dependencies: - minimist "~0.0.1" - wordwrap "~0.0.2" - -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" - -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - -os-locale@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" - dependencies: - execa "^0.7.0" - lcid "^1.0.0" - mem "^1.1.0" - -os-shim@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" - -os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - -osenv@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -output-file-sync@^1.1.2: - 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" - -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.2.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c" - dependencies: - p-try "^1.0.0" - -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - dependencies: - p-limit "^1.1.0" - -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - -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" - -parse5@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - dependencies: - pinkie-promise "^2.0.0" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - -path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - -path-is-inside@^1.0.1, path-is-inside@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - -path-key@^2.0.0: - 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-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" - -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: - 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" - -pkg-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" - dependencies: - find-up "^1.0.0" - -pkg-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" - dependencies: - find-up "^2.1.0" - -pluralize@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" - -pn@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - -pre-commit@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/pre-commit/-/pre-commit-1.2.2.tgz#dbcee0ee9de7235e57f79c56d7ce94641a69eec6" - dependencies: - cross-spawn "^5.0.1" - spawn-sync "^1.0.15" - which "1.2.x" - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - -preserve@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - -pretty-format@^22.4.0, pretty-format@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-22.4.3.tgz#f873d780839a9c02e9664c8a082e9ee79eaac16f" - dependencies: - ansi-regex "^3.0.0" - ansi-styles "^3.2.0" - -private@^0.1.6, private@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" - -process-nextick-args@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" - -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.3.1" - resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" - dependencies: - asap "~2.0.3" - -prop-types@^15.6.0: - version "15.6.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca" - dependencies: - fbjs "^0.8.16" - loose-envify "^1.3.1" - object-assign "^4.1.1" - -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - -punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - -punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - -qs@~6.5.1: - version "6.5.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - -randomatic@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.0.0.tgz#d35490030eb4f7578de292ce6dfb04a91a128923" - dependencies: - is-number "^4.0.0" - kind-of "^6.0.0" - math-random "^1.0.1" - -rc@^1.1.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.7.tgz#8a10ca30d588d00464360372b890d06dacd02297" - dependencies: - deep-extend "^0.5.1" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -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.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.2: - version "2.3.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -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" - -realpath-native@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.0.0.tgz#7885721a83b43bd5327609f0ddecb2482305fdf0" - dependencies: - util.promisify "^1.0.0" - -regenerate@^1.2.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" - -regenerator-runtime@^0.10.5: - version "0.10.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" - -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - -regenerator-transform@^0.10.0: - version "0.10.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" - dependencies: - babel-runtime "^6.18.0" - babel-types "^6.19.0" - private "^0.1.6" - -regex-cache@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" - dependencies: - is-equal-shallow "^0.1.3" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regexpp@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" - -regexpu-core@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" - dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" - -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - -regjsparser@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" - dependencies: - jsesc "~0.5.0" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - -repeat-element@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" - -repeat-string@^1.5.2, repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - dependencies: - is-finite "^1.0.0" - -request-promise-core@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" - dependencies: - lodash "^4.13.1" - -request-promise-native@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5" - dependencies: - request-promise-core "1.1.1" - stealthy-require "^1.1.0" - tough-cookie ">=2.3.3" - -request@^2.81.0, request@^2.83.0: - version "2.87.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.6.0" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.1" - forever-agent "~0.6.1" - form-data "~2.3.1" - har-validator "~5.0.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.17" - oauth-sign "~0.8.2" - performance-now "^2.1.0" - qs "~6.5.1" - safe-buffer "^5.1.1" - tough-cookie "~2.3.3" - tunnel-agent "^0.6.0" - uuid "^3.1.0" - -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" - -resolve-cwd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" - dependencies: - resolve-from "^3.0.0" - -resolve-from@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" - -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - -resolve@1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - -resolve@^1.5.0, resolve@^1.6.0: - version "1.7.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.7.1.tgz#aadd656374fd298aee895bc026b8297418677fd3" - dependencies: - path-parse "^1.0.5" - -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - -right-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" - dependencies: - align-text "^0.1.1" - -rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1: - version "2.6.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" - dependencies: - glob "^7.0.5" - -rsvp@^3.3.3: - version "3.6.2" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" - -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" - -safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - -sane@^2.0.0: - version "2.5.2" - resolved "https://registry.yarnpkg.com/sane/-/sane-2.5.2.tgz#b4dc1861c21b427e929507a3e751e2a2cb8ab3fa" - dependencies: - anymatch "^2.0.0" - capture-exit "^1.2.0" - exec-sh "^0.2.0" - fb-watchman "^2.0.0" - micromatch "^3.1.4" - minimist "^1.1.1" - walker "~1.0.5" - watch "~0.18.0" - optionalDependencies: - fsevents "^1.2.3" - -sax@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1: - version "5.5.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" - -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" - -set-value@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.1" - to-object-path "^0.3.0" - -set-value@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - -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" - -shellwords@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" - -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" - -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - -slice-ansi@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" - dependencies: - is-fullwidth-code-point "^2.0.0" - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -source-map-resolve@^0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" - dependencies: - atob "^2.1.1" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@^0.4.15: - version "0.4.18" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" - dependencies: - source-map "^0.5.6" - -source-map-support@^0.5.0: - version "0.5.6" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13" - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-url@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - -source-map@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" - dependencies: - amdefine ">=0.0.4" - -source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - -source-map@^0.6.0, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - -spawn-sync@^1.0.15: - version "1.0.15" - resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476" - dependencies: - concat-stream "^1.4.7" - os-shim "^0.1.2" - -spdx-correct@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9" - -spdx-expression-parse@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87" - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - dependencies: - extend-shallow "^3.0.0" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - -sshpk@^1.7.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.1.tgz#130f5975eddad963f1d56f92b9ac6c51fa9f83eb" - 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" - -stack-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.1.tgz#d4f33ab54e8e38778b0ca5cfd3b3afb12db68620" - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -stealthy-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" - -string-length@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" - dependencies: - astral-regex "^1.0.0" - strip-ansi "^4.0.0" - -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, string-width@^2.1.0, string-width@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - dependencies: - ansi-regex "^3.0.0" - -strip-bom@3.0.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-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-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - -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" - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - -supports-color@^3.1.2: - version "3.2.3" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" - dependencies: - has-flag "^1.0.0" - -supports-color@^5.3.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" - dependencies: - has-flag "^3.0.0" - -symbol-tree@^3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" - -table@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" - dependencies: - ajv "^5.2.3" - ajv-keywords "^2.1.0" - chalk "^2.1.0" - lodash "^4.17.4" - slice-ansi "1.0.0" - string-width "^2.1.1" - -tar@^4: - version "4.4.2" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.2.tgz#60685211ba46b38847b1ae7ee1a24d744a2cd462" - dependencies: - chownr "^1.0.1" - fs-minipass "^1.2.5" - minipass "^2.2.4" - minizlib "^1.1.0" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.2" - -test-exclude@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.1.tgz#dfa222f03480bca69207ca728b37d74b45f724fa" - dependencies: - arrify "^1.0.1" - micromatch "^3.1.8" - object-assign "^4.1.0" - read-pkg-up "^1.0.1" - require-main-filename "^1.0.1" - -text-table@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - -throat@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" - -through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - dependencies: - os-tmpdir "~1.0.2" - -tmpl@1.0.x: - version "1.0.4" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" - -to-fast-properties@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -tough-cookie@>=2.3.3, tough-cookie@^2.3.3, tough-cookie@~2.3.3: - version "2.3.4" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" - dependencies: - punycode "^1.4.1" - -tr46@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" - dependencies: - punycode "^2.1.0" - -trim-right@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - dependencies: - prelude-ls "~1.1.2" - -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.9: - version "0.7.18" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.18.tgz#a7bfd92f56edfb117083b69e31d2aa8882d4b1ed" - -uglify-js@^2.6: - version "2.8.29" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" - dependencies: - source-map "~0.5.1" - yargs "~3.10.0" - optionalDependencies: - uglify-to-browserify "~1.0.0" - -uglify-to-browserify@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" - -union-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^0.4.3" - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - -urlgrey@0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/urlgrey/-/urlgrey-0.4.4.tgz#892fe95960805e85519f1cd4389f2cb4cbb7652f" - -use@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.0.tgz#14716bf03fdfefd03040aef58d8b4b85f3a7c544" - dependencies: - kind-of "^6.0.2" - -user-home@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" - -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - -util.promisify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" - dependencies: - define-properties "^1.1.2" - object.getownpropertydescriptors "^2.0.3" - -uuid@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" - -v8flags@^2.1.1: - 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.3" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338" - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -w3c-hr-time@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" - dependencies: - browser-process-hrtime "^0.1.2" - -walker@~1.0.5: - version "1.0.7" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" - dependencies: - makeerror "1.0.x" - -watch@~0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986" - dependencies: - exec-sh "^0.2.0" - minimist "^1.2.0" - -webidl-conversions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" - -whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3" - dependencies: - iconv-lite "0.4.19" - -whatwg-fetch@>=0.10.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" - -whatwg-mimetype@^2.0.0, whatwg-mimetype@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz#f0f21d76cbba72362eb609dbed2a30cd17fcc7d4" - -whatwg-url@^6.4.0: - version "6.4.1" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.4.1.tgz#fdb94b440fd4ad836202c16e9737d511f012fd67" - dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" - -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.2.x: - version "1.2.14" - resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" - dependencies: - isexe "^2.0.0" - -which@^1.2.12, which@^1.2.9, which@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" - 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" - -window-size@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" - -wordwrap@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" - -wordwrap@~0.0.2: - version "0.0.3" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - -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.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - signal-exit "^3.0.2" - -write@^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@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-4.1.0.tgz#a979b5d7d4da68bf54efe0408967c324869a7289" - dependencies: - async-limiter "~1.0.0" - safe-buffer "~5.1.0" - -xml-name-validator@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" - -y18n@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" - -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - -yallist@^3.0.0, yallist@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" - -yargs-parser@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950" - dependencies: - camelcase "^4.1.0" - -yargs@^10.0.3: - version "10.1.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.2.tgz#454d074c2b16a51a43e2fb7807e4f9de69ccb5c5" - dependencies: - cliui "^4.0.0" - decamelize "^1.1.1" - find-up "^2.1.0" - get-caller-file "^1.0.1" - os-locale "^2.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^8.1.0" - -yargs@~3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" - dependencies: - camelcase "^1.0.2" - cliui "^2.1.0" - decamelize "^1.0.0" - window-size "0.1.0" From 0bc4fcafe70db6043f3a360381b2461de1aa55f1 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 24 May 2018 05:07:06 +0800 Subject: [PATCH 317/327] Translate to Chinese --- README.zh-CN.md | 212 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 212 insertions(+) create mode 100644 README.zh-CN.md diff --git a/README.zh-CN.md b/README.zh-CN.md new file mode 100644 index 000000000..5a815e3df --- /dev/null +++ b/README.zh-CN.md @@ -0,0 +1,212 @@ +# JavaScript 算法与数据结构 + +[![build status](https://travis-ci.org/trekhleb/javascript-algorithms.svg?branch=master)](https://travis-ci.org/trekhleb/javascript-algorithms) +[![codecov](https://codecov.io/gh/trekhleb/javascript-algorithms/branch/master/graph/badge.svg)](https://codecov.io/gh/trekhleb/javascript-algorithms) + +本仓库包含了多种基于 JavaScript 的算法与数据结构。 + +每种算法和数据结构都有自己的 README 并提供相关说明以及进一步阅读和 YouTube 视频。 + +## 数据结构 + +数据结构是在计算机中组织和存储数据的一种特殊方式,它可以高效地访问和修改数据。更确切地说,数据结构是数据值的集合,它们之间的关系、函数或操作可以应用于数据。 + +* [链表](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/linked-list) +* [队列](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/queue) +* [栈](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/stack) +* [哈希表](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/hash-table) +* [堆](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/heap) +* [优先队列](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/priority-queue) +* [字典树](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/trie) +* [树](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/tree) + * [二分查找](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/tree/binary-search-tree) + * [AVL 树](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/tree/avl-tree) + * 红黑树 + * 后缀树 + * 线段树 或 间隔树 + * 二叉索引树 +* [图](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/graph) (有向图与无向图) +* [并查集](https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/disjoint-set) + +## 算法 + +算法是如何解决一类问题的明确规范。 算法是一组精确定义操作序列的规则。 + +### 算法主题 + +* **数学** + * [阶乘](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/factorial) + * [斐波那契数](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/fibonacci) + * [素数检测](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/primality-test) (排除法) + * [欧几里得算法](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/euclidean-algorithm) - 计算最大公约数(GCD) + * [最小公倍数](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/least-common-multiple) (LCM) + * [整数拆分](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/integer-partition) +* **集合** + * [笛卡尔积](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/cartesian-product) - 多集合结果 + * [幂集](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/power-set) - 该集合的所有子集 + * [排列](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/permutations) (有/无重复) + * [组合](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/combinations) (有/无重复) + * [洗牌算法](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/fisher-yates) - 随机置换有限序列 + * [最长公共子序列](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/longest-common-subsequnce) (LCS) + * [最长递增子序列](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/longest-increasing-subsequence) + * [Shortest Common Supersequence](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/shortest-common-supersequence) (SCS) + * [背包问题](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/knapsack-problem) - "0/1" and "Unbound" ones + * [最大子数列问题](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/maximum-subarray) - BF算法 与 动态编程 +* **字符串** + * [莱温斯坦距离](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/levenshtein-distance) - 两个序列之间的最小编辑距离 + * [汉明距离](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/hamming-distance) - 符号不同的位置数 + * [克努斯-莫里斯-普拉特算法](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/knuth-morris-pratt) - 子串搜索 + * [字符串快速查找](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/rabin-karp) - 子串搜索 + * [最长公共子串](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/longest-common-substring) +* **搜索** + * [二分查找](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/search/binary-search) +* **排序** + * [冒泡排序](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sorting/bubble-sort) + * [选择排序](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sorting/selection-sort) + * [插入排序](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sorting/insertion-sort) + * [堆排序](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sorting/heap-sort) + * [归并排序](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sorting/merge-sort) + * [快速排序](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sorting/quick-sort) + * [希尔排序](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sorting/shell-sort) +* **树** + * [深度优先搜索](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/tree/depth-first-search) (DFS) + * [广度优先搜索](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/tree/breadth-first-search) (BFS) +* **图** + * [深度优先搜索](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/depth-first-search) (DFS) + * [广度优先搜索](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/breadth-first-search) (BFS) + * [戴克斯特拉算法m](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/dijkstra) - 找到所有图顶点的最短路径 + * [贝尔曼-福特算法](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/bellman-ford) - 找到所有图顶点的最短路径 + * [判圈算法](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/detect-cycle) - 对于有向图和无向图(基于DFS和不相交集的版本) + * [普林演算法](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/prim) - 寻找加权无向图的最小生成树(MST) + * [克鲁斯克尔演算法](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/kruskal) - 寻找加权无向图的最小生成树(MST) + * [拓撲排序](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/topological-sorting) - DFS 方法 + * [关节点](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/articulation-points) - Tarjan算法(基于DFS) + * [桥](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/bridges) - 基于DFS的算法 + * [欧拉路径与一笔画问题](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/eulerian-path) - Fleury的算法 - 一次访问每个边缘 + * [哈密顿图](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/hamiltonian-cycle) - 恰好访问每个顶点一次 + * [强连通分量](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/strongly-connected-components) - Kosaraju算法 + * [旅行推销员问题](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/travelling-salesman) - 尽可能以最短的路线访问每个城市并返回原始城市 +* **未分类** + * [汉诺塔](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/uncategorized/hanoi-tower) + * [八皇后问题](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/uncategorized/n-queens) + * [骑士巡逻](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/uncategorized/knight-tour) + +### 算法范式 + +算法范式是基于类的设计的通用方法或方法的算法。 这是一个比算法概念更高的抽象,就像一个 +算法是比计算机程序更高的抽象。 + +* **BF算法** - 查找所有可能性并选择最佳解决方案 + * [最大子数列](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/maximum-subarray) + * [旅行推销员问题](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/travelling-salesman) - 尽可能以最短的路线访问每个城市并返回原始城市 + +* **贪心法** - 在当前选择最佳选项,不考虑以后情况 + * [背包问题](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/knapsack-problem) + * [戴克斯特拉算法](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/dijkstra) - 找到所有图顶点的最短路径 + * [普里姆算法](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/prim) - 寻找加权无向图的最小生成树(MST) + * [克鲁斯卡尔算法](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/kruskal) - 寻找加权无向图的最小生成树(MST) +* **分治法** - 将问题分成较小的部分,然后解决这些部分 + * [二分查找](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/search/binary-search) + * [汉诺塔](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/uncategorized/hanoi-tower) + * [欧几里得算法](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/euclidean-algorithm) - 计算最大公约数(GCD) + * [排列](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/permutations) (有/无重复) + * [组合](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/combinations) (有/无重复) + * [归并排序](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sorting/merge-sort) + * [Quicksort](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sorting/quick-sort) + * [树深度优先搜索](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/tree/depth-first-search) (DFS) + * [图深度优先搜索](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/depth-first-search) (DFS) +* **动态编程** - 使用以前找到的子解决方案构建解决方案 + * [斐波那契数](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/fibonacci) + * [莱温斯坦距离](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/levenshtein-distance) - 两个序列之间的最小编辑距离 + * [最长公共子序列](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/longest-common-subsequnce) (LCS) + * [最长公共子串](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/string/longest-common-substring) + * [最长递增子序列](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/longest-increasing-subsequence) + * [最短公共子序列](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/shortest-common-supersequence) + * [0-1背包问题](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/knapsack-problem) + * [整数拆分](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/integer-partition) + * [最大子数列](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/sets/maximum-subarray) + * [贝尔曼-福特算法](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/bellman-ford) - 找到所有图顶点的最短路径 +* **回溯法** - 类似于 BF算法 试图产生所有可能的解决方案,但每次生成解决方案测试如果它满足所有条件,那么只有继续生成后续解决方案。 否则回溯并继续寻找不同路径的解决方案。 + * [哈密顿图](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/graph/hamiltonian-cycle) - 恰好访问每个顶点一次 + * [八皇后问题](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/uncategorized/n-queens) + * [骑士巡逻](https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/uncategorized/knight-tour) +* **B & B** + +## 如何使用本仓库 + +**安装依赖** +``` +npm install +``` + +**执行测试** +``` +npm test +``` + +**按照名称执行测试** +``` +npm test -- -t 'LinkedList' +``` + +**Playground** + +你可以在`./src/playground/playground.js`文件中操作数据结构与算法,并在`./src/playground/__test__/playground.test.js`中编写测试。 + +然后,只需运行以下命令来测试你的 Playground 是否按无误: + +``` +npm test -- -t 'playground' +``` + +## 有用的信息 + +### 引用 + +[▶ YouTube](https://www.youtube.com/playlist?list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) + +### 大O符号 + +大O符号中指定的算法的增长顺序。 + +![Big O graphs](https://github.com/trekhleb/javascript-algorithms/blob/master/assets/big-o-graph.png?raw=true) + +源: [Big O Cheat Sheet](http://bigocheatsheet.com/). + +以下是一些最常用的 大O标记法 列表以及它们与不同大小输入数据的性能比较。 + +| 大O标记法 | 计算10个元素 | 计算100个元素 | 计算1000个元素 | +| -------------- | ---------------------------- | ----------------------------- | ------------------------------- | +| **O(1)** | 1 | 1 | 1 | +| **O(log N)** | 3 | 6 | 9 | +| **O(N)** | 10 | 100 | 1000 | +| **O(N log N)** | 30 | 60 | 9000 | +| **O(N^2)** | 100 | 10000 | 1000000 | +| **O(2^N)** | 1024 | 1.26e+29 | 1.07e+301 | +| **O(N!)** | 3628800 | 9.3e+157 | 4.02e+2567 | + +### 数据结构操作的复杂性 + +| 数据结构 | 连接 | 查找 | 插入 | 删除 | +| ----------------------- | :-------: | :-------: | :-------: | :-------: | +| **数组** | 1 | n | n | n | +| **栈** | n | n | 1 | 1 | +| **队列** | n | n | 1 | 1 | +| **链表** | n | n | 1 | 1 | +| **哈希表** | - | n | n | n | +| **二分查找树** | n | n | n | n | +| **B树** | log(n) | log(n) | log(n) | log(n) | +| **红黑树** | log(n) | log(n) | log(n) | log(n) | +| **AVL树** | log(n) | log(n) | log(n) | log(n) | + +### 数组排序算法的复杂性 + +| 名称 | 最优 | 平均 | 最坏 | 内存 | 稳定 | +| --------------------- | :-------: | :-------: | :-----------: | :-------: | :-------: | +| **冒泡排序** | n | n^2 | n^2 | 1 | Yes | +| **插入排序** | n | n^2 | n^2 | 1 | Yes | +| **选择排序** | n^2 | n^2 | n^2 | 1 | No | +| **堆排序** | n log(n) | n log(n) | n log(n) | 1 | No | +| **归并排序** | n log(n) | n log(n) | n log(n) | n | Yes | +| **快速排序** | n log(n) | n log(n) | n^2 | log(n) | No | +| **希尔排序** | n log(n) | 取决于差距序列 | n (log(n))^2 | 1 | No | From b4777d2283c3733bc1428c9c8afd747105232fff Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Wed, 23 May 2018 17:38:02 -0500 Subject: [PATCH 318/327] Fixed Typo in Big O Complexity table --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e894debbc..2f1f5497e 100644 --- a/README.md +++ b/README.md @@ -190,7 +190,7 @@ Below is the list of some of the most used Big O notations and their performance | **O(1)** | 1 | 1 | 1 | | **O(log N)** | 3 | 6 | 9 | | **O(N)** | 10 | 100 | 1000 | -| **O(N log N)** | 30 | 60 | 9000 | +| **O(N log N)** | 30 | 600 | 9000 | | **O(N^2)** | 100 | 10000 | 1000000 | | **O(2^N)** | 1024 | 1.26e+29 | 1.07e+301 | | **O(N!)** | 3628800 | 9.3e+157 | 4.02e+2567 | From d0bd4d3964d817abc0033f4f1cfc407e6b8aa5c4 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 24 May 2018 08:57:11 +0300 Subject: [PATCH 319/327] Add link to Chinese translation. --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 2f1f5497e..edf78284d 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,8 @@ Each algorithm and data structure have its own separate README with related explanations and links for further reading and YouTube videos. +Read this in other languages: [Chinese](https://github.com/trekhleb/javascript-algorithms/blob/master/README.zh-CN.md) + ## Data Structures Data structure is a particular way of organizing and storing data in a computer so that it can From c2fa375a67977f016210b466f3007ba7c4501710 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 24 May 2018 09:01:50 +0300 Subject: [PATCH 320/327] Fix then > than typo. --- .../search/binary-search/binarySearch.js | 2 +- .../sorting/bubble-sort/BubbleSort.js | 2 +- .../sorting/insertion-sort/InsertionSort.js | 2 +- .../sorting/merge-sort/MergeSort.js | 2 +- .../sorting/quick-sort/QuickSort.js | 2 +- .../sorting/selection-sort/SelectionSort.js | 2 +- .../sorting/shell-sort/ShellSort.js | 2 +- src/data-structures/heap/MinHeap.js | 8 ++-- src/utils/comparator/Comparator.js | 12 +++--- .../comparator/__test__/Comparator.test.js | 42 +++++++++---------- 10 files changed, 38 insertions(+), 38 deletions(-) diff --git a/src/algorithms/search/binary-search/binarySearch.js b/src/algorithms/search/binary-search/binarySearch.js index cc85b1ff2..c33fc3c0d 100644 --- a/src/algorithms/search/binary-search/binarySearch.js +++ b/src/algorithms/search/binary-search/binarySearch.js @@ -22,7 +22,7 @@ export default function binarySearch(sortedArray, seekElement, comparatorCallbac } // Decide which half to choose for seeking next: left or right one. - if (comparator.lessThen(sortedArray[middleIndex], seekElement)) { + if (comparator.lessThan(sortedArray[middleIndex], seekElement)) { // Go to the right half of the array. startIndex = middleIndex + 1; } else { diff --git a/src/algorithms/sorting/bubble-sort/BubbleSort.js b/src/algorithms/sorting/bubble-sort/BubbleSort.js index 2da40d56f..0af595c1d 100644 --- a/src/algorithms/sorting/bubble-sort/BubbleSort.js +++ b/src/algorithms/sorting/bubble-sort/BubbleSort.js @@ -18,7 +18,7 @@ export default class BubbleSort extends Sort { this.callbacks.visitingCallback(array[j]); // Swap elements if they are in wrong order. - if (this.comparator.lessThen(array[j + 1], array[j])) { + if (this.comparator.lessThan(array[j + 1], array[j])) { const tmp = array[j + 1]; array[j + 1] = array[j]; array[j] = tmp; diff --git a/src/algorithms/sorting/insertion-sort/InsertionSort.js b/src/algorithms/sorting/insertion-sort/InsertionSort.js index 7b74acd77..c12553e26 100644 --- a/src/algorithms/sorting/insertion-sort/InsertionSort.js +++ b/src/algorithms/sorting/insertion-sort/InsertionSort.js @@ -15,7 +15,7 @@ export default class InsertionSort extends Sort { // If this is the case then swap that elements. while ( array[currentIndex - 1] && - this.comparator.lessThen(array[currentIndex], array[currentIndex - 1]) + this.comparator.lessThan(array[currentIndex], array[currentIndex - 1]) ) { // Call visiting callback. this.callbacks.visitingCallback(array[currentIndex - 1]); diff --git a/src/algorithms/sorting/merge-sort/MergeSort.js b/src/algorithms/sorting/merge-sort/MergeSort.js index d40679ffc..6a2f8a843 100644 --- a/src/algorithms/sorting/merge-sort/MergeSort.js +++ b/src/algorithms/sorting/merge-sort/MergeSort.js @@ -31,7 +31,7 @@ export default class MergeSort extends Sort { let minimumElement = null; // Find minimum element of two arrays. - if (this.comparator.lessThenOrEqual(leftArray[0], rightArray[0])) { + if (this.comparator.lessThanOrEqual(leftArray[0], rightArray[0])) { minimumElement = leftArray.shift(); } else { minimumElement = rightArray.shift(); diff --git a/src/algorithms/sorting/quick-sort/QuickSort.js b/src/algorithms/sorting/quick-sort/QuickSort.js index d97e28970..bc723f022 100644 --- a/src/algorithms/sorting/quick-sort/QuickSort.js +++ b/src/algorithms/sorting/quick-sort/QuickSort.js @@ -27,7 +27,7 @@ export default class QuickSort extends Sort { if (this.comparator.equal(currentElement, pivotElement)) { centerArray.push(currentElement); - } else if (this.comparator.lessThen(currentElement, pivotElement)) { + } else if (this.comparator.lessThan(currentElement, pivotElement)) { leftArray.push(currentElement); } else { rightArray.push(currentElement); diff --git a/src/algorithms/sorting/selection-sort/SelectionSort.js b/src/algorithms/sorting/selection-sort/SelectionSort.js index e26347ec9..b34c30c9a 100644 --- a/src/algorithms/sorting/selection-sort/SelectionSort.js +++ b/src/algorithms/sorting/selection-sort/SelectionSort.js @@ -16,7 +16,7 @@ export default class SelectionSort extends Sort { // Call visiting callback. this.callbacks.visitingCallback(array[j]); - if (this.comparator.lessThen(array[j], array[minIndex])) { + if (this.comparator.lessThan(array[j], array[minIndex])) { minIndex = j; } } diff --git a/src/algorithms/sorting/shell-sort/ShellSort.js b/src/algorithms/sorting/shell-sort/ShellSort.js index eac410456..443da9414 100644 --- a/src/algorithms/sorting/shell-sort/ShellSort.js +++ b/src/algorithms/sorting/shell-sort/ShellSort.js @@ -20,7 +20,7 @@ export default class ShellSort extends Sort { this.callbacks.visitingCallback(array[currentIndex]); // Compare and swap array elements if needed. - if (this.comparator.lessThen(array[gapShiftedIndex], array[currentIndex])) { + if (this.comparator.lessThan(array[gapShiftedIndex], array[currentIndex])) { const tmp = array[currentIndex]; array[currentIndex] = array[gapShiftedIndex]; array[gapShiftedIndex] = tmp; diff --git a/src/data-structures/heap/MinHeap.js b/src/data-structures/heap/MinHeap.js index 5cd52e2e7..bf23f415d 100644 --- a/src/data-structures/heap/MinHeap.js +++ b/src/data-structures/heap/MinHeap.js @@ -167,7 +167,7 @@ export default class MinHeap { leftChild !== null && ( parentItem === null || - this.compare.lessThen(parentItem, this.heapContainer[indexToRemove]) + this.compare.lessThan(parentItem, this.heapContainer[indexToRemove]) ) ) { this.heapifyDown(indexToRemove); @@ -209,7 +209,7 @@ export default class MinHeap { while ( this.hasParent(currentIndex) && - this.compare.lessThen(this.heapContainer[currentIndex], this.parent(currentIndex)) + this.compare.lessThan(this.heapContainer[currentIndex], this.parent(currentIndex)) ) { this.swap(currentIndex, this.getParentIndex(currentIndex)); currentIndex = this.getParentIndex(currentIndex); @@ -228,14 +228,14 @@ export default class MinHeap { while (this.hasLeftChild(currentIndex)) { if ( this.hasRightChild(currentIndex) && - this.compare.lessThen(this.rightChild(currentIndex), this.leftChild(currentIndex)) + this.compare.lessThan(this.rightChild(currentIndex), this.leftChild(currentIndex)) ) { nextIndex = this.getRightChildIndex(currentIndex); } else { nextIndex = this.getLeftChildIndex(currentIndex); } - if (this.compare.lessThen(this.heapContainer[currentIndex], this.heapContainer[nextIndex])) { + if (this.compare.lessThan(this.heapContainer[currentIndex], this.heapContainer[nextIndex])) { break; } diff --git a/src/utils/comparator/Comparator.js b/src/utils/comparator/Comparator.js index a2c71527a..152c1ec1a 100644 --- a/src/utils/comparator/Comparator.js +++ b/src/utils/comparator/Comparator.js @@ -23,20 +23,20 @@ export default class Comparator { return this.compare(a, b) === 0; } - lessThen(a, b) { + lessThan(a, b) { return this.compare(a, b) < 0; } - greaterThen(a, b) { + greaterThan(a, b) { return this.compare(a, b) > 0; } - lessThenOrEqual(a, b) { - return this.lessThen(a, b) || this.equal(a, b); + lessThanOrEqual(a, b) { + return this.lessThan(a, b) || this.equal(a, b); } - greaterThenOrEqual(a, b) { - return this.greaterThen(a, b) || this.equal(a, b); + greaterThanOrEqual(a, b) { + return this.greaterThan(a, b) || this.equal(a, b); } reverse() { diff --git a/src/utils/comparator/__test__/Comparator.test.js b/src/utils/comparator/__test__/Comparator.test.js index 4bd837540..ccc7e0dce 100644 --- a/src/utils/comparator/__test__/Comparator.test.js +++ b/src/utils/comparator/__test__/Comparator.test.js @@ -7,19 +7,19 @@ describe('Comparator', () => { expect(comparator.equal(0, 0)).toBeTruthy(); expect(comparator.equal(0, 1)).toBeFalsy(); expect(comparator.equal('a', 'a')).toBeTruthy(); - expect(comparator.lessThen(1, 2)).toBeTruthy(); - expect(comparator.lessThen(-1, 2)).toBeTruthy(); - expect(comparator.lessThen('a', 'b')).toBeTruthy(); - expect(comparator.lessThen('a', 'ab')).toBeTruthy(); - expect(comparator.lessThen(10, 2)).toBeFalsy(); - expect(comparator.lessThenOrEqual(10, 2)).toBeFalsy(); - expect(comparator.lessThenOrEqual(1, 1)).toBeTruthy(); - expect(comparator.lessThenOrEqual(0, 0)).toBeTruthy(); - expect(comparator.greaterThen(0, 0)).toBeFalsy(); - expect(comparator.greaterThen(10, 0)).toBeTruthy(); - expect(comparator.greaterThenOrEqual(10, 0)).toBeTruthy(); - expect(comparator.greaterThenOrEqual(10, 10)).toBeTruthy(); - expect(comparator.greaterThenOrEqual(0, 10)).toBeFalsy(); + expect(comparator.lessThan(1, 2)).toBeTruthy(); + expect(comparator.lessThan(-1, 2)).toBeTruthy(); + expect(comparator.lessThan('a', 'b')).toBeTruthy(); + expect(comparator.lessThan('a', 'ab')).toBeTruthy(); + expect(comparator.lessThan(10, 2)).toBeFalsy(); + expect(comparator.lessThanOrEqual(10, 2)).toBeFalsy(); + expect(comparator.lessThanOrEqual(1, 1)).toBeTruthy(); + expect(comparator.lessThanOrEqual(0, 0)).toBeTruthy(); + expect(comparator.greaterThan(0, 0)).toBeFalsy(); + expect(comparator.greaterThan(10, 0)).toBeTruthy(); + expect(comparator.greaterThanOrEqual(10, 0)).toBeTruthy(); + expect(comparator.greaterThanOrEqual(10, 10)).toBeTruthy(); + expect(comparator.greaterThanOrEqual(0, 10)).toBeFalsy(); }); it('should compare with custom comparator function', () => { @@ -33,18 +33,18 @@ describe('Comparator', () => { expect(comparator.equal('a', 'b')).toBeTruthy(); expect(comparator.equal('a', '')).toBeFalsy(); - expect(comparator.lessThen('b', 'aa')).toBeTruthy(); - expect(comparator.greaterThenOrEqual('a', 'aa')).toBeFalsy(); - expect(comparator.greaterThenOrEqual('aa', 'a')).toBeTruthy(); - expect(comparator.greaterThenOrEqual('a', 'a')).toBeTruthy(); + expect(comparator.lessThan('b', 'aa')).toBeTruthy(); + expect(comparator.greaterThanOrEqual('a', 'aa')).toBeFalsy(); + expect(comparator.greaterThanOrEqual('aa', 'a')).toBeTruthy(); + expect(comparator.greaterThanOrEqual('a', 'a')).toBeTruthy(); comparator.reverse(); expect(comparator.equal('a', 'b')).toBeTruthy(); expect(comparator.equal('a', '')).toBeFalsy(); - expect(comparator.lessThen('b', 'aa')).toBeFalsy(); - expect(comparator.greaterThenOrEqual('a', 'aa')).toBeTruthy(); - expect(comparator.greaterThenOrEqual('aa', 'a')).toBeFalsy(); - expect(comparator.greaterThenOrEqual('a', 'a')).toBeTruthy(); + expect(comparator.lessThan('b', 'aa')).toBeFalsy(); + expect(comparator.greaterThanOrEqual('a', 'aa')).toBeTruthy(); + expect(comparator.greaterThanOrEqual('aa', 'a')).toBeFalsy(); + expect(comparator.greaterThanOrEqual('a', 'a')).toBeTruthy(); }); }); From b68bd3da2fbd07b0aa058d47d5308d3588524ab8 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 24 May 2018 16:04:59 +1000 Subject: [PATCH 321/327] stop bubble sort revisiting already sorted elements --- src/algorithms/sorting/bubble-sort/BubbleSort.js | 4 ++-- .../sorting/bubble-sort/__test__/BubbleSort.test.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/algorithms/sorting/bubble-sort/BubbleSort.js b/src/algorithms/sorting/bubble-sort/BubbleSort.js index 2da40d56f..a57e9ce46 100644 --- a/src/algorithms/sorting/bubble-sort/BubbleSort.js +++ b/src/algorithms/sorting/bubble-sort/BubbleSort.js @@ -7,13 +7,13 @@ export default class BubbleSort extends Sort { // Clone original array to prevent its modification. const array = originalArray.slice(0); - for (let i = 0; i < array.length; i += 1) { + for (let i = 1; i < array.length; i += 1) { swapped = false; // Call visiting callback. this.callbacks.visitingCallback(array[i]); - for (let j = 0; j < array.length - 1; j += 1) { + for (let j = 0; j < array.length - i; j += 1) { // Call visiting callback. this.callbacks.visitingCallback(array[j]); diff --git a/src/algorithms/sorting/bubble-sort/__test__/BubbleSort.test.js b/src/algorithms/sorting/bubble-sort/__test__/BubbleSort.test.js index 8ab3984ec..5ffd65297 100644 --- a/src/algorithms/sorting/bubble-sort/__test__/BubbleSort.test.js +++ b/src/algorithms/sorting/bubble-sort/__test__/BubbleSort.test.js @@ -9,8 +9,8 @@ import { // Complexity constants. const SORTED_ARRAY_VISITING_COUNT = 20; -const NOT_SORTED_ARRAY_VISITING_COUNT = 280; -const REVERSE_SORTED_ARRAY_VISITING_COUNT = 400; +const NOT_SORTED_ARRAY_VISITING_COUNT = 189; +const REVERSE_SORTED_ARRAY_VISITING_COUNT = 209; const EQUAL_ARRAY_VISITING_COUNT = 20; describe('BubbleSort', () => { From 4dcc79e0c47b5b85524b2a9167a81b463bf85750 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 24 May 2018 09:10:48 +0300 Subject: [PATCH 322/327] Refactor peek function in Stack. --- src/data-structures/stack/Stack.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data-structures/stack/Stack.js b/src/data-structures/stack/Stack.js index daa5d9390..664df0533 100644 --- a/src/data-structures/stack/Stack.js +++ b/src/data-structures/stack/Stack.js @@ -16,7 +16,7 @@ export default class Stack { * @return {*} */ peek() { - if (!this.linkedList.tail) { + if (this.isEmpty()) { return null; } From 6a34f0332667abe1bd07bcfb3d140089651de598 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 24 May 2018 09:13:23 +0300 Subject: [PATCH 323/327] Update language link outlook. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index edf78284d..09ec8defe 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Each algorithm and data structure have its own separate README with related explanations and links for further reading and YouTube videos. -Read this in other languages: [Chinese](https://github.com/trekhleb/javascript-algorithms/blob/master/README.zh-CN.md) +_Read this in other languages:_ [_Chinese_](https://github.com/trekhleb/javascript-algorithms/blob/master/README.zh-CN.md) ## Data Structures From d5ef28117130ffbe4bb5cfe67858e696b199fdc0 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 24 May 2018 09:15:18 +0300 Subject: [PATCH 324/327] Fix Chinese README. --- README.zh-CN.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.zh-CN.md b/README.zh-CN.md index 5a815e3df..fb386c46d 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -180,7 +180,7 @@ npm test -- -t 'playground' | **O(1)** | 1 | 1 | 1 | | **O(log N)** | 3 | 6 | 9 | | **O(N)** | 10 | 100 | 1000 | -| **O(N log N)** | 30 | 60 | 9000 | +| **O(N log N)** | 30 | 600 | 9000 | | **O(N^2)** | 100 | 10000 | 1000000 | | **O(2^N)** | 1024 | 1.26e+29 | 1.07e+301 | | **O(N!)** | 3628800 | 9.3e+157 | 4.02e+2567 | From 6a60e4a658113d6c7d9e34a2bf98b967ce009c79 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 24 May 2018 09:17:06 +0300 Subject: [PATCH 325/327] Fix Chinese README. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 09ec8defe..1422c6923 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Each algorithm and data structure have its own separate README with related explanations and links for further reading and YouTube videos. -_Read this in other languages:_ [_Chinese_](https://github.com/trekhleb/javascript-algorithms/blob/master/README.zh-CN.md) +_Read this in other languages:_ [简体中文](https://github.com/trekhleb/javascript-algorithms/blob/master/README.zh-CN.md) ## Data Structures From 27c8379427051ac70a5e4db89da25f06f762ac0b Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 24 May 2018 14:27:06 +0300 Subject: [PATCH 326/327] Update dependencies. --- yarn.lock | 4265 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 4265 insertions(+) create mode 100644 yarn.lock diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 000000000..d66b822ea --- /dev/null +++ b/yarn.lock @@ -0,0 +1,4265 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@^7.0.0-beta.35": + version "7.0.0-beta.47" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.47.tgz#d18c2f4c4ba8d093a2bcfab5616593bfe2441a27" + dependencies: + "@babel/highlight" "7.0.0-beta.47" + +"@babel/highlight@7.0.0-beta.47": + version "7.0.0-beta.47" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.47.tgz#8fbc83fb2a21f0bd2b95cdbeb238cf9689cad494" + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^3.0.0" + +"@types/jest@^22.2.3": + version "22.2.3" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-22.2.3.tgz#0157c0316dc3722c43a7b71de3fdf3acbccef10d" + +abab@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + +acorn-globals@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538" + dependencies: + acorn "^5.0.0" + +acorn-jsx@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" + dependencies: + acorn "^3.0.4" + +acorn@^3.0.4: + version "3.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" + +acorn@^5.0.0, acorn@^5.3.0, acorn@^5.5.0: + version "5.5.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.3.tgz#f473dd47e0277a08e28e9bec5aeeb04751f0b8c9" + +ajv-keywords@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" + +ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0: + version "5.5.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" + dependencies: + co "^4.6.0" + fast-deep-equal "^1.0.0" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.3.0" + +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + +ansi-escapes@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + dependencies: + color-convert "^1.9.0" + +anymatch@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" + dependencies: + micromatch "^2.1.5" + normalize-path "^2.0.0" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +append-transform@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" + dependencies: + default-require-extensions "^1.0.0" + +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + +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.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + dependencies: + sprintf-js "~1.0.2" + +argv@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/argv/-/argv-0.0.2.tgz#ecbd16f8949b157183711b1bda334f37840185ab" + +aria-query@^0.7.0: + version "0.7.1" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-0.7.1.tgz#26cbb5aff64144b0a825be1846e0b16cfa00b11e" + dependencies: + ast-types-flow "0.0.7" + commander "^2.11.0" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + +arr-flatten@^1.0.1, arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + +array-includes@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.7.0" + +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" + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + +arrify@^1.0.0, arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + +asap@~2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + +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" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + +ast-types-flow@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + +async-each@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + +async-limiter@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" + +async@^1.4.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + +async@^2.1.4: + version "2.6.1" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" + dependencies: + lodash "^4.17.10" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +atob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + +aws4@^1.6.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289" + +axobject-query@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-0.1.0.tgz#62f59dbc59c9f9242759ca349960e7a2fe3c36c0" + dependencies: + ast-types-flow "0.0.7" + +babel-cli@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.26.0.tgz#502ab54874d7db88ad00b887a06383ce03d002f1" + dependencies: + babel-core "^6.26.0" + babel-polyfill "^6.26.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + commander "^2.11.0" + convert-source-map "^1.5.0" + fs-readdir-recursive "^1.0.0" + glob "^7.1.2" + lodash "^4.17.4" + output-file-sync "^1.1.2" + path-is-absolute "^1.0.1" + slash "^1.0.0" + source-map "^0.5.6" + v8flags "^2.1.1" + optionalDependencies: + chokidar "^1.6.1" + +babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-core@^6.0.0, babel-core@^6.26.0: + version "6.26.3" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.1" + debug "^2.6.9" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.8" + slash "^1.0.0" + source-map "^0.5.7" + +babel-generator@^6.18.0, babel-generator@^6.26.0: + version "6.26.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.7" + trim-right "^1.0.1" + +babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" + dependencies: + babel-helper-explode-assignable-expression "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-define-map@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-explode-assignable-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + dependencies: + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-regex@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" + dependencies: + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-remap-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + dependencies: + babel-helper-optimise-call-expression "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-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-jest@^22.4.4: + version "22.4.4" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-22.4.4.tgz#977259240420e227444ebe49e226a61e49ea659d" + dependencies: + babel-plugin-istanbul "^4.1.5" + babel-preset-jest "^22.4.4" + +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-istanbul@^4.1.5: + version "4.1.6" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz#36c59b2192efce81c5b378321b74175add1c9a45" + dependencies: + babel-plugin-syntax-object-rest-spread "^6.13.0" + find-up "^2.1.0" + istanbul-lib-instrument "^1.10.1" + test-exclude "^4.2.1" + +babel-plugin-jest-hoist@^22.4.4: + version "22.4.4" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.4.4.tgz#b9851906eab34c7bf6f8c895a2b08bea1a844c0b" + +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-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-object-rest-spread@^6.13.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-to-generator@^6.22.0: + 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-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.23.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" + dependencies: + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-plugin-transform-es2015-classes@^6.23.0: + 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.22.0: + 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.23.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.22.0: + 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.23.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.22.0: + 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.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.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.26.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-types "^6.26.0" + +babel-plugin-transform-es2015-modules-systemjs@^6.23.0: + 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.23.0: + 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.22.0: + 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.23.0: + 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.22.0: + 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.22.0: + 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.23.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.22.0: + 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.22.0: + 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-regenerator@^6.22.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" + dependencies: + regenerator-transform "^0.10.0" + +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-polyfill@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" + dependencies: + babel-runtime "^6.26.0" + core-js "^2.5.0" + regenerator-runtime "^0.10.5" + +babel-preset-env@^1.6.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-to-generator "^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.23.0" + babel-plugin-transform-es2015-classes "^6.23.0" + babel-plugin-transform-es2015-computed-properties "^6.22.0" + babel-plugin-transform-es2015-destructuring "^6.23.0" + babel-plugin-transform-es2015-duplicate-keys "^6.22.0" + babel-plugin-transform-es2015-for-of "^6.23.0" + babel-plugin-transform-es2015-function-name "^6.22.0" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.22.0" + babel-plugin-transform-es2015-modules-commonjs "^6.23.0" + babel-plugin-transform-es2015-modules-systemjs "^6.23.0" + babel-plugin-transform-es2015-modules-umd "^6.23.0" + babel-plugin-transform-es2015-object-super "^6.22.0" + babel-plugin-transform-es2015-parameters "^6.23.0" + babel-plugin-transform-es2015-shorthand-properties "^6.22.0" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.22.0" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.23.0" + babel-plugin-transform-es2015-unicode-regex "^6.22.0" + babel-plugin-transform-exponentiation-operator "^6.22.0" + babel-plugin-transform-regenerator "^6.22.0" + browserslist "^3.2.6" + invariant "^2.2.2" + semver "^5.3.0" + +babel-preset-jest@^22.4.4: + version "22.4.4" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-22.4.4.tgz#ec9fbd8bcd7dfd24b8b5320e0e688013235b7c39" + dependencies: + babel-plugin-jest-hoist "^22.4.4" + babel-plugin-syntax-object-rest-spread "^6.13.0" + +babel-register@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + dependencies: + babel-core "^6.26.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" + home-or-tmp "^2.0.0" + lodash "^4.17.4" + mkdirp "^0.5.1" + source-map-support "^0.4.15" + +babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +bcrypt-pbkdf@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + dependencies: + tweetnacl "^0.14.3" + +binary-extensions@^1.0.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +braces@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +browser-process-hrtime@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e" + +browser-resolve@^1.11.2: + version "1.11.2" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" + dependencies: + resolve "1.1.7" + +browserslist@^3.2.6: + version "3.2.8" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" + dependencies: + caniuse-lite "^1.0.30000844" + electron-to-chromium "^1.3.47" + +bser@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" + dependencies: + node-int64 "^0.4.0" + +buffer-from@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.0.0.tgz#4cb8832d23612589b0406e9e2956c17f06fdf531" + +builtin-modules@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +caller-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" + dependencies: + callsites "^0.2.0" + +callsites@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + +camelcase@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + +camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + +caniuse-lite@^1.0.30000844: + version "1.0.30000846" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000846.tgz#2092911eecad71a89dae1faa62bcc202fde7f959" + +capture-exit@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" + dependencies: + rsvp "^3.3.3" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +chalk@^1.1.3: + 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.0, chalk@^2.0.1, chalk@^2.1.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chardet@^0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" + +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" + +ci-info@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.3.tgz#710193264bb05c77b8c90d02f5aaf22216a667b2" + +circular-json@^0.3.1: + version "0.3.3" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +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.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + +cliui@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + +cliui@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + +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" + +codecov@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/codecov/-/codecov-3.0.2.tgz#aea43843a5cd2fb6b7e488b2eff25d367ab70b12" + dependencies: + argv "0.0.2" + request "^2.81.0" + urlgrey "0.4.4" + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" + dependencies: + color-name "^1.1.1" + +color-name@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + +combined-stream@1.0.6, combined-stream@~1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" + dependencies: + delayed-stream "~1.0.0" + +commander@^2.11.0: + version "2.15.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" + +compare-versions@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.2.1.tgz#a49eb7689d4caaf0b6db5220173fd279614000f7" + +component-emitter@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +concat-stream@^1.4.7, concat-stream@^1.6.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +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" + +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + +convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + +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.4.0, core-js@^2.5.0: + version "2.5.6" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.6.tgz#0fe6d45bf3cac3ac364a9d72de7576f4eb221b9d" + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +cross-spawn@^5.0.1, cross-spawn@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": + version "0.3.2" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" + +"cssstyle@>= 0.3.1 < 0.4.0": + version "0.3.1" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.3.1.tgz#6da9b4cff1bc5d716e6e5fe8e04fcb1b50a49adf" + dependencies: + cssom "0.3.x" + +damerau-levenshtein@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz#03191c432cb6eea168bb77f3a55ffdccb8978514" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +data-urls@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.0.0.tgz#24802de4e81c298ea8a9388bb0d8e461c774684f" + dependencies: + abab "^1.0.4" + whatwg-mimetype "^2.0.0" + whatwg-url "^6.4.0" + +debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + dependencies: + ms "2.0.0" + +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: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + +deep-extend@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.5.1.tgz#b894a9dd90d3023fbf1c55a394fb858eb2066f1f" + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + +default-require-extensions@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" + dependencies: + strip-bom "^2.0.0" + +define-properties@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" + dependencies: + foreach "^2.0.5" + object-keys "^1.0.8" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +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" + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + dependencies: + repeating "^2.0.0" + +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + +detect-newline@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" + +diff@^3.2.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + +doctrine@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +doctrine@^2.0.2, doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + dependencies: + esutils "^2.0.2" + +domexception@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + dependencies: + webidl-conversions "^4.0.2" + +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" + +electron-to-chromium@^1.3.47: + version "1.3.48" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.48.tgz#d3b0d8593814044e092ece2108fc3ac9aea4b900" + +emoji-regex@^6.1.0: + version "6.5.1" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.5.1.tgz#9baea929b155565c11ea41c6626eaa65cef992c2" + +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" + +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.5.1, es-abstract@^1.7.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.11.0.tgz#cce87d518f0496893b1a30cd8461835535480681" + dependencies: + es-to-primitive "^1.1.1" + function-bind "^1.1.1" + has "^1.0.1" + is-callable "^1.1.3" + is-regex "^1.0.4" + +es-to-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" + dependencies: + is-callable "^1.1.1" + is-date-object "^1.0.1" + is-symbol "^1.0.1" + +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.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.1.tgz#dbae17ef96c8e4bedb1356f4504fa4cc2f7cb7e2" + dependencies: + esprima "^3.1.3" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +eslint-config-airbnb-base@^12.1.0: + version "12.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-12.1.0.tgz#386441e54a12ccd957b0a92564a4bafebd747944" + dependencies: + eslint-restricted-globals "^0.1.1" + +eslint-config-airbnb@^16.1.0: + version "16.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-16.1.0.tgz#2546bfb02cc9fe92284bf1723ccf2e87bc45ca46" + dependencies: + eslint-config-airbnb-base "^12.1.0" + +eslint-import-resolver-node@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" + dependencies: + debug "^2.6.9" + resolve "^1.5.0" + +eslint-module-utils@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz#b270362cd88b1a48ad308976ce7fa54e98411746" + dependencies: + debug "^2.6.8" + pkg-dir "^1.0.0" + +eslint-plugin-import@^2.11.0: + version "2.12.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.12.0.tgz#dad31781292d6664b25317fd049d2e2b2f02205d" + dependencies: + contains-path "^0.1.0" + debug "^2.6.8" + doctrine "1.5.0" + eslint-import-resolver-node "^0.3.1" + eslint-module-utils "^2.2.0" + has "^1.0.1" + lodash "^4.17.4" + minimatch "^3.0.3" + read-pkg-up "^2.0.0" + resolve "^1.6.0" + +eslint-plugin-jest@^21.15.1: + version "21.15.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-21.15.2.tgz#d55898636291d97e0c0a5dbe205bef0235157a34" + +eslint-plugin-jsx-a11y@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.0.3.tgz#54583d1ae442483162e040e13cc31865465100e5" + dependencies: + aria-query "^0.7.0" + array-includes "^3.0.3" + ast-types-flow "0.0.7" + axobject-query "^0.1.0" + damerau-levenshtein "^1.0.0" + emoji-regex "^6.1.0" + jsx-ast-utils "^2.0.0" + +eslint-plugin-react@^7.7.0: + version "7.8.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.8.2.tgz#e95c9c47fece55d2303d1a67c9d01b930b88a51d" + dependencies: + doctrine "^2.0.2" + has "^1.0.1" + jsx-ast-utils "^2.0.1" + prop-types "^15.6.0" + +eslint-restricted-globals@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz#35f0d5cbc64c2e3ed62e93b4b1a7af05ba7ed4d7" + +eslint-scope@^3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-visitor-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" + +eslint@^4.19.1: + version "4.19.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300" + dependencies: + ajv "^5.3.0" + babel-code-frame "^6.22.0" + chalk "^2.1.0" + concat-stream "^1.6.0" + cross-spawn "^5.1.0" + debug "^3.1.0" + doctrine "^2.1.0" + eslint-scope "^3.7.1" + eslint-visitor-keys "^1.0.0" + espree "^3.5.4" + esquery "^1.0.0" + esutils "^2.0.2" + file-entry-cache "^2.0.0" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^11.0.1" + ignore "^3.3.3" + imurmurhash "^0.1.4" + inquirer "^3.0.6" + is-resolvable "^1.0.0" + js-yaml "^3.9.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.4" + minimatch "^3.0.2" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.2" + pluralize "^7.0.0" + progress "^2.0.0" + regexpp "^1.0.1" + require-uncached "^1.0.3" + semver "^5.3.0" + strip-ansi "^4.0.0" + strip-json-comments "~2.0.1" + table "4.0.2" + text-table "~0.2.0" + +espree@^3.5.4: + version "3.5.4" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" + dependencies: + acorn "^5.5.0" + acorn-jsx "^3.0.0" + +esprima@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + +esprima@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" + +esquery@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" + dependencies: + estraverse "^4.0.0" + +esrecurse@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + dependencies: + estraverse "^4.1.0" + +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +exec-sh@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.1.tgz#163b98a6e89e6b65b47c2a28d215bc1f63989c38" + dependencies: + merge "^1.1.3" + +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" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + +expect@^22.4.0: + version "22.4.3" + resolved "https://registry.yarnpkg.com/expect/-/expect-22.4.3.tgz#d5a29d0a0e1fb2153557caef2674d4547e914674" + dependencies: + ansi-styles "^3.2.0" + jest-diff "^22.4.3" + jest-get-type "^22.4.3" + jest-matcher-utils "^22.4.3" + jest-message-util "^22.4.3" + jest-regex-util "^22.4.3" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@~3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + +external-editor@^2.0.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" + dependencies: + chardet "^0.4.0" + iconv-lite "^0.4.17" + tmp "^0.0.33" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + +fast-deep-equal@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" + +fast-json-stable-stringify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + +fb-watchman@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" + dependencies: + bser "^2.0.0" + +fbjs@^0.8.16: + version "0.8.16" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db" + 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" + +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" + +fileset@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" + dependencies: + glob "^7.0.3" + minimatch "^3.0.3" + +fill-range@^2.1.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^3.0.0" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + dependencies: + locate-path "^2.0.0" + +flat-cache@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" + dependencies: + circular-json "^0.3.1" + del "^2.0.2" + graceful-fs "^4.1.2" + write "^0.2.1" + +for-in@^1.0.1, for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + dependencies: + for-in "^1.0.1" + +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.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" + dependencies: + asynckit "^0.4.0" + combined-stream "1.0.6" + mime-types "^2.1.12" + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + dependencies: + map-cache "^0.2.2" + +fs-minipass@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" + dependencies: + minipass "^2.2.1" + +fs-readdir-recursive@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fsevents@^1.0.0, fsevents@^1.2.3: + version "1.2.4" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" + dependencies: + nan "^2.9.2" + node-pre-gyp "^0.10.0" + +function-bind@^1.0.2, function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +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-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + dependencies: + assert-plus "^1.0.0" + +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.0.3, glob@^7.0.5, glob@^7.1.1, 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" + +globals@^11.0.1: + version "11.5.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.5.0.tgz#6bc840de6771173b191f13d3a9c94d441ee92642" + +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + +globby@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" + dependencies: + array-union "^1.0.1" + arrify "^1.0.0" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + +handlebars@^4.0.3: + version "4.0.11" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" + dependencies: + async "^1.4.0" + optimist "^0.6.1" + source-map "^0.4.4" + optionalDependencies: + uglify-js "^2.6" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + +har-validator@~5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" + dependencies: + ajv "^5.1.0" + har-schema "^2.0.0" + +has-ansi@^2.0.0: + 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-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" + dependencies: + function-bind "^1.0.2" + +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" + +hosted-git-info@^2.1.4: + version "2.6.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.6.0.tgz#23235b29ab230c576aab0d4f13fc046b0b038222" + +html-encoding-sniffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + dependencies: + whatwg-encoding "^1.0.1" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +iconv-lite@0.4.19: + version "0.4.19" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" + +iconv-lite@^0.4.17, iconv-lite@^0.4.4, iconv-lite@~0.4.13: + version "0.4.23" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ignore-walk@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" + dependencies: + minimatch "^3.0.4" + +ignore@^3.3.3: + version "3.3.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.8.tgz#3f8e9c35d38708a3a7e0e9abb6c73e7ee7707b2b" + +import-local@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc" + dependencies: + pkg-dir "^2.0.0" + resolve-cwd "^2.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + +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.1, inherits@^2.0.3, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +ini@~1.3.0: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + +inquirer@^3.0.6: + version "3.3.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.0.4" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx-lite "^4.0.8" + rx-lite-aggregates "^4.0.8" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + +invariant@^2.2.2: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + dependencies: + kind-of "^6.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + dependencies: + builtin-modules "^1.0.0" + +is-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.1.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.1.0.tgz#247e4162e7860cebbdaf30b774d6b0ac7dcfe7a5" + dependencies: + ci-info "^1.0.0" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + +is-generator-fn@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-1.0.0.tgz#969d49e1bb3329f6bb7f09089be26578b2ddd46a" + +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-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + dependencies: + kind-of "^3.0.2" + +is-number@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + +is-odd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24" + dependencies: + is-number "^4.0.0" + +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + +is-path-in-cwd@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" + dependencies: + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + dependencies: + path-is-inside "^1.0.1" + +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + dependencies: + isobject "^3.0.1" + +is-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-regex@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + dependencies: + has "^1.0.1" + +is-resolvable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + +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-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" + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + +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" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + +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" + +istanbul-api@^1.1.14: + version "1.3.1" + resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.3.1.tgz#4c3b05d18c0016d1022e079b98dc82c40f488954" + dependencies: + async "^2.1.4" + compare-versions "^3.1.0" + fileset "^2.0.2" + istanbul-lib-coverage "^1.2.0" + istanbul-lib-hook "^1.2.0" + istanbul-lib-instrument "^1.10.1" + istanbul-lib-report "^1.1.4" + istanbul-lib-source-maps "^1.2.4" + istanbul-reports "^1.3.0" + js-yaml "^3.7.0" + mkdirp "^0.5.1" + once "^1.4.0" + +istanbul-lib-coverage@^1.1.1, istanbul-lib-coverage@^1.1.2, istanbul-lib-coverage@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz#f7d8f2e42b97e37fe796114cb0f9d68b5e3a4341" + +istanbul-lib-hook@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.2.0.tgz#ae556fd5a41a6e8efa0b1002b1e416dfeaf9816c" + dependencies: + append-transform "^0.4.0" + +istanbul-lib-instrument@^1.10.1, istanbul-lib-instrument@^1.8.0: + version "1.10.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz#724b4b6caceba8692d3f1f9d0727e279c401af7b" + dependencies: + babel-generator "^6.18.0" + babel-template "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + babylon "^6.18.0" + istanbul-lib-coverage "^1.2.0" + semver "^5.3.0" + +istanbul-lib-report@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.4.tgz#e886cdf505c4ebbd8e099e4396a90d0a28e2acb5" + dependencies: + istanbul-lib-coverage "^1.2.0" + mkdirp "^0.5.1" + path-parse "^1.0.5" + supports-color "^3.1.2" + +istanbul-lib-source-maps@^1.2.1: + version "1.2.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.3.tgz#20fb54b14e14b3fb6edb6aca3571fd2143db44e6" + dependencies: + debug "^3.1.0" + istanbul-lib-coverage "^1.1.2" + mkdirp "^0.5.1" + rimraf "^2.6.1" + source-map "^0.5.3" + +istanbul-lib-source-maps@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.4.tgz#cc7ccad61629f4efff8e2f78adb8c522c9976ec7" + dependencies: + debug "^3.1.0" + istanbul-lib-coverage "^1.2.0" + mkdirp "^0.5.1" + rimraf "^2.6.1" + source-map "^0.5.3" + +istanbul-reports@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.3.0.tgz#2f322e81e1d9520767597dca3c20a0cce89a3554" + dependencies: + handlebars "^4.0.3" + +jest-changed-files@^22.2.0: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-22.4.3.tgz#8882181e022c38bd46a2e4d18d44d19d90a90fb2" + dependencies: + throat "^4.0.0" + +jest-cli@^22.4.4: + version "22.4.4" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-22.4.4.tgz#68cd2a2aae983adb1e6638248ca21082fd6d9e90" + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.2" + graceful-fs "^4.1.11" + import-local "^1.0.0" + is-ci "^1.0.10" + istanbul-api "^1.1.14" + istanbul-lib-coverage "^1.1.1" + istanbul-lib-instrument "^1.8.0" + istanbul-lib-source-maps "^1.2.1" + jest-changed-files "^22.2.0" + jest-config "^22.4.4" + jest-environment-jsdom "^22.4.1" + jest-get-type "^22.1.0" + jest-haste-map "^22.4.2" + jest-message-util "^22.4.0" + jest-regex-util "^22.1.0" + jest-resolve-dependencies "^22.1.0" + jest-runner "^22.4.4" + jest-runtime "^22.4.4" + jest-snapshot "^22.4.0" + jest-util "^22.4.1" + jest-validate "^22.4.4" + jest-worker "^22.2.2" + micromatch "^2.3.11" + node-notifier "^5.2.1" + realpath-native "^1.0.0" + rimraf "^2.5.4" + slash "^1.0.0" + string-length "^2.0.0" + strip-ansi "^4.0.0" + which "^1.2.12" + yargs "^10.0.3" + +jest-config@^22.4.4: + version "22.4.4" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-22.4.4.tgz#72a521188720597169cd8b4ff86934ef5752d86a" + dependencies: + chalk "^2.0.1" + glob "^7.1.1" + jest-environment-jsdom "^22.4.1" + jest-environment-node "^22.4.1" + jest-get-type "^22.1.0" + jest-jasmine2 "^22.4.4" + jest-regex-util "^22.1.0" + jest-resolve "^22.4.2" + jest-util "^22.4.1" + jest-validate "^22.4.4" + pretty-format "^22.4.0" + +jest-diff@^22.4.0, jest-diff@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-22.4.3.tgz#e18cc3feff0aeef159d02310f2686d4065378030" + dependencies: + chalk "^2.0.1" + diff "^3.2.0" + jest-get-type "^22.4.3" + pretty-format "^22.4.3" + +jest-docblock@^22.4.0, jest-docblock@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-22.4.3.tgz#50886f132b42b280c903c592373bb6e93bb68b19" + dependencies: + detect-newline "^2.1.0" + +jest-environment-jsdom@^22.4.1: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-22.4.3.tgz#d67daa4155e33516aecdd35afd82d4abf0fa8a1e" + dependencies: + jest-mock "^22.4.3" + jest-util "^22.4.3" + jsdom "^11.5.1" + +jest-environment-node@^22.4.1: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-22.4.3.tgz#54c4eaa374c83dd52a9da8759be14ebe1d0b9129" + dependencies: + jest-mock "^22.4.3" + jest-util "^22.4.3" + +jest-get-type@^22.1.0, jest-get-type@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.4.3.tgz#e3a8504d8479342dd4420236b322869f18900ce4" + +jest-haste-map@^22.4.2: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-22.4.3.tgz#25842fa2ba350200767ac27f658d58b9d5c2e20b" + dependencies: + fb-watchman "^2.0.0" + graceful-fs "^4.1.11" + jest-docblock "^22.4.3" + jest-serializer "^22.4.3" + jest-worker "^22.4.3" + micromatch "^2.3.11" + sane "^2.0.0" + +jest-jasmine2@^22.4.4: + version "22.4.4" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-22.4.4.tgz#c55f92c961a141f693f869f5f081a79a10d24e23" + dependencies: + chalk "^2.0.1" + co "^4.6.0" + expect "^22.4.0" + graceful-fs "^4.1.11" + is-generator-fn "^1.0.0" + jest-diff "^22.4.0" + jest-matcher-utils "^22.4.0" + jest-message-util "^22.4.0" + jest-snapshot "^22.4.0" + jest-util "^22.4.1" + source-map-support "^0.5.0" + +jest-leak-detector@^22.4.0: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-22.4.3.tgz#2b7b263103afae8c52b6b91241a2de40117e5b35" + dependencies: + pretty-format "^22.4.3" + +jest-matcher-utils@^22.4.0, jest-matcher-utils@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz#4632fe428ebc73ebc194d3c7b65d37b161f710ff" + dependencies: + chalk "^2.0.1" + jest-get-type "^22.4.3" + pretty-format "^22.4.3" + +jest-message-util@^22.4.0, jest-message-util@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-22.4.3.tgz#cf3d38aafe4befddbfc455e57d65d5239e399eb7" + dependencies: + "@babel/code-frame" "^7.0.0-beta.35" + chalk "^2.0.1" + micromatch "^2.3.11" + slash "^1.0.0" + stack-utils "^1.0.1" + +jest-mock@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-22.4.3.tgz#f63ba2f07a1511772cdc7979733397df770aabc7" + +jest-regex-util@^22.1.0, jest-regex-util@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-22.4.3.tgz#a826eb191cdf22502198c5401a1fc04de9cef5af" + +jest-resolve-dependencies@^22.1.0: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-22.4.3.tgz#e2256a5a846732dc3969cb72f3c9ad7725a8195e" + dependencies: + jest-regex-util "^22.4.3" + +jest-resolve@^22.4.2: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-22.4.3.tgz#0ce9d438c8438229aa9b916968ec6b05c1abb4ea" + dependencies: + browser-resolve "^1.11.2" + chalk "^2.0.1" + +jest-runner@^22.4.4: + version "22.4.4" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-22.4.4.tgz#dfca7b7553e0fa617e7b1291aeb7ce83e540a907" + dependencies: + exit "^0.1.2" + jest-config "^22.4.4" + jest-docblock "^22.4.0" + jest-haste-map "^22.4.2" + jest-jasmine2 "^22.4.4" + jest-leak-detector "^22.4.0" + jest-message-util "^22.4.0" + jest-runtime "^22.4.4" + jest-util "^22.4.1" + jest-worker "^22.2.2" + throat "^4.0.0" + +jest-runtime@^22.4.4: + version "22.4.4" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-22.4.4.tgz#9ba7792fc75582a5be0f79af6f8fe8adea314048" + dependencies: + babel-core "^6.0.0" + babel-jest "^22.4.4" + babel-plugin-istanbul "^4.1.5" + chalk "^2.0.1" + convert-source-map "^1.4.0" + exit "^0.1.2" + graceful-fs "^4.1.11" + jest-config "^22.4.4" + jest-haste-map "^22.4.2" + jest-regex-util "^22.1.0" + jest-resolve "^22.4.2" + jest-util "^22.4.1" + jest-validate "^22.4.4" + json-stable-stringify "^1.0.1" + micromatch "^2.3.11" + realpath-native "^1.0.0" + slash "^1.0.0" + strip-bom "3.0.0" + write-file-atomic "^2.1.0" + yargs "^10.0.3" + +jest-serializer@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-22.4.3.tgz#a679b81a7f111e4766235f4f0c46d230ee0f7436" + +jest-snapshot@^22.4.0: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-22.4.3.tgz#b5c9b42846ffb9faccb76b841315ba67887362d2" + dependencies: + chalk "^2.0.1" + jest-diff "^22.4.3" + jest-matcher-utils "^22.4.3" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + pretty-format "^22.4.3" + +jest-util@^22.4.1, jest-util@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-22.4.3.tgz#c70fec8eec487c37b10b0809dc064a7ecf6aafac" + dependencies: + callsites "^2.0.0" + chalk "^2.0.1" + graceful-fs "^4.1.11" + is-ci "^1.0.10" + jest-message-util "^22.4.3" + mkdirp "^0.5.1" + source-map "^0.6.0" + +jest-validate@^22.4.4: + version "22.4.4" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-22.4.4.tgz#1dd0b616ef46c995de61810d85f57119dbbcec4d" + dependencies: + chalk "^2.0.1" + jest-config "^22.4.4" + jest-get-type "^22.1.0" + leven "^2.1.0" + pretty-format "^22.4.0" + +jest-worker@^22.2.2, jest-worker@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-22.4.3.tgz#5c421417cba1c0abf64bf56bd5fb7968d79dd40b" + dependencies: + merge-stream "^1.0.1" + +jest@^22.4.3: + version "22.4.4" + resolved "https://registry.yarnpkg.com/jest/-/jest-22.4.4.tgz#ffb36c9654b339a13e10b3d4b338eb3e9d49f6eb" + dependencies: + import-local "^1.0.0" + jest-cli "^22.4.4" + +js-tokens@^3.0.0, js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + +js-yaml@^3.7.0, js-yaml@^3.9.1: + version "3.11.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.11.0.tgz#597c1a8bd57152f26d622ce4117851a51f5ebaef" + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + +jsdom@^11.5.1: + version "11.11.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.11.0.tgz#df486efad41aee96c59ad7a190e2449c7eb1110e" + dependencies: + abab "^1.0.4" + acorn "^5.3.0" + acorn-globals "^4.1.0" + array-equal "^1.0.0" + cssom ">= 0.3.2 < 0.4.0" + cssstyle ">= 0.3.1 < 0.4.0" + data-urls "^1.0.0" + domexception "^1.0.0" + escodegen "^1.9.0" + html-encoding-sniffer "^1.0.2" + left-pad "^1.2.0" + nwsapi "^2.0.0" + parse5 "4.0.0" + pn "^1.1.0" + request "^2.83.0" + request-promise-native "^1.0.5" + sax "^1.2.4" + symbol-tree "^3.2.2" + tough-cookie "^2.3.3" + w3c-hr-time "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.3" + whatwg-mimetype "^2.1.0" + whatwg-url "^6.4.1" + ws "^4.0.0" + xml-name-validator "^3.0.0" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + +json-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-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + +json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +json5@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +jsx-ast-utils@^2.0.0, jsx-ast-utils@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz#e801b1b39985e20fffc87b40e3748080e2dcac7f" + dependencies: + array-includes "^3.0.3" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + +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" + +left-pad@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + +leven@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" + +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" + +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" + +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.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + +lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.4, lodash@^4.3.0: + version "4.17.10" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" + +longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + +loose-envify@^1.0.0, 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" + +lru-cache@^4.0.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + dependencies: + tmpl "1.0.x" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + dependencies: + object-visit "^1.0.0" + +math-random@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac" + +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" + +merge-stream@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" + dependencies: + readable-stream "^2.0.1" + +merge@^1.1.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" + +micromatch@^2.1.5, micromatch@^2.3.11: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +micromatch@^3.1.4, micromatch@^3.1.8: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +mime-db@~1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" + +mime-types@^2.1.12, mime-types@~2.1.17: + version "2.1.18" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" + dependencies: + mime-db "~1.33.0" + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + +minimatch@^3.0.2, minimatch@^3.0.3, 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.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@^1.1.1, minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + +minipass@^2.2.1, minipass@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233" + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" + dependencies: + minipass "^2.2.1" + +mixin-deep@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.0, mkdirp@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +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.9.2: + version "2.10.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" + +nanomatch@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-odd "^2.0.0" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + +needle@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d" + dependencies: + debug "^2.1.2" + iconv-lite "^0.4.4" + sax "^1.2.4" + +node-fetch@^1.0.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + +node-notifier@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea" + dependencies: + growly "^1.3.0" + semver "^5.4.1" + shellwords "^0.1.1" + which "^1.3.0" + +node-pre-gyp@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.0.tgz#6e4ef5bb5c5203c6552448828c852c40111aac46" + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.0" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.1.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" + +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: + version "2.4.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + dependencies: + remove-trailing-separator "^1.0.1" + +npm-bundled@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308" + +npm-packlist@^1.1.6: + version "1.1.10" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.10.tgz#1039db9e985727e464df066f4cf0ab6ef85c398a" + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + +npm-run-path@^2.0.0: + 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.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +nwsapi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.0.tgz#7c8faf4ad501e1d17a651ebc5547f966b547c5c7" + +oauth-sign@~0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +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-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-keys@^1.0.8: + version "1.0.11" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + dependencies: + isobject "^3.0.0" + +object.getownpropertydescriptors@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.1" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + dependencies: + isobject "^3.0.1" + +once@^1.3.0, 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" + +optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +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" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-locale@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" + dependencies: + execa "^0.7.0" + lcid "^1.0.0" + mem "^1.1.0" + +os-shim@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +output-file-sync@^1.1.2: + 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" + +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.2.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c" + dependencies: + p-try "^1.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + dependencies: + p-limit "^1.1.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + +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" + +parse5@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + dependencies: + pinkie-promise "^2.0.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-is-inside@^1.0.1, path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + +path-key@^2.0.0: + 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-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" + +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: + 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" + +pkg-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" + dependencies: + find-up "^1.0.0" + +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + dependencies: + find-up "^2.1.0" + +pluralize@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" + +pn@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + +pre-commit@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/pre-commit/-/pre-commit-1.2.2.tgz#dbcee0ee9de7235e57f79c56d7ce94641a69eec6" + dependencies: + cross-spawn "^5.0.1" + spawn-sync "^1.0.15" + which "1.2.x" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + +pretty-format@^22.4.0, pretty-format@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-22.4.3.tgz#f873d780839a9c02e9664c8a082e9ee79eaac16f" + dependencies: + ansi-regex "^3.0.0" + ansi-styles "^3.2.0" + +private@^0.1.6, private@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + +process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + +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.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + dependencies: + asap "~2.0.3" + +prop-types@^15.6.0: + version "15.6.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca" + dependencies: + fbjs "^0.8.16" + loose-envify "^1.3.1" + object-assign "^4.1.1" + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + +qs@~6.5.1: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + +randomatic@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.0.0.tgz#d35490030eb4f7578de292ce6dfb04a91a128923" + dependencies: + is-number "^4.0.0" + kind-of "^6.0.0" + math-random "^1.0.1" + +rc@^1.1.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.7.tgz#8a10ca30d588d00464360372b890d06dacd02297" + dependencies: + deep-extend "^0.5.1" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +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.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.2: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +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" + +realpath-native@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.0.0.tgz#7885721a83b43bd5327609f0ddecb2482305fdf0" + dependencies: + util.promisify "^1.0.0" + +regenerate@^1.2.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + +regenerator-runtime@^0.10.5: + version "0.10.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + +regenerator-transform@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + +regex-cache@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + dependencies: + is-equal-shallow "^0.1.3" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexpp@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" + +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + dependencies: + jsesc "~0.5.0" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + +repeat-element@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + +repeat-string@^1.5.2, repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + dependencies: + is-finite "^1.0.0" + +request-promise-core@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" + dependencies: + lodash "^4.13.1" + +request-promise-native@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5" + dependencies: + request-promise-core "1.1.1" + stealthy-require "^1.1.0" + tough-cookie ">=2.3.3" + +request@^2.81.0, request@^2.83.0: + version "2.87.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.6.0" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.1" + forever-agent "~0.6.1" + form-data "~2.3.1" + har-validator "~5.0.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.17" + oauth-sign "~0.8.2" + performance-now "^2.1.0" + qs "~6.5.1" + safe-buffer "^5.1.1" + tough-cookie "~2.3.3" + tunnel-agent "^0.6.0" + uuid "^3.1.0" + +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" + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + dependencies: + resolve-from "^3.0.0" + +resolve-from@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + +resolve@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + +resolve@^1.5.0, resolve@^1.6.0: + version "1.7.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.7.1.tgz#aadd656374fd298aee895bc026b8297418677fd3" + dependencies: + path-parse "^1.0.5" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + +right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + dependencies: + align-text "^0.1.1" + +rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" + dependencies: + glob "^7.0.5" + +rsvp@^3.3.3: + version "3.6.2" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" + +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" + +safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + +sane@^2.0.0: + version "2.5.2" + resolved "https://registry.yarnpkg.com/sane/-/sane-2.5.2.tgz#b4dc1861c21b427e929507a3e751e2a2cb8ab3fa" + dependencies: + anymatch "^2.0.0" + capture-exit "^1.2.0" + exec-sh "^0.2.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" + watch "~0.18.0" + optionalDependencies: + fsevents "^1.2.3" + +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1: + version "5.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" + +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" + +set-value@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.1" + to-object-path "^0.3.0" + +set-value@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + +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" + +shellwords@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + +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" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + +slice-ansi@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" + dependencies: + is-fullwidth-code-point "^2.0.0" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +source-map-resolve@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + dependencies: + atob "^2.1.1" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.4.15: + version "0.4.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + dependencies: + source-map "^0.5.6" + +source-map-support@^0.5.0: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13" + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + +source-map@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + dependencies: + amdefine ">=0.0.4" + +source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + +source-map@^0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + +spawn-sync@^1.0.15: + version "1.0.15" + resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476" + dependencies: + concat-stream "^1.4.7" + os-shim "^0.1.2" + +spdx-correct@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9" + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87" + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + +sshpk@^1.7.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.1.tgz#130f5975eddad963f1d56f92b9ac6c51fa9f83eb" + 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" + +stack-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.1.tgz#d4f33ab54e8e38778b0ca5cfd3b3afb12db68620" + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +stealthy-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + +string-length@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" + dependencies: + astral-regex "^1.0.0" + strip-ansi "^4.0.0" + +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, string-width@^2.1.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + dependencies: + ansi-regex "^3.0.0" + +strip-bom@3.0.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-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-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + +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" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +supports-color@^3.1.2: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + dependencies: + has-flag "^1.0.0" + +supports-color@^5.3.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" + dependencies: + has-flag "^3.0.0" + +symbol-tree@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" + +table@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" + dependencies: + ajv "^5.2.3" + ajv-keywords "^2.1.0" + chalk "^2.1.0" + lodash "^4.17.4" + slice-ansi "1.0.0" + string-width "^2.1.1" + +tar@^4: + version "4.4.3" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.3.tgz#d6bd509dc7f6b5a5d2c13aa0f7d57b03269b8376" + dependencies: + chownr "^1.0.1" + fs-minipass "^1.2.5" + minipass "^2.3.3" + minizlib "^1.1.0" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.2" + +test-exclude@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.1.tgz#dfa222f03480bca69207ca728b37d74b45f724fa" + dependencies: + arrify "^1.0.1" + micromatch "^3.1.8" + object-assign "^4.1.0" + read-pkg-up "^1.0.1" + require-main-filename "^1.0.1" + +text-table@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + +throat@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + dependencies: + os-tmpdir "~1.0.2" + +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +tough-cookie@>=2.3.3, tough-cookie@^2.3.3, tough-cookie@~2.3.3: + version "2.3.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" + dependencies: + punycode "^1.4.1" + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + dependencies: + punycode "^2.1.0" + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + dependencies: + prelude-ls "~1.1.2" + +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.9: + version "0.7.18" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.18.tgz#a7bfd92f56edfb117083b69e31d2aa8882d4b1ed" + +uglify-js@^2.6: + version "2.8.29" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" + optionalDependencies: + uglify-to-browserify "~1.0.0" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + +union-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^0.4.3" + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + +urlgrey@0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/urlgrey/-/urlgrey-0.4.4.tgz#892fe95960805e85519f1cd4389f2cb4cbb7652f" + +use@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.0.tgz#14716bf03fdfefd03040aef58d8b4b85f3a7c544" + dependencies: + kind-of "^6.0.2" + +user-home@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +util.promisify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + +uuid@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" + +v8flags@^2.1.1: + 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.3" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338" + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +w3c-hr-time@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" + dependencies: + browser-process-hrtime "^0.1.2" + +walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + dependencies: + makeerror "1.0.x" + +watch@~0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986" + dependencies: + exec-sh "^0.2.0" + minimist "^1.2.0" + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3" + dependencies: + iconv-lite "0.4.19" + +whatwg-fetch@>=0.10.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" + +whatwg-mimetype@^2.0.0, whatwg-mimetype@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz#f0f21d76cbba72362eb609dbed2a30cd17fcc7d4" + +whatwg-url@^6.4.0, whatwg-url@^6.4.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.4.1.tgz#fdb94b440fd4ad836202c16e9737d511f012fd67" + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +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.2.x: + version "1.2.14" + resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" + dependencies: + isexe "^2.0.0" + +which@^1.2.12, which@^1.2.9, which@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" + 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" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + +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.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +write@^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@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-4.1.0.tgz#a979b5d7d4da68bf54efe0408967c324869a7289" + dependencies: + async-limiter "~1.0.0" + safe-buffer "~5.1.0" + +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + +y18n@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + +yallist@^3.0.0, yallist@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" + +yargs-parser@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950" + dependencies: + camelcase "^4.1.0" + +yargs@^10.0.3: + version "10.1.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.2.tgz#454d074c2b16a51a43e2fb7807e4f9de69ccb5c5" + dependencies: + cliui "^4.0.0" + decamelize "^1.1.1" + find-up "^2.1.0" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^8.1.0" + +yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0" From 98934f622c091ce53a565852df74bb0157ef67e9 Mon Sep 17 00:00:00 2001 From: Muhammad Usman Date: Thu, 24 May 2018 14:34:30 +0300 Subject: [PATCH 327/327] Update dependencies. --- package-lock.json | 941 +++++++--- package.json | 12 +- yarn.lock | 4265 --------------------------------------------- 3 files changed, 717 insertions(+), 4501 deletions(-) delete mode 100644 yarn.lock diff --git a/package-lock.json b/package-lock.json index 12661d48b..5b229954f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,22 +1,22 @@ { - "name": "javascript-algorithms", - "version": "1.0.0", + "name": "javascript-algorithms-and-data-structures", + "version": "0.0.3", "lockfileVersion": 1, "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.0.0-beta.46", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.46.tgz", - "integrity": "sha512-7BKRkmYaPZm3Yff5HGZJKCz7RqZ5jUjknsXT6Gz5YKG23J3uq9hAj0epncCB0rlqmnZ8Q+UUpQB2tCR5mT37vw==", + "version": "7.0.0-beta.47", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.47.tgz", + "integrity": "sha512-W7IeG4MoVf4oUvWfHUx9VG9if3E0xSUDf1urrnNYtC2ow1dz2ptvQ6YsJfyVXDuPTFXz66jkHhzMW7a5Eld7TA==", "dev": true, "requires": { - "@babel/highlight": "7.0.0-beta.46" + "@babel/highlight": "7.0.0-beta.47" } }, "@babel/highlight": { - "version": "7.0.0-beta.46", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.46.tgz", - "integrity": "sha512-r4snW6Q8ICL3Y8hGzYJRvyG/+sc+kvkewXNedG9tQjoHmUFMwMSv/o45GWQUQswevGnWghiGkpRPivFfOuMsOA==", + "version": "7.0.0-beta.47", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.47.tgz", + "integrity": "sha512-d505K3Hth1eg0b2swfEF7oFMw3J9M8ceFg0s6dhCSxOOF+07WDvJ0HKT/YbK/Jk9wn8Wyr6HIRAUPKJ9Wfv8Rg==", "dev": true, "requires": { "chalk": "^2.0.0", @@ -298,12 +298,12 @@ "dev": true }, "async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", "dev": true, "requires": { - "lodash": "^4.14.0" + "lodash": "^4.17.10" } }, "async-each": { @@ -326,9 +326,9 @@ "dev": true }, "atob": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.0.tgz", - "integrity": "sha512-SuiKH8vbsOyCALjA/+EINmt/Kdl+TQPrtFgW7XZZcwtryFu9e5kQoX3bjCW6mIvGH1fbeAZZuvwGR5IlBRznGw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", + "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", "dev": true }, "aws-sign2": { @@ -567,13 +567,13 @@ } }, "babel-jest": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-22.4.3.tgz", - "integrity": "sha512-BgSjmtl3mW3i+VeVHEr9d2zFSAT66G++pJcHQiUjd00pkW+voYXFctIm/indcqOWWXw5a1nUpR1XWszD9fJ1qg==", + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-22.4.4.tgz", + "integrity": "sha512-A9NB6/lZhYyypR9ATryOSDcqBaqNdzq4U+CN+/wcMsLcmKkPxQEoTKLajGfd3IkxNyVBT8NewUK2nWyGbSzHEQ==", "dev": true, "requires": { "babel-plugin-istanbul": "^4.1.5", - "babel-preset-jest": "^22.4.3" + "babel-preset-jest": "^22.4.4" } }, "babel-messages": { @@ -618,9 +618,9 @@ } }, "babel-plugin-jest-hoist": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.4.3.tgz", - "integrity": "sha512-zhvv4f6OTWy2bYevcJftwGCWXMFe7pqoz41IhMi4xna7xNsX5NygdagsrE0y6kkfuXq8UalwvPwKTyAxME2E/g==", + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.4.4.tgz", + "integrity": "sha512-DUvGfYaAIlkdnygVIEl0O4Av69NtuQWcrjMOv6DODPuhuGLDnbsARz3AwiiI/EkIMMlxQDUcrZ9yoyJvTNjcVQ==", "dev": true }, "babel-plugin-syntax-async-functions": { @@ -942,9 +942,9 @@ } }, "babel-preset-env": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.1.tgz", - "integrity": "sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz", + "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==", "dev": true, "requires": { "babel-plugin-check-es2015-constants": "^6.22.0", @@ -974,18 +974,18 @@ "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", "babel-plugin-transform-exponentiation-operator": "^6.22.0", "babel-plugin-transform-regenerator": "^6.22.0", - "browserslist": "^2.1.2", + "browserslist": "^3.2.6", "invariant": "^2.2.2", "semver": "^5.3.0" } }, "babel-preset-jest": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-22.4.3.tgz", - "integrity": "sha512-a+M3LTEXTq3gxv0uBN9Qm6ahUl7a8pj923nFbCUdqFUSsf3YrX8Uc+C3MEwji5Af3LiQjSC7w4ooYewlz8HRTA==", + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-22.4.4.tgz", + "integrity": "sha512-+dxMtOFwnSYWfum0NaEc0O03oSdwBsjx4tMSChRDPGwu/4wSY6Q6ANW3wkjKpJzzguaovRs/DODcT4hbSN8yiA==", "dev": true, "requires": { - "babel-plugin-jest-hoist": "^22.4.3", + "babel-plugin-jest-hoist": "^22.4.4", "babel-plugin-syntax-object-rest-spread": "^6.13.0" } }, @@ -1152,15 +1152,6 @@ "dev": true, "optional": true }, - "boom": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", - "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", - "dev": true, - "requires": { - "hoek": "4.x.x" - } - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1206,13 +1197,13 @@ } }, "browserslist": { - "version": "2.11.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", - "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", + "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000792", - "electron-to-chromium": "^1.3.30" + "caniuse-lite": "^1.0.30000844", + "electron-to-chromium": "^1.3.47" } }, "bser": { @@ -1284,11 +1275,20 @@ "optional": true }, "caniuse-lite": { - "version": "1.0.30000830", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000830.tgz", - "integrity": "sha512-yMqGkujkoOIZfvOYiWdqPALgY/PVGiqCHUJb6yNq7xhI/pR+gQO0U2K6lRDqAiJv4+CIU3CtTLblNGw0QGnr6g==", + "version": "1.0.30000846", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000846.tgz", + "integrity": "sha512-qxUOHr5mTaadWH1ap0ueivHd8x42Bnemcn+JutVr7GWmm2bU4zoBhjuv5QdXgALQnnT626lOQros7cCDf8PwCg==", "dev": true }, + "capture-exit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-1.2.0.tgz", + "integrity": "sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28=", + "dev": true, + "requires": { + "rsvp": "^3.3.3" + } + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -1433,9 +1433,9 @@ "dev": true }, "codecov": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/codecov/-/codecov-3.0.1.tgz", - "integrity": "sha512-0TjnXrbvcPzAkRPv/Y5D8aZju/M5adkFxShRyMMgDReB8EV9nF4XMERXs6ajgLA1di9LUFW2tgePDQd2JPWy7g==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/codecov/-/codecov-3.0.2.tgz", + "integrity": "sha512-9ljtIROIjPIUmMRqO+XuDITDoV8xRrZmA0jcEq6p2hg2+wY9wGmLfreAZGIL72IzUfdEDZaU8+Vjidg1fBQ8GQ==", "dev": true, "requires": { "argv": "0.0.2", @@ -1484,9 +1484,9 @@ "dev": true }, "compare-versions": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.1.0.tgz", - "integrity": "sha512-4hAxDSBypT/yp2ySFD346So6Ragw5xmBn/e/agIGl3bZr6DLUqnoRZPusxKrXdYRZpgexO9daejmIenlq/wrIQ==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.2.1.tgz", + "integrity": "sha512-2y2nHcopMG/NAyk6vWXlLs86XeM9sik4jmx1tKIgzMi9/RQ2eo758RGpxQO3ErihHmg0RlQITPqgz73y6s7quA==", "dev": true }, "component-emitter": { @@ -1554,26 +1554,6 @@ "which": "^1.2.9" } }, - "cryptiles": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", - "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", - "dev": true, - "requires": { - "boom": "5.x.x" - }, - "dependencies": { - "boom": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", - "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", - "dev": true, - "requires": { - "hoek": "4.x.x" - } - } - } - }, "cssom": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz", @@ -1581,9 +1561,9 @@ "dev": true }, "cssstyle": { - "version": "0.2.37", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", - "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.3.1.tgz", + "integrity": "sha512-tNvaxM5blOnxanyxI6panOsnfiyLRj3HV4qjqqS45WPNS1usdYWRUQjqTEEELK73lpeP/1KoIGYUwrBn/VcECA==", "dev": true, "requires": { "cssom": "0.3.x" @@ -1796,9 +1776,9 @@ } }, "electron-to-chromium": { - "version": "1.3.44", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.44.tgz", - "integrity": "sha1-72sVCmDVIwgjiMra2ICF7NL9RoQ=", + "version": "1.3.48", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.48.tgz", + "integrity": "sha1-07DYWTgUBE4JLs4hCPw6ya6kuQA=", "dev": true }, "emoji-regex": { @@ -2029,9 +2009,9 @@ } }, "eslint-plugin-import": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.11.0.tgz", - "integrity": "sha1-Fa7qN6Z0mdhI6OmBgG1GJ7VQOBY=", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.12.0.tgz", + "integrity": "sha1-2tMXgSktZmSyUxf9BJ0uKy8CIF0=", "dev": true, "requires": { "contains-path": "^0.1.0", @@ -2059,9 +2039,9 @@ } }, "eslint-plugin-jest": { - "version": "21.15.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-21.15.1.tgz", - "integrity": "sha512-Op9AFHQXFXD0pWubu2v7K7NydSEBopIYVyZM2CxbiIoVXMa6AnqJt+v+HkBxbwS5aYvPQYoHthZO18A4QVeF1Q==", + "version": "21.15.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-21.15.2.tgz", + "integrity": "sha512-XX0/g2F2iDnX36Ez4j5Sd8IzJj2dbDBqOxitfGD+uXyiEVECJAoRnf9eQnkzyXFVKB7DALx82ZqgqCEfeLpY7w==", "dev": true }, "eslint-plugin-jsx-a11y": { @@ -2080,9 +2060,9 @@ } }, "eslint-plugin-react": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.7.0.tgz", - "integrity": "sha512-KC7Snr4YsWZD5flu6A5c0AcIZidzW3Exbqp7OT67OaD2AppJtlBr/GuPrW/vaQM/yfZotEvKAdrxrO+v8vwYJA==", + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.8.2.tgz", + "integrity": "sha512-H3ne8ob4Bn6NXSN9N9twsn7t8dyHT5bF/ibQepxIHi6JiPIdC2gXlfYvZYucbdrWio4FxBq7Z4mSauQP+qmMkQ==", "dev": true, "requires": { "doctrine": "^2.0.2", @@ -3226,24 +3206,6 @@ } } }, - "hawk": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", - "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", - "dev": true, - "requires": { - "boom": "4.x.x", - "cryptiles": "3.x.x", - "hoek": "4.x.x", - "sntp": "2.x.x" - } - }, - "hoek": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", - "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==", - "dev": true - }, "home-or-tmp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", @@ -3880,13 +3842,13 @@ } }, "jest": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest/-/jest-22.4.3.tgz", - "integrity": "sha512-FFCdU/pXOEASfHxFDOWUysI/+FFoqiXJADEIXgDKuZyqSmBD3tZ4BEGH7+M79v7czj7bbkhwtd2LaEDcJiM/GQ==", + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest/-/jest-22.4.4.tgz", + "integrity": "sha512-eBhhW8OS/UuX3HxgzNBSVEVhSuRDh39Z1kdYkQVWna+scpgsrD7vSeBI7tmEvsguPDMnfJodW28YBnhv/BzSew==", "dev": true, "requires": { "import-local": "^1.0.0", - "jest-cli": "^22.4.3" + "jest-cli": "^22.4.4" }, "dependencies": { "ansi-regex": { @@ -3916,9 +3878,9 @@ } }, "jest-cli": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-22.4.3.tgz", - "integrity": "sha512-IiHybF0DJNqZPsbjn4Cy4vcqcmImpoFwNFnkehzVw8lTUSl4axZh5DHewu5bdpZF2Y5gUqFKYzH0FH4Qx2k+UA==", + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-22.4.4.tgz", + "integrity": "sha512-I9dsgkeyjVEEZj9wrGrqlH+8OlNob9Iptyl+6L5+ToOLJmHm4JwOPatin1b2Bzp5R5YRQJ+oiedx7o1H7wJzhA==", "dev": true, "requires": { "ansi-escapes": "^3.0.0", @@ -3932,20 +3894,20 @@ "istanbul-lib-coverage": "^1.1.1", "istanbul-lib-instrument": "^1.8.0", "istanbul-lib-source-maps": "^1.2.1", - "jest-changed-files": "^22.4.3", - "jest-config": "^22.4.3", - "jest-environment-jsdom": "^22.4.3", - "jest-get-type": "^22.4.3", - "jest-haste-map": "^22.4.3", - "jest-message-util": "^22.4.3", - "jest-regex-util": "^22.4.3", - "jest-resolve-dependencies": "^22.4.3", - "jest-runner": "^22.4.3", - "jest-runtime": "^22.4.3", - "jest-snapshot": "^22.4.3", - "jest-util": "^22.4.3", - "jest-validate": "^22.4.3", - "jest-worker": "^22.4.3", + "jest-changed-files": "^22.2.0", + "jest-config": "^22.4.4", + "jest-environment-jsdom": "^22.4.1", + "jest-get-type": "^22.1.0", + "jest-haste-map": "^22.4.2", + "jest-message-util": "^22.4.0", + "jest-regex-util": "^22.1.0", + "jest-resolve-dependencies": "^22.1.0", + "jest-runner": "^22.4.4", + "jest-runtime": "^22.4.4", + "jest-snapshot": "^22.4.0", + "jest-util": "^22.4.1", + "jest-validate": "^22.4.4", + "jest-worker": "^22.2.2", "micromatch": "^2.3.11", "node-notifier": "^5.2.1", "realpath-native": "^1.0.0", @@ -3987,22 +3949,22 @@ } }, "jest-config": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-22.4.3.tgz", - "integrity": "sha512-KSg3EOToCgkX+lIvenKY7J8s426h6ahXxaUFJxvGoEk0562Z6inWj1TnKoGycTASwiLD+6kSYFALcjdosq9KIQ==", + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-22.4.4.tgz", + "integrity": "sha512-9CKfo1GC4zrXSoMLcNeDvQBfgtqGTB1uP8iDIZ97oB26RCUb886KkKWhVcpyxVDOUxbhN+uzcBCeFe7w+Iem4A==", "dev": true, "requires": { "chalk": "^2.0.1", "glob": "^7.1.1", - "jest-environment-jsdom": "^22.4.3", - "jest-environment-node": "^22.4.3", - "jest-get-type": "^22.4.3", - "jest-jasmine2": "^22.4.3", - "jest-regex-util": "^22.4.3", - "jest-resolve": "^22.4.3", - "jest-util": "^22.4.3", - "jest-validate": "^22.4.3", - "pretty-format": "^22.4.3" + "jest-environment-jsdom": "^22.4.1", + "jest-environment-node": "^22.4.1", + "jest-get-type": "^22.1.0", + "jest-jasmine2": "^22.4.4", + "jest-regex-util": "^22.1.0", + "jest-resolve": "^22.4.2", + "jest-util": "^22.4.1", + "jest-validate": "^22.4.4", + "pretty-format": "^22.4.0" }, "dependencies": { "ansi-styles": { @@ -4131,21 +4093,21 @@ } }, "jest-jasmine2": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-22.4.3.tgz", - "integrity": "sha512-yZCPCJUcEY6R5KJB/VReo1AYI2b+5Ky+C+JA1v34jndJsRcLpU4IZX4rFJn7yDTtdNbO/nNqg+3SDIPNH2ecnw==", + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-22.4.4.tgz", + "integrity": "sha512-nK3vdUl50MuH7vj/8at7EQVjPGWCi3d5+6aCi7Gxy/XMWdOdbH1qtO/LjKbqD8+8dUAEH+BVVh7HkjpCWC1CSw==", "dev": true, "requires": { "chalk": "^2.0.1", "co": "^4.6.0", - "expect": "^22.4.3", + "expect": "^22.4.0", "graceful-fs": "^4.1.11", "is-generator-fn": "^1.0.0", - "jest-diff": "^22.4.3", - "jest-matcher-utils": "^22.4.3", - "jest-message-util": "^22.4.3", - "jest-snapshot": "^22.4.3", - "jest-util": "^22.4.3", + "jest-diff": "^22.4.0", + "jest-matcher-utils": "^22.4.0", + "jest-message-util": "^22.4.0", + "jest-snapshot": "^22.4.0", + "jest-util": "^22.4.1", "source-map-support": "^0.5.0" }, "dependencies": { @@ -4176,9 +4138,9 @@ "dev": true }, "source-map-support": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.5.tgz", - "integrity": "sha512-mR7/Nd5l1z6g99010shcXJiNEaf3fEtmLhRB/sBcQVJGodcHCULPp2y4Sfa43Kv2zq7T+Izmfp/WHCR6dYkQCA==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", + "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -4354,43 +4316,43 @@ } }, "jest-runner": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-22.4.3.tgz", - "integrity": "sha512-U7PLlQPRlWNbvOHWOrrVay9sqhBJmiKeAdKIkvX4n1G2tsvzLlf77nBD28GL1N6tGv4RmuTfI8R8JrkvCa+IBg==", + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-22.4.4.tgz", + "integrity": "sha512-5S/OpB51igQW9xnkM5Tgd/7ZjiAuIoiJAVtvVTBcEBiXBIFzWM3BAMPBM19FX68gRV0KWyFuGKj0EY3M3aceeQ==", "dev": true, "requires": { "exit": "^0.1.2", - "jest-config": "^22.4.3", - "jest-docblock": "^22.4.3", - "jest-haste-map": "^22.4.3", - "jest-jasmine2": "^22.4.3", - "jest-leak-detector": "^22.4.3", - "jest-message-util": "^22.4.3", - "jest-runtime": "^22.4.3", - "jest-util": "^22.4.3", - "jest-worker": "^22.4.3", + "jest-config": "^22.4.4", + "jest-docblock": "^22.4.0", + "jest-haste-map": "^22.4.2", + "jest-jasmine2": "^22.4.4", + "jest-leak-detector": "^22.4.0", + "jest-message-util": "^22.4.0", + "jest-runtime": "^22.4.4", + "jest-util": "^22.4.1", + "jest-worker": "^22.2.2", "throat": "^4.0.0" } }, "jest-runtime": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-22.4.3.tgz", - "integrity": "sha512-Eat/esQjevhx9BgJEC8udye+FfoJ2qvxAZfOAWshYGS22HydHn5BgsvPdTtt9cp0fSl5LxYOFA1Pja9Iz2Zt8g==", + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-22.4.4.tgz", + "integrity": "sha512-WRTj9m///npte1YjuphCYX7GRY/c2YvJImU9t7qOwFcqHr4YMzmX6evP/3Sehz5DKW2Vi8ONYPCFWe36JVXxfw==", "dev": true, "requires": { "babel-core": "^6.0.0", - "babel-jest": "^22.4.3", + "babel-jest": "^22.4.4", "babel-plugin-istanbul": "^4.1.5", "chalk": "^2.0.1", "convert-source-map": "^1.4.0", "exit": "^0.1.2", "graceful-fs": "^4.1.11", - "jest-config": "^22.4.3", - "jest-haste-map": "^22.4.3", - "jest-regex-util": "^22.4.3", - "jest-resolve": "^22.4.3", - "jest-util": "^22.4.3", - "jest-validate": "^22.4.3", + "jest-config": "^22.4.4", + "jest-haste-map": "^22.4.2", + "jest-regex-util": "^22.1.0", + "jest-resolve": "^22.4.2", + "jest-util": "^22.4.1", + "jest-validate": "^22.4.4", "json-stable-stringify": "^1.0.1", "micromatch": "^2.3.11", "realpath-native": "^1.0.0", @@ -4541,16 +4503,16 @@ } }, "jest-validate": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-22.4.3.tgz", - "integrity": "sha512-CfFM18W3GSP/xgmA4UouIx0ljdtfD2mjeBC6c89Gg17E44D4tQhAcTrZmf9djvipwU30kSTnk6CzcxdCCeSXfA==", + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-22.4.4.tgz", + "integrity": "sha512-dmlf4CIZRGvkaVg3fa0uetepcua44DHtktHm6rcoNVtYlpwe6fEJRkMFsaUVcFHLzbuBJ2cPw9Gl9TKfnzMVwg==", "dev": true, "requires": { "chalk": "^2.0.1", - "jest-config": "^22.4.3", - "jest-get-type": "^22.4.3", + "jest-config": "^22.4.4", + "jest-get-type": "^22.1.0", "leven": "^2.1.0", - "pretty-format": "^22.4.3" + "pretty-format": "^22.4.0" }, "dependencies": { "ansi-styles": { @@ -4617,9 +4579,9 @@ "optional": true }, "jsdom": { - "version": "11.9.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.9.0.tgz", - "integrity": "sha512-sb3omwJTJ+HwAltLZevM/KQBusY+l2Ar5UfnTCWk9oUVBiDnQPBNiG1BaTAKttCnneonYbNo7vi4EFDY2lBfNA==", + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.11.0.tgz", + "integrity": "sha512-ou1VyfjwsSuWkudGxb03FotDajxAto6USAlmMZjE2lc0jCznt7sBWkhfRBRaWwbnmDqdMSTKTLT5d9sBFkkM7A==", "dev": true, "requires": { "abab": "^1.0.4", @@ -4627,13 +4589,13 @@ "acorn-globals": "^4.1.0", "array-equal": "^1.0.0", "cssom": ">= 0.3.2 < 0.4.0", - "cssstyle": ">= 0.2.37 < 0.3.0", + "cssstyle": ">= 0.3.1 < 0.4.0", "data-urls": "^1.0.0", "domexception": "^1.0.0", "escodegen": "^1.9.0", "html-encoding-sniffer": "^1.0.2", "left-pad": "^1.2.0", - "nwmatcher": "^1.4.3", + "nwsapi": "^2.0.0", "parse5": "4.0.0", "pn": "^1.1.0", "request": "^2.83.0", @@ -4645,7 +4607,7 @@ "webidl-conversions": "^4.0.2", "whatwg-encoding": "^1.0.3", "whatwg-mimetype": "^2.1.0", - "whatwg-url": "^6.4.0", + "whatwg-url": "^6.4.1", "ws": "^4.0.0", "xml-name-validator": "^3.0.0" } @@ -5100,10 +5062,10 @@ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, - "nwmatcher": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz", - "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==", + "nwsapi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.0.0.tgz", + "integrity": "sha512-9kj1oCEDNq+LHDAVPGDPg9+qRcBcpXb1IYC8q89jR8xJvOC2byQwEVsM3W1qQcSPVyzGGaXN7wZHnXORCiZl4w==", "dev": true }, "oauth-sign": { @@ -5561,9 +5523,9 @@ "dev": true }, "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, "randomatic": { @@ -5677,9 +5639,9 @@ } }, "regenerate": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", - "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", "dev": true }, "regenerator-runtime": { @@ -5786,9 +5748,9 @@ } }, "request": { - "version": "2.85.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz", - "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==", + "version": "2.87.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", + "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", "dev": true, "requires": { "aws-sign2": "~0.7.0", @@ -5799,7 +5761,6 @@ "forever-agent": "~0.6.1", "form-data": "~2.3.1", "har-validator": "~5.0.3", - "hawk": "~6.0.2", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", @@ -5809,7 +5770,6 @@ "performance-now": "^2.1.0", "qs": "~6.5.1", "safe-buffer": "^5.1.1", - "stringstream": "~0.0.5", "tough-cookie": "~2.3.3", "tunnel-agent": "^0.6.0", "uuid": "^3.1.0" @@ -5930,6 +5890,12 @@ "glob": "^7.0.5" } }, + "rsvp": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", + "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", + "dev": true + }, "run-async": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", @@ -5976,15 +5942,16 @@ "dev": true }, "sane": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-2.5.0.tgz", - "integrity": "sha512-glfKd7YH4UCrh/7dD+UESsr8ylKWRE7UQPoXuz28FgmcF0ViJQhCTCCZHICRKxf8G8O1KdLEn20dcICK54c7ew==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/sane/-/sane-2.5.2.tgz", + "integrity": "sha1-tNwYYcIbQn6SlQej51HiosuKs/o=", "dev": true, "requires": { "anymatch": "^2.0.0", + "capture-exit": "^1.2.0", "exec-sh": "^0.2.0", "fb-watchman": "^2.0.0", - "fsevents": "^1.1.1", + "fsevents": "^1.2.3", "micromatch": "^3.1.4", "minimist": "^1.1.1", "walker": "~1.0.5", @@ -6193,6 +6160,535 @@ } } }, + "fsevents": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.21", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": "^2.1.0" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.2.4", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.1", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.0", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.5.1", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.5.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.1", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true, + "dev": true + } + } + }, "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", @@ -6487,15 +6983,6 @@ "kind-of": "^3.2.0" } }, - "sntp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", - "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", - "dev": true, - "requires": { - "hoek": "4.x.x" - } - }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -6503,12 +6990,12 @@ "dev": true }, "source-map-resolve": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", - "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", "dev": true, "requires": { - "atob": "^2.0.0", + "atob": "^2.1.1", "decode-uri-component": "^0.2.0", "resolve-url": "^0.2.1", "source-map-url": "^0.4.0", @@ -6699,12 +7186,6 @@ "safe-buffer": "~5.1.0" } }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", - "dev": true - }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -7232,9 +7713,9 @@ }, "dependencies": { "punycode": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", - "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true } } @@ -7277,9 +7758,9 @@ "dev": true }, "ua-parser-js": { - "version": "0.7.17", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz", - "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g==", + "version": "0.7.18", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.18.tgz", + "integrity": "sha512-LtzwHlVHwFGTptfNSgezHp7WUlwiqb0gA9AALRbKaERfxwJoiX0A73QbTToxteIAuIaFshhgIZfqK8s7clqgnA==", "dev": true }, "uglify-js": { diff --git a/package.json b/package.json index a00e95bbd..f96ca7af4 100644 --- a/package.json +++ b/package.json @@ -38,15 +38,15 @@ "devDependencies": { "@types/jest": "^22.2.3", "babel-cli": "^6.26.0", - "babel-preset-env": "^1.6.1", - "codecov": "^3.0.1", + "babel-preset-env": "^1.7.0", + "codecov": "^3.0.2", "eslint": "^4.19.1", "eslint-config-airbnb": "^16.1.0", - "eslint-plugin-import": "^2.11.0", - "eslint-plugin-jest": "^21.15.1", + "eslint-plugin-import": "^2.12.0", + "eslint-plugin-jest": "^21.15.2", "eslint-plugin-jsx-a11y": "^6.0.3", - "eslint-plugin-react": "^7.7.0", - "jest": "^22.4.3", + "eslint-plugin-react": "^7.8.2", + "jest": "^22.4.4", "pre-commit": "^1.2.2" }, "dependencies": {} diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index d66b822ea..000000000 --- a/yarn.lock +++ /dev/null @@ -1,4265 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/code-frame@^7.0.0-beta.35": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.47.tgz#d18c2f4c4ba8d093a2bcfab5616593bfe2441a27" - dependencies: - "@babel/highlight" "7.0.0-beta.47" - -"@babel/highlight@7.0.0-beta.47": - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.47.tgz#8fbc83fb2a21f0bd2b95cdbeb238cf9689cad494" - dependencies: - chalk "^2.0.0" - esutils "^2.0.2" - js-tokens "^3.0.0" - -"@types/jest@^22.2.3": - version "22.2.3" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-22.2.3.tgz#0157c0316dc3722c43a7b71de3fdf3acbccef10d" - -abab@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - -acorn-globals@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538" - dependencies: - acorn "^5.0.0" - -acorn-jsx@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" - dependencies: - acorn "^3.0.4" - -acorn@^3.0.4: - version "3.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" - -acorn@^5.0.0, acorn@^5.3.0, acorn@^5.5.0: - version "5.5.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.3.tgz#f473dd47e0277a08e28e9bec5aeeb04751f0b8c9" - -ajv-keywords@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" - -ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0: - version "5.5.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" - dependencies: - co "^4.6.0" - fast-deep-equal "^1.0.0" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.3.0" - -align-text@^0.1.1, align-text@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" - dependencies: - kind-of "^3.0.2" - longest "^1.0.1" - repeat-string "^1.5.2" - -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - -ansi-escapes@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - -ansi-styles@^3.2.0, ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - dependencies: - color-convert "^1.9.0" - -anymatch@^1.3.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" - dependencies: - micromatch "^2.1.5" - normalize-path "^2.0.0" - -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - -append-transform@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" - dependencies: - default-require-extensions "^1.0.0" - -aproba@^1.0.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - -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.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - dependencies: - sprintf-js "~1.0.2" - -argv@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/argv/-/argv-0.0.2.tgz#ecbd16f8949b157183711b1bda334f37840185ab" - -aria-query@^0.7.0: - version "0.7.1" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-0.7.1.tgz#26cbb5aff64144b0a825be1846e0b16cfa00b11e" - dependencies: - ast-types-flow "0.0.7" - commander "^2.11.0" - -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - dependencies: - arr-flatten "^1.0.1" - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - -arr-flatten@^1.0.1, arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - -array-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" - -array-includes@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" - dependencies: - define-properties "^1.1.2" - es-abstract "^1.7.0" - -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" - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - -arrify@^1.0.0, arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - -asap@~2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - -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" - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - -ast-types-flow@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" - -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - -async-each@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" - -async-limiter@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" - -async@^1.4.0: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - -async@^2.1.4: - version "2.6.1" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" - dependencies: - lodash "^4.17.10" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - -atob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a" - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - -aws4@^1.6.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289" - -axobject-query@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-0.1.0.tgz#62f59dbc59c9f9242759ca349960e7a2fe3c36c0" - dependencies: - ast-types-flow "0.0.7" - -babel-cli@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.26.0.tgz#502ab54874d7db88ad00b887a06383ce03d002f1" - dependencies: - babel-core "^6.26.0" - babel-polyfill "^6.26.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - commander "^2.11.0" - convert-source-map "^1.5.0" - fs-readdir-recursive "^1.0.0" - glob "^7.1.2" - lodash "^4.17.4" - output-file-sync "^1.1.2" - path-is-absolute "^1.0.1" - slash "^1.0.0" - source-map "^0.5.6" - v8flags "^2.1.1" - optionalDependencies: - chokidar "^1.6.1" - -babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" - dependencies: - chalk "^1.1.3" - esutils "^2.0.2" - js-tokens "^3.0.2" - -babel-core@^6.0.0, babel-core@^6.26.0: - version "6.26.3" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" - dependencies: - babel-code-frame "^6.26.0" - babel-generator "^6.26.0" - babel-helpers "^6.24.1" - babel-messages "^6.23.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - convert-source-map "^1.5.1" - debug "^2.6.9" - json5 "^0.5.1" - lodash "^4.17.4" - minimatch "^3.0.4" - path-is-absolute "^1.0.1" - private "^0.1.8" - slash "^1.0.0" - source-map "^0.5.7" - -babel-generator@^6.18.0, babel-generator@^6.26.0: - version "6.26.1" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" - dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.17.4" - source-map "^0.5.7" - trim-right "^1.0.1" - -babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" - dependencies: - babel-helper-explode-assignable-expression "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-call-delegate@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-define-map@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-explode-assignable-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-function-name@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" - dependencies: - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-get-function-arity@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-hoist-variables@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-optimise-call-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-regex@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" - dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-remap-async-to-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-replace-supers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" - dependencies: - babel-helper-optimise-call-expression "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-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-jest@^22.4.4: - version "22.4.4" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-22.4.4.tgz#977259240420e227444ebe49e226a61e49ea659d" - dependencies: - babel-plugin-istanbul "^4.1.5" - babel-preset-jest "^22.4.4" - -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-istanbul@^4.1.5: - version "4.1.6" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz#36c59b2192efce81c5b378321b74175add1c9a45" - dependencies: - babel-plugin-syntax-object-rest-spread "^6.13.0" - find-up "^2.1.0" - istanbul-lib-instrument "^1.10.1" - test-exclude "^4.2.1" - -babel-plugin-jest-hoist@^22.4.4: - version "22.4.4" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.4.4.tgz#b9851906eab34c7bf6f8c895a2b08bea1a844c0b" - -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-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-object-rest-spread@^6.13.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-to-generator@^6.22.0: - 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-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.23.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" - dependencies: - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-plugin-transform-es2015-classes@^6.23.0: - 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.22.0: - 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.23.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.22.0: - 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.23.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.22.0: - 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.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.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: - version "6.26.2" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" - dependencies: - babel-plugin-transform-strict-mode "^6.24.1" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-types "^6.26.0" - -babel-plugin-transform-es2015-modules-systemjs@^6.23.0: - 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.23.0: - 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.22.0: - 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.23.0: - 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.22.0: - 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.22.0: - 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.23.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.22.0: - 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.22.0: - 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-regenerator@^6.22.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" - dependencies: - regenerator-transform "^0.10.0" - -babel-plugin-transform-strict-mode@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-polyfill@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" - dependencies: - babel-runtime "^6.26.0" - core-js "^2.5.0" - regenerator-runtime "^0.10.5" - -babel-preset-env@^1.6.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" - dependencies: - babel-plugin-check-es2015-constants "^6.22.0" - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-to-generator "^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.23.0" - babel-plugin-transform-es2015-classes "^6.23.0" - babel-plugin-transform-es2015-computed-properties "^6.22.0" - babel-plugin-transform-es2015-destructuring "^6.23.0" - babel-plugin-transform-es2015-duplicate-keys "^6.22.0" - babel-plugin-transform-es2015-for-of "^6.23.0" - babel-plugin-transform-es2015-function-name "^6.22.0" - babel-plugin-transform-es2015-literals "^6.22.0" - babel-plugin-transform-es2015-modules-amd "^6.22.0" - babel-plugin-transform-es2015-modules-commonjs "^6.23.0" - babel-plugin-transform-es2015-modules-systemjs "^6.23.0" - babel-plugin-transform-es2015-modules-umd "^6.23.0" - babel-plugin-transform-es2015-object-super "^6.22.0" - babel-plugin-transform-es2015-parameters "^6.23.0" - babel-plugin-transform-es2015-shorthand-properties "^6.22.0" - babel-plugin-transform-es2015-spread "^6.22.0" - babel-plugin-transform-es2015-sticky-regex "^6.22.0" - babel-plugin-transform-es2015-template-literals "^6.22.0" - babel-plugin-transform-es2015-typeof-symbol "^6.23.0" - babel-plugin-transform-es2015-unicode-regex "^6.22.0" - babel-plugin-transform-exponentiation-operator "^6.22.0" - babel-plugin-transform-regenerator "^6.22.0" - browserslist "^3.2.6" - invariant "^2.2.2" - semver "^5.3.0" - -babel-preset-jest@^22.4.4: - version "22.4.4" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-22.4.4.tgz#ec9fbd8bcd7dfd24b8b5320e0e688013235b7c39" - dependencies: - babel-plugin-jest-hoist "^22.4.4" - babel-plugin-syntax-object-rest-spread "^6.13.0" - -babel-register@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" - dependencies: - babel-core "^6.26.0" - babel-runtime "^6.26.0" - core-js "^2.5.0" - home-or-tmp "^2.0.0" - lodash "^4.17.4" - mkdirp "^0.5.1" - source-map-support "^0.4.15" - -babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - -babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" - dependencies: - babel-runtime "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - lodash "^4.17.4" - -babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" - dependencies: - babel-code-frame "^6.26.0" - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - debug "^2.6.8" - globals "^9.18.0" - invariant "^2.2.2" - lodash "^4.17.4" - -babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" - dependencies: - babel-runtime "^6.26.0" - esutils "^2.0.2" - lodash "^4.17.4" - to-fast-properties "^1.0.3" - -babylon@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -bcrypt-pbkdf@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" - dependencies: - tweetnacl "^0.14.3" - -binary-extensions@^1.0.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^1.8.2: - version "1.8.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" - repeat-element "^1.1.2" - -braces@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -browser-process-hrtime@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e" - -browser-resolve@^1.11.2: - version "1.11.2" - resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" - dependencies: - resolve "1.1.7" - -browserslist@^3.2.6: - version "3.2.8" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" - dependencies: - caniuse-lite "^1.0.30000844" - electron-to-chromium "^1.3.47" - -bser@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" - dependencies: - node-int64 "^0.4.0" - -buffer-from@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.0.0.tgz#4cb8832d23612589b0406e9e2956c17f06fdf531" - -builtin-modules@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -caller-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" - dependencies: - callsites "^0.2.0" - -callsites@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" - -callsites@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" - -camelcase@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" - -camelcase@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - -caniuse-lite@^1.0.30000844: - version "1.0.30000846" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000846.tgz#2092911eecad71a89dae1faa62bcc202fde7f959" - -capture-exit@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" - dependencies: - rsvp "^3.3.3" - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - -center-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" - dependencies: - align-text "^0.1.3" - lazy-cache "^1.0.3" - -chalk@^1.1.3: - 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.0, chalk@^2.0.1, chalk@^2.1.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chardet@^0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" - -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" - -ci-info@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.3.tgz#710193264bb05c77b8c90d02f5aaf22216a667b2" - -circular-json@^0.3.1: - version "0.3.3" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -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.2.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - -cliui@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" - dependencies: - center-align "^0.1.1" - right-align "^0.1.1" - wordwrap "0.0.2" - -cliui@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" - dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - wrap-ansi "^2.0.0" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - -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" - -codecov@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/codecov/-/codecov-3.0.2.tgz#aea43843a5cd2fb6b7e488b2eff25d367ab70b12" - dependencies: - argv "0.0.2" - request "^2.81.0" - urlgrey "0.4.4" - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" - dependencies: - color-name "^1.1.1" - -color-name@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - -combined-stream@1.0.6, combined-stream@~1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" - dependencies: - delayed-stream "~1.0.0" - -commander@^2.11.0: - version "2.15.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" - -compare-versions@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.2.1.tgz#a49eb7689d4caaf0b6db5220173fd279614000f7" - -component-emitter@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - -concat-stream@^1.4.7, concat-stream@^1.6.0: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -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" - -contains-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" - -convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - -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.4.0, core-js@^2.5.0: - version "2.5.6" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.6.tgz#0fe6d45bf3cac3ac364a9d72de7576f4eb221b9d" - -core-util-is@1.0.2, core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - -cross-spawn@^5.0.1, cross-spawn@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" - -cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": - version "0.3.2" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" - -"cssstyle@>= 0.3.1 < 0.4.0": - version "0.3.1" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.3.1.tgz#6da9b4cff1bc5d716e6e5fe8e04fcb1b50a49adf" - dependencies: - cssom "0.3.x" - -damerau-levenshtein@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz#03191c432cb6eea168bb77f3a55ffdccb8978514" - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - dependencies: - assert-plus "^1.0.0" - -data-urls@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.0.0.tgz#24802de4e81c298ea8a9388bb0d8e461c774684f" - dependencies: - abab "^1.0.4" - whatwg-mimetype "^2.0.0" - whatwg-url "^6.4.0" - -debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - dependencies: - ms "2.0.0" - -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: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - -deep-extend@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.5.1.tgz#b894a9dd90d3023fbf1c55a394fb858eb2066f1f" - -deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - -default-require-extensions@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" - dependencies: - strip-bom "^2.0.0" - -define-properties@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" - dependencies: - foreach "^2.0.5" - object-keys "^1.0.8" - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -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" - -detect-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - dependencies: - repeating "^2.0.0" - -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - -detect-newline@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" - -diff@^3.2.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - -doctrine@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" - dependencies: - esutils "^2.0.2" - isarray "^1.0.0" - -doctrine@^2.0.2, doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - dependencies: - esutils "^2.0.2" - -domexception@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" - dependencies: - webidl-conversions "^4.0.2" - -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" - -electron-to-chromium@^1.3.47: - version "1.3.48" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.48.tgz#d3b0d8593814044e092ece2108fc3ac9aea4b900" - -emoji-regex@^6.1.0: - version "6.5.1" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.5.1.tgz#9baea929b155565c11ea41c6626eaa65cef992c2" - -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" - -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.5.1, es-abstract@^1.7.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.11.0.tgz#cce87d518f0496893b1a30cd8461835535480681" - dependencies: - es-to-primitive "^1.1.1" - function-bind "^1.1.1" - has "^1.0.1" - is-callable "^1.1.3" - is-regex "^1.0.4" - -es-to-primitive@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" - dependencies: - is-callable "^1.1.1" - is-date-object "^1.0.1" - is-symbol "^1.0.1" - -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.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.1.tgz#dbae17ef96c8e4bedb1356f4504fa4cc2f7cb7e2" - dependencies: - esprima "^3.1.3" - estraverse "^4.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -eslint-config-airbnb-base@^12.1.0: - version "12.1.0" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-12.1.0.tgz#386441e54a12ccd957b0a92564a4bafebd747944" - dependencies: - eslint-restricted-globals "^0.1.1" - -eslint-config-airbnb@^16.1.0: - version "16.1.0" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-16.1.0.tgz#2546bfb02cc9fe92284bf1723ccf2e87bc45ca46" - dependencies: - eslint-config-airbnb-base "^12.1.0" - -eslint-import-resolver-node@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" - dependencies: - debug "^2.6.9" - resolve "^1.5.0" - -eslint-module-utils@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz#b270362cd88b1a48ad308976ce7fa54e98411746" - dependencies: - debug "^2.6.8" - pkg-dir "^1.0.0" - -eslint-plugin-import@^2.11.0: - version "2.12.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.12.0.tgz#dad31781292d6664b25317fd049d2e2b2f02205d" - dependencies: - contains-path "^0.1.0" - debug "^2.6.8" - doctrine "1.5.0" - eslint-import-resolver-node "^0.3.1" - eslint-module-utils "^2.2.0" - has "^1.0.1" - lodash "^4.17.4" - minimatch "^3.0.3" - read-pkg-up "^2.0.0" - resolve "^1.6.0" - -eslint-plugin-jest@^21.15.1: - version "21.15.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-21.15.2.tgz#d55898636291d97e0c0a5dbe205bef0235157a34" - -eslint-plugin-jsx-a11y@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.0.3.tgz#54583d1ae442483162e040e13cc31865465100e5" - dependencies: - aria-query "^0.7.0" - array-includes "^3.0.3" - ast-types-flow "0.0.7" - axobject-query "^0.1.0" - damerau-levenshtein "^1.0.0" - emoji-regex "^6.1.0" - jsx-ast-utils "^2.0.0" - -eslint-plugin-react@^7.7.0: - version "7.8.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.8.2.tgz#e95c9c47fece55d2303d1a67c9d01b930b88a51d" - dependencies: - doctrine "^2.0.2" - has "^1.0.1" - jsx-ast-utils "^2.0.1" - prop-types "^15.6.0" - -eslint-restricted-globals@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz#35f0d5cbc64c2e3ed62e93b4b1a7af05ba7ed4d7" - -eslint-scope@^3.7.1: - version "3.7.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-visitor-keys@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" - -eslint@^4.19.1: - version "4.19.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300" - dependencies: - ajv "^5.3.0" - babel-code-frame "^6.22.0" - chalk "^2.1.0" - concat-stream "^1.6.0" - cross-spawn "^5.1.0" - debug "^3.1.0" - doctrine "^2.1.0" - eslint-scope "^3.7.1" - eslint-visitor-keys "^1.0.0" - espree "^3.5.4" - esquery "^1.0.0" - esutils "^2.0.2" - file-entry-cache "^2.0.0" - functional-red-black-tree "^1.0.1" - glob "^7.1.2" - globals "^11.0.1" - ignore "^3.3.3" - imurmurhash "^0.1.4" - inquirer "^3.0.6" - is-resolvable "^1.0.0" - js-yaml "^3.9.1" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.4" - minimatch "^3.0.2" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.2" - pluralize "^7.0.0" - progress "^2.0.0" - regexpp "^1.0.1" - require-uncached "^1.0.3" - semver "^5.3.0" - strip-ansi "^4.0.0" - strip-json-comments "~2.0.1" - table "4.0.2" - text-table "~0.2.0" - -espree@^3.5.4: - version "3.5.4" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" - dependencies: - acorn "^5.5.0" - acorn-jsx "^3.0.0" - -esprima@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" - -esprima@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" - -esquery@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" - dependencies: - estraverse "^4.0.0" - -esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - dependencies: - estraverse "^4.1.0" - -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" - -esutils@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" - -exec-sh@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.1.tgz#163b98a6e89e6b65b47c2a28d215bc1f63989c38" - dependencies: - merge "^1.1.3" - -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" - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - -expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - dependencies: - is-posix-bracket "^0.1.0" - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -expand-range@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - dependencies: - fill-range "^2.1.0" - -expect@^22.4.0: - version "22.4.3" - resolved "https://registry.yarnpkg.com/expect/-/expect-22.4.3.tgz#d5a29d0a0e1fb2153557caef2674d4547e914674" - dependencies: - ansi-styles "^3.2.0" - jest-diff "^22.4.3" - jest-get-type "^22.4.3" - jest-matcher-utils "^22.4.3" - jest-message-util "^22.4.3" - jest-regex-util "^22.4.3" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extend@~3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" - -external-editor@^2.0.4: - version "2.2.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" - dependencies: - chardet "^0.4.0" - iconv-lite "^0.4.17" - tmp "^0.0.33" - -extglob@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - dependencies: - is-extglob "^1.0.0" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - -extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - -fast-deep-equal@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" - -fast-json-stable-stringify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" - -fast-levenshtein@~2.0.4: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - -fb-watchman@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" - dependencies: - bser "^2.0.0" - -fbjs@^0.8.16: - version "0.8.16" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db" - 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" - -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" - -fileset@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" - dependencies: - glob "^7.0.3" - minimatch "^3.0.3" - -fill-range@^2.1.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" - dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^3.0.0" - repeat-element "^1.1.2" - repeat-string "^1.5.2" - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - -find-up@^2.0.0, find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - dependencies: - locate-path "^2.0.0" - -flat-cache@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" - dependencies: - circular-json "^0.3.1" - del "^2.0.2" - graceful-fs "^4.1.2" - write "^0.2.1" - -for-in@^1.0.1, for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - -for-own@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - dependencies: - for-in "^1.0.1" - -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.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" - dependencies: - asynckit "^0.4.0" - combined-stream "1.0.6" - mime-types "^2.1.12" - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - dependencies: - map-cache "^0.2.2" - -fs-minipass@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" - dependencies: - minipass "^2.2.1" - -fs-readdir-recursive@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - -fsevents@^1.0.0, fsevents@^1.2.3: - version "1.2.4" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" - dependencies: - nan "^2.9.2" - node-pre-gyp "^0.10.0" - -function-bind@^1.0.2, function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - -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-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - dependencies: - assert-plus "^1.0.0" - -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.0.3, glob@^7.0.5, glob@^7.1.1, 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" - -globals@^11.0.1: - version "11.5.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.5.0.tgz#6bc840de6771173b191f13d3a9c94d441ee92642" - -globals@^9.18.0: - version "9.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" - -globby@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" - dependencies: - array-union "^1.0.1" - arrify "^1.0.0" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4: - version "4.1.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" - -growly@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" - -handlebars@^4.0.3: - version "4.0.11" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" - dependencies: - async "^1.4.0" - optimist "^0.6.1" - source-map "^0.4.4" - optionalDependencies: - uglify-js "^2.6" - -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - -har-validator@~5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" - dependencies: - ajv "^5.1.0" - har-schema "^2.0.0" - -has-ansi@^2.0.0: - 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-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" - dependencies: - function-bind "^1.0.2" - -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" - -hosted-git-info@^2.1.4: - version "2.6.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.6.0.tgz#23235b29ab230c576aab0d4f13fc046b0b038222" - -html-encoding-sniffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" - dependencies: - whatwg-encoding "^1.0.1" - -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -iconv-lite@0.4.19: - version "0.4.19" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" - -iconv-lite@^0.4.17, iconv-lite@^0.4.4, iconv-lite@~0.4.13: - version "0.4.23" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" - dependencies: - safer-buffer ">= 2.1.2 < 3" - -ignore-walk@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" - dependencies: - minimatch "^3.0.4" - -ignore@^3.3.3: - version "3.3.8" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.8.tgz#3f8e9c35d38708a3a7e0e9abb6c73e7ee7707b2b" - -import-local@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc" - dependencies: - pkg-dir "^2.0.0" - resolve-cwd "^2.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - -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.1, inherits@^2.0.3, inherits@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - -ini@~1.3.0: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - -inquirer@^3.0.6: - version "3.3.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" - dependencies: - ansi-escapes "^3.0.0" - chalk "^2.0.0" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^2.0.4" - figures "^2.0.0" - lodash "^4.3.0" - mute-stream "0.0.7" - run-async "^2.2.0" - rx-lite "^4.0.8" - rx-lite-aggregates "^4.0.8" - string-width "^2.1.0" - strip-ansi "^4.0.0" - through "^2.3.6" - -invariant@^2.2.2: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - dependencies: - loose-envify "^1.0.0" - -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - dependencies: - kind-of "^6.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - dependencies: - binary-extensions "^1.0.0" - -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - -is-builtin-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" - dependencies: - builtin-modules "^1.0.0" - -is-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.1.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.1.0.tgz#247e4162e7860cebbdaf30b774d6b0ac7dcfe7a5" - dependencies: - ci-info "^1.0.0" - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - dependencies: - kind-of "^6.0.0" - -is-date-object@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-dotfile@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" - -is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - dependencies: - is-primitive "^2.0.0" - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - -is-finite@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - -is-generator-fn@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-1.0.0.tgz#969d49e1bb3329f6bb7f09089be26578b2ddd46a" - -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-number@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - dependencies: - kind-of "^3.0.2" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - dependencies: - kind-of "^3.0.2" - -is-number@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" - -is-odd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24" - dependencies: - is-number "^4.0.0" - -is-path-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" - -is-path-in-cwd@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" - dependencies: - is-path-inside "^1.0.0" - -is-path-inside@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" - dependencies: - path-is-inside "^1.0.1" - -is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - dependencies: - isobject "^3.0.1" - -is-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-regex@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" - dependencies: - has "^1.0.1" - -is-resolvable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" - -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-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" - -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - -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" - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - -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" - -istanbul-api@^1.1.14: - version "1.3.1" - resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.3.1.tgz#4c3b05d18c0016d1022e079b98dc82c40f488954" - dependencies: - async "^2.1.4" - compare-versions "^3.1.0" - fileset "^2.0.2" - istanbul-lib-coverage "^1.2.0" - istanbul-lib-hook "^1.2.0" - istanbul-lib-instrument "^1.10.1" - istanbul-lib-report "^1.1.4" - istanbul-lib-source-maps "^1.2.4" - istanbul-reports "^1.3.0" - js-yaml "^3.7.0" - mkdirp "^0.5.1" - once "^1.4.0" - -istanbul-lib-coverage@^1.1.1, istanbul-lib-coverage@^1.1.2, istanbul-lib-coverage@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz#f7d8f2e42b97e37fe796114cb0f9d68b5e3a4341" - -istanbul-lib-hook@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.2.0.tgz#ae556fd5a41a6e8efa0b1002b1e416dfeaf9816c" - dependencies: - append-transform "^0.4.0" - -istanbul-lib-instrument@^1.10.1, istanbul-lib-instrument@^1.8.0: - version "1.10.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz#724b4b6caceba8692d3f1f9d0727e279c401af7b" - dependencies: - babel-generator "^6.18.0" - babel-template "^6.16.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" - babylon "^6.18.0" - istanbul-lib-coverage "^1.2.0" - semver "^5.3.0" - -istanbul-lib-report@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.4.tgz#e886cdf505c4ebbd8e099e4396a90d0a28e2acb5" - dependencies: - istanbul-lib-coverage "^1.2.0" - mkdirp "^0.5.1" - path-parse "^1.0.5" - supports-color "^3.1.2" - -istanbul-lib-source-maps@^1.2.1: - version "1.2.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.3.tgz#20fb54b14e14b3fb6edb6aca3571fd2143db44e6" - dependencies: - debug "^3.1.0" - istanbul-lib-coverage "^1.1.2" - mkdirp "^0.5.1" - rimraf "^2.6.1" - source-map "^0.5.3" - -istanbul-lib-source-maps@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.4.tgz#cc7ccad61629f4efff8e2f78adb8c522c9976ec7" - dependencies: - debug "^3.1.0" - istanbul-lib-coverage "^1.2.0" - mkdirp "^0.5.1" - rimraf "^2.6.1" - source-map "^0.5.3" - -istanbul-reports@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.3.0.tgz#2f322e81e1d9520767597dca3c20a0cce89a3554" - dependencies: - handlebars "^4.0.3" - -jest-changed-files@^22.2.0: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-22.4.3.tgz#8882181e022c38bd46a2e4d18d44d19d90a90fb2" - dependencies: - throat "^4.0.0" - -jest-cli@^22.4.4: - version "22.4.4" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-22.4.4.tgz#68cd2a2aae983adb1e6638248ca21082fd6d9e90" - dependencies: - ansi-escapes "^3.0.0" - chalk "^2.0.1" - exit "^0.1.2" - glob "^7.1.2" - graceful-fs "^4.1.11" - import-local "^1.0.0" - is-ci "^1.0.10" - istanbul-api "^1.1.14" - istanbul-lib-coverage "^1.1.1" - istanbul-lib-instrument "^1.8.0" - istanbul-lib-source-maps "^1.2.1" - jest-changed-files "^22.2.0" - jest-config "^22.4.4" - jest-environment-jsdom "^22.4.1" - jest-get-type "^22.1.0" - jest-haste-map "^22.4.2" - jest-message-util "^22.4.0" - jest-regex-util "^22.1.0" - jest-resolve-dependencies "^22.1.0" - jest-runner "^22.4.4" - jest-runtime "^22.4.4" - jest-snapshot "^22.4.0" - jest-util "^22.4.1" - jest-validate "^22.4.4" - jest-worker "^22.2.2" - micromatch "^2.3.11" - node-notifier "^5.2.1" - realpath-native "^1.0.0" - rimraf "^2.5.4" - slash "^1.0.0" - string-length "^2.0.0" - strip-ansi "^4.0.0" - which "^1.2.12" - yargs "^10.0.3" - -jest-config@^22.4.4: - version "22.4.4" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-22.4.4.tgz#72a521188720597169cd8b4ff86934ef5752d86a" - dependencies: - chalk "^2.0.1" - glob "^7.1.1" - jest-environment-jsdom "^22.4.1" - jest-environment-node "^22.4.1" - jest-get-type "^22.1.0" - jest-jasmine2 "^22.4.4" - jest-regex-util "^22.1.0" - jest-resolve "^22.4.2" - jest-util "^22.4.1" - jest-validate "^22.4.4" - pretty-format "^22.4.0" - -jest-diff@^22.4.0, jest-diff@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-22.4.3.tgz#e18cc3feff0aeef159d02310f2686d4065378030" - dependencies: - chalk "^2.0.1" - diff "^3.2.0" - jest-get-type "^22.4.3" - pretty-format "^22.4.3" - -jest-docblock@^22.4.0, jest-docblock@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-22.4.3.tgz#50886f132b42b280c903c592373bb6e93bb68b19" - dependencies: - detect-newline "^2.1.0" - -jest-environment-jsdom@^22.4.1: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-22.4.3.tgz#d67daa4155e33516aecdd35afd82d4abf0fa8a1e" - dependencies: - jest-mock "^22.4.3" - jest-util "^22.4.3" - jsdom "^11.5.1" - -jest-environment-node@^22.4.1: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-22.4.3.tgz#54c4eaa374c83dd52a9da8759be14ebe1d0b9129" - dependencies: - jest-mock "^22.4.3" - jest-util "^22.4.3" - -jest-get-type@^22.1.0, jest-get-type@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.4.3.tgz#e3a8504d8479342dd4420236b322869f18900ce4" - -jest-haste-map@^22.4.2: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-22.4.3.tgz#25842fa2ba350200767ac27f658d58b9d5c2e20b" - dependencies: - fb-watchman "^2.0.0" - graceful-fs "^4.1.11" - jest-docblock "^22.4.3" - jest-serializer "^22.4.3" - jest-worker "^22.4.3" - micromatch "^2.3.11" - sane "^2.0.0" - -jest-jasmine2@^22.4.4: - version "22.4.4" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-22.4.4.tgz#c55f92c961a141f693f869f5f081a79a10d24e23" - dependencies: - chalk "^2.0.1" - co "^4.6.0" - expect "^22.4.0" - graceful-fs "^4.1.11" - is-generator-fn "^1.0.0" - jest-diff "^22.4.0" - jest-matcher-utils "^22.4.0" - jest-message-util "^22.4.0" - jest-snapshot "^22.4.0" - jest-util "^22.4.1" - source-map-support "^0.5.0" - -jest-leak-detector@^22.4.0: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-22.4.3.tgz#2b7b263103afae8c52b6b91241a2de40117e5b35" - dependencies: - pretty-format "^22.4.3" - -jest-matcher-utils@^22.4.0, jest-matcher-utils@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz#4632fe428ebc73ebc194d3c7b65d37b161f710ff" - dependencies: - chalk "^2.0.1" - jest-get-type "^22.4.3" - pretty-format "^22.4.3" - -jest-message-util@^22.4.0, jest-message-util@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-22.4.3.tgz#cf3d38aafe4befddbfc455e57d65d5239e399eb7" - dependencies: - "@babel/code-frame" "^7.0.0-beta.35" - chalk "^2.0.1" - micromatch "^2.3.11" - slash "^1.0.0" - stack-utils "^1.0.1" - -jest-mock@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-22.4.3.tgz#f63ba2f07a1511772cdc7979733397df770aabc7" - -jest-regex-util@^22.1.0, jest-regex-util@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-22.4.3.tgz#a826eb191cdf22502198c5401a1fc04de9cef5af" - -jest-resolve-dependencies@^22.1.0: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-22.4.3.tgz#e2256a5a846732dc3969cb72f3c9ad7725a8195e" - dependencies: - jest-regex-util "^22.4.3" - -jest-resolve@^22.4.2: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-22.4.3.tgz#0ce9d438c8438229aa9b916968ec6b05c1abb4ea" - dependencies: - browser-resolve "^1.11.2" - chalk "^2.0.1" - -jest-runner@^22.4.4: - version "22.4.4" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-22.4.4.tgz#dfca7b7553e0fa617e7b1291aeb7ce83e540a907" - dependencies: - exit "^0.1.2" - jest-config "^22.4.4" - jest-docblock "^22.4.0" - jest-haste-map "^22.4.2" - jest-jasmine2 "^22.4.4" - jest-leak-detector "^22.4.0" - jest-message-util "^22.4.0" - jest-runtime "^22.4.4" - jest-util "^22.4.1" - jest-worker "^22.2.2" - throat "^4.0.0" - -jest-runtime@^22.4.4: - version "22.4.4" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-22.4.4.tgz#9ba7792fc75582a5be0f79af6f8fe8adea314048" - dependencies: - babel-core "^6.0.0" - babel-jest "^22.4.4" - babel-plugin-istanbul "^4.1.5" - chalk "^2.0.1" - convert-source-map "^1.4.0" - exit "^0.1.2" - graceful-fs "^4.1.11" - jest-config "^22.4.4" - jest-haste-map "^22.4.2" - jest-regex-util "^22.1.0" - jest-resolve "^22.4.2" - jest-util "^22.4.1" - jest-validate "^22.4.4" - json-stable-stringify "^1.0.1" - micromatch "^2.3.11" - realpath-native "^1.0.0" - slash "^1.0.0" - strip-bom "3.0.0" - write-file-atomic "^2.1.0" - yargs "^10.0.3" - -jest-serializer@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-22.4.3.tgz#a679b81a7f111e4766235f4f0c46d230ee0f7436" - -jest-snapshot@^22.4.0: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-22.4.3.tgz#b5c9b42846ffb9faccb76b841315ba67887362d2" - dependencies: - chalk "^2.0.1" - jest-diff "^22.4.3" - jest-matcher-utils "^22.4.3" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - pretty-format "^22.4.3" - -jest-util@^22.4.1, jest-util@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-22.4.3.tgz#c70fec8eec487c37b10b0809dc064a7ecf6aafac" - dependencies: - callsites "^2.0.0" - chalk "^2.0.1" - graceful-fs "^4.1.11" - is-ci "^1.0.10" - jest-message-util "^22.4.3" - mkdirp "^0.5.1" - source-map "^0.6.0" - -jest-validate@^22.4.4: - version "22.4.4" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-22.4.4.tgz#1dd0b616ef46c995de61810d85f57119dbbcec4d" - dependencies: - chalk "^2.0.1" - jest-config "^22.4.4" - jest-get-type "^22.1.0" - leven "^2.1.0" - pretty-format "^22.4.0" - -jest-worker@^22.2.2, jest-worker@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-22.4.3.tgz#5c421417cba1c0abf64bf56bd5fb7968d79dd40b" - dependencies: - merge-stream "^1.0.1" - -jest@^22.4.3: - version "22.4.4" - resolved "https://registry.yarnpkg.com/jest/-/jest-22.4.4.tgz#ffb36c9654b339a13e10b3d4b338eb3e9d49f6eb" - dependencies: - import-local "^1.0.0" - jest-cli "^22.4.4" - -js-tokens@^3.0.0, js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - -js-yaml@^3.7.0, js-yaml@^3.9.1: - version "3.11.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.11.0.tgz#597c1a8bd57152f26d622ce4117851a51f5ebaef" - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - -jsdom@^11.5.1: - version "11.11.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.11.0.tgz#df486efad41aee96c59ad7a190e2449c7eb1110e" - dependencies: - abab "^1.0.4" - acorn "^5.3.0" - acorn-globals "^4.1.0" - array-equal "^1.0.0" - cssom ">= 0.3.2 < 0.4.0" - cssstyle ">= 0.3.1 < 0.4.0" - data-urls "^1.0.0" - domexception "^1.0.0" - escodegen "^1.9.0" - html-encoding-sniffer "^1.0.2" - left-pad "^1.2.0" - nwsapi "^2.0.0" - parse5 "4.0.0" - pn "^1.1.0" - request "^2.83.0" - request-promise-native "^1.0.5" - sax "^1.2.4" - symbol-tree "^3.2.2" - tough-cookie "^2.3.3" - w3c-hr-time "^1.0.1" - webidl-conversions "^4.0.2" - whatwg-encoding "^1.0.3" - whatwg-mimetype "^2.1.0" - whatwg-url "^6.4.1" - ws "^4.0.0" - xml-name-validator "^3.0.0" - -jsesc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - -json-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-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - -json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - dependencies: - jsonify "~0.0.0" - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - -json5@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - -jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" - -jsx-ast-utils@^2.0.0, jsx-ast-utils@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz#e801b1b39985e20fffc87b40e3748080e2dcac7f" - dependencies: - array-includes "^3.0.3" - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" - -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" - -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" - -left-pad@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" - -leven@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" - -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" - -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" - -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.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - -lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.4, lodash@^4.3.0: - version "4.17.10" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" - -longest@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" - -loose-envify@^1.0.0, 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" - -lru-cache@^4.0.1: - version "4.1.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - -makeerror@1.0.x: - version "1.0.11" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" - dependencies: - tmpl "1.0.x" - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - dependencies: - object-visit "^1.0.0" - -math-random@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac" - -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" - -merge-stream@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" - dependencies: - readable-stream "^2.0.1" - -merge@^1.1.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" - -micromatch@^2.1.5, micromatch@^2.3.11: - version "2.3.11" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" - -micromatch@^3.1.4, micromatch@^3.1.8: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -mime-db@~1.33.0: - version "1.33.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" - -mime-types@^2.1.12, mime-types@~2.1.17: - version "2.1.18" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" - dependencies: - mime-db "~1.33.0" - -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - -minimatch@^3.0.2, minimatch@^3.0.3, 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.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - -minimist@^1.1.1, minimist@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - -minimist@~0.0.1: - version "0.0.10" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" - -minipass@^2.2.1, minipass@^2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233" - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minizlib@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" - dependencies: - minipass "^2.2.1" - -mixin-deep@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp@^0.5.0, mkdirp@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - dependencies: - minimist "0.0.8" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - -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.9.2: - version "2.10.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" - -nanomatch@^1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2" - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-odd "^2.0.0" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - -needle@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d" - dependencies: - debug "^2.1.2" - iconv-lite "^0.4.4" - sax "^1.2.4" - -node-fetch@^1.0.1: - version "1.7.3" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" - dependencies: - encoding "^0.1.11" - is-stream "^1.0.1" - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - -node-notifier@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea" - dependencies: - growly "^1.3.0" - semver "^5.4.1" - shellwords "^0.1.1" - which "^1.3.0" - -node-pre-gyp@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.0.tgz#6e4ef5bb5c5203c6552448828c852c40111aac46" - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.0" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.1.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4" - -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: - version "2.4.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" - dependencies: - hosted-git-info "^2.1.4" - is-builtin-module "^1.0.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - dependencies: - remove-trailing-separator "^1.0.1" - -npm-bundled@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308" - -npm-packlist@^1.1.6: - version "1.1.10" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.10.tgz#1039db9e985727e464df066f4cf0ab6ef85c398a" - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - -npm-run-path@^2.0.0: - 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.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - -nwsapi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.0.tgz#7c8faf4ad501e1d17a651ebc5547f966b547c5c7" - -oauth-sign@~0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" - -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-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-keys@^1.0.8: - version "1.0.11" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - dependencies: - isobject "^3.0.0" - -object.getownpropertydescriptors@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" - dependencies: - define-properties "^1.1.2" - es-abstract "^1.5.1" - -object.omit@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" - dependencies: - for-own "^0.1.4" - is-extendable "^0.1.1" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - dependencies: - isobject "^3.0.1" - -once@^1.3.0, 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" - -optimist@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" - dependencies: - minimist "~0.0.1" - wordwrap "~0.0.2" - -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" - -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - -os-locale@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" - dependencies: - execa "^0.7.0" - lcid "^1.0.0" - mem "^1.1.0" - -os-shim@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" - -os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - -osenv@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -output-file-sync@^1.1.2: - 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" - -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.2.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c" - dependencies: - p-try "^1.0.0" - -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - dependencies: - p-limit "^1.1.0" - -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - -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" - -parse5@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - dependencies: - pinkie-promise "^2.0.0" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - -path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - -path-is-inside@^1.0.1, path-is-inside@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - -path-key@^2.0.0: - 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-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" - -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: - 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" - -pkg-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" - dependencies: - find-up "^1.0.0" - -pkg-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" - dependencies: - find-up "^2.1.0" - -pluralize@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" - -pn@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - -pre-commit@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/pre-commit/-/pre-commit-1.2.2.tgz#dbcee0ee9de7235e57f79c56d7ce94641a69eec6" - dependencies: - cross-spawn "^5.0.1" - spawn-sync "^1.0.15" - which "1.2.x" - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - -preserve@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - -pretty-format@^22.4.0, pretty-format@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-22.4.3.tgz#f873d780839a9c02e9664c8a082e9ee79eaac16f" - dependencies: - ansi-regex "^3.0.0" - ansi-styles "^3.2.0" - -private@^0.1.6, private@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" - -process-nextick-args@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" - -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.3.1" - resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" - dependencies: - asap "~2.0.3" - -prop-types@^15.6.0: - version "15.6.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca" - dependencies: - fbjs "^0.8.16" - loose-envify "^1.3.1" - object-assign "^4.1.1" - -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - -punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - -punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - -qs@~6.5.1: - version "6.5.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - -randomatic@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.0.0.tgz#d35490030eb4f7578de292ce6dfb04a91a128923" - dependencies: - is-number "^4.0.0" - kind-of "^6.0.0" - math-random "^1.0.1" - -rc@^1.1.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.7.tgz#8a10ca30d588d00464360372b890d06dacd02297" - dependencies: - deep-extend "^0.5.1" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -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.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.2: - version "2.3.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -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" - -realpath-native@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.0.0.tgz#7885721a83b43bd5327609f0ddecb2482305fdf0" - dependencies: - util.promisify "^1.0.0" - -regenerate@^1.2.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" - -regenerator-runtime@^0.10.5: - version "0.10.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" - -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - -regenerator-transform@^0.10.0: - version "0.10.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" - dependencies: - babel-runtime "^6.18.0" - babel-types "^6.19.0" - private "^0.1.6" - -regex-cache@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" - dependencies: - is-equal-shallow "^0.1.3" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regexpp@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" - -regexpu-core@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" - dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" - -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - -regjsparser@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" - dependencies: - jsesc "~0.5.0" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - -repeat-element@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" - -repeat-string@^1.5.2, repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - dependencies: - is-finite "^1.0.0" - -request-promise-core@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" - dependencies: - lodash "^4.13.1" - -request-promise-native@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5" - dependencies: - request-promise-core "1.1.1" - stealthy-require "^1.1.0" - tough-cookie ">=2.3.3" - -request@^2.81.0, request@^2.83.0: - version "2.87.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.6.0" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.1" - forever-agent "~0.6.1" - form-data "~2.3.1" - har-validator "~5.0.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.17" - oauth-sign "~0.8.2" - performance-now "^2.1.0" - qs "~6.5.1" - safe-buffer "^5.1.1" - tough-cookie "~2.3.3" - tunnel-agent "^0.6.0" - uuid "^3.1.0" - -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" - -resolve-cwd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" - dependencies: - resolve-from "^3.0.0" - -resolve-from@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" - -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - -resolve@1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - -resolve@^1.5.0, resolve@^1.6.0: - version "1.7.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.7.1.tgz#aadd656374fd298aee895bc026b8297418677fd3" - dependencies: - path-parse "^1.0.5" - -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - -right-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" - dependencies: - align-text "^0.1.1" - -rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1: - version "2.6.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" - dependencies: - glob "^7.0.5" - -rsvp@^3.3.3: - version "3.6.2" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" - -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" - -safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - -sane@^2.0.0: - version "2.5.2" - resolved "https://registry.yarnpkg.com/sane/-/sane-2.5.2.tgz#b4dc1861c21b427e929507a3e751e2a2cb8ab3fa" - dependencies: - anymatch "^2.0.0" - capture-exit "^1.2.0" - exec-sh "^0.2.0" - fb-watchman "^2.0.0" - micromatch "^3.1.4" - minimist "^1.1.1" - walker "~1.0.5" - watch "~0.18.0" - optionalDependencies: - fsevents "^1.2.3" - -sax@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1: - version "5.5.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" - -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" - -set-value@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.1" - to-object-path "^0.3.0" - -set-value@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - -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" - -shellwords@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" - -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" - -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - -slice-ansi@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" - dependencies: - is-fullwidth-code-point "^2.0.0" - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -source-map-resolve@^0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" - dependencies: - atob "^2.1.1" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@^0.4.15: - version "0.4.18" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" - dependencies: - source-map "^0.5.6" - -source-map-support@^0.5.0: - version "0.5.6" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13" - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-url@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - -source-map@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" - dependencies: - amdefine ">=0.0.4" - -source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - -source-map@^0.6.0, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - -spawn-sync@^1.0.15: - version "1.0.15" - resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476" - dependencies: - concat-stream "^1.4.7" - os-shim "^0.1.2" - -spdx-correct@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9" - -spdx-expression-parse@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87" - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - dependencies: - extend-shallow "^3.0.0" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - -sshpk@^1.7.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.1.tgz#130f5975eddad963f1d56f92b9ac6c51fa9f83eb" - 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" - -stack-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.1.tgz#d4f33ab54e8e38778b0ca5cfd3b3afb12db68620" - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -stealthy-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" - -string-length@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" - dependencies: - astral-regex "^1.0.0" - strip-ansi "^4.0.0" - -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, string-width@^2.1.0, string-width@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - dependencies: - ansi-regex "^3.0.0" - -strip-bom@3.0.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-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-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - -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" - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - -supports-color@^3.1.2: - version "3.2.3" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" - dependencies: - has-flag "^1.0.0" - -supports-color@^5.3.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" - dependencies: - has-flag "^3.0.0" - -symbol-tree@^3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" - -table@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" - dependencies: - ajv "^5.2.3" - ajv-keywords "^2.1.0" - chalk "^2.1.0" - lodash "^4.17.4" - slice-ansi "1.0.0" - string-width "^2.1.1" - -tar@^4: - version "4.4.3" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.3.tgz#d6bd509dc7f6b5a5d2c13aa0f7d57b03269b8376" - dependencies: - chownr "^1.0.1" - fs-minipass "^1.2.5" - minipass "^2.3.3" - minizlib "^1.1.0" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.2" - -test-exclude@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.1.tgz#dfa222f03480bca69207ca728b37d74b45f724fa" - dependencies: - arrify "^1.0.1" - micromatch "^3.1.8" - object-assign "^4.1.0" - read-pkg-up "^1.0.1" - require-main-filename "^1.0.1" - -text-table@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - -throat@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" - -through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - dependencies: - os-tmpdir "~1.0.2" - -tmpl@1.0.x: - version "1.0.4" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" - -to-fast-properties@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -tough-cookie@>=2.3.3, tough-cookie@^2.3.3, tough-cookie@~2.3.3: - version "2.3.4" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" - dependencies: - punycode "^1.4.1" - -tr46@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" - dependencies: - punycode "^2.1.0" - -trim-right@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - dependencies: - prelude-ls "~1.1.2" - -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.9: - version "0.7.18" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.18.tgz#a7bfd92f56edfb117083b69e31d2aa8882d4b1ed" - -uglify-js@^2.6: - version "2.8.29" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" - dependencies: - source-map "~0.5.1" - yargs "~3.10.0" - optionalDependencies: - uglify-to-browserify "~1.0.0" - -uglify-to-browserify@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" - -union-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^0.4.3" - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - -urlgrey@0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/urlgrey/-/urlgrey-0.4.4.tgz#892fe95960805e85519f1cd4389f2cb4cbb7652f" - -use@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.0.tgz#14716bf03fdfefd03040aef58d8b4b85f3a7c544" - dependencies: - kind-of "^6.0.2" - -user-home@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" - -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - -util.promisify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" - dependencies: - define-properties "^1.1.2" - object.getownpropertydescriptors "^2.0.3" - -uuid@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" - -v8flags@^2.1.1: - 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.3" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338" - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -w3c-hr-time@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" - dependencies: - browser-process-hrtime "^0.1.2" - -walker@~1.0.5: - version "1.0.7" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" - dependencies: - makeerror "1.0.x" - -watch@~0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986" - dependencies: - exec-sh "^0.2.0" - minimist "^1.2.0" - -webidl-conversions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" - -whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3" - dependencies: - iconv-lite "0.4.19" - -whatwg-fetch@>=0.10.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" - -whatwg-mimetype@^2.0.0, whatwg-mimetype@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz#f0f21d76cbba72362eb609dbed2a30cd17fcc7d4" - -whatwg-url@^6.4.0, whatwg-url@^6.4.1: - version "6.4.1" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.4.1.tgz#fdb94b440fd4ad836202c16e9737d511f012fd67" - dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" - -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.2.x: - version "1.2.14" - resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" - dependencies: - isexe "^2.0.0" - -which@^1.2.12, which@^1.2.9, which@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" - 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" - -window-size@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" - -wordwrap@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" - -wordwrap@~0.0.2: - version "0.0.3" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - -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.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - signal-exit "^3.0.2" - -write@^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@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-4.1.0.tgz#a979b5d7d4da68bf54efe0408967c324869a7289" - dependencies: - async-limiter "~1.0.0" - safe-buffer "~5.1.0" - -xml-name-validator@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" - -y18n@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" - -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - -yallist@^3.0.0, yallist@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" - -yargs-parser@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950" - dependencies: - camelcase "^4.1.0" - -yargs@^10.0.3: - version "10.1.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.2.tgz#454d074c2b16a51a43e2fb7807e4f9de69ccb5c5" - dependencies: - cliui "^4.0.0" - decamelize "^1.1.1" - find-up "^2.1.0" - get-caller-file "^1.0.1" - os-locale "^2.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^8.1.0" - -yargs@~3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" - dependencies: - camelcase "^1.0.2" - cliui "^2.1.0" - decamelize "^1.0.0" - window-size "0.1.0"