This is an automated email from the git hooks/post-receive script.
mreynolds pushed a commit to branch 389-ds-base-1.4.0
in repository 389-ds-base.
commit dd2a2e75fdc83970b141b8c29077ffd010b4c1be
Author: Mark Reynolds <mreynolds(a)redhat.com>
AuthorDate: Tue Jun 25 15:37:30 2019 -0400
Issue 50041 - Add the rest UI Plugin tabs - Part 1
Description: Add UI plugin tabs for accountPolicy, attributeUniqueness,
linkedAttributes, referentialIntegrity, retroChangelog, rootDNAccessControl
and winsync.
Reorder the tabs to make the usage more intuitive.
Fix Attribute Uniqueness logging level issue.
Move pluginTable.jsx content to pluginTables.jsx.
Fix a small 'help' typo in dbtasks.py.
https://pagure.io/389-ds-base/issue/50041
Reviewed by: mreynolds (Thanks!)
---
src/cockpit/389-console/audit-ci.json | 8 +
src/cockpit/389-console/node_modules.mk | 4 +-
src/cockpit/389-console/package-lock.json | 9195 ++++++++++++++++++++
src/cockpit/389-console/package.json | 22 +-
src/cockpit/389-console/src/ds.js | 37 +-
.../389-console/src/lib/plugins/accountPolicy.jsx | 45 +-
.../src/lib/plugins/attributeUniqueness.jsx | 36 +-
.../src/lib/plugins/linkedAttributes.jsx | 29 +-
.../389-console/src/lib/plugins/memberOf.jsx | 139 +-
.../src/lib/plugins/pluginBasicConfig.jsx | 3 +
.../src/lib/plugins/referentialIntegrity.jsx | 3 +
.../389-console/src/lib/plugins/retroChangelog.jsx | 15 +-
.../src/lib/plugins/rootDNAccessControl.jsx | 60 +
src/cockpit/389-console/src/plugins.jsx | 28 +-
src/cockpit/389-console/src/servers.js | 84 +-
src/cockpit/389-console/webpack.config.js | 1 -
src/lib389/cli/dsconf | 2 +
src/lib389/cli/dscreate | 2 -
src/lib389/cli/dsctl | 17 +-
src/lib389/cli/dsidm | 2 +
src/lib389/lib389/__init__.py | 342 +-
src/lib389/lib389/_entry.py | 2 +-
src/lib389/lib389/_mapped_object.py | 199 +-
src/lib389/lib389/agreement.py | 2 +-
src/lib389/lib389/changelog.py | 2 +-
src/lib389/lib389/cli_base/__init__.py | 43 +-
src/lib389/lib389/cli_conf/__init__.py | 14 +-
.../lib389/cli_conf/plugins/accountpolicy.py | 3 +-
src/lib389/lib389/cli_conf/plugins/attruniq.py | 3 +
src/lib389/lib389/cli_conf/plugins/linkedattr.py | 1 -
src/lib389/lib389/cli_conf/plugins/memberof.py | 7 +-
.../lib389/cli_conf/plugins/posix_winsync.py | 2 +-
src/lib389/lib389/cli_conf/plugins/referint.py | 2 +-
.../lib389/cli_conf/plugins/retrochangelog.py | 2 +-
src/lib389/lib389/cli_conf/pwpolicy.py | 119 +-
src/lib389/lib389/cli_ctl/dbtasks.py | 15 +-
src/lib389/lib389/cli_ctl/instance.py | 38 +-
src/lib389/lib389/cli_idm/account.py | 38 +-
src/lib389/lib389/cli_idm/client_config.py | 290 +
src/lib389/lib389/cli_idm/posixgroup.py | 2 +-
src/lib389/lib389/cos.py | 41 +
src/lib389/lib389/dirsrv_log.py | 18 +-
src/lib389/lib389/ds_instance.py | 4 +-
src/lib389/lib389/idm/account.py | 25 +-
src/lib389/lib389/idm/directorymanager.py | 6 +
src/lib389/lib389/idm/role.py | 163 +
src/lib389/lib389/instance/options.py | 8 +-
src/lib389/lib389/instance/remove.py | 134 +-
src/lib389/lib389/instance/setup.py | 192 +-
src/lib389/lib389/monitor.py | 22 +
src/lib389/lib389/nss_ssl.py | 51 +-
src/lib389/lib389/passwd.py | 15 +-
src/lib389/lib389/plugins.py | 43 +-
src/lib389/lib389/pwpolicy.py | 181 +-
src/lib389/lib389/replica.py | 6 +-
src/lib389/lib389/repltools.py | 2 +-
src/lib389/lib389/tasks.py | 30 +-
src/lib389/lib389/tests/cli/__init__.py | 27 +-
src/lib389/lib389/tests/cli/conf_plugin_test.py | 2 +-
src/lib389/lib389/tests/cli/conf_pwpolicy_test.py | 151 +
src/lib389/lib389/tests/dsadmin_basic_test.py | 2 +-
src/lib389/lib389/tests/dsadmin_test.py | 7 -
src/lib389/lib389/tombstone.py | 2 +-
src/lib389/lib389/utils.py | 89 +-
src/lib389/setup.py | 5 +-
src/lib389/tox.ini | 2 +-
66 files changed, 11288 insertions(+), 798 deletions(-)
diff --git a/src/cockpit/389-console/audit-ci.json
b/src/cockpit/389-console/audit-ci.json
new file mode 100644
index 0000000..78b590f
--- /dev/null
+++ b/src/cockpit/389-console/audit-ci.json
@@ -0,0 +1,8 @@
+{
+ "moderate": true,
+ "package-manager": "auto",
+ "report": true,
+ "advisories": [],
+ "_comment": "jquery should be removed from the whitelist after
https://github.com/patternfly/patternfly/pull/1174 is merged",
+ "whitelist": ["jquery"]
+}
diff --git a/src/cockpit/389-console/node_modules.mk
b/src/cockpit/389-console/node_modules.mk
index 4924900..307e8e3 100644
--- a/src/cockpit/389-console/node_modules.mk
+++ b/src/cockpit/389-console/node_modules.mk
@@ -1,8 +1,8 @@
install: package.json
- test -f node_modules/webpack || npm install
+ npm ci
build-cockpit-plugin: webpack.config.js
- npm run build; cp -r dist cockpit_dist
+ npm run audit-ci && npm run build && cp -r dist cockpit_dist
eslint-fix:
npm run eslint:fix
diff --git a/src/cockpit/389-console/package-lock.json
b/src/cockpit/389-console/package-lock.json
new file mode 100644
index 0000000..a35d857
--- /dev/null
+++ b/src/cockpit/389-console/package-lock.json
@@ -0,0 +1,9195 @@
+{
+ "name": "389-console",
+ "version": "1.0.0",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.0.0",
+ "resolved":
"https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
+ "integrity":
"sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.0.0"
+ }
+ },
+ "@babel/core": {
+ "version": "7.1.2",
+ "resolved":
"https://registry.npmjs.org/@babel/core/-/core-7.1.2.tgz",
+ "integrity":
"sha512-IFeSSnjXdhDaoysIlev//UzHZbdEmm7D0EIH2qtse9xK7mXEZQpYjs2P00XlP1qYsYvid79p+Zgg6tz1mp6iVw==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "@babel/generator": "^7.1.2",
+ "@babel/helpers": "^7.1.2",
+ "@babel/parser": "^7.1.2",
+ "@babel/template": "^7.1.2",
+ "@babel/traverse": "^7.1.0",
+ "@babel/types": "^7.1.2",
+ "convert-source-map": "^1.1.0",
+ "debug": "^3.1.0",
+ "json5": "^0.5.0",
+ "lodash": "^4.17.10",
+ "resolve": "^1.3.2",
+ "semver": "^5.4.1",
+ "source-map": "^0.5.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.5.7",
+ "resolved":
"https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "@babel/generator": {
+ "version": "7.1.3",
+ "resolved":
"https://registry.npmjs.org/@babel/generator/-/generator-7.1.3.tgz",
+ "integrity":
"sha512-ZoCZGcfIJFJuZBqxcY9OjC1KW2lWK64qrX1o4UYL3yshVhwKFYgzpWZ0vvtGMNJdTlvkw0W+HR1VnYN8q3QPFQ==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.1.3",
+ "jsesc": "^2.5.1",
+ "lodash": "^4.17.10",
+ "source-map": "^0.5.0",
+ "trim-right": "^1.0.1"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.5.7",
+ "resolved":
"https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "@babel/helper-annotate-as-pure": {
+ "version": "7.0.0",
+ "resolved":
"https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz",
+ "integrity":
"sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "@babel/helper-builder-binary-assignment-operator-visitor": {
+ "version": "7.1.0",
+ "resolved":
"https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz",
+ "integrity":
"sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-explode-assignable-expression": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "@babel/helper-builder-react-jsx": {
+ "version": "7.0.0",
+ "resolved":
"https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.0.0.tgz",
+ "integrity":
"sha512-ebJ2JM6NAKW0fQEqN8hOLxK84RbRz9OkUhGS/Xd5u56ejMfVbayJ4+LykERZCOUM6faa6Fp3SZNX3fcT16MKHw==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.0.0",
+ "esutils": "^2.0.0"
+ }
+ },
+ "@babel/helper-call-delegate": {
+ "version": "7.1.0",
+ "resolved":
"https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.1.0.tgz",
+ "integrity":
"sha512-YEtYZrw3GUK6emQHKthltKNZwszBcHK58Ygcis+gVUrF4/FmTVr5CCqQNSfmvg2y+YDEANyYoaLz/SHsnusCwQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-hoist-variables": "^7.0.0",
+ "@babel/traverse": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "@babel/helper-define-map": {
+ "version": "7.1.0",
+ "resolved":
"https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz",
+ "integrity":
"sha512-yPPcW8dc3gZLN+U1mhYV91QU3n5uTbx7DUdf8NnPbjS0RMwBuHi9Xt2MUgppmNz7CJxTBWsGczTiEp1CSOTPRg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-function-name": "^7.1.0",
+ "@babel/types": "^7.0.0",
+ "lodash": "^4.17.10"
+ }
+ },
+ "@babel/helper-explode-assignable-expression": {
+ "version": "7.1.0",
+ "resolved":
"https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz",
+ "integrity":
"sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==",
+ "dev": true,
+ "requires": {
+ "@babel/traverse": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "@babel/helper-function-name": {
+ "version": "7.1.0",
+ "resolved":
"https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz",
+ "integrity":
"sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-get-function-arity": "^7.0.0",
+ "@babel/template": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "@babel/helper-get-function-arity": {
+ "version": "7.0.0",
+ "resolved":
"https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz",
+ "integrity":
"sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "@babel/helper-hoist-variables": {
+ "version": "7.0.0",
+ "resolved":
"https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz",
+ "integrity":
"sha512-Ggv5sldXUeSKsuzLkddtyhyHe2YantsxWKNi7A+7LeD12ExRDWTRk29JCXpaHPAbMaIPZSil7n+lq78WY2VY7w==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "@babel/helper-member-expression-to-functions": {
+ "version": "7.0.0",
+ "resolved":
"https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz",
+ "integrity":
"sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "@babel/helper-module-imports": {
+ "version": "7.0.0",
+ "resolved":
"https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz",
+ "integrity":
"sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "@babel/helper-module-transforms": {
+ "version": "7.1.0",
+ "resolved":
"https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.1.0.tgz",
+ "integrity":
"sha512-0JZRd2yhawo79Rcm4w0LwSMILFmFXjugG3yqf+P/UsKsRS1mJCmMwwlHDlMg7Avr9LrvSpp4ZSULO9r8jpCzcw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-module-imports": "^7.0.0",
+ "@babel/helper-simple-access": "^7.1.0",
+ "@babel/helper-split-export-declaration": "^7.0.0",
+ "@babel/template": "^7.1.0",
+ "@babel/types": "^7.0.0",
+ "lodash": "^4.17.10"
+ }
+ },
+ "@babel/helper-optimise-call-expression": {
+ "version": "7.0.0",
+ "resolved":
"https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz",
+ "integrity":
"sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "@babel/helper-plugin-utils": {
+ "version": "7.0.0",
+ "resolved":
"https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz",
+ "integrity":
"sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==",
+ "dev": true
+ },
+ "@babel/helper-regex": {
+ "version": "7.0.0",
+ "resolved":
"https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.0.0.tgz",
+ "integrity":
"sha512-TR0/N0NDCcUIUEbqV6dCO+LptmmSQFQ7q70lfcEB4URsjD0E1HzicrwUH+ap6BAQ2jhCX9Q4UqZy4wilujWlkg==",
+ "dev": true,
+ "requires": {
+ "lodash": "^4.17.10"
+ }
+ },
+ "@babel/helper-remap-async-to-generator": {
+ "version": "7.1.0",
+ "resolved":
"https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz",
+ "integrity":
"sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-annotate-as-pure": "^7.0.0",
+ "@babel/helper-wrap-function": "^7.1.0",
+ "@babel/template": "^7.1.0",
+ "@babel/traverse": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "@babel/helper-replace-supers": {
+ "version": "7.1.0",
+ "resolved":
"https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.1.0.tgz",
+ "integrity":
"sha512-BvcDWYZRWVuDeXTYZWxekQNO5D4kO55aArwZOTFXw6rlLQA8ZaDicJR1sO47h+HrnCiDFiww0fSPV0d713KBGQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-member-expression-to-functions": "^7.0.0",
+ "@babel/helper-optimise-call-expression": "^7.0.0",
+ "@babel/traverse": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "@babel/helper-simple-access": {
+ "version": "7.1.0",
+ "resolved":
"https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz",
+ "integrity":
"sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==",
+ "dev": true,
+ "requires": {
+ "@babel/template": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "@babel/helper-split-export-declaration": {
+ "version": "7.0.0",
+ "resolved":
"https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz",
+ "integrity":
"sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "@babel/helper-wrap-function": {
+ "version": "7.1.0",
+ "resolved":
"https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.1.0.tgz",
+ "integrity":
"sha512-R6HU3dete+rwsdAfrOzTlE9Mcpk4RjU3aX3gi9grtmugQY0u79X7eogUvfXA5sI81Mfq1cn6AgxihfN33STjJA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-function-name": "^7.1.0",
+ "@babel/template": "^7.1.0",
+ "@babel/traverse": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "@babel/helpers": {
+ "version": "7.1.2",
+ "resolved":
"https://registry.npmjs.org/@babel/helpers/-/helpers-7.1.2.tgz",
+ "integrity":
"sha512-Myc3pUE8eswD73aWcartxB16K6CGmHDv9KxOmD2CeOs/FaEAQodr3VYGmlvOmog60vNQ2w8QbatuahepZwrHiA==",
+ "dev": true,
+ "requires": {
+ "@babel/template": "^7.1.2",
+ "@babel/traverse": "^7.1.0",
+ "@babel/types": "^7.1.2"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.0.0",
+ "resolved":
"https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
+ "integrity":
"sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.0.0",
+ "esutils": "^2.0.2",
+ "js-tokens": "^4.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved":
"https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity":
"sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved":
"https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity":
"sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved":
"https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity":
"sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "@babel/parser": {
+ "version": "7.1.3",
+ "resolved":
"https://registry.npmjs.org/@babel/parser/-/parser-7.1.3.tgz",
+ "integrity":
"sha512-gqmspPZOMW3MIRb9HlrnbZHXI1/KHTOroBwN1NcLL6pWxzqzEKGvRTq0W/PxS45OtQGbaFikSQpkS5zbnsQm2w==",
+ "dev": true
+ },
+ "@babel/plugin-proposal-async-generator-functions": {
+ "version": "7.1.0",
+ "resolved":
"https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.1.0.tgz",
+ "integrity":
"sha512-Fq803F3Jcxo20MXUSDdmZZXrPe6BWyGcWBPPNB/M7WaUYESKDeKMOGIxEzQOjGSmW/NWb6UaPZrtTB2ekhB/ew==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/helper-remap-async-to-generator": "^7.1.0",
+ "@babel/plugin-syntax-async-generators": "^7.0.0"
+ }
+ },
+ "@babel/plugin-proposal-json-strings": {
+ "version": "7.0.0",
+ "resolved":
"https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.0.0.tgz",
+ "integrity":
"sha512-kfVdUkIAGJIVmHmtS/40i/fg/AGnw/rsZBCaapY5yjeO5RA9m165Xbw9KMOu2nqXP5dTFjEjHdfNdoVcHv133Q==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/plugin-syntax-json-strings": "^7.0.0"
+ }
+ },
+ "@babel/plugin-proposal-object-rest-spread": {
+ "version": "7.0.0",
+ "resolved":
"https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.0.0.tgz",
+ "integrity":
"sha512-14fhfoPcNu7itSen7Py1iGN0gEm87hX/B+8nZPqkdmANyyYWYMY2pjA3r8WXbWVKMzfnSNS0xY8GVS0IjXi/iw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/plugin-syntax-object-rest-spread": "^7.0.0"
+ }
+ },
+ "@babel/plugin-proposal-optional-catch-binding": {
+ "version": "7.0.0",
+ "resolved":
"https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.0.0.tgz",
+ "integrity":
"sha512-JPqAvLG1s13B/AuoBjdBYvn38RqW6n1TzrQO839/sIpqLpbnXKacsAgpZHzLD83Sm8SDXMkkrAvEnJ25+0yIpw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.0.0"
+ }
+ },
+ "@babel/plugin-proposal-unicode-property-regex": {
+ "version": "7.0.0",
+ "resolved":
"https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.0.0.tgz",
+ "integrity":
"sha512-tM3icA6GhC3ch2SkmSxv7J/hCWKISzwycub6eGsDrFDgukD4dZ/I+x81XgW0YslS6mzNuQ1Cbzh5osjIMgepPQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/helper-regex": "^7.0.0",
+ "regexpu-core": "^4.2.0"
+ }
+ },
+ "@babel/plugin-syntax-async-generators": {
+ "version": "7.0.0",
+ "resolved":
"https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.0.0.tgz",
+ "integrity":
"sha512-im7ged00ddGKAjcZgewXmp1vxSZQQywuQXe2B1A7kajjZmDeY/ekMPmWr9zJgveSaQH0k7BcGrojQhcK06l0zA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0"
+ }
+ },
+ "@babel/plugin-syntax-json-strings": {
+ "version": "7.0.0",
+ "resolved":
"https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.0.0.tgz",
+ "integrity":
"sha512-UlSfNydC+XLj4bw7ijpldc1uZ/HB84vw+U6BTuqMdIEmz/LDe63w/GHtpQMdXWdqQZFeAI9PjnHe/vDhwirhKA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0"
+ }
+ },
+ "@babel/plugin-syntax-jsx": {
+ "version": "7.0.0",
+ "resolved":
"https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.0.0.tgz",
+ "integrity":
"sha512-PdmL2AoPsCLWxhIr3kG2+F9v4WH06Q3z+NoGVpQgnUNGcagXHq5sB3OXxkSahKq9TLdNMN/AJzFYSOo8UKDMHg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0"
+ }
+ },
+ "@babel/plugin-syntax-object-rest-spread": {
+ "version": "7.0.0",
+ "resolved":
"https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.0.0.tgz",
+ "integrity":
"sha512-5A0n4p6bIiVe5OvQPxBnesezsgFJdHhSs3uFSvaPdMqtsovajLZ+G2vZyvNe10EzJBWWo3AcHGKhAFUxqwp2dw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0"
+ }
+ },
+ "@babel/plugin-syntax-optional-catch-binding": {
+ "version": "7.0.0",
+ "resolved":
"https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.0.0.tgz",
+ "integrity":
"sha512-Wc+HVvwjcq5qBg1w5RG9o9RVzmCaAg/Vp0erHCKpAYV8La6I94o4GQAmFYNmkzoMO6gzoOSulpKeSSz6mPEoZw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0"
+ }
+ },
+ "@babel/plugin-transform-arrow-functions": {
+ "version": "7.0.0",
+ "resolved":
"https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.0.0.tgz",
+ "integrity":
"sha512-2EZDBl1WIO/q4DIkIp4s86sdp4ZifL51MoIviLY/gG/mLSuOIEg7J8o6mhbxOTvUJkaN50n+8u41FVsr5KLy/w==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0"
+ }
+ },
+ "@babel/plugin-transform-async-to-generator": {
+ "version": "7.1.0",
+ "resolved":
"https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.1.0.tgz",
+ "integrity":
"sha512-rNmcmoQ78IrvNCIt/R9U+cixUHeYAzgusTFgIAv+wQb9HJU4szhpDD6e5GCACmj/JP5KxuCwM96bX3L9v4ZN/g==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-module-imports": "^7.0.0",
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/helper-remap-async-to-generator": "^7.1.0"
+ }
+ },
+ "@babel/plugin-transform-block-scoped-functions": {
+ "version": "7.0.0",
+ "resolved":
"https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.0.0.tgz",
+ "integrity":
"sha512-AOBiyUp7vYTqz2Jibe1UaAWL0Hl9JUXEgjFvvvcSc9MVDItv46ViXFw2F7SVt1B5k+KWjl44eeXOAk3UDEaJjQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0"
+ }
+ },
+ "@babel/plugin-transform-block-scoping": {
+ "version": "7.0.0",
+ "resolved":
"https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.0.0.tgz",
+ "integrity":
"sha512-GWEMCrmHQcYWISilUrk9GDqH4enf3UmhOEbNbNrlNAX1ssH3MsS1xLOS6rdjRVPgA7XXVPn87tRkdTEoA/dxEg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "lodash": "^4.17.10"
+ }
+ },
+ "@babel/plugin-transform-classes": {
+ "version": "7.1.0",
+ "resolved":
"https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.1.0.tgz",
+ "integrity":
"sha512-rNaqoD+4OCBZjM7VaskladgqnZ1LO6o2UxuWSDzljzW21pN1KXkB7BstAVweZdxQkHAujps5QMNOTWesBciKFg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-annotate-as-pure": "^7.0.0",
+ "@babel/helper-define-map": "^7.1.0",
+ "@babel/helper-function-name": "^7.1.0",
+ "@babel/helper-optimise-call-expression": "^7.0.0",
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/helper-replace-supers": "^7.1.0",
+ "@babel/helper-split-export-declaration": "^7.0.0",
+ "globals": "^11.1.0"
+ }
+ },
+ "@babel/plugin-transform-computed-properties": {
+ "version": "7.0.0",
+ "resolved":
"https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.0.0.tgz",
+ "integrity":
"sha512-ubouZdChNAv4AAWAgU7QKbB93NU5sHwInEWfp+/OzJKA02E6Woh9RVoX4sZrbRwtybky/d7baTUqwFx+HgbvMA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0"
+ }
+ },
+ "@babel/plugin-transform-destructuring": {
+ "version": "7.1.3",
+ "resolved":
"https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.1.3.tgz",
+ "integrity":
"sha512-Mb9M4DGIOspH1ExHOUnn2UUXFOyVTiX84fXCd+6B5iWrQg/QMeeRmSwpZ9lnjYLSXtZwiw80ytVMr3zue0ucYw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0"
+ }
+ },
+ "@babel/plugin-transform-dotall-regex": {
+ "version": "7.0.0",
+ "resolved":
"https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.0.0.tgz",
+ "integrity":
"sha512-00THs8eJxOJUFVx1w8i1MBF4XH4PsAjKjQ1eqN/uCH3YKwP21GCKfrn6YZFZswbOk9+0cw1zGQPHVc1KBlSxig==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/helper-regex": "^7.0.0",
+ "regexpu-core": "^4.1.3"
+ }
+ },
+ "@babel/plugin-transform-duplicate-keys": {
+ "version": "7.0.0",
+ "resolved":
"https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.0.0.tgz",
+ "integrity":
"sha512-w2vfPkMqRkdxx+C71ATLJG30PpwtTpW7DDdLqYt2acXU7YjztzeWW2Jk1T6hKqCLYCcEA5UQM/+xTAm+QCSnuQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0"
+ }
+ },
+ "@babel/plugin-transform-exponentiation-operator": {
+ "version": "7.1.0",
+ "resolved":
"https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.1.0.tgz",
+ "integrity":
"sha512-uZt9kD1Pp/JubkukOGQml9tqAeI8NkE98oZnHZ2qHRElmeKCodbTZgOEUtujSCSLhHSBWbzNiFSDIMC4/RBTLQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-builder-binary-assignment-operator-visitor":
"^7.1.0",
+ "@babel/helper-plugin-utils": "^7.0.0"
+ }
+ },
+ "@babel/plugin-transform-for-of": {
+ "version": "7.0.0",
+ "resolved":
"https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.0.0.tgz",
+ "integrity":
"sha512-TlxKecN20X2tt2UEr2LNE6aqA0oPeMT1Y3cgz8k4Dn1j5ObT8M3nl9aA37LLklx0PBZKETC9ZAf9n/6SujTuXA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0"
+ }
+ },
+ "@babel/plugin-transform-function-name": {
+ "version": "7.1.0",
+ "resolved":
"https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.1.0.tgz",
+ "integrity":
"sha512-VxOa1TMlFMtqPW2IDYZQaHsFrq/dDoIjgN098NowhexhZcz3UGlvPgZXuE1jEvNygyWyxRacqDpCZt+par1FNg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-function-name": "^7.1.0",
+ "@babel/helper-plugin-utils": "^7.0.0"
+ }
+ },
+ "@babel/plugin-transform-literals": {
+ "version": "7.0.0",
+ "resolved":
"https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.0.0.tgz",
+ "integrity":
"sha512-1NTDBWkeNXgpUcyoVFxbr9hS57EpZYXpje92zv0SUzjdu3enaRwF/l3cmyRnXLtIdyJASyiS6PtybK+CgKf7jA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0"
+ }
+ },
+ "@babel/plugin-transform-modules-amd": {
+ "version": "7.1.0",
+ "resolved":
"https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.1.0.tgz",
+ "integrity":
"sha512-wt8P+xQ85rrnGNr2x1iV3DW32W8zrB6ctuBkYBbf5/ZzJY99Ob4MFgsZDFgczNU76iy9PWsy4EuxOliDjdKw6A==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-module-transforms": "^7.1.0",
+ "@babel/helper-plugin-utils": "^7.0.0"
+ }
+ },
+ "@babel/plugin-transform-modules-commonjs": {
+ "version": "7.1.0",
+ "resolved":
"https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.1.0.tgz",
+ "integrity":
"sha512-wtNwtMjn1XGwM0AXPspQgvmE6msSJP15CX2RVfpTSTNPLhKhaOjaIfBaVfj4iUZ/VrFSodcFedwtPg/NxwQlPA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-module-transforms": "^7.1.0",
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/helper-simple-access": "^7.1.0"
+ }
+ },
+ "@babel/plugin-transform-modules-systemjs": {
+ "version": "7.1.3",
+ "resolved":
"https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.1.3.tgz",
+ "integrity":
"sha512-PvTxgjxQAq4pvVUZF3mD5gEtVDuId8NtWkJsZLEJZMZAW3TvgQl1pmydLLN1bM8huHFVVU43lf0uvjQj9FRkKw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-hoist-variables": "^7.0.0",
+ "@babel/helper-plugin-utils": "^7.0.0"
+ }
+ },
+ "@babel/plugin-transform-modules-umd": {
+ "version": "7.1.0",
+ "resolved":
"https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.1.0.tgz",
+ "integrity":
"sha512-enrRtn5TfRhMmbRwm7F8qOj0qEYByqUvTttPEGimcBH4CJHphjyK1Vg7sdU7JjeEmgSpM890IT/efS2nMHwYig==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-module-transforms": "^7.1.0",
+ "@babel/helper-plugin-utils": "^7.0.0"
+ }
+ },
+ "@babel/plugin-transform-new-target": {
+ "version": "7.0.0",
+ "resolved":
"https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz",
+ "integrity":
"sha512-yin069FYjah+LbqfGeTfzIBODex/e++Yfa0rH0fpfam9uTbuEeEOx5GLGr210ggOV77mVRNoeqSYqeuaqSzVSw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0"
+ }
+ },
+ "@babel/plugin-transform-object-super": {
+ "version": "7.1.0",
+ "resolved":
"https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.1.0.tgz",
+ "integrity":
"sha512-/O02Je1CRTSk2SSJaq0xjwQ8hG4zhZGNjE8psTsSNPXyLRCODv7/PBozqT5AmQMzp7MI3ndvMhGdqp9c96tTEw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/helper-replace-supers": "^7.1.0"
+ }
+ },
+ "@babel/plugin-transform-parameters": {
+ "version": "7.1.0",
+ "resolved":
"https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.1.0.tgz",
+ "integrity":
"sha512-vHV7oxkEJ8IHxTfRr3hNGzV446GAb+0hgbA7o/0Jd76s+YzccdWuTU296FOCOl/xweU4t/Ya4g41yWz80RFCRw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-call-delegate": "^7.1.0",
+ "@babel/helper-get-function-arity": "^7.0.0",
+ "@babel/helper-plugin-utils": "^7.0.0"
+ }
+ },
+ "@babel/plugin-transform-react-display-name": {
+ "version": "7.0.0",
+ "resolved":
"https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.0.0.tgz",
+ "integrity":
"sha512-BX8xKuQTO0HzINxT6j/GiCwoJB0AOMs0HmLbEnAvcte8U8rSkNa/eSCAY+l1OA4JnCVq2jw2p6U8QQryy2fTPg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0"
+ }
+ },
+ "@babel/plugin-transform-react-jsx": {
+ "version": "7.0.0",
+ "resolved":
"https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.0.0.tgz",
+ "integrity":
"sha512-0TMP21hXsSUjIQJmu/r7RiVxeFrXRcMUigbKu0BLegJK9PkYodHstaszcig7zxXfaBji2LYUdtqIkHs+hgYkJQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-builder-react-jsx": "^7.0.0",
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/plugin-syntax-jsx": "^7.0.0"
+ }
+ },
+ "@babel/plugin-transform-react-jsx-self": {
+ "version": "7.0.0",
+ "resolved":
"https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.0.0.tgz",
+ "integrity":
"sha512-pymy+AK12WO4safW1HmBpwagUQRl9cevNX+82AIAtU1pIdugqcH+nuYP03Ja6B+N4gliAaKWAegIBL/ymALPHA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/plugin-syntax-jsx": "^7.0.0"
+ }
+ },
+ "@babel/plugin-transform-react-jsx-source": {
+ "version": "7.0.0",
+ "resolved":
"https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.0.0.tgz",
+ "integrity":
"sha512-OSeEpFJEH5dw/TtxTg4nijl4nHBbhqbKL94Xo/Y17WKIf2qJWeIk/QeXACF19lG1vMezkxqruwnTjVizaW7u7w==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/plugin-syntax-jsx": "^7.0.0"
+ }
+ },
+ "@babel/plugin-transform-regenerator": {
+ "version": "7.0.0",
+ "resolved":
"https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0.tgz",
+ "integrity":
"sha512-sj2qzsEx8KDVv1QuJc/dEfilkg3RRPvPYx/VnKLtItVQRWt1Wqf5eVCOLZm29CiGFfYYsA3VPjfizTCV0S0Dlw==",
+ "dev": true,
+ "requires": {
+ "regenerator-transform": "^0.13.3"
+ }
+ },
+ "@babel/plugin-transform-shorthand-properties": {
+ "version": "7.0.0",
+ "resolved":
"https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.0.0.tgz",
+ "integrity":
"sha512-g/99LI4vm5iOf5r1Gdxq5Xmu91zvjhEG5+yZDJW268AZELAu4J1EiFLnkSG3yuUsZyOipVOVUKoGPYwfsTymhw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0"
+ }
+ },
+ "@babel/plugin-transform-spread": {
+ "version": "7.0.0",
+ "resolved":
"https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.0.0.tgz",
+ "integrity":
"sha512-L702YFy2EvirrR4shTj0g2xQp7aNwZoWNCkNu2mcoU0uyzMl0XRwDSwzB/xp6DSUFiBmEXuyAyEN16LsgVqGGQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0"
+ }
+ },
+ "@babel/plugin-transform-sticky-regex": {
+ "version": "7.0.0",
+ "resolved":
"https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.0.0.tgz",
+ "integrity":
"sha512-LFUToxiyS/WD+XEWpkx/XJBrUXKewSZpzX68s+yEOtIbdnsRjpryDw9U06gYc6klYEij/+KQVRnD3nz3AoKmjw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/helper-regex": "^7.0.0"
+ }
+ },
+ "@babel/plugin-transform-template-literals": {
+ "version": "7.0.0",
+ "resolved":
"https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.0.0.tgz",
+ "integrity":
"sha512-vA6rkTCabRZu7Nbl9DfLZE1imj4tzdWcg5vtdQGvj+OH9itNNB6hxuRMHuIY8SGnEt1T9g5foqs9LnrHzsqEFg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-annotate-as-pure": "^7.0.0",
+ "@babel/helper-plugin-utils": "^7.0.0"
+ }
+ },
+ "@babel/plugin-transform-typeof-symbol": {
+ "version": "7.0.0",
+ "resolved":
"https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.0.0.tgz",
+ "integrity":
"sha512-1r1X5DO78WnaAIvs5uC48t41LLckxsYklJrZjNKcevyz83sF2l4RHbw29qrCPr/6ksFsdfRpT/ZgxNWHXRnffg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0"
+ }
+ },
+ "@babel/plugin-transform-unicode-regex": {
+ "version": "7.0.0",
+ "resolved":
"https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.0.0.tgz",
+ "integrity":
"sha512-uJBrJhBOEa3D033P95nPHu3nbFwFE9ZgXsfEitzoIXIwqAZWk7uXcg06yFKXz9FSxBH5ucgU/cYdX0IV8ldHKw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/helper-regex": "^7.0.0",
+ "regexpu-core": "^4.1.3"
+ }
+ },
+ "@babel/preset-env": {
+ "version": "7.1.0",
+ "resolved":
"https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.1.0.tgz",
+ "integrity":
"sha512-ZLVSynfAoDHB/34A17/JCZbyrzbQj59QC1Anyueb4Bwjh373nVPq5/HMph0z+tCmcDjXDe+DlKQq9ywQuvWrQg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-module-imports": "^7.0.0",
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/plugin-proposal-async-generator-functions":
"^7.1.0",
+ "@babel/plugin-proposal-json-strings": "^7.0.0",
+ "@babel/plugin-proposal-object-rest-spread": "^7.0.0",
+ "@babel/plugin-proposal-optional-catch-binding": "^7.0.0",
+ "@babel/plugin-proposal-unicode-property-regex": "^7.0.0",
+ "@babel/plugin-syntax-async-generators": "^7.0.0",
+ "@babel/plugin-syntax-object-rest-spread": "^7.0.0",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.0.0",
+ "@babel/plugin-transform-arrow-functions": "^7.0.0",
+ "@babel/plugin-transform-async-to-generator": "^7.1.0",
+ "@babel/plugin-transform-block-scoped-functions": "^7.0.0",
+ "@babel/plugin-transform-block-scoping": "^7.0.0",
+ "@babel/plugin-transform-classes": "^7.1.0",
+ "@babel/plugin-transform-computed-properties": "^7.0.0",
+ "@babel/plugin-transform-destructuring": "^7.0.0",
+ "@babel/plugin-transform-dotall-regex": "^7.0.0",
+ "@babel/plugin-transform-duplicate-keys": "^7.0.0",
+ "@babel/plugin-transform-exponentiation-operator": "^7.1.0",
+ "@babel/plugin-transform-for-of": "^7.0.0",
+ "@babel/plugin-transform-function-name": "^7.1.0",
+ "@babel/plugin-transform-literals": "^7.0.0",
+ "@babel/plugin-transform-modules-amd": "^7.1.0",
+ "@babel/plugin-transform-modules-commonjs": "^7.1.0",
+ "@babel/plugin-transform-modules-systemjs": "^7.0.0",
+ "@babel/plugin-transform-modules-umd": "^7.1.0",
+ "@babel/plugin-transform-new-target": "^7.0.0",
+ "@babel/plugin-transform-object-super": "^7.1.0",
+ "@babel/plugin-transform-parameters": "^7.1.0",
+ "@babel/plugin-transform-regenerator": "^7.0.0",
+ "@babel/plugin-transform-shorthand-properties": "^7.0.0",
+ "@babel/plugin-transform-spread": "^7.0.0",
+ "@babel/plugin-transform-sticky-regex": "^7.0.0",
+ "@babel/plugin-transform-template-literals": "^7.0.0",
+ "@babel/plugin-transform-typeof-symbol": "^7.0.0",
+ "@babel/plugin-transform-unicode-regex": "^7.0.0",
+ "browserslist": "^4.1.0",
+ "invariant": "^2.2.2",
+ "js-levenshtein": "^1.1.3",
+ "semver": "^5.3.0"
+ }
+ },
+ "@babel/preset-react": {
+ "version": "7.0.0",
+ "resolved":
"https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.0.0.tgz",
+ "integrity":
"sha512-oayxyPS4Zj+hF6Et11BwuBkmpgT/zMxyuZgFrMeZID6Hdh3dGlk4sHCAhdBCpuCKW2ppBfl2uCCetlrUIJRY3w==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/plugin-transform-react-display-name": "^7.0.0",
+ "@babel/plugin-transform-react-jsx": "^7.0.0",
+ "@babel/plugin-transform-react-jsx-self": "^7.0.0",
+ "@babel/plugin-transform-react-jsx-source": "^7.0.0"
+ }
+ },
+ "@babel/runtime": {
+ "version": "7.2.0",
+ "resolved":
"https://registry.npmjs.org/@babel/runtime/-/runtime-7.2.0.tgz",
+ "integrity":
"sha512-oouEibCbHMVdZSDlJBO6bZmID/zA/G/Qx3H1d3rSNPTD+L8UNKvCat7aKWSJ74zYbm5zWGh0GQN0hKj8zYFTCg==",
+ "requires": {
+ "regenerator-runtime": "^0.12.0"
+ }
+ },
+ "@babel/runtime-corejs2": {
+ "version": "7.2.0",
+ "resolved":
"https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.2.0.tgz",
+ "integrity":
"sha512-kPfmKoRI8Hpo5ZJGACWyrc9Eq1j3ZIUpUAQT2yH045OuYpccFJ9kYA/eErwzOM2jeBG1sC8XX1nl1EArtuM8tg==",
+ "requires": {
+ "core-js": "^2.5.7",
+ "regenerator-runtime": "^0.12.0"
+ }
+ },
+ "@babel/template": {
+ "version": "7.1.2",
+ "resolved":
"https://registry.npmjs.org/@babel/template/-/template-7.1.2.tgz",
+ "integrity":
"sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "@babel/parser": "^7.1.2",
+ "@babel/types": "^7.1.2"
+ }
+ },
+ "@babel/traverse": {
+ "version": "7.1.4",
+ "resolved":
"https://registry.npmjs.org/@babel/traverse/-/traverse-7.1.4.tgz",
+ "integrity":
"sha512-my9mdrAIGdDiSVBuMjpn/oXYpva0/EZwWL3sm3Wcy/AVWO2eXnsoZruOT9jOGNRXU8KbCIu5zsKnXcAJ6PcV6Q==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "@babel/generator": "^7.1.3",
+ "@babel/helper-function-name": "^7.1.0",
+ "@babel/helper-split-export-declaration": "^7.0.0",
+ "@babel/parser": "^7.1.3",
+ "@babel/types": "^7.1.3",
+ "debug": "^3.1.0",
+ "globals": "^11.1.0",
+ "lodash": "^4.17.10"
+ }
+ },
+ "@babel/types": {
+ "version": "7.1.3",
+ "resolved":
"https://registry.npmjs.org/@babel/types/-/types-7.1.3.tgz",
+ "integrity":
"sha512-RpPOVfK+yatXyn8n4PB1NW6k9qjinrXrRR8ugBN8fD6hCy5RXI6PSbVqpOJBO9oSaY7Nom4ohj35feb0UR9hSA==",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2",
+ "lodash": "^4.17.10",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "@types/c3": {
+ "version": "0.6.4",
+ "resolved":
"https://registry.npmjs.org/@types/c3/-/c3-0.6.4.tgz",
+ "integrity":
"sha512-W7i7oSmHsXYhseZJsIYexelv9HitGsWdQhx3mcy4NWso+GedpCYr02ghpkNvnZ4oTIjNeISdrOnM70s7HiuV+g==",
+ "optional": true,
+ "requires": {
+ "@types/d3": "^4"
+ }
+ },
+ "@types/d3": {
+ "version": "4.13.2",
+ "resolved":
"https://registry.npmjs.org/@types/d3/-/d3-4.13.2.tgz",
+ "integrity":
"sha512-jaMix9nFUgLeBSdU0md3usx5BaZfnO9Z0idyRmEq7mo7Ux7FpenW1SvyLXI0e59BtrgyPGNHMaZ0y2rJcSCMiw==",
+ "optional": true,
+ "requires": {
+ "@types/d3-array": "^1",
+ "@types/d3-axis": "*",
+ "@types/d3-brush": "*",
+ "@types/d3-chord": "*",
+ "@types/d3-collection": "*",
+ "@types/d3-color": "*",
+ "@types/d3-dispatch": "*",
+ "@types/d3-drag": "*",
+ "@types/d3-dsv": "*",
+ "@types/d3-ease": "*",
+ "@types/d3-force": "*",
+ "@types/d3-format": "*",
+ "@types/d3-geo": "*",
+ "@types/d3-hierarchy": "*",
+ "@types/d3-interpolate": "*",
+ "@types/d3-path": "*",
+ "@types/d3-polygon": "*",
+ "@types/d3-quadtree": "*",
+ "@types/d3-queue": "*",
+ "@types/d3-random": "*",
+ "@types/d3-request": "*",
+ "@types/d3-scale": "^1",
+ "@types/d3-selection": "*",
+ "@types/d3-shape": "*",
+ "@types/d3-time": "*",
+ "@types/d3-time-format": "*",
+ "@types/d3-timer": "*",
+ "@types/d3-transition": "*",
+ "@types/d3-voronoi": "*",
+ "@types/d3-zoom": "*"
+ }
+ },
+ "@types/d3-array": {
+ "version": "1.2.7",
+ "resolved":
"https://registry.npmjs.org/@types/d3-array/-/d3-array-1.2.7.tgz",
+ "integrity":
"sha512-51vHWuUyDOi+8XuwPrTw3cFqyh2Slg9y8COYkRfjCPG9TfYqY0hoNPzv/8BrcAy0FeQBzqEo/D/8Nk2caOQJnA==",
+ "optional": true
+ },
+ "@types/d3-axis": {
+ "version": "1.0.12",
+ "resolved":
"https://registry.npmjs.org/@types/d3-axis/-/d3-axis-1.0.12.tgz",
+ "integrity":
"sha512-BZISgSD5M8TgURyNtcPAmUB9sk490CO1Thb6/gIn0WZTt3Y50IssX+2Z0vTccoqZksUDTep0b+o4ofXslvNbqg==",
+ "optional": true,
+ "requires": {
+ "@types/d3-selection": "*"
+ }
+ },
+ "@types/d3-brush": {
+ "version": "1.0.10",
+ "resolved":
"https://registry.npmjs.org/@types/d3-brush/-/d3-brush-1.0.10.tgz",
+ "integrity":
"sha512-J8jREATIrfJaAfhJivqaEKPnJsRlwwrOPje+ABqZFgamADjll+q9zaDXnYyjiGPPsiJEU+Qq9jQi5rECxIOfhg==",
+ "optional": true,
+ "requires": {
+ "@types/d3-selection": "*"
+ }
+ },
+ "@types/d3-chord": {
+ "version": "1.0.9",
+ "resolved":
"https://registry.npmjs.org/@types/d3-chord/-/d3-chord-1.0.9.tgz",
+ "integrity":
"sha512-UA6lI9CVW5cT5Ku/RV4hxoFn4mKySHm7HEgodtfRthAj1lt9rKZEPon58vyYfk+HIAm33DtJJgZwMXy2QgyPXw==",
+ "optional": true
+ },
+ "@types/d3-collection": {
+ "version": "1.0.8",
+ "resolved":
"https://registry.npmjs.org/@types/d3-collection/-/d3-collection-1.0.8.tgz",
+ "integrity":
"sha512-y5lGlazdc0HNO0F3UUX2DPE7OmYvd9Kcym4hXwrJcNUkDaypR5pX+apuMikl9LfTxKItJsY9KYvzBulpCKyvuQ==",
+ "optional": true
+ },
+ "@types/d3-color": {
+ "version": "1.2.2",
+ "resolved":
"https://registry.npmjs.org/@types/d3-color/-/d3-color-1.2.2.tgz",
+ "integrity":
"sha512-6pBxzJ8ZP3dYEQ4YjQ+NVbQaOflfgXq/JbDiS99oLobM2o72uAST4q6yPxHv6FOTCRC/n35ktuo8pvw/S4M7sw=="
+ },
+ "@types/d3-dispatch": {
+ "version": "1.0.7",
+ "resolved":
"https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-1.0.7.tgz",
+ "integrity":
"sha512-M+z84G7UKwK6hEPnGCSccOg8zJ3Nk2hgDQ9sCstHXgsFU0sMxlIZVKqKB5oxUDbALqQG6ucg0G9e8cmOSlishg==",
+ "optional": true
+ },
+ "@types/d3-drag": {
+ "version": "1.2.3",
+ "resolved":
"https://registry.npmjs.org/@types/d3-drag/-/d3-drag-1.2.3.tgz",
+ "integrity":
"sha512-rWB5SPvkYVxW3sqUxHOJUZwifD0KqvKwvt1bhNqcLpW6Azsd0BJgRNcyVW8GAferaAk5r8dzeZnf9zKlg9+xMQ==",
+ "optional": true,
+ "requires": {
+ "@types/d3-selection": "*"
+ }
+ },
+ "@types/d3-dsv": {
+ "version": "1.0.36",
+ "resolved":
"https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-1.0.36.tgz",
+ "integrity":
"sha512-jbIWQ27QJcBNMZbQv0NSQMHnBDCmxghAxePxgyiPH1XPCRkOsTBei7jcdi3fDrUCGpCV3lKrSZFSlOkhUQVClA=="
+ },
+ "@types/d3-ease": {
+ "version": "1.0.8",
+ "resolved":
"https://registry.npmjs.org/@types/d3-ease/-/d3-ease-1.0.8.tgz",
+ "integrity":
"sha512-VRf8czVWHSJPoUWxMunzpePK02//wHDAswknU8QWzcyrQn6pqe46bHRYi2smSpw5VjsT2CG8k/QeWIdWPS3Bmg==",
+ "optional": true
+ },
+ "@types/d3-force": {
+ "version": "1.2.1",
+ "resolved":
"https://registry.npmjs.org/@types/d3-force/-/d3-force-1.2.1.tgz",
+ "integrity":
"sha512-jqK+I36uz4kTBjyk39meed5y31Ab+tXYN/x1dn3nZEus9yOHCLc+VrcIYLc/aSQ0Y7tMPRlIhLetulME76EiiA==",
+ "optional": true
+ },
+ "@types/d3-format": {
+ "version": "1.3.1",
+ "resolved":
"https://registry.npmjs.org/@types/d3-format/-/d3-format-1.3.1.tgz",
+ "integrity":
"sha512-KAWvReOKMDreaAwOjdfQMm0HjcUMlQG47GwqdVKgmm20vTd2pucj0a70c3gUSHrnsmo6H2AMrkBsZU2UhJLq8A==",
+ "optional": true
+ },
+ "@types/d3-geo": {
+ "version": "1.11.1",
+ "resolved":
"https://registry.npmjs.org/@types/d3-geo/-/d3-geo-1.11.1.tgz",
+ "integrity":
"sha512-Ox8WWOG3igDRoep/dNsGbOiSJYdUG3ew/6z0ETvHyAtXZVBjOE0S96zSSmzgl0gqQ3RdZjn2eeJOj9oRcMZPkQ==",
+ "optional": true,
+ "requires": {
+ "@types/geojson": "*"
+ }
+ },
+ "@types/d3-hierarchy": {
+ "version": "1.1.6",
+ "resolved":
"https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-1.1.6.tgz",
+ "integrity":
"sha512-vvSaIDf/Ov0o3KwMT+1M8+WbnnlRiGjlGD5uvk83a1mPCTd/E5x12bUJ/oP55+wUY/4Kb5kc67rVpVGJ2KUHxg==",
+ "optional": true
+ },
+ "@types/d3-interpolate": {
+ "version": "1.3.1",
+ "resolved":
"https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-1.3.1.tgz",
+ "integrity":
"sha512-z8Zmi08XVwe8e62vP6wcA+CNuRhpuUU5XPEfqpG0hRypDE5BWNthQHB1UNWWDB7ojCbGaN4qBdsWp5kWxhT1IQ==",
+ "requires": {
+ "@types/d3-color": "*"
+ }
+ },
+ "@types/d3-path": {
+ "version": "1.0.8",
+ "resolved":
"https://registry.npmjs.org/@types/d3-path/-/d3-path-1.0.8.tgz",
+ "integrity":
"sha512-AZGHWslq/oApTAHu9+yH/Bnk63y9oFOMROtqPAtxl5uB6qm1x2lueWdVEjsjjV3Qc2+QfuzKIwIR5MvVBakfzA=="
+ },
+ "@types/d3-polygon": {
+ "version": "1.0.7",
+ "resolved":
"https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-1.0.7.tgz",
+ "integrity":
"sha512-Xuw0eSjQQKs8jTiNbntWH0S+Xp+JyhqxmQ0YAQ3rDu6c3kKMFfgsaGN7Jv5u3zG6yVX/AsLP/Xs/QRjmi9g43Q==",
+ "optional": true
+ },
+ "@types/d3-quadtree": {
+ "version": "1.0.7",
+ "resolved":
"https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-1.0.7.tgz",
+ "integrity":
"sha512-0ajFawWicfjsaCLh6NzxOyVDYhQAmMFbsiI3MPGLInorauHFEh9/Cl6UHNf+kt/J1jfoxKY/ZJaKAoDpbvde5Q==",
+ "optional": true
+ },
+ "@types/d3-queue": {
+ "version": "3.0.8",
+ "resolved":
"https://registry.npmjs.org/@types/d3-queue/-/d3-queue-3.0.8.tgz",
+ "integrity":
"sha512-1FWOiI/MYwS5Z1Sa9EvS1Xet3isiVIIX5ozD6iGnwHonGcqL+RcC1eThXN5VfDmAiYt9Me9EWNEv/9J9k9RIKQ==",
+ "optional": true
+ },
+ "@types/d3-random": {
+ "version": "1.1.2",
+ "resolved":
"https://registry.npmjs.org/@types/d3-random/-/d3-random-1.1.2.tgz",
+ "integrity":
"sha512-Jui+Zn28pQw/3EayPKaN4c/PqTvqNbIPjHkgIIFnxne1FdwNjfHtAIsZIBMKlquQNrrMjFzCrlF2gPs3xckqaA==",
+ "optional": true
+ },
+ "@types/d3-request": {
+ "version": "1.0.5",
+ "resolved":
"https://registry.npmjs.org/@types/d3-request/-/d3-request-1.0.5.tgz",
+ "integrity":
"sha512-X+/c/qXp92o056C5Qbcp7jL27YRHpmIqOchHb/WB7NwFFqkBtAircqO7oKWv2GTtX4LyEqiDF9gqXsV+ldOlIg==",
+ "optional": true,
+ "requires": {
+ "@types/d3-dsv": "*"
+ }
+ },
+ "@types/d3-scale": {
+ "version": "1.0.14",
+ "resolved":
"https://registry.npmjs.org/@types/d3-scale/-/d3-scale-1.0.14.tgz",
+ "integrity":
"sha512-dW6Ii8bH+10klJzVVPPeeQvRpCbX3BO3x9cLTngu/+lXNDbk2uC51aFAA/XhocehZroaG5ajwAFelMFsgpClMg==",
+ "optional": true,
+ "requires": {
+ "@types/d3-time": "*"
+ }
+ },
+ "@types/d3-selection": {
+ "version": "1.4.1",
+ "resolved":
"https://registry.npmjs.org/@types/d3-selection/-/d3-selection-1.4.1.tgz",
+ "integrity":
"sha512-bv8IfFYo/xG6dxri9OwDnK3yCagYPeRIjTlrcdYJSx+FDWlCeBDepIHUpqROmhPtZ53jyna0aUajZRk0I3rXNA=="
+ },
+ "@types/d3-shape": {
+ "version": "1.3.1",
+ "resolved":
"https://registry.npmjs.org/@types/d3-shape/-/d3-shape-1.3.1.tgz",
+ "integrity":
"sha512-usqdvUvPJ7AJNwpd2drOzRKs1ELie53p2m2GnPKr076/ADM579jVTJ5dPsoZ5E/CMNWk8lvPWYQSvilpp6jjwg==",
+ "optional": true,
+ "requires": {
+ "@types/d3-path": "*"
+ }
+ },
+ "@types/d3-time": {
+ "version": "1.0.10",
+ "resolved":
"https://registry.npmjs.org/@types/d3-time/-/d3-time-1.0.10.tgz",
+ "integrity":
"sha512-aKf62rRQafDQmSiv1NylKhIMmznsjRN+MnXRXTqHoqm0U/UZzVpdrtRnSIfdiLS616OuC1soYeX1dBg2n1u8Xw=="
+ },
+ "@types/d3-time-format": {
+ "version": "2.1.1",
+ "resolved":
"https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-2.1.1.tgz",
+ "integrity":
"sha512-tJSyXta8ZyJ52wDDHA96JEsvkbL6jl7wowGmuf45+fAkj5Y+SQOnz0N7/H68OWmPshPsAaWMQh+GAws44IzH3g==",
+ "optional": true
+ },
+ "@types/d3-timer": {
+ "version": "1.0.9",
+ "resolved":
"https://registry.npmjs.org/@types/d3-timer/-/d3-timer-1.0.9.tgz",
+ "integrity":
"sha512-WvfJ3LFxBbWjqRGz9n7GJt08RrTHPJDVsIwwoCMROlqF+iDacYiAFjf9oqnq0mXpb2juA2N/qjKP+MKdal3YNQ==",
+ "optional": true
+ },
+ "@types/d3-transition": {
+ "version": "1.1.4",
+ "resolved":
"https://registry.npmjs.org/@types/d3-transition/-/d3-transition-1.1.4.tgz",
+ "integrity":
"sha512-/vsmKVUIXEyCcIXYAlw7bnYkIs9/J/nZbptRJFKUN3FdXq/dF6j9z9xXzerkyU6TDHLrMrwx9eGwdKyTIy/j9w==",
+ "optional": true,
+ "requires": {
+ "@types/d3-selection": "*"
+ }
+ },
+ "@types/d3-voronoi": {
+ "version": "1.1.9",
+ "resolved":
"https://registry.npmjs.org/@types/d3-voronoi/-/d3-voronoi-1.1.9.tgz",
+ "integrity":
"sha512-DExNQkaHd1F3dFPvGA/Aw2NGyjMln6E9QzsiqOcBgnE+VInYnFBHBBySbZQts6z6xD+5jTfKCP7M4OqMyVjdwQ==",
+ "optional": true
+ },
+ "@types/d3-zoom": {
+ "version": "1.7.4",
+ "resolved":
"https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-1.7.4.tgz",
+ "integrity":
"sha512-5jnFo/itYhJeB2khO/lKe730kW/h2EbKMOvY0uNp3+7NdPm4w63DwPEMxifQZ7n902xGYK5DdU67FmToSoy4VA==",
+ "optional": true,
+ "requires": {
+ "@types/d3-interpolate": "*",
+ "@types/d3-selection": "*"
+ }
+ },
+ "@types/geojson": {
+ "version": "7946.0.7",
+ "resolved":
"https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.7.tgz",
+ "integrity":
"sha512-wE2v81i4C4Ol09RtsWFAqg3BUitWbHSpSlIo+bNdsCJijO9sjme+zm+73ZMCa/qMC8UEERxzGbvmr1cffo2SiQ==",
+ "optional": true
+ },
+ "@types/prop-types": {
+ "version": "15.5.7",
+ "resolved":
"https://registry.npmjs.org/@types/prop-types/-/prop-types-15.5.7.tgz",
+ "integrity":
"sha512-a6WH0fXkgPNiGIuLjjdpf0n/GnmgWZ4vLuVIJJnDwhmRDPEaiRBcy5ofQPh+EJFua0S1QWmk1745+JqZQGnJ8Q=="
+ },
+ "@types/react": {
+ "version": "16.7.13",
+ "resolved":
"https://registry.npmjs.org/@types/react/-/react-16.7.13.tgz",
+ "integrity":
"sha512-WhqrQLAE9z65hfcvWqZfR6qUtIazFRyb8LXqHo8440R53dAQqNkt2OlVJ3FXwqOwAXXg4nfYxt0qgBvE18o5XA==",
+ "requires": {
+ "@types/prop-types": "*",
+ "csstype": "^2.2.0"
+ }
+ },
+ "@webassemblyjs/ast": {
+ "version": "1.7.8",
+ "resolved":
"https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.8.tgz",
+ "integrity":
"sha512-dOrtdtEyB8sInpl75yLPNksY4sRl0j/+t6aHyB/YA+ab9hV3Fo7FmG12FHzP+2MvWVAJtDb+6eXR5EZbZJ+uVg==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/helper-module-context": "1.7.8",
+ "@webassemblyjs/helper-wasm-bytecode": "1.7.8",
+ "@webassemblyjs/wast-parser": "1.7.8"
+ }
+ },
+ "@webassemblyjs/floating-point-hex-parser": {
+ "version": "1.7.8",
+ "resolved":
"https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.8.tgz",
+ "integrity":
"sha512-kn2zNKGsbql5i56VAgRYkpG+VazqHhQQZQycT2uXAazrAEDs23gy+Odkh5VblybjnwX2/BITkDtNmSO76hdIvQ==",
+ "dev": true
+ },
+ "@webassemblyjs/helper-api-error": {
+ "version": "1.7.8",
+ "resolved":
"https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.8.tgz",
+ "integrity":
"sha512-xUwxDXsd1dUKArJEP5wWM5zxgCSwZApSOJyP1XO7M8rNUChUDblcLQ4FpzTpWG2YeylMwMl1MlP5Ztryiz1x4g==",
+ "dev": true
+ },
+ "@webassemblyjs/helper-buffer": {
+ "version": "1.7.8",
+ "resolved":
"https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.8.tgz",
+ "integrity":
"sha512-WXiIMnuvuwlhWvVOm8xEXU9DnHaa3AgAU0ZPfvY8vO1cSsmYb2WbGbHnMLgs43vXnA7XAob9b56zuZaMkxpCBg==",
+ "dev": true
+ },
+ "@webassemblyjs/helper-code-frame": {
+ "version": "1.7.8",
+ "resolved":
"https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.8.tgz",
+ "integrity":
"sha512-TLQxyD9qGOIdX5LPQOPo0Ernd88U5rHkFb8WAjeMIeA0sPjCHeVPaGqUGGIXjUcblUkjuDAc07bruCcNHUrHDA==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/wast-printer": "1.7.8"
+ }
+ },
+ "@webassemblyjs/helper-fsm": {
+ "version": "1.7.8",
+ "resolved":
"https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.8.tgz",
+ "integrity":
"sha512-TjK0CnD8hAPkV5mbSp5aWl6SO1+H3WFcjWtixWoy8EMA99YnNzYhpc/WSYWhf7yrhpzkq5tZB0tvLK3Svr3IXA==",
+ "dev": true
+ },
+ "@webassemblyjs/helper-module-context": {
+ "version": "1.7.8",
+ "resolved":
"https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.8.tgz",
+ "integrity":
"sha512-uCutAKR7Nm0VsFixcvnB4HhAyHouNbj0Dx1p7eRjFjXGGZ+N7ftTaG1ZbWCasAEbtwGj54LP8+lkBZdTCPmLGg==",
+ "dev": true
+ },
+ "@webassemblyjs/helper-wasm-bytecode": {
+ "version": "1.7.8",
+ "resolved":
"https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.8.tgz",
+ "integrity":
"sha512-AdCCE3BMW6V34WYaKUmPgVHa88t2Z14P4/0LjLwuGkI0X6pf7nzp0CehzVVk51cKm2ymVXjl9dCG+gR1yhITIQ==",
+ "dev": true
+ },
+ "@webassemblyjs/helper-wasm-section": {
+ "version": "1.7.8",
+ "resolved":
"https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.8.tgz",
+ "integrity":
"sha512-BkBhYQuzyl4hgTGOKo87Vdw6f9nj8HhI7WYpI0MCC5qFa5ahrAPOGgyETVdnRbv+Rjukl9MxxfDmVcVC435lDg==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/ast": "1.7.8",
+ "@webassemblyjs/helper-buffer": "1.7.8",
+ "@webassemblyjs/helper-wasm-bytecode": "1.7.8",
+ "@webassemblyjs/wasm-gen": "1.7.8"
+ }
+ },
+ "@webassemblyjs/ieee754": {
+ "version": "1.7.8",
+ "resolved":
"https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.8.tgz",
+ "integrity":
"sha512-tOarWChdG1a3y1yqCX0JMDKzrat5tQe4pV6K/TX19BcXsBLYxFQOL1DEDa5KG9syeyvCrvZ+i1+Mv1ExngvktQ==",
+ "dev": true,
+ "requires": {
+ "@xtuc/ieee754": "^1.2.0"
+ }
+ },
+ "@webassemblyjs/leb128": {
+ "version": "1.7.8",
+ "resolved":
"https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.8.tgz",
+ "integrity":
"sha512-GCYeGPgUFWJiZuP4NICbcyUQNxNLJIf476Ei+K+jVuuebtLpfvwkvYT6iTUE7oZYehhkor4Zz2g7SJ/iZaPudQ==",
+ "dev": true,
+ "requires": {
+ "@xtuc/long": "4.2.1"
+ }
+ },
+ "@webassemblyjs/utf8": {
+ "version": "1.7.8",
+ "resolved":
"https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.8.tgz",
+ "integrity":
"sha512-9X+f0VV+xNXW2ujfIRSXBJENGE6Qh7bNVKqu3yDjTFB3ar3nsThsGBBKdTG58aXOm2iUH6v28VIf88ymPXODHA==",
+ "dev": true
+ },
+ "@webassemblyjs/wasm-edit": {
+ "version": "1.7.8",
+ "resolved":
"https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.8.tgz",
+ "integrity":
"sha512-6D3Hm2gFixrfyx9XjSON4ml1FZTugqpkIz5Awvrou8fnpyprVzcm4X8pyGRtA2Piixjl3DqmX/HB1xdWyE097A==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/ast": "1.7.8",
+ "@webassemblyjs/helper-buffer": "1.7.8",
+ "@webassemblyjs/helper-wasm-bytecode": "1.7.8",
+ "@webassemblyjs/helper-wasm-section": "1.7.8",
+ "@webassemblyjs/wasm-gen": "1.7.8",
+ "@webassemblyjs/wasm-opt": "1.7.8",
+ "@webassemblyjs/wasm-parser": "1.7.8",
+ "@webassemblyjs/wast-printer": "1.7.8"
+ }
+ },
+ "@webassemblyjs/wasm-gen": {
+ "version": "1.7.8",
+ "resolved":
"https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.8.tgz",
+ "integrity":
"sha512-a7O/wE6eBeVKKUYgpMK7NOHmMADD85rSXLe3CqrWRDwWff5y3cSVbzpN6Qv3z6C4hdkpq9qyij1Ga1kemOZGvQ==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/ast": "1.7.8",
+ "@webassemblyjs/helper-wasm-bytecode": "1.7.8",
+ "@webassemblyjs/ieee754": "1.7.8",
+ "@webassemblyjs/leb128": "1.7.8",
+ "@webassemblyjs/utf8": "1.7.8"
+ }
+ },
+ "@webassemblyjs/wasm-opt": {
+ "version": "1.7.8",
+ "resolved":
"https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.8.tgz",
+ "integrity":
"sha512-3lbQ0PT81NHCdi1sR/7+SNpZadM4qYcTSr62nFFAA7e5lFwJr14M1Gi+A/Y3PgcDWOHYjsaNGPpPU0H03N6Blg==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/ast": "1.7.8",
+ "@webassemblyjs/helper-buffer": "1.7.8",
+ "@webassemblyjs/wasm-gen": "1.7.8",
+ "@webassemblyjs/wasm-parser": "1.7.8"
+ }
+ },
+ "@webassemblyjs/wasm-parser": {
+ "version": "1.7.8",
+ "resolved":
"https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.8.tgz",
+ "integrity":
"sha512-rZ/zlhp9DHR/05zh1MbAjT2t624sjrPP/OkJCjXqzm7ynH+nIdNcn9Ixc+qzPMFXhIrk0rBoQ3to6sEIvHh9jQ==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/ast": "1.7.8",
+ "@webassemblyjs/helper-api-error": "1.7.8",
+ "@webassemblyjs/helper-wasm-bytecode": "1.7.8",
+ "@webassemblyjs/ieee754": "1.7.8",
+ "@webassemblyjs/leb128": "1.7.8",
+ "@webassemblyjs/utf8": "1.7.8"
+ }
+ },
+ "@webassemblyjs/wast-parser": {
+ "version": "1.7.8",
+ "resolved":
"https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.8.tgz",
+ "integrity":
"sha512-Q/zrvtUvzWuSiJMcSp90fi6gp2nraiHXjTV2VgAluVdVapM4gy1MQn7akja2p6eSBDQpKJPJ6P4TxRkghRS5dg==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/ast": "1.7.8",
+ "@webassemblyjs/floating-point-hex-parser": "1.7.8",
+ "@webassemblyjs/helper-api-error": "1.7.8",
+ "@webassemblyjs/helper-code-frame": "1.7.8",
+ "@webassemblyjs/helper-fsm": "1.7.8",
+ "@xtuc/long": "4.2.1"
+ }
+ },
+ "@webassemblyjs/wast-printer": {
+ "version": "1.7.8",
+ "resolved":
"https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.8.tgz",
+ "integrity":
"sha512-GllIthRtwTxRDAURRNXscu7Napzmdf1jt1gpiZiK/QN4fH0lSGs3OTmvdfsMNP7tqI4B3ZtfaaWRlNIQug6Xyg==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/ast": "1.7.8",
+ "@webassemblyjs/wast-parser": "1.7.8",
+ "@xtuc/long": "4.2.1"
+ }
+ },
+ "@xtuc/ieee754": {
+ "version": "1.2.0",
+ "resolved":
"https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+ "integrity":
"sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+ "dev": true
+ },
+ "@xtuc/long": {
+ "version": "4.2.1",
+ "resolved":
"https://registry.npmjs.org/@xtuc/long/-/long-4.2.1.tgz",
+ "integrity":
"sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g==",
+ "dev": true
+ },
+ "abbrev": {
+ "version": "1.1.1",
+ "resolved":
"https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+ "integrity":
"sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
+ },
+ "acorn": {
+ "version": "5.7.3",
+ "resolved":
"https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz",
+ "integrity":
"sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==",
+ "dev": true
+ },
+ "acorn-dynamic-import": {
+ "version": "3.0.0",
+ "resolved":
"https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz",
+ "integrity":
"sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==",
+ "dev": true,
+ "requires": {
+ "acorn": "^5.0.0"
+ }
+ },
+ "acorn-jsx": {
+ "version": "4.1.1",
+ "resolved":
"https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-4.1.1.tgz",
+ "integrity":
"sha512-JY+iV6r+cO21KtntVvFkD+iqjtdpRUpGqKWgfkCdZq1R+kbreEl8EcdcJR4SmiIgsIQT33s6QzheQ9a275Q8xw==",
+ "dev": true,
+ "requires": {
+ "acorn": "^5.0.3"
+ }
+ },
+ "ajv": {
+ "version": "6.5.4",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.4.tgz",
+ "integrity":
"sha512-4Wyjt8+t6YszqaXnLDfMmG/8AlO5Zbcsy3ATHncCzjW/NoPzAId8AK6749Ybjmdt+kUY1gP60fCu46oDxPv/mg==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^2.0.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ajv-errors": {
+ "version": "1.0.1",
+ "resolved":
"https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz",
+ "integrity":
"sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==",
+ "dev": true
+ },
+ "ajv-keywords": {
+ "version": "3.2.0",
+ "resolved":
"https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz",
+ "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=",
+ "dev": true
+ },
+ "amdefine": {
+ "version": "1.0.1",
+ "resolved":
"https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
+ "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU="
+ },
+ "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",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved":
"https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+ },
+ "anymatch": {
+ "version": "2.0.0",
+ "resolved":
"https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
+ "integrity":
"sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+ "dev": true,
+ "requires": {
+ "micromatch": "^3.1.4",
+ "normalize-path": "^2.1.1"
+ }
+ },
+ "aproba": {
+ "version": "1.2.0",
+ "resolved":
"https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
+ "integrity":
"sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
+ },
+ "are-we-there-yet": {
+ "version": "1.1.5",
+ "resolved":
"https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
+ "integrity":
"sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
+ "requires": {
+ "delegates": "^1.0.0",
+ "readable-stream": "^2.0.6"
+ }
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved":
"https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity":
"sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved":
"https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved":
"https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity":
"sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+ "dev": true
+ },
+ "arr-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-find-index": {
+ "version": "1.0.2",
+ "resolved":
"https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
+ "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E="
+ },
+ "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,
+ "requires": {
+ "define-properties": "^1.1.2",
+ "es-abstract": "^1.7.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.1"
+ }
+ },
+ "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.3.2",
+ "resolved":
"https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "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="
+ },
+ "asn1": {
+ "version": "0.2.4",
+ "resolved":
"https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
+ "integrity":
"sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
+ "requires": {
+ "safer-buffer": "~2.1.0"
+ }
+ },
+ "asn1.js": {
+ "version": "4.10.1",
+ "resolved":
"https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
+ "integrity":
"sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.0.0",
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0"
+ }
+ },
+ "assert": {
+ "version": "1.4.1",
+ "resolved":
"https://registry.npmjs.org/assert/-/assert-1.4.1.tgz",
+ "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=",
+ "dev": true,
+ "requires": {
+ "util": "0.10.3"
+ },
+ "dependencies": {
+ "inherits": {
+ "version": "2.0.1",
+ "resolved":
"https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
+ "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
+ "dev": true
+ },
+ "util": {
+ "version": "0.10.3",
+ "resolved":
"https://registry.npmjs.org/util/-/util-0.10.3.tgz",
+ "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.1"
+ }
+ }
+ }
+ },
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
+ },
+ "assign-symbols": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+ "dev": true
+ },
+ "async": {
+ "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.17.10"
+ }
+ },
+ "async-each": {
+ "version": "1.0.1",
+ "resolved":
"https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
+ "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
+ "dev": true
+ },
+ "async-foreach": {
+ "version": "0.1.3",
+ "resolved":
"https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz",
+ "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI="
+ },
+ "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="
+ },
+ "atob": {
+ "version": "2.1.2",
+ "resolved":
"https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
+ "integrity":
"sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
+ "dev": true
+ },
+ "audit-ci": {
+ "version": "1.7.0",
+ "resolved":
"https://registry.npmjs.org/audit-ci/-/audit-ci-1.7.0.tgz",
+ "integrity":
"sha512-KZipOhxTrLVmlEwaXLn5CSee4xkvvHsiNVWMkdOCawDPaCkK7t65DEzOU0N82OPQgc65PLOoL/BJR/s6hja2lw==",
+ "dev": true,
+ "requires": {
+ "byline": "^5.0.0",
+ "cross-spawn": "6.0.5",
+ "semver": "^6.0.0",
+ "yargs": "12.0.5"
+ },
+ "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
+ },
+ "camelcase": {
+ "version": "5.3.1",
+ "resolved":
"https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity":
"sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true
+ },
+ "cliui": {
+ "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",
+ "strip-ansi": "^4.0.0",
+ "wrap-ansi": "^2.0.0"
+ }
+ },
+ "cross-spawn": {
+ "version": "6.0.5",
+ "resolved":
"https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+ "integrity":
"sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+ "dev": true,
+ "requires": {
+ "nice-try": "^1.0.4",
+ "path-key": "^2.0.1",
+ "semver": "^5.5.0",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.7.0",
+ "resolved":
"https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
+ "integrity":
"sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
+ "dev": true
+ }
+ }
+ },
+ "execa": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
+ "integrity":
"sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^6.0.0",
+ "get-stream": "^4.0.0",
+ "is-stream": "^1.1.0",
+ "npm-run-path": "^2.0.0",
+ "p-finally": "^1.0.0",
+ "signal-exit": "^3.0.0",
+ "strip-eof": "^1.0.0"
+ }
+ },
+ "find-up": {
+ "version": "3.0.0",
+ "resolved":
"https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+ "integrity":
"sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^3.0.0"
+ }
+ },
+ "get-stream": {
+ "version": "4.1.0",
+ "resolved":
"https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
+ "integrity":
"sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+ "dev": true,
+ "requires": {
+ "pump": "^3.0.0"
+ }
+ },
+ "invert-kv": {
+ "version": "2.0.0",
+ "resolved":
"https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz",
+ "integrity":
"sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved":
"https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true
+ },
+ "lcid": {
+ "version": "2.0.0",
+ "resolved":
"https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz",
+ "integrity":
"sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==",
+ "dev": true,
+ "requires": {
+ "invert-kv": "^2.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "3.0.0",
+ "resolved":
"https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity":
"sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
+ }
+ },
+ "os-locale": {
+ "version": "3.1.0",
+ "resolved":
"https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz",
+ "integrity":
"sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==",
+ "dev": true,
+ "requires": {
+ "execa": "^1.0.0",
+ "lcid": "^2.0.0",
+ "mem": "^4.0.0"
+ }
+ },
+ "p-limit": {
+ "version": "2.2.0",
+ "resolved":
"https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz",
+ "integrity":
"sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==",
+ "dev": true,
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "3.0.0",
+ "resolved":
"https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity":
"sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^2.0.0"
+ }
+ },
+ "p-try": {
+ "version": "2.2.0",
+ "resolved":
"https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity":
"sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true
+ },
+ "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
+ },
+ "pump": {
+ "version": "3.0.0",
+ "resolved":
"https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+ "integrity":
"sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
+ "semver": {
+ "version": "6.1.1",
+ "resolved":
"https://registry.npmjs.org/semver/-/semver-6.1.1.tgz",
+ "integrity":
"sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==",
+ "dev": true
+ },
+ "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-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.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"
+ }
+ },
+ "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
+ },
+ "yargs": {
+ "version": "12.0.5",
+ "resolved":
"https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz",
+ "integrity":
"sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==",
+ "dev": true,
+ "requires": {
+ "cliui": "^4.0.0",
+ "decamelize": "^1.2.0",
+ "find-up": "^3.0.0",
+ "get-caller-file": "^1.0.1",
+ "os-locale": "^3.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 || ^4.0.0",
+ "yargs-parser": "^11.1.1"
+ }
+ },
+ "yargs-parser": {
+ "version": "11.1.1",
+ "resolved":
"https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz",
+ "integrity":
"sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==",
+ "dev": true,
+ "requires": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ }
+ }
+ }
+ },
+ "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="
+ },
+ "aws4": {
+ "version": "1.8.0",
+ "resolved":
"https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
+ "integrity":
"sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ=="
+ },
+ "babel-eslint": {
+ "version": "9.0.0",
+ "resolved":
"https://registry.npmjs.org/babel-eslint/-/babel-eslint-9.0.0.tgz",
+ "integrity":
"sha512-itv1MwE3TMbY0QtNfeL7wzak1mV47Uy+n6HtSOO4Xd7rvmO+tsGQSgyOEEgo6Y2vHZKZphaoelNeSVj4vkLA1g==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "@babel/parser": "^7.0.0",
+ "@babel/traverse": "^7.0.0",
+ "@babel/types": "^7.0.0",
+ "eslint-scope": "3.7.1",
+ "eslint-visitor-keys": "^1.0.0"
+ }
+ },
+ "babel-loader": {
+ "version": "8.0.4",
+ "resolved":
"https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.4.tgz",
+ "integrity":
"sha512-fhBhNkUToJcW9nV46v8w87AJOwAJDz84c1CL57n3Stj73FANM/b9TbCUK4YhdOwEyZ+OxhYpdeZDNzSI29Firw==",
+ "dev": true,
+ "requires": {
+ "find-cache-dir": "^1.0.0",
+ "loader-utils": "^1.0.2",
+ "mkdirp": "^0.5.1",
+ "util.promisify": "^1.0.0"
+ }
+ },
+ "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=",
+ "requires": {
+ "core-js": "^2.4.0",
+ "regenerator-runtime": "^0.11.0"
+ },
+ "dependencies": {
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved":
"https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity":
"sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
+ }
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
+ },
+ "base": {
+ "version": "0.11.2",
+ "resolved":
"https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity":
"sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "dev": true,
+ "requires": {
+ "cache-base": "^1.0.1",
+ "class-utils": "^0.3.5",
+ "component-emitter": "^1.2.1",
+ "define-property": "^1.0.0",
+ "isobject": "^3.0.1",
+ "mixin-deep": "^1.2.0",
+ "pascalcase": "^0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity":
"sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity":
"sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved":
"https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity":
"sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ }
+ }
+ },
+ "base64-js": {
+ "version": "1.3.0",
+ "resolved":
"https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz",
+ "integrity":
"sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==",
+ "dev": true
+ },
+ "bcrypt-pbkdf": {
+ "version": "1.0.2",
+ "resolved":
"https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+ "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
+ "requires": {
+ "tweetnacl": "^0.14.3"
+ }
+ },
+ "big.js": {
+ "version": "3.2.0",
+ "resolved":
"https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz",
+ "integrity":
"sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==",
+ "dev": true
+ },
+ "binary-extensions": {
+ "version": "1.12.0",
+ "resolved":
"https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz",
+ "integrity":
"sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==",
+ "dev": true
+ },
+ "block-stream": {
+ "version": "0.0.9",
+ "resolved":
"https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
+ "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
+ "requires": {
+ "inherits": "~2.0.0"
+ }
+ },
+ "bluebird": {
+ "version": "3.5.2",
+ "resolved":
"https://registry.npmjs.org/bluebird/-/bluebird-3.5.2.tgz",
+ "integrity":
"sha512-dhHTWMI7kMx5whMQntl7Vr9C6BvV10lFXDAasnqnrMYhXVCzzk6IO9Fo2L75jXHT07WrOngL1WDXOp+yYS91Yg==",
+ "dev": true
+ },
+ "bn.js": {
+ "version": "4.11.8",
+ "resolved":
"https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
+ "integrity":
"sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==",
+ "dev": true
+ },
+ "bootstrap": {
+ "version": "4.3.1",
+ "resolved":
"https://registry.npmjs.org/bootstrap/-/bootstrap-4.3.1.tgz",
+ "integrity":
"sha512-rXqOmH1VilAt2DyPzluTi2blhk17bO7ef+zLLPlWvG494pDxcM234pJ8wTc/6R40UWizAIIMgxjvxZg5kmsbag=="
+ },
+ "bootstrap-datepicker": {
+ "version": "1.9.0",
+ "resolved":
"https://registry.npmjs.org/bootstrap-datepicker/-/bootstrap-datepicker-1.9.0.tgz",
+ "integrity":
"sha512-9rYYbaVOheGYxjOr/+bJCmRPihfy+LkLSg4fIFMT9Od8WwWB/MB50w0JO1eBgKUMbb7PFHQD5uAfI3ArAxZRXA==",
+ "optional": true,
+ "requires": {
+ "jquery": ">=1.7.1 <4.0.0"
+ }
+ },
+ "bootstrap-sass": {
+ "version": "3.4.1",
+ "resolved":
"https://registry.npmjs.org/bootstrap-sass/-/bootstrap-sass-3.4.1.tgz",
+ "integrity":
"sha512-p5rxsK/IyEDQm2CwiHxxUi0MZZtvVFbhWmyMOt4lLkA4bujDA1TGoKT0i1FKIWiugAdP+kK8T5KMDFIKQCLYIA==",
+ "optional": true
+ },
+ "bootstrap-select": {
+ "version": "1.12.2",
+ "resolved":
"https://registry.npmjs.org/bootstrap-select/-/bootstrap-select-1.12.2.tgz",
+ "integrity": "sha1-WNCVs/1YSzFEOGb745tv3U5OEqQ=",
+ "optional": true,
+ "requires": {
+ "jquery": ">=1.8"
+ }
+ },
+ "bootstrap-slider": {
+ "version": "9.10.0",
+ "resolved":
"https://registry.npmjs.org/bootstrap-slider/-/bootstrap-slider-9.10.0.tgz",
+ "integrity": "sha1-EQPWvADPv6jPyaJZmrUYxVZD2j8=",
+ "optional": true
+ },
+ "bootstrap-slider-without-jquery": {
+ "version": "10.0.0",
+ "resolved":
"https://registry.npmjs.org/bootstrap-slider-without-jquery/-/bootstrap-slider-without-jquery-10.0.0.tgz",
+ "integrity":
"sha512-CB9CrpNVrIytlOoqHtRXhhxFo/jencr1U5cMqPBA0WmMdb13bzjHnXQVNGYde/g5gWW+RWiuT9jTquZuz3VE8A=="
+ },
+ "bootstrap-switch": {
+ "version": "3.3.5",
+ "resolved":
"https://registry.npmjs.org/bootstrap-switch/-/bootstrap-switch-3.3.5.tgz",
+ "integrity":
"sha512-aRwgTPO7QPvTtUxit2ucXgs/P+dp3Y8Qy41XOOqTXZiJvfI6b87+hP+r4B4+3y7bptu0P6KHIyEc4ordEVIVkg==",
+ "optional": true
+ },
+ "bootstrap-touchspin": {
+ "version": "3.1.1",
+ "resolved":
"https://registry.npmjs.org/bootstrap-touchspin/-/bootstrap-touchspin-3.1.1.tgz",
+ "integrity": "sha1-l3nerHKq9Xfl52K4USx0fIcdlZc=",
+ "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==",
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved":
"https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity":
"sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "^1.1.0",
+ "array-unique": "^0.3.2",
+ "extend-shallow": "^2.0.1",
+ "fill-range": "^4.0.0",
+ "isobject": "^3.0.1",
+ "repeat-element": "^1.1.2",
+ "snapdragon": "^0.8.1",
+ "snapdragon-node": "^2.0.1",
+ "split-string": "^3.0.2",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved":
"https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "breakjs": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/breakjs/-/breakjs-1.0.0.tgz",
+ "integrity": "sha1-7INToGhi60OWLergkHLuZqTNhFk="
+ },
+ "brorand": {
+ "version": "1.1.0",
+ "resolved":
"https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+ "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
+ "dev": true
+ },
+ "browserify-aes": {
+ "version": "1.2.0",
+ "resolved":
"http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
+ "integrity":
"sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
+ "dev": true,
+ "requires": {
+ "buffer-xor": "^1.0.3",
+ "cipher-base": "^1.0.0",
+ "create-hash": "^1.1.0",
+ "evp_bytestokey": "^1.0.3",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "browserify-cipher": {
+ "version": "1.0.1",
+ "resolved":
"https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
+ "integrity":
"sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
+ "dev": true,
+ "requires": {
+ "browserify-aes": "^1.0.4",
+ "browserify-des": "^1.0.0",
+ "evp_bytestokey": "^1.0.0"
+ }
+ },
+ "browserify-des": {
+ "version": "1.0.2",
+ "resolved":
"https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
+ "integrity":
"sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
+ "dev": true,
+ "requires": {
+ "cipher-base": "^1.0.1",
+ "des.js": "^1.0.0",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "browserify-rsa": {
+ "version": "4.0.1",
+ "resolved":
"http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
+ "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.1.0",
+ "randombytes": "^2.0.1"
+ }
+ },
+ "browserify-sign": {
+ "version": "4.0.4",
+ "resolved":
"https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz",
+ "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.1.1",
+ "browserify-rsa": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "create-hmac": "^1.1.2",
+ "elliptic": "^6.0.0",
+ "inherits": "^2.0.1",
+ "parse-asn1": "^5.0.0"
+ }
+ },
+ "browserify-zlib": {
+ "version": "0.2.0",
+ "resolved":
"https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
+ "integrity":
"sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
+ "dev": true,
+ "requires": {
+ "pako": "~1.0.5"
+ }
+ },
+ "browserslist": {
+ "version": "4.3.3",
+ "resolved":
"https://registry.npmjs.org/browserslist/-/browserslist-4.3.3.tgz",
+ "integrity":
"sha512-6h84UD1mmHeuQ9IucX6yzBc+KBYcBBTLYt2CXtY7GYCra6iE5kOm7oM+zuGw/0tjGtbJxjm58OvxSBmogEMCRQ==",
+ "dev": true,
+ "requires": {
+ "caniuse-lite": "^1.0.30000898",
+ "electron-to-chromium": "^1.3.81",
+ "node-releases": "^1.0.0-alpha.15"
+ }
+ },
+ "buffer": {
+ "version": "4.9.1",
+ "resolved":
"http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
+ "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
+ "dev": true,
+ "requires": {
+ "base64-js": "^1.0.2",
+ "ieee754": "^1.1.4",
+ "isarray": "^1.0.0"
+ }
+ },
+ "buffer-from": {
+ "version": "1.1.1",
+ "resolved":
"https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
+ "integrity":
"sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
+ "dev": true
+ },
+ "buffer-xor": {
+ "version": "1.0.3",
+ "resolved":
"https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
+ "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
+ "dev": true
+ },
+ "builtin-modules": {
+ "version": "1.1.1",
+ "resolved":
"https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8="
+ },
+ "builtin-status-codes": {
+ "version": "3.0.0",
+ "resolved":
"https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
+ "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
+ "dev": true
+ },
+ "byline": {
+ "version": "5.0.0",
+ "resolved":
"https://registry.npmjs.org/byline/-/byline-5.0.0.tgz",
+ "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=",
+ "dev": true
+ },
+ "c3": {
+ "version": "0.4.23",
+ "resolved": "https://registry.npmjs.org/c3/-/c3-0.4.23.tgz",
+ "integrity":
"sha512-fI6hbx1QoATU0gRQtPWsUGWX+ssXhxGH1ogew32KjVmGHFE4WmfmBkh+RkuHDoeCIoGFon7XTpKcwUZpBGW4mQ==",
+ "requires": {
+ "d3": "~3.5.0"
+ }
+ },
+ "cacache": {
+ "version": "10.0.4",
+ "resolved":
"https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz",
+ "integrity":
"sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==",
+ "dev": 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": {
+ "y18n": {
+ "version": "4.0.0",
+ "resolved":
"https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
+ "integrity":
"sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
+ "dev": true
+ }
+ }
+ },
+ "cache-base": {
+ "version": "1.0.1",
+ "resolved":
"https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity":
"sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "dev": true,
+ "requires": {
+ "collection-visit": "^1.0.0",
+ "component-emitter": "^1.2.1",
+ "get-value": "^2.0.6",
+ "has-value": "^1.0.0",
+ "isobject": "^3.0.1",
+ "set-value": "^2.0.0",
+ "to-object-path": "^0.3.0",
+ "union-value": "^1.0.0",
+ "unset-value": "^1.0.0"
+ }
+ },
+ "caller-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": "2.1.1",
+ "resolved":
"https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
+ "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8="
+ },
+ "camelcase-keys": {
+ "version": "2.1.0",
+ "resolved":
"https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
+ "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+ "requires": {
+ "camelcase": "^2.0.0",
+ "map-obj": "^1.0.0"
+ }
+ },
+ "caniuse-lite": {
+ "version": "1.0.30000898",
+ "resolved":
"https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000898.tgz",
+ "integrity":
"sha512-ytlTZqO4hYe4rNAJhMynUAIUI33jsP2Bb1two/9OVC39wZjPZ8exIO0eCLw5mqAtegOGiGF0kkTWTn3B02L+mw==",
+ "dev": true
+ },
+ "caseless": {
+ "version": "0.12.0",
+ "resolved":
"https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved":
"http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "requires": {
+ "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"
+ }
+ },
+ "change-emitter": {
+ "version": "0.1.6",
+ "resolved":
"https://registry.npmjs.org/change-emitter/-/change-emitter-0.1.6.tgz",
+ "integrity": "sha1-6LL+PX8at9aaMhma/5HqaTFAlRU="
+ },
+ "chardet": {
+ "version": "0.7.0",
+ "resolved":
"https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
+ "integrity":
"sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
+ "dev": true
+ },
+ "chokidar": {
+ "version": "2.0.4",
+ "resolved":
"https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz",
+ "integrity":
"sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==",
+ "dev": true,
+ "requires": {
+ "anymatch": "^2.0.0",
+ "async-each": "^1.0.0",
+ "braces": "^2.3.0",
+ "fsevents": "^1.2.2",
+ "glob-parent": "^3.1.0",
+ "inherits": "^2.0.1",
+ "is-binary-path": "^1.0.0",
+ "is-glob": "^4.0.0",
+ "lodash.debounce": "^4.0.8",
+ "normalize-path": "^2.1.1",
+ "path-is-absolute": "^1.0.0",
+ "readdirp": "^2.0.0",
+ "upath": "^1.0.5"
+ }
+ },
+ "chownr": {
+ "version": "1.1.1",
+ "resolved":
"https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz",
+ "integrity":
"sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==",
+ "dev": true
+ },
+ "chrome-remote-interface": {
+ "version": "0.25.7",
+ "resolved":
"https://registry.npmjs.org/chrome-remote-interface/-/chrome-remote-interface-0.25.7.tgz",
+ "integrity":
"sha512-6zI6LbR2IiGmduFZededaerEr9hHXabxT/L+fRrdq65a0CfyLMzpq0BKuZiqN0Upqcacsb6q2POj7fmobwBsEA==",
+ "dev": true,
+ "requires": {
+ "commander": "2.11.x",
+ "ws": "3.3.x"
+ }
+ },
+ "chrome-trace-event": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz",
+ "integrity":
"sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==",
+ "dev": true,
+ "requires": {
+ "tslib": "^1.9.0"
+ }
+ },
+ "cipher-base": {
+ "version": "1.0.4",
+ "resolved":
"https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
+ "integrity":
"sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "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
+ },
+ "class-utils": {
+ "version": "0.3.6",
+ "resolved":
"https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity":
"sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "dev": true,
+ "requires": {
+ "arr-union": "^3.1.0",
+ "define-property": "^0.2.5",
+ "isobject": "^3.0.0",
+ "static-extend": "^0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved":
"https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ }
+ }
+ },
+ "classnames": {
+ "version": "2.2.6",
+ "resolved":
"https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz",
+ "integrity":
"sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q=="
+ },
+ "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": {
+ "restore-cursor": "^2.0.0"
+ }
+ },
+ "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": "3.2.0",
+ "resolved":
"https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+ "requires": {
+ "string-width": "^1.0.1",
+ "strip-ansi": "^3.0.1",
+ "wrap-ansi": "^2.0.0"
+ }
+ },
+ "clone-deep": {
+ "version": "2.0.2",
+ "resolved":
"https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz",
+ "integrity":
"sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==",
+ "dev": true,
+ "requires": {
+ "for-own": "^1.0.0",
+ "is-plain-object": "^2.0.4",
+ "kind-of": "^6.0.0",
+ "shallow-clone": "^1.0.0"
+ }
+ },
+ "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="
+ },
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "dev": true,
+ "requires": {
+ "map-visit": "^1.0.0",
+ "object-visit": "^1.0.0"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved":
"https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity":
"sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved":
"https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "combined-stream": {
+ "version": "1.0.7",
+ "resolved":
"https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz",
+ "integrity":
"sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==",
+ "requires": {
+ "delayed-stream": "~1.0.0"
+ }
+ },
+ "commander": {
+ "version": "2.11.0",
+ "resolved":
"https://registry.npmjs.org/commander/-/commander-2.11.0.tgz",
+ "integrity":
"sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==",
+ "dev": true
+ },
+ "commondir": {
+ "version": "1.0.1",
+ "resolved":
"https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
+ "dev": true
+ },
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved":
"https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+ "dev": true
+ },
+ "compression-webpack-plugin": {
+ "version": "1.1.12",
+ "resolved":
"https://registry.npmjs.org/compression-webpack-plugin/-/compression-webpack-plugin-1.1.12.tgz",
+ "integrity":
"sha512-UpBXSHbrCSdSZieAffqXlAQpLO2fikVVRYibrWlbHYzKpOw1Y4jwkVZ/+S91GzWuJvXSbc8SBy/e8fQJh8uEMQ==",
+ "dev": true,
+ "requires": {
+ "cacache": "^10.0.1",
+ "find-cache-dir": "^1.0.0",
+ "neo-async": "^2.5.0",
+ "serialize-javascript": "^1.4.0",
+ "webpack-sources": "^1.0.1"
+ }
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved":
"https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+ },
+ "concat-stream": {
+ "version": "1.6.2",
+ "resolved":
"https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity":
"sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "dev": true,
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.2.2",
+ "typedarray": "^0.0.6"
+ }
+ },
+ "console-browserify": {
+ "version": "1.1.0",
+ "resolved":
"https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
+ "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
+ "dev": true,
+ "requires": {
+ "date-now": "^0.1.4"
+ }
+ },
+ "console-control-strings": {
+ "version": "1.1.0",
+ "resolved":
"https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+ "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
+ },
+ "constants-browserify": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
+ "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
+ "dev": true
+ },
+ "contains-path": {
+ "version": "0.1.0",
+ "resolved":
"https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz",
+ "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=",
+ "dev": true
+ },
+ "convert-source-map": {
+ "version": "1.6.0",
+ "resolved":
"https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz",
+ "integrity":
"sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.1"
+ }
+ },
+ "copy-concurrently": {
+ "version": "1.0.5",
+ "resolved":
"https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
+ "integrity":
"sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==",
+ "dev": true,
+ "requires": {
+ "aproba": "^1.1.1",
+ "fs-write-stream-atomic": "^1.0.8",
+ "iferr": "^0.1.5",
+ "mkdirp": "^0.5.1",
+ "rimraf": "^2.5.4",
+ "run-queue": "^1.0.0"
+ }
+ },
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved":
"https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+ "dev": true
+ },
+ "copy-webpack-plugin": {
+ "version": "4.5.4",
+ "resolved":
"https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.5.4.tgz",
+ "integrity":
"sha512-0lstlEyj74OAtYMrDxlNZsU7cwFijAI3Ofz2fD6Mpo9r4xCv4yegfa3uHIKvZY1NSuOtE9nvG6TAhJ+uz9gDaQ==",
+ "dev": true,
+ "requires": {
+ "cacache": "^10.0.4",
+ "find-cache-dir": "^1.0.0",
+ "globby": "^7.1.1",
+ "is-glob": "^4.0.0",
+ "loader-utils": "^1.1.0",
+ "minimatch": "^3.0.4",
+ "p-limit": "^1.0.0",
+ "serialize-javascript": "^1.4.0"
+ }
+ },
+ "core-js": {
+ "version": "2.6.0",
+ "resolved":
"https://registry.npmjs.org/core-js/-/core-js-2.6.0.tgz",
+ "integrity":
"sha512-kLRC6ncVpuEW/1kwrOXYX6KQASCVtrh1gQr/UiaVgFlf9WE5Vp+lNe5+h3LuMr5PAucWnnEXwH0nQHRH/gpGtw=="
+ },
+ "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="
+ },
+ "create-ecdh": {
+ "version": "4.0.3",
+ "resolved":
"https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
+ "integrity":
"sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.1.0",
+ "elliptic": "^6.0.0"
+ }
+ },
+ "create-hash": {
+ "version": "1.2.0",
+ "resolved":
"http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
+ "integrity":
"sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
+ "dev": true,
+ "requires": {
+ "cipher-base": "^1.0.1",
+ "inherits": "^2.0.1",
+ "md5.js": "^1.3.4",
+ "ripemd160": "^2.0.1",
+ "sha.js": "^2.4.0"
+ }
+ },
+ "create-hmac": {
+ "version": "1.1.7",
+ "resolved":
"http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
+ "integrity":
"sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
+ "dev": true,
+ "requires": {
+ "cipher-base": "^1.0.3",
+ "create-hash": "^1.1.0",
+ "inherits": "^2.0.1",
+ "ripemd160": "^2.0.0",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
+ }
+ },
+ "create-react-context": {
+ "version": "0.2.3",
+ "resolved":
"https://registry.npmjs.org/create-react-context/-/create-react-context-0.2.3.tgz",
+ "integrity":
"sha512-CQBmD0+QGgTaxDL3OX1IDXYqjkp2It4RIbcb99jS6AEg27Ga+a9G3JtK6SIu0HBwPLZlmwt9F7UwWA4Bn92Rag==",
+ "requires": {
+ "fbjs": "^0.8.0",
+ "gud": "^1.0.0"
+ }
+ },
+ "cross-spawn": {
+ "version": "3.0.1",
+ "resolved":
"https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz",
+ "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=",
+ "requires": {
+ "lru-cache": "^4.0.1",
+ "which": "^1.2.9"
+ }
+ },
+ "crypto-browserify": {
+ "version": "3.12.0",
+ "resolved":
"https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
+ "integrity":
"sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
+ "dev": true,
+ "requires": {
+ "browserify-cipher": "^1.0.0",
+ "browserify-sign": "^4.0.0",
+ "create-ecdh": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "create-hmac": "^1.1.0",
+ "diffie-hellman": "^5.0.0",
+ "inherits": "^2.0.1",
+ "pbkdf2": "^3.0.3",
+ "public-encrypt": "^4.0.0",
+ "randombytes": "^2.0.0",
+ "randomfill": "^1.0.3"
+ }
+ },
+ "css-element-queries": {
+ "version": "1.2.0",
+ "resolved":
"https://registry.npmjs.org/css-element-queries/-/css-element-queries-1.2.0.tgz",
+ "integrity":
"sha512-4gaxpioSFueMcp9yj1TJFCLjfooGv38y6ZdwFUS3GuS+9NIVijdeiExXKwSIHoQDADfpgnaYSTzmJs+bV+Hehg=="
+ },
+ "css-loader": {
+ "version": "2.1.1",
+ "resolved":
"https://registry.npmjs.org/css-loader/-/css-loader-2.1.1.tgz",
+ "integrity":
"sha512-OcKJU/lt232vl1P9EEDamhoO9iKY3tIjY5GU+XDLblAykTdgs6Ux9P1hTHve8nFKy5KPpOXOsVI/hIwi3841+w==",
+ "dev": true,
+ "requires": {
+ "camelcase": "^5.2.0",
+ "icss-utils": "^4.1.0",
+ "loader-utils": "^1.2.3",
+ "normalize-path": "^3.0.0",
+ "postcss": "^7.0.14",
+ "postcss-modules-extract-imports": "^2.0.0",
+ "postcss-modules-local-by-default": "^2.0.6",
+ "postcss-modules-scope": "^2.1.0",
+ "postcss-modules-values": "^2.0.0",
+ "postcss-value-parser": "^3.3.0",
+ "schema-utils": "^1.0.0"
+ },
+ "dependencies": {
+ "big.js": {
+ "version": "5.2.2",
+ "resolved":
"https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
+ "integrity":
"sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+ "dev": true
+ },
+ "camelcase": {
+ "version": "5.3.1",
+ "resolved":
"https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity":
"sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true
+ },
+ "json5": {
+ "version": "1.0.1",
+ "resolved":
"https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+ "integrity":
"sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.0"
+ }
+ },
+ "loader-utils": {
+ "version": "1.2.3",
+ "resolved":
"https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
+ "integrity":
"sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
+ "dev": true,
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^2.0.0",
+ "json5": "^1.0.1"
+ }
+ },
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved":
"https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity":
"sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true
+ },
+ "schema-utils": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+ "integrity":
"sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.1.0",
+ "ajv-errors": "^1.0.0",
+ "ajv-keywords": "^3.1.0"
+ }
+ }
+ }
+ },
+ "cssesc": {
+ "version": "3.0.0",
+ "resolved":
"https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity":
"sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "dev": true
+ },
+ "csstype": {
+ "version": "2.5.8",
+ "resolved":
"https://registry.npmjs.org/csstype/-/csstype-2.5.8.tgz",
+ "integrity":
"sha512-r4DbsyNJ7slwBSKoGesxDubRWJ71ghG8W2+1HcsDlAo12KGca9dDLv0u98tfdFw7ldBdoA7XmCnI6Q8LpAJXaQ=="
+ },
+ "currently-unhandled": {
+ "version": "0.4.1",
+ "resolved":
"https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
+ "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
+ "requires": {
+ "array-find-index": "^1.0.1"
+ }
+ },
+ "cyclist": {
+ "version": "0.2.2",
+ "resolved":
"https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz",
+ "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=",
+ "dev": true
+ },
+ "d3": {
+ "version": "3.5.17",
+ "resolved": "https://registry.npmjs.org/d3/-/d3-3.5.17.tgz",
+ "integrity": "sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g="
+ },
+ "dashdash": {
+ "version": "1.14.1",
+ "resolved":
"https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+ "requires": {
+ "assert-plus": "^1.0.0"
+ }
+ },
+ "datatables.net": {
+ "version": "1.10.19",
+ "resolved":
"https://registry.npmjs.org/datatables.net/-/datatables.net-1.10.19.tgz",
+ "integrity":
"sha512-+ljXcI6Pj3PTGy5pesp3E5Dr3x3AV45EZe0o1r0gKENN2gafBKXodVnk2ypKwl2tTmivjxbkiqoWnipTefyBTA==",
+ "requires": {
+ "jquery": ">=1.7"
+ }
+ },
+ "datatables.net-bs": {
+ "version": "2.1.1",
+ "resolved":
"https://registry.npmjs.org/datatables.net-bs/-/datatables.net-bs-2.1.1.tgz",
+ "integrity": "sha1-cEEIlyiRlJ0JS/RPU9BlTZ/ue84=",
+ "optional": true,
+ "requires": {
+ "datatables.net": ">=1.10.9",
+ "jquery": ">=1.7"
+ }
+ },
+ "datatables.net-colreorder": {
+ "version": "1.5.1",
+ "resolved":
"https://registry.npmjs.org/datatables.net-colreorder/-/datatables.net-colreorder-1.5.1.tgz",
+ "integrity":
"sha512-nKV0ZBOdOG+CCrtDZZlTOvhu9NC53pr4rYR8Xhd3KIKipLZohWWdBoOFGMu+VKDvllg2Xj79oS/wicYSiNyteA==",
+ "optional": true,
+ "requires": {
+ "datatables.net": "^1.10.15",
+ "jquery": ">=1.7"
+ }
+ },
+ "datatables.net-colreorder-bs": {
+ "version": "1.3.3",
+ "resolved":
"https://registry.npmjs.org/datatables.net-colreorder-bs/-/datatables.net-colreorder-bs-1.3.3.tgz",
+ "integrity": "sha1-Op3LCN7r612FQHlZHgbkk615OlM=",
+ "optional": true,
+ "requires": {
+ "datatables.net-bs": ">=1.10.9",
+ "datatables.net-colreorder": ">=1.2.0",
+ "jquery": ">=1.7"
+ }
+ },
+ "datatables.net-select": {
+ "version": "1.2.7",
+ "resolved":
"https://registry.npmjs.org/datatables.net-select/-/datatables.net-select-1.2.7.tgz",
+ "integrity":
"sha512-C3XDi7wpruGjDXV36dc9hN/FrAX9GOFvBZ7+KfKJTBNkGFbbhdzHS91SMeGiwRXPYivAyxfPTcVVndVaO83uBQ==",
+ "optional": true,
+ "requires": {
+ "datatables.net": "^1.10.15",
+ "jquery": ">=1.7"
+ }
+ },
+ "date-now": {
+ "version": "0.1.4",
+ "resolved":
"https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
+ "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=",
+ "dev": true
+ },
+ "debug": {
+ "version": "3.2.6",
+ "resolved":
"https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+ "integrity":
"sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved":
"https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
+ },
+ "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
+ },
+ "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
+ },
+ "define-properties": {
+ "version": "1.1.3",
+ "resolved":
"https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+ "integrity":
"sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+ "dev": true,
+ "requires": {
+ "object-keys": "^1.0.12"
+ }
+ },
+ "define-property": {
+ "version": "2.0.2",
+ "resolved":
"https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity":
"sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.2",
+ "isobject": "^3.0.1"
+ },
+ "dependencies": {
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity":
"sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity":
"sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved":
"https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity":
"sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ }
+ }
+ },
+ "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.0",
+ "object-assign": "^4.0.1",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0",
+ "rimraf": "^2.2.8"
+ },
+ "dependencies": {
+ "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.1",
+ "arrify": "^1.0.0",
+ "glob": "^7.0.3",
+ "object-assign": "^4.0.1",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
+ }
+ }
+ }
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
+ },
+ "delegates": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+ "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
+ },
+ "des.js": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz",
+ "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0"
+ }
+ },
+ "diffie-hellman": {
+ "version": "5.0.3",
+ "resolved":
"http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
+ "integrity":
"sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.1.0",
+ "miller-rabin": "^4.0.0",
+ "randombytes": "^2.0.0"
+ }
+ },
+ "dir-glob": {
+ "version": "2.0.0",
+ "resolved":
"https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz",
+ "integrity":
"sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==",
+ "dev": true,
+ "requires": {
+ "arrify": "^1.0.1",
+ "path-type": "^3.0.0"
+ },
+ "dependencies": {
+ "path-type": {
+ "version": "3.0.0",
+ "resolved":
"https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
+ "integrity":
"sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
+ "dev": true,
+ "requires": {
+ "pify": "^3.0.0"
+ }
+ },
+ "pify": {
+ "version": "3.0.0",
+ "resolved":
"https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "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"
+ }
+ },
+ "dom-helpers": {
+ "version": "3.4.0",
+ "resolved":
"https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz",
+ "integrity":
"sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==",
+ "requires": {
+ "@babel/runtime": "^7.1.2"
+ }
+ },
+ "domain-browser": {
+ "version": "1.2.0",
+ "resolved":
"https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
+ "integrity":
"sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
+ "dev": true
+ },
+ "drmonty-datatables-colvis": {
+ "version": "1.1.2",
+ "resolved":
"https://registry.npmjs.org/drmonty-datatables-colvis/-/drmonty-datatables-colvis-1.1.2.tgz",
+ "integrity": "sha1-lque37SGQ8wu3aP4e4iTPN7oEnw=",
+ "optional": true,
+ "requires": {
+ "jquery": ">=1.7.0"
+ }
+ },
+ "duplexify": {
+ "version": "3.6.1",
+ "resolved":
"https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz",
+ "integrity":
"sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "^1.0.0",
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.0.0",
+ "stream-shift": "^1.0.0"
+ }
+ },
+ "ecc-jsbn": {
+ "version": "0.1.2",
+ "resolved":
"https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+ "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
+ "requires": {
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.1.0"
+ }
+ },
+ "electron-to-chromium": {
+ "version": "1.3.81",
+ "resolved":
"https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.81.tgz",
+ "integrity":
"sha512-+rym2xtzwPWmoi8AYRrCdW65QOT0vfUHjZb5mjgh0VLyj31pGM3CpP3znKhQNBzQaWujR/KEl/mfC2lnKYgADA==",
+ "dev": true
+ },
+ "elliptic": {
+ "version": "6.4.1",
+ "resolved":
"https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz",
+ "integrity":
"sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.4.0",
+ "brorand": "^1.0.1",
+ "hash.js": "^1.0.0",
+ "hmac-drbg": "^1.0.0",
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0",
+ "minimalistic-crypto-utils": "^1.0.0"
+ }
+ },
+ "emojis-list": {
+ "version": "2.1.0",
+ "resolved":
"https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
+ "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
+ "dev": true
+ },
+ "encoding": {
+ "version": "0.1.12",
+ "resolved":
"https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
+ "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
+ "requires": {
+ "iconv-lite": "~0.4.13"
+ }
+ },
+ "end-of-stream": {
+ "version": "1.4.1",
+ "resolved":
"https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
+ "integrity":
"sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
+ "dev": true,
+ "requires": {
+ "once": "^1.4.0"
+ }
+ },
+ "enhanced-resolve": {
+ "version": "4.1.0",
+ "resolved":
"https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz",
+ "integrity":
"sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "memory-fs": "^0.4.0",
+ "tapable": "^1.0.0"
+ }
+ },
+ "eonasdan-bootstrap-datetimepicker": {
+ "version": "4.17.47",
+ "resolved":
"https://registry.npmjs.org/eonasdan-bootstrap-datetimepicker/-/eonasdan-bootstrap-datetimepicker-4.17.47.tgz",
+ "integrity": "sha1-ekmXAEQGUnbnll79Fvgic1IZ5zU=",
+ "optional": true,
+ "requires": {
+ "bootstrap": "^3.3",
+ "jquery": "^1.8.3 || ^2.0 || ^3.0",
+ "moment": "^2.10",
+ "moment-timezone": "^0.4.0"
+ },
+ "dependencies": {
+ "bootstrap": {
+ "version": "3.4.1",
+ "resolved":
"https://registry.npmjs.org/bootstrap/-/bootstrap-3.4.1.tgz",
+ "integrity":
"sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA==",
+ "optional": true
+ }
+ }
+ },
+ "errno": {
+ "version": "0.1.7",
+ "resolved":
"https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
+ "integrity":
"sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
+ "dev": true,
+ "requires": {
+ "prr": "~1.0.1"
+ }
+ },
+ "error-ex": {
+ "version": "1.3.2",
+ "resolved":
"https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity":
"sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "requires": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "es-abstract": {
+ "version": "1.12.0",
+ "resolved":
"https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz",
+ "integrity":
"sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==",
+ "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.2.0",
+ "resolved":
"https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz",
+ "integrity":
"sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==",
+ "dev": true,
+ "requires": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ }
+ },
+ "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="
+ },
+ "eslint": {
+ "version": "5.7.0",
+ "resolved":
"https://registry.npmjs.org/eslint/-/eslint-5.7.0.tgz",
+ "integrity":
"sha512-zYCeFQahsxffGl87U2aJ7DPyH8CbWgxBC213Y8+TCanhUTf2gEvfq3EKpHmEcozTLyPmGe9LZdMAwC/CpJBM5A==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "ajv": "^6.5.3",
+ "chalk": "^2.1.0",
+ "cross-spawn": "^6.0.5",
+ "debug": "^4.0.1",
+ "doctrine": "^2.1.0",
+ "eslint-scope": "^4.0.0",
+ "eslint-utils": "^1.3.1",
+ "eslint-visitor-keys": "^1.0.0",
+ "espree": "^4.0.0",
+ "esquery": "^1.0.1",
+ "esutils": "^2.0.2",
+ "file-entry-cache": "^2.0.0",
+ "functional-red-black-tree": "^1.0.1",
+ "glob": "^7.1.2",
+ "globals": "^11.7.0",
+ "ignore": "^4.0.6",
+ "imurmurhash": "^0.1.4",
+ "inquirer": "^6.1.0",
+ "is-resolvable": "^1.1.0",
+ "js-yaml": "^3.12.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": "^2.0.1",
+ "require-uncached": "^1.0.3",
+ "semver": "^5.5.1",
+ "strip-ansi": "^4.0.0",
+ "strip-json-comments": "^2.0.1",
+ "table": "^5.0.2",
+ "text-table": "^0.2.0"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "6.5.4",
+ "resolved":
"https://registry.npmjs.org/ajv/-/ajv-6.5.4.tgz",
+ "integrity":
"sha512-4Wyjt8+t6YszqaXnLDfMmG/8AlO5Zbcsy3ATHncCzjW/NoPzAId8AK6749Ybjmdt+kUY1gP60fCu46oDxPv/mg==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^2.0.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "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.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved":
"https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity":
"sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "cross-spawn": {
+ "version": "6.0.5",
+ "resolved":
"https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+ "integrity":
"sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+ "dev": true,
+ "requires": {
+ "nice-try": "^1.0.4",
+ "path-key": "^2.0.1",
+ "semver": "^5.5.0",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
+ }
+ },
+ "debug": {
+ "version": "4.1.0",
+ "resolved":
"https://registry.npmjs.org/debug/-/debug-4.1.0.tgz",
+ "integrity":
"sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "eslint-scope": {
+ "version": "4.0.0",
+ "resolved":
"https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz",
+ "integrity":
"sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==",
+ "dev": true,
+ "requires": {
+ "esrecurse": "^4.1.0",
+ "estraverse": "^4.1.1"
+ }
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved":
"https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity":
"sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true
+ },
+ "fast-deep-equal": {
+ "version": "2.0.1",
+ "resolved":
"https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
+ "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
+ "dev": true
+ },
+ "ignore": {
+ "version": "4.0.6",
+ "resolved":
"https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+ "integrity":
"sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.13.1",
+ "resolved":
"https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
+ "integrity":
"sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved":
"https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity":
"sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "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.5.0",
+ "resolved":
"https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity":
"sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "eslint-config-standard": {
+ "version": "11.0.0",
+ "resolved":
"http://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-11.0.0.tgz",
+ "integrity":
"sha512-oDdENzpViEe5fwuRCWla7AXQd++/oyIp8zP+iP9jiUPG6NBj3SHgdgtl/kTn00AjeN+1HNvavTKmYbMo+xMOlw==",
+ "dev": true
+ },
+ "eslint-config-standard-jsx": {
+ "version": "5.0.0",
+ "resolved":
"http://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-5.0.0.tgz",
+ "integrity":
"sha512-rLToPAEqLMPBfWnYTu6xRhm2OWziS2n40QFqJ8jAM8NSVzeVKTa3nclhsU4DpPJQRY60F34Oo1wi/71PN/eITg==",
+ "dev": true
+ },
+ "eslint-config-standard-react": {
+ "version": "6.0.0",
+ "resolved":
"http://registry.npmjs.org/eslint-config-standard-react/-/eslint-config-standard-react-6.0.0.tgz",
+ "integrity":
"sha512-YWlqfvREbH1r6SaRTgFOq+VE3f8/ZQypkfnpDpSmZjztEjxnzznm4xeE2/mDQRx77Okhd/pKHXNZLMsSneJH8A==",
+ "dev": true,
+ "requires": {
+ "eslint-config-standard-jsx": "^5.0.0"
+ }
+ },
+ "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.5.0"
+ },
+ "dependencies": {
+ "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"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved":
"https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ }
+ }
+ },
+ "eslint-loader": {
+ "version": "2.1.1",
+ "resolved":
"https://registry.npmjs.org/eslint-loader/-/eslint-loader-2.1.1.tgz",
+ "integrity":
"sha512-1GrJFfSevQdYpoDzx8mEE2TDWsb/zmFuY09l6hURg1AeFIKQOvZ+vH0UPjzmd1CZIbfTV5HUkMeBmFiDBkgIsQ==",
+ "dev": true,
+ "requires": {
+ "loader-fs-cache": "^1.0.0",
+ "loader-utils": "^1.0.2",
+ "object-assign": "^4.0.1",
+ "object-hash": "^1.1.4",
+ "rimraf": "^2.6.1"
+ }
+ },
+ "eslint-module-utils": {
+ "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.8",
+ "pkg-dir": "^1.0.0"
+ },
+ "dependencies": {
+ "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"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved":
"https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "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.0.0"
+ }
+ }
+ }
+ },
+ "eslint-plugin-es": {
+ "version": "1.3.1",
+ "resolved":
"https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-1.3.1.tgz",
+ "integrity":
"sha512-9XcVyZiQRVeFjqHw8qHNDAZcQLqaHlOGGpeYqzYh8S4JYCWTCO3yzyen8yVmA5PratfzTRWDwCOFphtDEG+w/w==",
+ "dev": true,
+ "requires": {
+ "eslint-utils": "^1.3.0",
+ "regexpp": "^2.0.0"
+ }
+ },
+ "eslint-plugin-flowtype": {
+ "version": "2.50.3",
+ "resolved":
"https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.50.3.tgz",
+ "integrity":
"sha512-X+AoKVOr7Re0ko/yEXyM5SSZ0tazc6ffdIOocp2fFUlWoDt7DV0Bz99mngOkAFLOAWjqRA5jPwqUCbrx13XoxQ==",
+ "dev": true,
+ "requires": {
+ "lodash": "^4.17.10"
+ }
+ },
+ "eslint-plugin-import": {
+ "version": "2.14.0",
+ "resolved":
"https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz",
+ "integrity":
"sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g==",
+ "dev": true,
+ "requires": {
+ "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"
+ },
+ "dependencies": {
+ "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"
+ }
+ },
+ "doctrine": {
+ "version": "1.5.0",
+ "resolved":
"https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
+ "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2",
+ "isarray": "^1.0.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"
+ }
+ },
+ "load-json-file": {
+ "version": "2.0.0",
+ "resolved":
"http://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.2",
+ "parse-json": "^2.2.0",
+ "pify": "^2.0.0",
+ "strip-bom": "^3.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved":
"https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "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.0.0"
+ }
+ },
+ "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.3.2",
+ "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.0.0",
+ "read-pkg": "^2.0.0"
+ }
+ },
+ "strip-bom": {
+ "version": "3.0.0",
+ "resolved":
"https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+ "dev": true
+ }
+ }
+ },
+ "eslint-plugin-node": {
+ "version": "7.0.1",
+ "resolved":
"https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-7.0.1.tgz",
+ "integrity":
"sha512-lfVw3TEqThwq0j2Ba/Ckn2ABdwmL5dkOgAux1rvOk6CO7A6yGyPI2+zIxN6FyNkp1X1X/BSvKOceD6mBWSj4Yw==",
+ "dev": true,
+ "requires": {
+ "eslint-plugin-es": "^1.3.1",
+ "eslint-utils": "^1.3.1",
+ "ignore": "^4.0.2",
+ "minimatch": "^3.0.4",
+ "resolve": "^1.8.1",
+ "semver": "^5.5.0"
+ },
+ "dependencies": {
+ "ignore": {
+ "version": "4.0.6",
+ "resolved":
"https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+ "integrity":
"sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-plugin-promise": {
+ "version": "4.0.1",
+ "resolved":
"https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.0.1.tgz",
+ "integrity":
"sha512-Si16O0+Hqz1gDHsys6RtFRrW7cCTB6P7p3OJmKp3Y3dxpQE2qwOA7d3xnV+0mBmrPoi0RBnxlCKvqu70te6wjg==",
+ "dev": true
+ },
+ "eslint-plugin-react": {
+ "version": "7.11.1",
+ "resolved":
"https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.11.1.tgz",
+ "integrity":
"sha512-cVVyMadRyW7qsIUh3FHp3u6QHNhOgVrLQYdQEB1bPWBsgbNCHdFAeNMquBMCcZJu59eNthX053L70l7gRt4SCw==",
+ "dev": true,
+ "requires": {
+ "array-includes": "^3.0.3",
+ "doctrine": "^2.1.0",
+ "has": "^1.0.3",
+ "jsx-ast-utils": "^2.0.1",
+ "prop-types": "^15.6.2"
+ }
+ },
+ "eslint-plugin-standard": {
+ "version": "3.1.0",
+ "resolved":
"https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-3.1.0.tgz",
+ "integrity":
"sha512-fVcdyuKRr0EZ4fjWl3c+gp1BANFJD1+RaWa2UPYfMZ6jCtp5RG00kSaXnK/dE5sYzt4kaWJ9qdxqUfc0d9kX0w==",
+ "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.1.0",
+ "estraverse": "^4.1.1"
+ }
+ },
+ "eslint-utils": {
+ "version": "1.3.1",
+ "resolved":
"https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz",
+ "integrity":
"sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==",
+ "dev": true
+ },
+ "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": "4.0.0",
+ "resolved":
"https://registry.npmjs.org/espree/-/espree-4.0.0.tgz",
+ "integrity":
"sha512-kapdTCt1bjmspxStVKX6huolXVV5ZfyZguY1lcfhVVZstce3bqxH9mcLzNn3/mlgW6wQ732+0fuG9v7h0ZQoKg==",
+ "dev": true,
+ "requires": {
+ "acorn": "^5.6.0",
+ "acorn-jsx": "^4.1.1"
+ }
+ },
+ "esquery": {
+ "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"
+ }
+ },
+ "esrecurse": {
+ "version": "4.2.1",
+ "resolved":
"https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
+ "integrity":
"sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^4.1.0"
+ }
+ },
+ "estraverse": {
+ "version": "4.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
+ },
+ "events": {
+ "version": "1.1.1",
+ "resolved":
"http://registry.npmjs.org/events/-/events-1.1.1.tgz",
+ "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=",
+ "dev": true
+ },
+ "evp_bytestokey": {
+ "version": "1.0.3",
+ "resolved":
"https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
+ "integrity":
"sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
+ "dev": true,
+ "requires": {
+ "md5.js": "^1.3.4",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "execa": {
+ "version": "0.10.0",
+ "resolved":
"https://registry.npmjs.org/execa/-/execa-0.10.0.tgz",
+ "integrity":
"sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^6.0.0",
+ "get-stream": "^3.0.0",
+ "is-stream": "^1.1.0",
+ "npm-run-path": "^2.0.0",
+ "p-finally": "^1.0.0",
+ "signal-exit": "^3.0.0",
+ "strip-eof": "^1.0.0"
+ },
+ "dependencies": {
+ "cross-spawn": {
+ "version": "6.0.5",
+ "resolved":
"https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+ "integrity":
"sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+ "dev": true,
+ "requires": {
+ "nice-try": "^1.0.4",
+ "path-key": "^2.0.1",
+ "semver": "^5.5.0",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
+ }
+ }
+ }
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved":
"https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "debug": "^2.3.3",
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "posix-character-classes": "^0.1.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "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"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved":
"https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved":
"https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved":
"https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ }
+ }
+ },
+ "extend": {
+ "version": "3.0.2",
+ "resolved":
"https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity":
"sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
+ },
+ "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": "3.0.3",
+ "resolved":
"https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz",
+ "integrity":
"sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==",
+ "dev": true,
+ "requires": {
+ "chardet": "^0.7.0",
+ "iconv-lite": "^0.4.24",
+ "tmp": "^0.0.33"
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved":
"https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity":
"sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "^0.3.2",
+ "define-property": "^1.0.0",
+ "expand-brackets": "^2.1.4",
+ "extend-shallow": "^2.0.1",
+ "fragment-cache": "^0.2.1",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved":
"https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity":
"sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity":
"sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved":
"https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity":
"sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ }
+ }
+ },
+ "extract-text-webpack-plugin": {
+ "version": "4.0.0-beta.0",
+ "resolved":
"https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-4.0.0-beta.0.tgz",
+ "integrity":
"sha512-Hypkn9jUTnFr0DpekNam53X47tXn3ucY08BQumv7kdGgeVUBLq3DJHJTi6HNxv4jl9W+Skxjz9+RnK0sJyqqjA==",
+ "dev": true,
+ "requires": {
+ "async": "^2.4.1",
+ "loader-utils": "^1.1.0",
+ "schema-utils": "^0.4.5",
+ "webpack-sources": "^1.1.0"
+ }
+ },
+ "extsprintf": {
+ "version": "1.3.0",
+ "resolved":
"https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
+ },
+ "fast-deep-equal": {
+ "version": "2.0.1",
+ "resolved":
"https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
+ "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk="
+ },
+ "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="
+ },
+ "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
+ },
+ "fbjs": {
+ "version": "0.8.17",
+ "resolved":
"https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz",
+ "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=",
+ "requires": {
+ "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.18"
+ },
+ "dependencies": {
+ "core-js": {
+ "version": "1.2.7",
+ "resolved":
"http://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz",
+ "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY="
+ }
+ }
+ },
+ "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.2.1",
+ "object-assign": "^4.0.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.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved":
"https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "find-cache-dir": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz",
+ "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=",
+ "dev": true,
+ "requires": {
+ "commondir": "^1.0.1",
+ "make-dir": "^1.0.0",
+ "pkg-dir": "^2.0.0"
+ }
+ },
+ "find-up": {
+ "version": "1.1.2",
+ "resolved":
"https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+ "requires": {
+ "path-exists": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
+ }
+ },
+ "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.1",
+ "del": "^2.0.2",
+ "graceful-fs": "^4.1.2",
+ "write": "^0.2.1"
+ }
+ },
+ "flush-write-stream": {
+ "version": "1.0.3",
+ "resolved":
"https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz",
+ "integrity":
"sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.0.4"
+ }
+ },
+ "font-awesome": {
+ "version": "4.7.0",
+ "resolved":
"https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz",
+ "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM="
+ },
+ "font-awesome-sass": {
+ "version": "4.7.0",
+ "resolved":
"https://registry.npmjs.org/font-awesome-sass/-/font-awesome-sass-4.7.0.tgz",
+ "integrity": "sha1-TtppPpFQCc4Asijglk3F7Km8NOE=",
+ "optional": true
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved":
"https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+ "dev": true
+ },
+ "for-own": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
+ "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
+ "dev": true,
+ "requires": {
+ "for-in": "^1.0.1"
+ }
+ },
+ "forever-agent": {
+ "version": "0.6.1",
+ "resolved":
"https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
+ },
+ "form-data": {
+ "version": "2.3.3",
+ "resolved":
"https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+ "integrity":
"sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.6",
+ "mime-types": "^2.1.12"
+ }
+ },
+ "fragment-cache": {
+ "version": "0.2.1",
+ "resolved":
"https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "dev": true,
+ "requires": {
+ "map-cache": "^0.2.2"
+ }
+ },
+ "from2": {
+ "version": "2.3.0",
+ "resolved":
"https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
+ "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.0.0"
+ }
+ },
+ "fs-write-stream-atomic": {
+ "version": "1.0.10",
+ "resolved":
"https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz",
+ "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "iferr": "^0.1.5",
+ "imurmurhash": "^0.1.4",
+ "readable-stream": "1 || 2"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+ },
+ "fsevents": {
+ "version": "1.2.9",
+ "resolved":
"https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz",
+ "integrity":
"sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "nan": "^2.12.1",
+ "node-pre-gyp": "^0.12.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.5",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "delegates": "^1.0.0",
+ "readable-stream": "^2.0.6"
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "chownr": {
+ "version": "1.1.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": "4.1.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "deep-extend": {
+ "version": "0.6.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "delegates": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "detect-libc": {
+ "version": "1.0.3",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "fs-minipass": {
+ "version": "1.2.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.3",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "has-unicode": {
+ "version": "2.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "iconv-lite": {
+ "version": "0.4.24",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ }
+ },
+ "ignore-walk": {
+ "version": "3.0.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.3.5",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "safe-buffer": "^5.1.2",
+ "yallist": "^3.0.0"
+ }
+ },
+ "minizlib": {
+ "version": "1.2.1",
+ "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.1.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "nan": {
+ "version": "2.14.0",
+ "resolved":
"https://registry.npmjs.org/nan/-/nan-2.14.0.tgz",
+ "integrity":
"sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==",
+ "dev": true,
+ "optional": true
+ },
+ "needle": {
+ "version": "2.3.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "debug": "^4.1.0",
+ "iconv-lite": "^0.4.4",
+ "sax": "^1.2.4"
+ }
+ },
+ "node-pre-gyp": {
+ "version": "0.12.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "detect-libc": "^1.0.2",
+ "mkdirp": "^0.5.1",
+ "needle": "^2.2.1",
+ "nopt": "^4.0.1",
+ "npm-packlist": "^1.1.6",
+ "npmlog": "^4.0.2",
+ "rc": "^1.2.7",
+ "rimraf": "^2.6.1",
+ "semver": "^5.3.0",
+ "tar": "^4"
+ }
+ },
+ "nopt": {
+ "version": "4.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "abbrev": "1",
+ "osenv": "^0.1.4"
+ }
+ },
+ "npm-bundled": {
+ "version": "1.0.6",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "npm-packlist": {
+ "version": "1.4.1",
+ "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.8",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "deep-extend": "^0.6.0",
+ "ini": "~1.3.0",
+ "minimist": "^1.2.0",
+ "strip-json-comments": "~2.0.1"
+ },
+ "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.3",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "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.7.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.8",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "chownr": "^1.1.1",
+ "fs-minipass": "^1.2.5",
+ "minipass": "^2.3.4",
+ "minizlib": "^1.1.1",
+ "mkdirp": "^0.5.0",
+ "safe-buffer": "^5.1.2",
+ "yallist": "^3.0.2"
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "wide-align": {
+ "version": "1.1.3",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "string-width": "^1.0.2 || 2"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true
+ },
+ "yallist": {
+ "version": "3.0.3",
+ "bundled": true,
+ "dev": true
+ }
+ }
+ },
+ "fstream": {
+ "version": "1.0.12",
+ "resolved":
"https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz",
+ "integrity":
"sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==",
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "inherits": "~2.0.0",
+ "mkdirp": ">=0.5 0",
+ "rimraf": "2"
+ }
+ },
+ "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
+ },
+ "gauge": {
+ "version": "2.7.4",
+ "resolved":
"https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
+ "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
+ "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"
+ }
+ },
+ "gaze": {
+ "version": "1.1.3",
+ "resolved":
"https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz",
+ "integrity":
"sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==",
+ "requires": {
+ "globule": "^1.0.0"
+ }
+ },
+ "get-caller-file": {
+ "version": "1.0.3",
+ "resolved":
"https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
+ "integrity":
"sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w=="
+ },
+ "get-stdin": {
+ "version": "4.0.1",
+ "resolved":
"https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
+ "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4="
+ },
+ "get-stream": {
+ "version": "3.0.0",
+ "resolved":
"http://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=",
+ "requires": {
+ "assert-plus": "^1.0.0"
+ }
+ },
+ "glob": {
+ "version": "7.1.3",
+ "resolved":
"https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
+ "integrity":
"sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved":
"https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "dev": true,
+ "requires": {
+ "is-glob": "^3.1.0",
+ "path-dirname": "^1.0.0"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved":
"https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.0"
+ }
+ }
+ }
+ },
+ "global-modules-path": {
+ "version": "2.3.0",
+ "resolved":
"https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.3.0.tgz",
+ "integrity":
"sha512-HchvMJNYh9dGSCy8pOQ2O8u/hoXaL+0XhnrwH0RyLiSXMMTl9W3N6KUU73+JFOg5PGjtzl6VZzUQsnrpm7Szag==",
+ "dev": true
+ },
+ "globals": {
+ "version": "11.8.0",
+ "resolved":
"https://registry.npmjs.org/globals/-/globals-11.8.0.tgz",
+ "integrity":
"sha512-io6LkyPVuzCHBSQV9fmOwxZkUk6nIaGmxheLDgmuFv89j0fm2aqDbIXKAGfzCMHqz3HLF2Zf8WSG6VqMh2qFmA==",
+ "dev": true
+ },
+ "globby": {
+ "version": "7.1.1",
+ "resolved":
"https://registry.npmjs.org/globby/-/globby-7.1.1.tgz",
+ "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=",
+ "dev": true,
+ "requires": {
+ "array-union": "^1.0.1",
+ "dir-glob": "^2.0.0",
+ "glob": "^7.1.2",
+ "ignore": "^3.3.5",
+ "pify": "^3.0.0",
+ "slash": "^1.0.0"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "3.0.0",
+ "resolved":
"https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "dev": true
+ }
+ }
+ },
+ "globule": {
+ "version": "1.2.1",
+ "resolved":
"https://registry.npmjs.org/globule/-/globule-1.2.1.tgz",
+ "integrity":
"sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==",
+ "requires": {
+ "glob": "~7.1.1",
+ "lodash": "~4.17.10",
+ "minimatch": "~3.0.2"
+ }
+ },
+ "google-code-prettify": {
+ "version": "1.0.5",
+ "resolved":
"https://registry.npmjs.org/google-code-prettify/-/google-code-prettify-1.0.5.tgz",
+ "integrity": "sha1-n0d/Ik2/piNy5e+AOn4VdBBAAIQ=",
+ "optional": true
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved":
"https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
+ },
+ "gud": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz",
+ "integrity":
"sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw=="
+ },
+ "har-schema": {
+ "version": "2.0.0",
+ "resolved":
"https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+ "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
+ },
+ "har-validator": {
+ "version": "5.1.3",
+ "resolved":
"https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
+ "integrity":
"sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
+ "requires": {
+ "ajv": "^6.5.5",
+ "har-schema": "^2.0.0"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "6.7.0",
+ "resolved":
"https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz",
+ "integrity":
"sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg==",
+ "requires": {
+ "fast-deep-equal": "^2.0.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ }
+ }
+ },
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity":
"sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.1"
+ }
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved":
"https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved":
"https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "has-symbols": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz",
+ "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=",
+ "dev": true
+ },
+ "has-unicode": {
+ "version": "2.0.1",
+ "resolved":
"https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+ "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
+ },
+ "has-value": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "dev": true,
+ "requires": {
+ "get-value": "^2.0.6",
+ "has-values": "^1.0.0",
+ "isobject": "^3.0.0"
+ }
+ },
+ "has-values": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "dev": true,
+ "requires": {
+ "is-number": "^3.0.0",
+ "kind-of": "^4.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved":
"https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "hash-base": {
+ "version": "3.0.4",
+ "resolved":
"https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz",
+ "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "hash.js": {
+ "version": "1.1.5",
+ "resolved":
"https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz",
+ "integrity":
"sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.3",
+ "minimalistic-assert": "^1.0.1"
+ }
+ },
+ "hmac-drbg": {
+ "version": "1.0.1",
+ "resolved":
"https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+ "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
+ "dev": true,
+ "requires": {
+ "hash.js": "^1.0.3",
+ "minimalistic-assert": "^1.0.0",
+ "minimalistic-crypto-utils": "^1.0.1"
+ }
+ },
+ "hoist-non-react-statics": {
+ "version": "2.5.5",
+ "resolved":
"https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz",
+ "integrity":
"sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw=="
+ },
+ "hosted-git-info": {
+ "version": "2.7.1",
+ "resolved":
"https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz",
+ "integrity":
"sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w=="
+ },
+ "htmlparser": {
+ "version": "1.7.7",
+ "resolved":
"https://registry.npmjs.org/htmlparser/-/htmlparser-1.7.7.tgz",
+ "integrity": "sha1-GeezmX/2+6yZrlp9J2ZInv5+LQ4=",
+ "dev": true
+ },
+ "http-signature": {
+ "version": "1.2.0",
+ "resolved":
"https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+ "requires": {
+ "assert-plus": "^1.0.0",
+ "jsprim": "^1.2.2",
+ "sshpk": "^1.7.0"
+ }
+ },
+ "https-browserify": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
+ "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
+ "dev": true
+ },
+ "iconv-lite": {
+ "version": "0.4.24",
+ "resolved":
"https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity":
"sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ }
+ },
+ "icss-replace-symbols": {
+ "version": "1.1.0",
+ "resolved":
"https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz",
+ "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=",
+ "dev": true
+ },
+ "icss-utils": {
+ "version": "4.1.0",
+ "resolved":
"https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.0.tgz",
+ "integrity":
"sha512-3DEun4VOeMvSczifM3F2cKQrDQ5Pj6WKhkOq6HD4QTnDUAq8MQRxy5TX6Sy1iY6WPBe4gQ3p5vTECjbIkglkkQ==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.14"
+ }
+ },
+ "ieee754": {
+ "version": "1.1.12",
+ "resolved":
"https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz",
+ "integrity":
"sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==",
+ "dev": true
+ },
+ "iferr": {
+ "version": "0.1.5",
+ "resolved":
"https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz",
+ "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=",
+ "dev": true
+ },
+ "ignore": {
+ "version": "3.3.10",
+ "resolved":
"https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz",
+ "integrity":
"sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==",
+ "dev": true
+ },
+ "import-local": {
+ "version": "2.0.0",
+ "resolved":
"https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz",
+ "integrity":
"sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==",
+ "dev": true,
+ "requires": {
+ "pkg-dir": "^3.0.0",
+ "resolve-cwd": "^2.0.0"
+ },
+ "dependencies": {
+ "find-up": {
+ "version": "3.0.0",
+ "resolved":
"https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+ "integrity":
"sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^3.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "3.0.0",
+ "resolved":
"https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity":
"sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
+ }
+ },
+ "p-limit": {
+ "version": "2.0.0",
+ "resolved":
"https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz",
+ "integrity":
"sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==",
+ "dev": true,
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "3.0.0",
+ "resolved":
"https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity":
"sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^2.0.0"
+ }
+ },
+ "p-try": {
+ "version": "2.0.0",
+ "resolved":
"https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz",
+ "integrity":
"sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==",
+ "dev": true
+ },
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved":
"https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+ "dev": true
+ },
+ "pkg-dir": {
+ "version": "3.0.0",
+ "resolved":
"https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
+ "integrity":
"sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
+ "dev": true,
+ "requires": {
+ "find-up": "^3.0.0"
+ }
+ }
+ }
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved":
"https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "dev": true
+ },
+ "in-publish": {
+ "version": "2.0.0",
+ "resolved":
"https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz",
+ "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E="
+ },
+ "indent-string": {
+ "version": "2.1.0",
+ "resolved":
"https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
+ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
+ "requires": {
+ "repeating": "^2.0.0"
+ }
+ },
+ "indexes-of": {
+ "version": "1.0.1",
+ "resolved":
"https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
+ "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=",
+ "dev": true
+ },
+ "indexof": {
+ "version": "0.0.1",
+ "resolved":
"https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
+ "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved":
"https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved":
"https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+ },
+ "inquirer": {
+ "version": "6.2.0",
+ "resolved":
"https://registry.npmjs.org/inquirer/-/inquirer-6.2.0.tgz",
+ "integrity":
"sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg==",
+ "dev": true,
+ "requires": {
+ "ansi-escapes": "^3.0.0",
+ "chalk": "^2.0.0",
+ "cli-cursor": "^2.1.0",
+ "cli-width": "^2.0.0",
+ "external-editor": "^3.0.0",
+ "figures": "^2.0.0",
+ "lodash": "^4.17.10",
+ "mute-stream": "0.0.7",
+ "run-async": "^2.2.0",
+ "rxjs": "^6.1.0",
+ "string-width": "^2.1.0",
+ "strip-ansi": "^4.0.0",
+ "through": "^2.3.6"
+ },
+ "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.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved":
"https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity":
"sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "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
+ },
+ "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-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.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"
+ }
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved":
"https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity":
"sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "interpret": {
+ "version": "1.1.0",
+ "resolved":
"https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz",
+ "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.4",
+ "resolved":
"https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity":
"sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "requires": {
+ "loose-envify": "^1.0.0"
+ }
+ },
+ "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="
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved":
"https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved":
"https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-arrayish": {
+ "version": "0.2.1",
+ "resolved":
"https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
+ },
+ "is-binary-path": {
+ "version": "1.0.1",
+ "resolved":
"https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
+ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+ "dev": true,
+ "requires": {
+ "binary-extensions": "^1.0.0"
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved":
"https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity":
"sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "is-builtin-module": {
+ "version": "1.0.0",
+ "resolved":
"http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
+ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
+ "requires": {
+ "builtin-modules": "^1.0.0"
+ }
+ },
+ "is-callable": {
+ "version": "1.1.4",
+ "resolved":
"https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz",
+ "integrity":
"sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==",
+ "dev": 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": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved":
"https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-date-object": {
+ "version": "1.0.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": "0.1.6",
+ "resolved":
"https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity":
"sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^0.1.6",
+ "is-data-descriptor": "^0.1.4",
+ "kind-of": "^5.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved":
"https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity":
"sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved":
"https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved":
"https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved":
"https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "requires": {
+ "number-is-nan": "^1.0.0"
+ }
+ },
+ "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=",
+ "requires": {
+ "number-is-nan": "^1.0.0"
+ }
+ },
+ "is-glob": {
+ "version": "4.0.0",
+ "resolved":
"https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
+ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved":
"https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved":
"https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-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.0"
+ }
+ },
+ "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.1"
+ }
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved":
"https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity":
"sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "requires": {
+ "isobject": "^3.0.1"
+ }
+ },
+ "is-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="
+ },
+ "is-symbol": {
+ "version": "1.0.2",
+ "resolved":
"https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz",
+ "integrity":
"sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==",
+ "dev": true,
+ "requires": {
+ "has-symbols": "^1.0.0"
+ }
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
+ },
+ "is-utf8": {
+ "version": "0.2.1",
+ "resolved":
"https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI="
+ },
+ "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="
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved":
"https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved":
"https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "isomorphic-fetch": {
+ "version": "2.2.1",
+ "resolved":
"https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz",
+ "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=",
+ "requires": {
+ "node-fetch": "^1.0.1",
+ "whatwg-fetch": ">=0.10.0"
+ }
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved":
"https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
+ },
+ "jed": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/jed/-/jed-1.1.1.tgz",
+ "integrity": "sha1-elSbvZ/+FYWwzQoZHiAwVb7ldLQ=",
+ "dev": true
+ },
+ "jquery": {
+ "version": "3.4.1",
+ "resolved":
"https://registry.npmjs.org/jquery/-/jquery-3.4.1.tgz",
+ "integrity":
"sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw=="
+ },
+ "jquery-match-height": {
+ "version": "0.7.2",
+ "resolved":
"https://registry.npmjs.org/jquery-match-height/-/jquery-match-height-0.7.2.tgz",
+ "integrity": "sha1-+NnzulMU2qsQnPB0CGdL4gS+Xw4=",
+ "optional": true
+ },
+ "js-base64": {
+ "version": "2.4.9",
+ "resolved":
"https://registry.npmjs.org/js-base64/-/js-base64-2.4.9.tgz",
+ "integrity":
"sha512-xcinL3AuDJk7VSzsHgb9DvvIXayBbadtMZ4HFPx8rUszbW1MuNMlwYVC4zzCZ6e1sqZpnNS5ZFYOhXqA39T7LQ=="
+ },
+ "js-levenshtein": {
+ "version": "1.1.4",
+ "resolved":
"https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.4.tgz",
+ "integrity":
"sha512-PxfGzSs0ztShKrUYPIn5r0MtyAhYcCwmndozzpz8YObbPnD1jFxzlBGbRnX2mIu6Z13xN6+PTu05TQFnZFlzow==",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved":
"https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity":
"sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+ },
+ "jsbn": {
+ "version": "0.1.1",
+ "resolved":
"https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
+ },
+ "jsesc": {
+ "version": "2.5.1",
+ "resolved":
"https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz",
+ "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=",
+ "dev": true
+ },
+ "json-parse-better-errors": {
+ "version": "1.0.2",
+ "resolved":
"https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
+ "integrity":
"sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
+ "dev": true
+ },
+ "json-schema": {
+ "version": "0.2.3",
+ "resolved":
"https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+ "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
+ },
+ "json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved":
"https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity":
"sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+ },
+ "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="
+ },
+ "json5": {
+ "version": "0.5.1",
+ "resolved":
"http://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
+ "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
+ "dev": true
+ },
+ "jsprim": {
+ "version": "1.4.1",
+ "resolved":
"https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
+ "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+ "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"
+ }
+ },
+ "keycode": {
+ "version": "2.2.0",
+ "resolved":
"https://registry.npmjs.org/keycode/-/keycode-2.2.0.tgz",
+ "integrity": "sha1-PQr1bce4uOXLqNCpfxByBO7CKwQ="
+ },
+ "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
+ },
+ "lcid": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
+ "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
+ "requires": {
+ "invert-kv": "^1.0.0"
+ }
+ },
+ "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": "1.1.0",
+ "resolved":
"https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "parse-json": "^2.2.0",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0",
+ "strip-bom": "^2.0.0"
+ }
+ },
+ "loader-fs-cache": {
+ "version": "1.0.1",
+ "resolved":
"https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.1.tgz",
+ "integrity": "sha1-VuC/CL2XCLJqdltoUJhAyN7J/bw=",
+ "dev": true,
+ "requires": {
+ "find-cache-dir": "^0.1.1",
+ "mkdirp": "0.5.1"
+ },
+ "dependencies": {
+ "find-cache-dir": {
+ "version": "0.1.1",
+ "resolved":
"https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz",
+ "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=",
+ "dev": true,
+ "requires": {
+ "commondir": "^1.0.1",
+ "mkdirp": "^0.5.1",
+ "pkg-dir": "^1.0.0"
+ }
+ },
+ "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.0.0"
+ }
+ }
+ }
+ },
+ "loader-runner": {
+ "version": "2.3.1",
+ "resolved":
"https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.1.tgz",
+ "integrity":
"sha512-By6ZFY7ETWOc9RFaAIb23IjJVcM4dvJC/N57nmdz9RSkMXvAXGI7SyVlAw3v8vjtDRlqThgVDVmTnr9fqMlxkw==",
+ "dev": true
+ },
+ "loader-utils": {
+ "version": "1.1.0",
+ "resolved":
"https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz",
+ "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=",
+ "dev": true,
+ "requires": {
+ "big.js": "^3.1.3",
+ "emojis-list": "^2.0.0",
+ "json5": "^0.5.0"
+ }
+ },
+ "locate-path": {
+ "version": "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.11",
+ "resolved":
"https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+ "integrity":
"sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg=="
+ },
+ "lodash.assign": {
+ "version": "4.2.0",
+ "resolved":
"https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz",
+ "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc="
+ },
+ "lodash.clonedeep": {
+ "version": "4.5.0",
+ "resolved":
"https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
+ "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8="
+ },
+ "lodash.debounce": {
+ "version": "4.0.8",
+ "resolved":
"https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+ "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168="
+ },
+ "lodash.mergewith": {
+ "version": "4.6.1",
+ "resolved":
"https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz",
+ "integrity":
"sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ=="
+ },
+ "lodash.tail": {
+ "version": "4.1.1",
+ "resolved":
"https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz",
+ "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.4.0",
+ "resolved":
"https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity":
"sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "requires": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ }
+ },
+ "loud-rejection": {
+ "version": "1.6.0",
+ "resolved":
"https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
+ "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
+ "requires": {
+ "currently-unhandled": "^0.4.1",
+ "signal-exit": "^3.0.0"
+ }
+ },
+ "lru-cache": {
+ "version": "4.1.3",
+ "resolved":
"https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz",
+ "integrity":
"sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==",
+ "requires": {
+ "pseudomap": "^1.0.2",
+ "yallist": "^2.1.2"
+ }
+ },
+ "make-dir": {
+ "version": "1.3.0",
+ "resolved":
"https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
+ "integrity":
"sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
+ "dev": true,
+ "requires": {
+ "pify": "^3.0.0"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "3.0.0",
+ "resolved":
"https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "dev": true
+ }
+ }
+ },
+ "map-age-cleaner": {
+ "version": "0.1.2",
+ "resolved":
"https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz",
+ "integrity":
"sha512-UN1dNocxQq44IhJyMI4TU8phc2m9BddacHRPRjKGLYaF0jqd3xLz0jS0skpAU9WgYyoR4gHtUpzytNBS385FWQ==",
+ "dev": true,
+ "requires": {
+ "p-defer": "^1.0.0"
+ }
+ },
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved":
"https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+ "dev": true
+ },
+ "map-obj": {
+ "version": "1.0.1",
+ "resolved":
"https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+ "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0="
+ },
+ "map-visit": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "dev": true,
+ "requires": {
+ "object-visit": "^1.0.0"
+ }
+ },
+ "md5.js": {
+ "version": "1.3.5",
+ "resolved":
"https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
+ "integrity":
"sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
+ "dev": true,
+ "requires": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "mem": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz",
+ "integrity":
"sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==",
+ "dev": true,
+ "requires": {
+ "map-age-cleaner": "^0.1.1",
+ "mimic-fn": "^1.0.0",
+ "p-is-promise": "^1.1.0"
+ }
+ },
+ "memory-fs": {
+ "version": "0.4.1",
+ "resolved":
"https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
+ "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
+ "dev": true,
+ "requires": {
+ "errno": "^0.1.3",
+ "readable-stream": "^2.0.1"
+ }
+ },
+ "meow": {
+ "version": "3.7.0",
+ "resolved":
"https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
+ "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
+ "requires": {
+ "camelcase-keys": "^2.0.0",
+ "decamelize": "^1.1.2",
+ "loud-rejection": "^1.0.0",
+ "map-obj": "^1.0.1",
+ "minimist": "^1.1.3",
+ "normalize-package-data": "^2.3.4",
+ "object-assign": "^4.0.1",
+ "read-pkg-up": "^1.0.1",
+ "redent": "^1.0.0",
+ "trim-newlines": "^1.0.0"
+ }
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved":
"https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity":
"sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "braces": "^2.3.1",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "extglob": "^2.0.4",
+ "fragment-cache": "^0.2.1",
+ "kind-of": "^6.0.2",
+ "nanomatch": "^1.2.9",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.2"
+ }
+ },
+ "miller-rabin": {
+ "version": "4.0.1",
+ "resolved":
"https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
+ "integrity":
"sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.0.0",
+ "brorand": "^1.0.1"
+ }
+ },
+ "mime-db": {
+ "version": "1.37.0",
+ "resolved":
"https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz",
+ "integrity":
"sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg=="
+ },
+ "mime-types": {
+ "version": "2.1.21",
+ "resolved":
"https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz",
+ "integrity":
"sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==",
+ "requires": {
+ "mime-db": "~1.37.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
+ },
+ "minimalistic-assert": {
+ "version": "1.0.1",
+ "resolved":
"https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+ "integrity":
"sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
+ "dev": true
+ },
+ "minimalistic-crypto-utils": {
+ "version": "1.0.1",
+ "resolved":
"https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+ "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved":
"https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity":
"sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "1.2.0",
+ "resolved":
"https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
+ },
+ "mississippi": {
+ "version": "2.0.0",
+ "resolved":
"https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz",
+ "integrity":
"sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==",
+ "dev": true,
+ "requires": {
+ "concat-stream": "^1.5.0",
+ "duplexify": "^3.4.2",
+ "end-of-stream": "^1.1.0",
+ "flush-write-stream": "^1.0.0",
+ "from2": "^2.1.0",
+ "parallel-transform": "^1.1.0",
+ "pump": "^2.0.1",
+ "pumpify": "^1.3.3",
+ "stream-each": "^1.1.0",
+ "through2": "^2.0.0"
+ }
+ },
+ "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"
+ }
+ }
+ }
+ },
+ "mixin-object": {
+ "version": "2.0.1",
+ "resolved":
"https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz",
+ "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=",
+ "dev": true,
+ "requires": {
+ "for-in": "^0.1.3",
+ "is-extendable": "^0.1.1"
+ },
+ "dependencies": {
+ "for-in": {
+ "version": "0.1.8",
+ "resolved":
"https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz",
+ "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=",
+ "dev": true
+ }
+ }
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "resolved":
"http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "requires": {
+ "minimist": "0.0.8"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "0.0.8",
+ "resolved":
"http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
+ }
+ }
+ },
+ "moment": {
+ "version": "2.24.0",
+ "resolved":
"https://registry.npmjs.org/moment/-/moment-2.24.0.tgz",
+ "integrity":
"sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg=="
+ },
+ "moment-timezone": {
+ "version": "0.4.1",
+ "resolved":
"http://registry.npmjs.org/moment-timezone/-/moment-timezone-0.4.1.tgz",
+ "integrity": "sha1-gfWYw61eIs2teWtn7NjYjQ9bqgY=",
+ "optional": true,
+ "requires": {
+ "moment": ">= 2.6.0"
+ }
+ },
+ "move-concurrently": {
+ "version": "1.0.1",
+ "resolved":
"https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
+ "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=",
+ "dev": true,
+ "requires": {
+ "aproba": "^1.1.1",
+ "copy-concurrently": "^1.0.0",
+ "fs-write-stream-atomic": "^1.0.8",
+ "mkdirp": "^0.5.1",
+ "rimraf": "^2.5.4",
+ "run-queue": "^1.0.3"
+ }
+ },
+ "ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity":
"sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+ "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.11.1",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz",
+ "integrity":
"sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA=="
+ },
+ "nanomatch": {
+ "version": "1.2.13",
+ "resolved":
"https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
+ "integrity":
"sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "fragment-cache": "^0.2.1",
+ "is-windows": "^1.0.2",
+ "kind-of": "^6.0.2",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ }
+ },
+ "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
+ },
+ "neo-async": {
+ "version": "2.6.0",
+ "resolved":
"https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz",
+ "integrity":
"sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==",
+ "dev": true
+ },
+ "nice-try": {
+ "version": "1.0.5",
+ "resolved":
"https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
+ "integrity":
"sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
+ "dev": true
+ },
+ "node-fetch": {
+ "version": "1.7.3",
+ "resolved":
"https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz",
+ "integrity":
"sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==",
+ "requires": {
+ "encoding": "^0.1.11",
+ "is-stream": "^1.0.1"
+ }
+ },
+ "node-gyp": {
+ "version": "3.8.0",
+ "resolved":
"https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz",
+ "integrity":
"sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==",
+ "requires": {
+ "fstream": "^1.0.0",
+ "glob": "^7.0.3",
+ "graceful-fs": "^4.1.2",
+ "mkdirp": "^0.5.0",
+ "nopt": "2 || 3",
+ "npmlog": "0 || 1 || 2 || 3 || 4",
+ "osenv": "0",
+ "request": "^2.87.0",
+ "rimraf": "2",
+ "semver": "~5.3.0",
+ "tar": "^2.0.0",
+ "which": "1"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.3.0",
+ "resolved":
"https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
+ "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8="
+ }
+ }
+ },
+ "node-libs-browser": {
+ "version": "2.1.0",
+ "resolved":
"https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz",
+ "integrity":
"sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==",
+ "dev": true,
+ "requires": {
+ "assert": "^1.1.1",
+ "browserify-zlib": "^0.2.0",
+ "buffer": "^4.3.0",
+ "console-browserify": "^1.1.0",
+ "constants-browserify": "^1.0.0",
+ "crypto-browserify": "^3.11.0",
+ "domain-browser": "^1.1.1",
+ "events": "^1.0.0",
+ "https-browserify": "^1.0.0",
+ "os-browserify": "^0.3.0",
+ "path-browserify": "0.0.0",
+ "process": "^0.11.10",
+ "punycode": "^1.2.4",
+ "querystring-es3": "^0.2.0",
+ "readable-stream": "^2.3.3",
+ "stream-browserify": "^2.0.1",
+ "stream-http": "^2.7.2",
+ "string_decoder": "^1.0.0",
+ "timers-browserify": "^2.0.4",
+ "tty-browserify": "0.0.0",
+ "url": "^0.11.0",
+ "util": "^0.10.3",
+ "vm-browserify": "0.0.4"
+ }
+ },
+ "node-releases": {
+ "version": "1.0.0-alpha.15",
+ "resolved":
"https://registry.npmjs.org/node-releases/-/node-releases-1.0.0-alpha.15.tgz",
+ "integrity":
"sha512-hKG6hd/g6a9OV/ARt2qrxbRhe/4WEMFohTLOB9PNyTYvvI59gICZFzt9/mMgpYUTts06qXlN8H6UjfbIRdnW8A==",
+ "dev": true,
+ "requires": {
+ "semver": "^5.3.0"
+ }
+ },
+ "node-sass": {
+ "version": "4.11.0",
+ "resolved":
"https://registry.npmjs.org/node-sass/-/node-sass-4.11.0.tgz",
+ "integrity":
"sha512-bHUdHTphgQJZaF1LASx0kAviPH7sGlcyNhWade4eVIpFp6tsn7SV8xNMTbsQFpEV9VXpnwTTnNYlfsZXgGgmkA==",
+ "requires": {
+ "async-foreach": "^0.1.3",
+ "chalk": "^1.1.1",
+ "cross-spawn": "^3.0.0",
+ "gaze": "^1.0.0",
+ "get-stdin": "^4.0.1",
+ "glob": "^7.0.3",
+ "in-publish": "^2.0.0",
+ "lodash.assign": "^4.2.0",
+ "lodash.clonedeep": "^4.3.2",
+ "lodash.mergewith": "^4.6.0",
+ "meow": "^3.7.0",
+ "mkdirp": "^0.5.1",
+ "nan": "^2.10.0",
+ "node-gyp": "^3.8.0",
+ "npmlog": "^4.0.0",
+ "request": "^2.88.0",
+ "sass-graph": "^2.2.4",
+ "stdout-stream": "^1.4.0",
+ "true-case-path": "^1.0.2"
+ }
+ },
+ "nopt": {
+ "version": "3.0.6",
+ "resolved":
"https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
+ "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
+ "requires": {
+ "abbrev": "1"
+ }
+ },
+ "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==",
+ "requires": {
+ "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": {
+ "version": "2.1.1",
+ "resolved":
"https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+ "dev": true,
+ "requires": {
+ "remove-trailing-separator": "^1.0.1"
+ }
+ },
+ "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"
+ }
+ },
+ "npmlog": {
+ "version": "4.1.2",
+ "resolved":
"https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
+ "integrity":
"sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
+ "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",
+ "resolved":
"https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
+ },
+ "oauth-sign": {
+ "version": "0.9.0",
+ "resolved":
"https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+ "integrity":
"sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved":
"https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+ },
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved":
"https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "dev": true,
+ "requires": {
+ "copy-descriptor": "^0.1.0",
+ "define-property": "^0.2.5",
+ "kind-of": "^3.0.3"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved":
"https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved":
"https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "object-hash": {
+ "version": "1.3.0",
+ "resolved":
"https://registry.npmjs.org/object-hash/-/object-hash-1.3.0.tgz",
+ "integrity":
"sha512-05KzQ70lSeGSrZJQXE5wNDiTkBJDlUT/myi6RX9dVIvz7a7Qh4oH93BQdiPMn27nldYvVQCKMUaM83AfizZlsQ==",
+ "dev": true
+ },
+ "object-keys": {
+ "version": "1.0.12",
+ "resolved":
"https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz",
+ "integrity":
"sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==",
+ "dev": true
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved":
"https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "dev": true,
+ "requires": {
+ "isobject": "^3.0.0"
+ }
+ },
+ "object.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.5.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"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved":
"https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "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.0.0"
+ }
+ },
+ "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.4",
+ "levn": "~0.3.0",
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2",
+ "wordwrap": "~1.0.0"
+ }
+ },
+ "os-browserify": {
+ "version": "0.3.0",
+ "resolved":
"https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
+ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
+ "dev": true
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "resolved":
"https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
+ },
+ "os-locale": {
+ "version": "1.4.0",
+ "resolved":
"https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
+ "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
+ "requires": {
+ "lcid": "^1.0.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="
+ },
+ "osenv": {
+ "version": "0.1.5",
+ "resolved":
"https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
+ "integrity":
"sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
+ "requires": {
+ "os-homedir": "^1.0.0",
+ "os-tmpdir": "^1.0.0"
+ }
+ },
+ "p-defer": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
+ "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=",
+ "dev": true
+ },
+ "p-finally": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
+ "dev": true
+ },
+ "p-is-promise": {
+ "version": "1.1.0",
+ "resolved":
"http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz",
+ "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=",
+ "dev": true
+ },
+ "p-limit": {
+ "version": "1.3.0",
+ "resolved":
"https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+ "integrity":
"sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+ "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.1.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
+ },
+ "pako": {
+ "version": "1.0.6",
+ "resolved":
"https://registry.npmjs.org/pako/-/pako-1.0.6.tgz",
+ "integrity":
"sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==",
+ "dev": true
+ },
+ "parallel-transform": {
+ "version": "1.1.0",
+ "resolved":
"https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz",
+ "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=",
+ "dev": true,
+ "requires": {
+ "cyclist": "~0.2.2",
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.1.5"
+ }
+ },
+ "parse-asn1": {
+ "version": "5.1.1",
+ "resolved":
"http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz",
+ "integrity":
"sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==",
+ "dev": true,
+ "requires": {
+ "asn1.js": "^4.0.0",
+ "browserify-aes": "^1.0.0",
+ "create-hash": "^1.1.0",
+ "evp_bytestokey": "^1.0.0",
+ "pbkdf2": "^3.0.3"
+ }
+ },
+ "parse-json": {
+ "version": "2.2.0",
+ "resolved":
"https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+ "requires": {
+ "error-ex": "^1.2.0"
+ }
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved":
"https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+ "dev": true
+ },
+ "path-browserify": {
+ "version": "0.0.0",
+ "resolved":
"https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz",
+ "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=",
+ "dev": true
+ },
+ "path-dirname": {
+ "version": "1.0.2",
+ "resolved":
"https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+ "dev": true
+ },
+ "path-exists": {
+ "version": "2.1.0",
+ "resolved":
"https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+ "requires": {
+ "pinkie-promise": "^2.0.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="
+ },
+ "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.6",
+ "resolved":
"https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+ "integrity":
"sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+ "dev": true
+ },
+ "path-type": {
+ "version": "1.1.0",
+ "resolved":
"https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
+ }
+ },
+ "patternfly": {
+ "version": "3.59.1",
+ "resolved":
"https://registry.npmjs.org/patternfly/-/patternfly-3.59.1.tgz",
+ "integrity":
"sha512-0Q/P58yaxcQXwnXo/OssiXaZmuX0g9QvWdpsYHyml4ihqnN2lL/yGdadFarA6UAQb//15XtNjKHZocoJXCkWYg==",
+ "requires": {
+ "@types/c3": "^0.6.0",
+ "bootstrap": "~3.4.0",
+ "bootstrap-datepicker": "^1.7.1",
+ "bootstrap-sass": "^3.4.0",
+ "bootstrap-select": "1.12.2",
+ "bootstrap-slider": "^9.9.0",
+ "bootstrap-switch": "~3.3.4",
+ "bootstrap-touchspin": "~3.1.1",
+ "c3": "~0.4.11",
+ "d3": "~3.5.17",
+ "datatables.net": "^1.10.15",
+ "datatables.net-colreorder": "^1.4.1",
+ "datatables.net-colreorder-bs": "~1.3.2",
+ "datatables.net-select": "~1.2.0",
+ "drmonty-datatables-colvis": "~1.1.2",
+ "eonasdan-bootstrap-datetimepicker": "^4.17.47",
+ "font-awesome": "^4.7.0",
+ "font-awesome-sass": "^4.7.0",
+ "google-code-prettify": "~1.0.5",
+ "jquery": "~3.2.1",
+ "jquery-match-height": "^0.7.2",
+ "moment": "^2.19.1",
+ "moment-timezone": "^0.4.1",
+ "patternfly-bootstrap-combobox": "~1.1.7",
+ "patternfly-bootstrap-treeview": "~2.1.0"
+ },
+ "dependencies": {
+ "bootstrap": {
+ "version": "3.4.1",
+ "resolved":
"https://registry.npmjs.org/bootstrap/-/bootstrap-3.4.1.tgz",
+ "integrity":
"sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA=="
+ },
+ "jquery": {
+ "version": "3.2.1",
+ "resolved":
"https://registry.npmjs.org/jquery/-/jquery-3.2.1.tgz",
+ "integrity": "sha1-XE2d5lKvbNCncBVKYxu6ErAVx4c="
+ }
+ }
+ },
+ "patternfly-bootstrap-combobox": {
+ "version": "1.1.7",
+ "resolved":
"https://registry.npmjs.org/patternfly-bootstrap-combobox/-/patternfly-bootstrap-combobox-1.1.7.tgz",
+ "integrity": "sha1-al48zRFwwhs8S0qhaKdBPh3btuE=",
+ "optional": true
+ },
+ "patternfly-bootstrap-treeview": {
+ "version": "2.1.8",
+ "resolved":
"https://registry.npmjs.org/patternfly-bootstrap-treeview/-/patternfly-bootstrap-treeview-2.1.8.tgz",
+ "integrity":
"sha512-Z3v+zJ0AEhMiySyj7qgUs4yGM8afJwjUUWgwSosWI9xpMsyJV+B+I+GzgRoGiukzh14EOl3EiX4qqMBC+nwqXQ==",
+ "optional": true,
+ "requires": {
+ "bootstrap": "3.4.x",
+ "jquery": ">= 2.1.x"
+ },
+ "dependencies": {
+ "bootstrap": {
+ "version": "3.4.1",
+ "resolved":
"https://registry.npmjs.org/bootstrap/-/bootstrap-3.4.1.tgz",
+ "integrity":
"sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA==",
+ "optional": true
+ }
+ }
+ },
+ "patternfly-react": {
+ "version": "2.34.3",
+ "resolved":
"https://registry.npmjs.org/patternfly-react/-/patternfly-react-2.34.3.tgz",
+ "integrity":
"sha512-5bdIBHpo1bdO3gsYC1tbmxeXX/NXe5ghBen3MCFeumUDZGtKmaoN5NOY+uGL6LtkWTCTA7heKXJxfFOuk/IXrA==",
+ "requires": {
+ "bootstrap-slider-without-jquery": "^10.0.0",
+ "breakjs": "^1.0.0",
+ "classnames": "^2.2.5",
+ "css-element-queries": "^1.0.1",
+ "lodash": "^4.17.11",
+ "patternfly": "^3.58.0",
+ "react-bootstrap": "^0.32.1",
+ "react-bootstrap-switch": "^15.5.3",
+ "react-bootstrap-typeahead": "^3.4.1",
+ "react-c3js": "^0.1.20",
+ "react-click-outside": "^3.0.1",
+ "react-collapse": "^4.0.3",
+ "react-debounce-input": "^3.2.0",
+ "react-ellipsis-with-tooltip": "^1.0.8",
+ "react-fontawesome": "^1.6.1",
+ "react-motion": "^0.5.2",
+ "reactabular-table": "^8.14.0",
+ "recompose": "^0.26.0",
+ "sortabular": "^1.5.1",
+ "table-resolver": "^3.2.0",
+ "uuid": "^3.3.2"
+ },
+ "dependencies": {
+ "react-bootstrap-typeahead": {
+ "version": "3.4.3",
+ "resolved":
"https://registry.npmjs.org/react-bootstrap-typeahead/-/react-bootstrap-typeahead-3.4.3.tgz",
+ "integrity":
"sha512-/F37uKRWOL1IIo4EXCpL/1juHIG6Dzwl/gJlNJlqQGZMWMc/UNjB3DGg3loh3Gqfs4YHBgCu5SxhZWwgtLyRew==",
+ "requires": {
+ "classnames": "^2.2.0",
+ "create-react-context": "^0.2.3",
+ "escape-string-regexp": "^1.0.5",
+ "invariant": "^2.2.1",
+ "lodash": "^4.17.2",
+ "prop-types": "^15.5.8",
+ "prop-types-extra": "^1.0.1",
+ "react-overlays": "^0.8.1",
+ "react-popper": "^1.0.0",
+ "warning": "^4.0.1"
+ }
+ },
+ "recompose": {
+ "version": "0.26.0",
+ "resolved":
"https://registry.npmjs.org/recompose/-/recompose-0.26.0.tgz",
+ "integrity":
"sha512-KwOu6ztO0mN5vy3+zDcc45lgnaUoaQse/a5yLVqtzTK13czSWnFGmXbQVmnoMgDkI5POd1EwIKSbjU1V7xdZog==",
+ "requires": {
+ "change-emitter": "^0.1.2",
+ "fbjs": "^0.8.1",
+ "hoist-non-react-statics": "^2.3.1",
+ "symbol-observable": "^1.0.4"
+ }
+ },
+ "table-resolver": {
+ "version": "3.3.0",
+ "resolved":
"https://registry.npmjs.org/table-resolver/-/table-resolver-3.3.0.tgz",
+ "integrity":
"sha512-BkdhtKYhWtXK54GeACs0khqlMvJ53puOw01tzIPsPUr3PP2pFeq9AelPUb7Iy7NeHMyIUI6vEfnngoWgEG+rLQ==",
+ "optional": true
+ },
+ "warning": {
+ "version": "4.0.3",
+ "resolved":
"https://registry.npmjs.org/warning/-/warning-4.0.3.tgz",
+ "integrity":
"sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==",
+ "requires": {
+ "loose-envify": "^1.0.0"
+ }
+ }
+ }
+ },
+ "pbkdf2": {
+ "version": "3.0.17",
+ "resolved":
"https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz",
+ "integrity":
"sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==",
+ "dev": true,
+ "requires": {
+ "create-hash": "^1.1.2",
+ "create-hmac": "^1.1.4",
+ "ripemd160": "^2.0.1",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
+ }
+ },
+ "performance-now": {
+ "version": "0.2.0",
+ "resolved":
"https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz",
+ "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU="
+ },
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
+ },
+ "pinkie": {
+ "version": "2.0.4",
+ "resolved":
"https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+ "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
+ },
+ "pinkie-promise": {
+ "version": "2.0.1",
+ "resolved":
"https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+ "requires": {
+ "pinkie": "^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"
+ },
+ "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"
+ }
+ }
+ }
+ },
+ "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
+ },
+ "popper.js": {
+ "version": "1.15.0",
+ "resolved":
"https://registry.npmjs.org/popper.js/-/popper.js-1.15.0.tgz",
+ "integrity":
"sha512-w010cY1oCUmI+9KwwlWki+r5jxKfTFDVoadl7MSrIujHU5MJ5OR6HTDj6Xo8aoR/QsA56x8jKjA59qGH4ELtrA=="
+ },
+ "posix-character-classes": {
+ "version": "0.1.1",
+ "resolved":
"https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+ "dev": true
+ },
+ "postcss": {
+ "version": "7.0.16",
+ "resolved":
"https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz",
+ "integrity":
"sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.4.2",
+ "source-map": "^0.6.1",
+ "supports-color": "^6.1.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved":
"https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity":
"sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved":
"https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity":
"sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved":
"https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity":
"sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "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": "6.1.0",
+ "resolved":
"https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity":
"sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "postcss-modules-extract-imports": {
+ "version": "2.0.0",
+ "resolved":
"https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz",
+ "integrity":
"sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.5"
+ }
+ },
+ "postcss-modules-local-by-default": {
+ "version": "2.0.6",
+ "resolved":
"https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-2.0.6.tgz",
+ "integrity":
"sha512-oLUV5YNkeIBa0yQl7EYnxMgy4N6noxmiwZStaEJUSe2xPMcdNc8WmBQuQCx18H5psYbVxz8zoHk0RAAYZXP9gA==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.6",
+ "postcss-selector-parser": "^6.0.0",
+ "postcss-value-parser": "^3.3.1"
+ }
+ },
+ "postcss-modules-scope": {
+ "version": "2.1.0",
+ "resolved":
"https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.1.0.tgz",
+ "integrity":
"sha512-91Rjps0JnmtUB0cujlc8KIKCsJXWjzuxGeT/+Q2i2HXKZ7nBUeF9YQTZZTNvHVoNYj1AthsjnGLtqDUE0Op79A==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.6",
+ "postcss-selector-parser": "^6.0.0"
+ }
+ },
+ "postcss-modules-values": {
+ "version": "2.0.0",
+ "resolved":
"https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-2.0.0.tgz",
+ "integrity":
"sha512-Ki7JZa7ff1N3EIMlPnGTZfUMe69FFwiQPnVSXC9mnn3jozCRBYIxiZd44yJOV2AmabOo4qFf8s0dC/+lweG7+w==",
+ "dev": true,
+ "requires": {
+ "icss-replace-symbols": "^1.1.0",
+ "postcss": "^7.0.6"
+ }
+ },
+ "postcss-selector-parser": {
+ "version": "6.0.2",
+ "resolved":
"https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz",
+ "integrity":
"sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==",
+ "dev": true,
+ "requires": {
+ "cssesc": "^3.0.0",
+ "indexes-of": "^1.0.1",
+ "uniq": "^1.0.1"
+ }
+ },
+ "postcss-value-parser": {
+ "version": "3.3.1",
+ "resolved":
"https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+ "integrity":
"sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+ "dev": true
+ },
+ "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
+ },
+ "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": {
+ "version": "0.11.10",
+ "resolved":
"https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+ "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
+ "dev": true
+ },
+ "process-nextick-args": {
+ "version": "2.0.0",
+ "resolved":
"https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
+ "integrity":
"sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
+ },
+ "progress": {
+ "version": "2.0.1",
+ "resolved":
"https://registry.npmjs.org/progress/-/progress-2.0.1.tgz",
+ "integrity":
"sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==",
+ "dev": true
+ },
+ "promise": {
+ "version": "7.3.1",
+ "resolved":
"https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
+ "integrity":
"sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
+ "requires": {
+ "asap": "~2.0.3"
+ }
+ },
+ "promise-inflight": {
+ "version": "1.0.1",
+ "resolved":
"https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
+ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
+ "dev": true
+ },
+ "prop-types": {
+ "version": "15.6.2",
+ "resolved":
"https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz",
+ "integrity":
"sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==",
+ "requires": {
+ "loose-envify": "^1.3.1",
+ "object-assign": "^4.1.1"
+ }
+ },
+ "prop-types-extra": {
+ "version": "1.1.0",
+ "resolved":
"https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.0.tgz",
+ "integrity":
"sha512-QFyuDxvMipmIVKD2TwxLVPzMnO4e5oOf1vr3tJIomL8E7d0lr6phTHd5nkPhFIzTD1idBLLEPeylL9g+rrTzRg==",
+ "requires": {
+ "react-is": "^16.3.2",
+ "warning": "^3.0.0"
+ }
+ },
+ "prr": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
+ "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
+ "dev": true
+ },
+ "pseudomap": {
+ "version": "1.0.2",
+ "resolved":
"https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
+ },
+ "psl": {
+ "version": "1.1.31",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz",
+ "integrity":
"sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw=="
+ },
+ "public-encrypt": {
+ "version": "4.0.3",
+ "resolved":
"https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
+ "integrity":
"sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.1.0",
+ "browserify-rsa": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "parse-asn1": "^5.0.0",
+ "randombytes": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "pump": {
+ "version": "2.0.1",
+ "resolved":
"https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
+ "integrity":
"sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
+ "pumpify": {
+ "version": "1.5.1",
+ "resolved":
"https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz",
+ "integrity":
"sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
+ "dev": true,
+ "requires": {
+ "duplexify": "^3.6.0",
+ "inherits": "^2.0.3",
+ "pump": "^2.0.0"
+ }
+ },
+ "punycode": {
+ "version": "1.4.1",
+ "resolved":
"https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
+ },
+ "qs": {
+ "version": "6.5.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+ "integrity":
"sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
+ },
+ "querystring": {
+ "version": "0.2.0",
+ "resolved":
"https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
+ "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
+ "dev": true
+ },
+ "querystring-es3": {
+ "version": "0.2.1",
+ "resolved":
"https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
+ "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
+ "dev": true
+ },
+ "raf": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz",
+ "integrity":
"sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==",
+ "requires": {
+ "performance-now": "^2.1.0"
+ },
+ "dependencies": {
+ "performance-now": {
+ "version": "2.1.0",
+ "resolved":
"https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
+ }
+ }
+ },
+ "randombytes": {
+ "version": "2.0.6",
+ "resolved":
"https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz",
+ "integrity":
"sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "randomfill": {
+ "version": "1.0.4",
+ "resolved":
"https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
+ "integrity":
"sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
+ "dev": true,
+ "requires": {
+ "randombytes": "^2.0.5",
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "react": {
+ "version": "16.6.1",
+ "resolved":
"https://registry.npmjs.org/react/-/react-16.6.1.tgz",
+ "integrity":
"sha512-OtawJThYlvRgm9BXK+xTL7BIlDx8vv21j+fbQDjRRUyok6y7NyjlweGorielTahLZHYIdKUoK2Dp9ByVWuMqxw==",
+ "requires": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1",
+ "prop-types": "^15.6.2",
+ "scheduler": "^0.11.0"
+ }
+ },
+ "react-bootstrap": {
+ "version": "0.32.4",
+ "resolved":
"https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-0.32.4.tgz",
+ "integrity":
"sha512-xj+JfaPOvnvr3ow0aHC7Y3HaBKZNR1mm361hVxVzVX3fcdJNIrfiodbQ0m9nLBpNxiKG6FTU2lq/SbTDYT2vew==",
+ "requires": {
+ "@babel/runtime-corejs2": "^7.0.0",
+ "classnames": "^2.2.5",
+ "dom-helpers": "^3.2.0",
+ "invariant": "^2.2.4",
+ "keycode": "^2.2.0",
+ "prop-types": "^15.6.1",
+ "prop-types-extra": "^1.0.1",
+ "react-overlays": "^0.8.0",
+ "react-prop-types": "^0.4.0",
+ "react-transition-group": "^2.0.0",
+ "uncontrollable": "^5.0.0",
+ "warning": "^3.0.0"
+ }
+ },
+ "react-bootstrap-switch": {
+ "version": "15.5.3",
+ "resolved":
"https://registry.npmjs.org/react-bootstrap-switch/-/react-bootstrap-switch-15.5.3.tgz",
+ "integrity": "sha1-lyh3kdTsDRiS0UJULn5SSAArElE="
+ },
+ "react-bootstrap-typeahead": {
+ "version": "3.2.4",
+ "resolved":
"https://registry.npmjs.org/react-bootstrap-typeahead/-/react-bootstrap-typeahead-3.2.4.tgz",
+ "integrity":
"sha512-wFXIKbOHY4Q1AtnhSQIAnUvSDxmcFdDc5wIX/yd7YJug2jL5TvKspJ3XfX/FaWEWyn1pgHukRuFGnbYnL8rtUQ==",
+ "requires": {
+ "classnames": "^2.2.0",
+ "escape-string-regexp": "^1.0.5",
+ "invariant": "^2.2.1",
+ "lodash": "^4.17.2",
+ "prop-types": "^15.5.8",
+ "prop-types-extra": "^1.0.1",
+ "react-onclickoutside": "^6.1.1",
+ "react-overlays": "^0.8.1",
+ "react-popper": "^1.0.0",
+ "warning": "^4.0.1"
+ },
+ "dependencies": {
+ "warning": {
+ "version": "4.0.2",
+ "resolved":
"https://registry.npmjs.org/warning/-/warning-4.0.2.tgz",
+ "integrity":
"sha512-wbTp09q/9C+jJn4KKJfJfoS6VleK/Dti0yqWSm6KMvJ4MRCXFQNapHuJXutJIrWV0Cf4AhTdeIe4qdKHR1+Hug==",
+ "requires": {
+ "loose-envify": "^1.0.0"
+ }
+ }
+ }
+ },
+ "react-c3js": {
+ "version": "0.1.20",
+ "resolved":
"https://registry.npmjs.org/react-c3js/-/react-c3js-0.1.20.tgz",
+ "integrity":
"sha512-+jtEKJj6bFfD0pj3Vx0dDexpK3uGnZ/kLeJiuXYLBdHppx4tzpwAfMBDlQYQ5m4dqDi7jaovFaL2GX8vZRi+Gw==",
+ "requires": {
+ "c3": "^0.4.11"
+ }
+ },
+ "react-click-outside": {
+ "version": "3.0.1",
+ "resolved":
"https://registry.npmjs.org/react-click-outside/-/react-click-outside-3.0.1.tgz",
+ "integrity":
"sha512-d0KWFvBt+esoZUF15rL2UBB7jkeAqLU8L/Ny35oLK6fW6mIbOv/ChD+ExF4sR9PD26kVx+9hNfD0FTIqRZEyRQ==",
+ "requires": {
+ "hoist-non-react-statics": "^2.1.1"
+ }
+ },
+ "react-collapse": {
+ "version": "4.0.3",
+ "resolved":
"https://registry.npmjs.org/react-collapse/-/react-collapse-4.0.3.tgz",
+ "integrity":
"sha512-OO4NhtEqFtz+1ma31J1B7+ezdRnzHCZiTGSSd/Pxoks9hxrZYhzFEddeYt05A/1477xTtdrwo7xEa2FLJyWGCQ==",
+ "requires": {
+ "prop-types": "^15.5.8"
+ }
+ },
+ "react-debounce-input": {
+ "version": "3.2.0",
+ "resolved":
"https://registry.npmjs.org/react-debounce-input/-/react-debounce-input-3.2.0.tgz",
+ "integrity": "sha1-aXjGBh2Jj1SfQEF/sNLrvs9Qqqo=",
+ "requires": {
+ "lodash.debounce": "^4",
+ "prop-types": "^15"
+ }
+ },
+ "react-dom": {
+ "version": "16.6.1",
+ "resolved":
"https://registry.npmjs.org/react-dom/-/react-dom-16.6.1.tgz",
+ "integrity":
"sha512-zm+wBuEMGm009Wt1uE4Zw5KcXOW7qC4E/xW/fpJsCsbOco4U/R84u+DzzO/S4SYSdNBcqcaulcp4w3FXl8pImw==",
+ "requires": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1",
+ "prop-types": "^15.6.2",
+ "scheduler": "^0.11.0"
+ }
+ },
+ "react-ellipsis-with-tooltip": {
+ "version": "1.0.8",
+ "resolved":
"https://registry.npmjs.org/react-ellipsis-with-tooltip/-/react-ellipsis-with-tooltip-1.0.8.tgz",
+ "integrity":
"sha512-GdEYrrvS/iPYVAufShdJz8gtwG5kZNxlBh1Kb/LjCwYgNwGmRlCbVEmXS///bHrbhXoSxnzYbymGHFyYKR4Q6A==",
+ "requires": {
+ "uuid": "^3.1.0"
+ }
+ },
+ "react-fontawesome": {
+ "version": "1.6.1",
+ "resolved":
"https://registry.npmjs.org/react-fontawesome/-/react-fontawesome-1.6.1.tgz",
+ "integrity": "sha1-7dzhfn3HMaoJ/UoYZoimF5OhbFw=",
+ "requires": {
+ "prop-types": "^15.5.6"
+ }
+ },
+ "react-is": {
+ "version": "16.6.3",
+ "resolved":
"https://registry.npmjs.org/react-is/-/react-is-16.6.3.tgz",
+ "integrity":
"sha512-u7FDWtthB4rWibG/+mFbVd5FvdI20yde86qKGx4lVUTWmPlSWQ4QxbBIrrs+HnXGbxOUlUzTAP/VDmvCwaP2yA=="
+ },
+ "react-lifecycles-compat": {
+ "version": "3.0.4",
+ "resolved":
"https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz",
+ "integrity":
"sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA=="
+ },
+ "react-motion": {
+ "version": "0.5.2",
+ "resolved":
"https://registry.npmjs.org/react-motion/-/react-motion-0.5.2.tgz",
+ "integrity":
"sha512-9q3YAvHoUiWlP3cK0v+w1N5Z23HXMj4IF4YuvjvWegWqNPfLXsOBE/V7UvQGpXxHFKRQQcNcVQE31g9SB/6qgQ==",
+ "requires": {
+ "performance-now": "^0.2.0",
+ "prop-types": "^15.5.8",
+ "raf": "^3.1.0"
+ }
+ },
+ "react-onclickoutside": {
+ "version": "6.7.1",
+ "resolved":
"https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.7.1.tgz",
+ "integrity":
"sha512-p84kBqGaMoa7VYT0vZ/aOYRfJB+gw34yjpda1Z5KeLflg70HipZOT+MXQenEhdkPAABuE2Astq4zEPdMqUQxcg=="
+ },
+ "react-overlays": {
+ "version": "0.8.3",
+ "resolved":
"https://registry.npmjs.org/react-overlays/-/react-overlays-0.8.3.tgz",
+ "integrity":
"sha512-h6GT3jgy90PgctleP39Yu3eK1v9vaJAW73GOA/UbN9dJ7aAN4BTZD6793eI1D5U+ukMk17qiqN/wl3diK1Z5LA==",
+ "requires": {
+ "classnames": "^2.2.5",
+ "dom-helpers": "^3.2.1",
+ "prop-types": "^15.5.10",
+ "prop-types-extra": "^1.0.1",
+ "react-transition-group": "^2.2.0",
+ "warning": "^3.0.0"
+ }
+ },
+ "react-popper": {
+ "version": "1.3.0",
+ "resolved":
"https://registry.npmjs.org/react-popper/-/react-popper-1.3.0.tgz",
+ "integrity":
"sha512-Dbn9kwgFzNFRi8yz/i4Qp7d1hkCYhWX6uJOFz0+PoNNm9uJMnFAqSPNgUUCV49L6p5zz5mKtMiudbgIqjAe1uw==",
+ "requires": {
+ "@types/react": "^16.1.0",
+ "babel-runtime": "6.x.x",
+ "create-react-context": "^0.2.1",
+ "popper.js": "^1.14.4",
+ "prop-types": "^15.6.1",
+ "typed-styles": "^0.0.5",
+ "warning": "^3.0.0"
+ }
+ },
+ "react-prop-types": {
+ "version": "0.4.0",
+ "resolved":
"https://registry.npmjs.org/react-prop-types/-/react-prop-types-0.4.0.tgz",
+ "integrity": "sha1-+ZsL+0AGkpya8gUefBQUpcdbk9A=",
+ "requires": {
+ "warning": "^3.0.0"
+ }
+ },
+ "react-transition-group": {
+ "version": "2.5.1",
+ "resolved":
"https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.5.1.tgz",
+ "integrity":
"sha512-8x/CxUL9SjYFmUdzsBPTgtKeCxt7QArjNSte0wwiLtF/Ix/o1nWNJooNy5o9XbHIKS31pz7J5VF2l41TwlvbHQ==",
+ "requires": {
+ "dom-helpers": "^3.3.1",
+ "loose-envify": "^1.4.0",
+ "prop-types": "^15.6.2",
+ "react-lifecycles-compat": "^3.0.4"
+ }
+ },
+ "reactabular-table": {
+ "version": "8.14.0",
+ "resolved":
"https://registry.npmjs.org/reactabular-table/-/reactabular-table-8.14.0.tgz",
+ "integrity":
"sha512-F3qOa7yJCi1hnxsESmo2QBWVl1RQfUfZhMhpG81zOxDQKsk/nsXlq/5aBtQ17NadYI6PDdMNourNs+255GpmFQ==",
+ "requires": {
+ "classnames": "^2.2.5"
+ }
+ },
+ "read-pkg": {
+ "version": "1.1.0",
+ "resolved":
"https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+ "requires": {
+ "load-json-file": "^1.0.0",
+ "normalize-package-data": "^2.3.2",
+ "path-type": "^1.0.0"
+ }
+ },
+ "read-pkg-up": {
+ "version": "1.0.1",
+ "resolved":
"https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
+ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+ "requires": {
+ "find-up": "^1.0.0",
+ "read-pkg": "^1.0.0"
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "resolved":
"http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity":
"sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "readdirp": {
+ "version": "2.2.1",
+ "resolved":
"https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
+ "integrity":
"sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.11",
+ "micromatch": "^3.1.10",
+ "readable-stream": "^2.0.2"
+ }
+ },
+ "recompose": {
+ "version": "0.30.0",
+ "resolved":
"https://registry.npmjs.org/recompose/-/recompose-0.30.0.tgz",
+ "integrity":
"sha512-ZTrzzUDa9AqUIhRk4KmVFihH0rapdCSMFXjhHbNrjAWxBuUD/guYlyysMnuHjlZC/KRiOKRtB4jf96yYSkKE8w==",
+ "requires": {
+ "@babel/runtime": "^7.0.0",
+ "change-emitter": "^0.1.2",
+ "fbjs": "^0.8.1",
+ "hoist-non-react-statics": "^2.3.1",
+ "react-lifecycles-compat": "^3.0.2",
+ "symbol-observable": "^1.0.4"
+ }
+ },
+ "redent": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
+ "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+ "requires": {
+ "indent-string": "^2.1.0",
+ "strip-indent": "^1.0.1"
+ }
+ },
+ "regenerate": {
+ "version": "1.4.0",
+ "resolved":
"https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
+ "integrity":
"sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==",
+ "dev": true
+ },
+ "regenerate-unicode-properties": {
+ "version": "7.0.0",
+ "resolved":
"https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz",
+ "integrity":
"sha512-s5NGghCE4itSlUS+0WUj88G6cfMVMmH8boTPNvABf8od+2dhT9WDlWu8n01raQAJZMOK8Ch6jSexaRO7swd6aw==",
+ "dev": true,
+ "requires": {
+ "regenerate": "^1.4.0"
+ }
+ },
+ "regenerator-runtime": {
+ "version": "0.12.1",
+ "resolved":
"https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz",
+ "integrity":
"sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg=="
+ },
+ "regenerator-transform": {
+ "version": "0.13.3",
+ "resolved":
"https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.13.3.tgz",
+ "integrity":
"sha512-5ipTrZFSq5vU2YoGoww4uaRVAK4wyYC4TSICibbfEPOruUu8FFP7ErV0BjmbIOEpn3O/k9na9UEdYR/3m7N6uA==",
+ "dev": true,
+ "requires": {
+ "private": "^0.1.6"
+ }
+ },
+ "regex-not": {
+ "version": "1.0.2",
+ "resolved":
"https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity":
"sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "^3.0.2",
+ "safe-regex": "^1.1.0"
+ }
+ },
+ "regexpp": {
+ "version": "2.0.1",
+ "resolved":
"https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz",
+ "integrity":
"sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==",
+ "dev": true
+ },
+ "regexpu-core": {
+ "version": "4.2.0",
+ "resolved":
"https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.2.0.tgz",
+ "integrity":
"sha512-Z835VSnJJ46CNBttalHD/dB+Sj2ezmY6Xp38npwU87peK6mqOzOpV8eYktdkLTEkzzD+JsTcxd84ozd8I14+rw==",
+ "dev": true,
+ "requires": {
+ "regenerate": "^1.4.0",
+ "regenerate-unicode-properties": "^7.0.0",
+ "regjsgen": "^0.4.0",
+ "regjsparser": "^0.3.0",
+ "unicode-match-property-ecmascript": "^1.0.4",
+ "unicode-match-property-value-ecmascript": "^1.0.2"
+ }
+ },
+ "regjsgen": {
+ "version": "0.4.0",
+ "resolved":
"https://registry.npmjs.org/regjsgen/-/regjsgen-0.4.0.tgz",
+ "integrity":
"sha512-X51Lte1gCYUdlwhF28+2YMO0U6WeN0GLpgpA7LK7mbdDnkQYiwvEpmpe0F/cv5L14EbxgrdayAG3JETBv0dbXA==",
+ "dev": true
+ },
+ "regjsparser": {
+ "version": "0.3.0",
+ "resolved":
"https://registry.npmjs.org/regjsparser/-/regjsparser-0.3.0.tgz",
+ "integrity":
"sha512-zza72oZBBHzt64G7DxdqrOo/30bhHkwMUoT0WqfGu98XLd7N+1tsy5MJ96Bk4MD0y74n629RhmrGW6XlnLLwCA==",
+ "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.3",
+ "resolved":
"https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
+ "integrity":
"sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
+ "dev": true
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved":
"https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved":
"https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "requires": {
+ "is-finite": "^1.0.0"
+ }
+ },
+ "request": {
+ "version": "2.88.0",
+ "resolved":
"https://registry.npmjs.org/request/-/request-2.88.0.tgz",
+ "integrity":
"sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
+ "requires": {
+ "aws-sign2": "~0.7.0",
+ "aws4": "^1.8.0",
+ "caseless": "~0.12.0",
+ "combined-stream": "~1.0.6",
+ "extend": "~3.0.2",
+ "forever-agent": "~0.6.1",
+ "form-data": "~2.3.2",
+ "har-validator": "~5.1.0",
+ "http-signature": "~1.2.0",
+ "is-typedarray": "~1.0.0",
+ "isstream": "~0.1.2",
+ "json-stringify-safe": "~5.0.1",
+ "mime-types": "~2.1.19",
+ "oauth-sign": "~0.9.0",
+ "performance-now": "^2.1.0",
+ "qs": "~6.5.2",
+ "safe-buffer": "^5.1.2",
+ "tough-cookie": "~2.4.3",
+ "tunnel-agent": "^0.6.0",
+ "uuid": "^3.3.2"
+ },
+ "dependencies": {
+ "performance-now": {
+ "version": "2.1.0",
+ "resolved":
"https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
+ }
+ }
+ },
+ "require-directory": {
+ "version": "2.1.1",
+ "resolved":
"https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
+ },
+ "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="
+ },
+ "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.0"
+ }
+ },
+ "resolve": {
+ "version": "1.8.1",
+ "resolved":
"https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz",
+ "integrity":
"sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==",
+ "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.0",
+ "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
+ },
+ "rimraf": {
+ "version": "2.6.2",
+ "resolved":
"https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
+ "integrity":
"sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
+ "requires": {
+ "glob": "^7.0.5"
+ }
+ },
+ "ripemd160": {
+ "version": "2.0.2",
+ "resolved":
"https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
+ "integrity":
"sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
+ "dev": true,
+ "requires": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1"
+ }
+ },
+ "run-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"
+ }
+ },
+ "run-queue": {
+ "version": "1.0.3",
+ "resolved":
"https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz",
+ "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=",
+ "dev": true,
+ "requires": {
+ "aproba": "^1.1.1"
+ }
+ },
+ "rxjs": {
+ "version": "6.3.3",
+ "resolved":
"https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz",
+ "integrity":
"sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==",
+ "dev": true,
+ "requires": {
+ "tslib": "^1.9.0"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved":
"https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity":
"sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ },
+ "safe-regex": {
+ "version": "1.1.0",
+ "resolved":
"https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "dev": true,
+ "requires": {
+ "ret": "~0.1.10"
+ }
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "resolved":
"https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity":
"sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+ },
+ "sass-graph": {
+ "version": "2.2.4",
+ "resolved":
"https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz",
+ "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=",
+ "requires": {
+ "glob": "^7.0.0",
+ "lodash": "^4.0.0",
+ "scss-tokenizer": "^0.2.3",
+ "yargs": "^7.0.0"
+ }
+ },
+ "sass-loader": {
+ "version": "7.1.0",
+ "resolved":
"https://registry.npmjs.org/sass-loader/-/sass-loader-7.1.0.tgz",
+ "integrity":
"sha512-+G+BKGglmZM2GUSfT9TLuEp6tzehHPjAMoRRItOojWIqIGPloVCMhNIQuG639eJ+y033PaGTSjLaTHts8Kw79w==",
+ "dev": true,
+ "requires": {
+ "clone-deep": "^2.0.1",
+ "loader-utils": "^1.0.1",
+ "lodash.tail": "^4.1.1",
+ "neo-async": "^2.5.0",
+ "pify": "^3.0.0",
+ "semver": "^5.5.0"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "3.0.0",
+ "resolved":
"https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "dev": true
+ }
+ }
+ },
+ "scheduler": {
+ "version": "0.11.3",
+ "resolved":
"https://registry.npmjs.org/scheduler/-/scheduler-0.11.3.tgz",
+ "integrity":
"sha512-i9X9VRRVZDd3xZw10NY5Z2cVMbdYg6gqFecfj79USv1CFN+YrJ3gIPRKf1qlY+Sxly4djoKdfx1T+m9dnRB8kQ==",
+ "requires": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1"
+ }
+ },
+ "schema-utils": {
+ "version": "0.4.7",
+ "resolved":
"https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz",
+ "integrity":
"sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.1.0",
+ "ajv-keywords": "^3.1.0"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "6.5.4",
+ "resolved":
"https://registry.npmjs.org/ajv/-/ajv-6.5.4.tgz",
+ "integrity":
"sha512-4Wyjt8+t6YszqaXnLDfMmG/8AlO5Zbcsy3ATHncCzjW/NoPzAId8AK6749Ybjmdt+kUY1gP60fCu46oDxPv/mg==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^2.0.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "fast-deep-equal": {
+ "version": "2.0.1",
+ "resolved":
"https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
+ "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
+ "dev": true
+ },
+ "json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved":
"https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity":
"sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ }
+ }
+ },
+ "scss-tokenizer": {
+ "version": "0.2.3",
+ "resolved":
"https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz",
+ "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=",
+ "requires": {
+ "js-base64": "^2.1.8",
+ "source-map": "^0.4.2"
+ }
+ },
+ "semver": {
+ "version": "5.6.0",
+ "resolved":
"https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
+ "integrity":
"sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg=="
+ },
+ "serialize-javascript": {
+ "version": "1.5.0",
+ "resolved":
"https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz",
+ "integrity":
"sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==",
+ "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="
+ },
+ "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.3",
+ "split-string": "^3.0.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved":
"https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "setimmediate": {
+ "version": "1.0.5",
+ "resolved":
"https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
+ "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU="
+ },
+ "sha.js": {
+ "version": "2.4.11",
+ "resolved":
"http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
+ "integrity":
"sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "shallow-clone": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz",
+ "integrity":
"sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.1",
+ "kind-of": "^5.0.0",
+ "mixin-object": "^2.0.1"
+ },
+ "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
+ }
+ }
+ },
+ "shebang-command": {
+ "version": "1.2.0",
+ "resolved":
"https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^1.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+ "dev": true
+ },
+ "signal-exit": {
+ "version": "3.0.2",
+ "resolved":
"https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
+ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
+ },
+ "sizzle": {
+ "version": "2.3.3",
+ "resolved":
"https://registry.npmjs.org/sizzle/-/sizzle-2.3.3.tgz",
+ "integrity": "sha1-TrB4w3IxpWtS5Bk/cB5++JN+YGs=",
+ "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"
+ },
+ "dependencies": {
+ "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
+ }
+ }
+ },
+ "snapdragon": {
+ "version": "0.8.2",
+ "resolved":
"https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity":
"sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "dev": true,
+ "requires": {
+ "base": "^0.11.1",
+ "debug": "^2.2.0",
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "map-cache": "^0.2.2",
+ "source-map": "^0.5.6",
+ "source-map-resolve": "^0.5.0",
+ "use": "^3.1.0"
+ },
+ "dependencies": {
+ "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"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved":
"https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved":
"https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved":
"https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "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
+ }
+ }
+ },
+ "snapdragon-node": {
+ "version": "2.1.1",
+ "resolved":
"https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity":
"sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "dev": true,
+ "requires": {
+ "define-property": "^1.0.0",
+ "isobject": "^3.0.0",
+ "snapdragon-util": "^3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity":
"sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity":
"sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved":
"https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity":
"sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ }
+ }
+ },
+ "snapdragon-util": {
+ "version": "3.0.1",
+ "resolved":
"https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity":
"sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.2.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved":
"https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "sortabular": {
+ "version": "1.6.0",
+ "resolved":
"https://registry.npmjs.org/sortabular/-/sortabular-1.6.0.tgz",
+ "integrity":
"sha512-rKOAXc3Z5JXCeMR1FV6Yuh5HSQUAUyMpEBni5qgO84FBv+C9p4yZ4GnHDhFTyfyMCo7qMS+ZF8ffzXApUOzTBg==",
+ "optional": true
+ },
+ "source-list-map": {
+ "version": "2.0.1",
+ "resolved":
"https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
+ "integrity":
"sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.4.4",
+ "resolved":
"https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
+ "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
+ "requires": {
+ "amdefine": ">=0.0.4"
+ }
+ },
+ "source-map-resolve": {
+ "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.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-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.2",
+ "resolved":
"https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.2.tgz",
+ "integrity":
"sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ==",
+ "requires": {
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "spdx-exceptions": {
+ "version": "2.2.0",
+ "resolved":
"https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz",
+ "integrity":
"sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA=="
+ },
+ "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==",
+ "requires": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "spdx-license-ids": {
+ "version": "3.0.1",
+ "resolved":
"https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz",
+ "integrity":
"sha512-TfOfPcYGBB5sDuPn3deByxPhmfegAhpDYKSOXZQN81Oyrrif8ZCodOLzK3AesELnCx03kikhyDwh0pfvvQvF8w=="
+ },
+ "split-string": {
+ "version": "3.1.0",
+ "resolved":
"https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+ "integrity":
"sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "^3.0.0"
+ }
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved":
"https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "sshpk": {
+ "version": "1.16.0",
+ "resolved":
"https://registry.npmjs.org/sshpk/-/sshpk-1.16.0.tgz",
+ "integrity":
"sha512-Zhev35/y7hRMcID/upReIvRse+I9SVhyVre/KTJSJQWMz3C3+G+HpO7m1wK/yckEtujKZ7dS4hkVxAnmHaIGVQ==",
+ "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",
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.0.2",
+ "tweetnacl": "~0.14.0"
+ }
+ },
+ "ssri": {
+ "version": "5.3.0",
+ "resolved":
"https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz",
+ "integrity":
"sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "static-extend": {
+ "version": "0.1.2",
+ "resolved":
"https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "dev": true,
+ "requires": {
+ "define-property": "^0.2.5",
+ "object-copy": "^0.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved":
"https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ }
+ }
+ },
+ "stdio": {
+ "version": "0.2.7",
+ "resolved":
"https://registry.npmjs.org/stdio/-/stdio-0.2.7.tgz",
+ "integrity": "sha1-ocV9oQ/hz6oMO/aDydB0PRtmCDk=",
+ "dev": true
+ },
+ "stdout-stream": {
+ "version": "1.4.1",
+ "resolved":
"https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz",
+ "integrity":
"sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==",
+ "requires": {
+ "readable-stream": "^2.0.1"
+ }
+ },
+ "stream-browserify": {
+ "version": "2.0.1",
+ "resolved":
"https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz",
+ "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=",
+ "dev": true,
+ "requires": {
+ "inherits": "~2.0.1",
+ "readable-stream": "^2.0.2"
+ }
+ },
+ "stream-each": {
+ "version": "1.2.3",
+ "resolved":
"https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz",
+ "integrity":
"sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "^1.1.0",
+ "stream-shift": "^1.0.0"
+ }
+ },
+ "stream-http": {
+ "version": "2.8.3",
+ "resolved":
"https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz",
+ "integrity":
"sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==",
+ "dev": true,
+ "requires": {
+ "builtin-status-codes": "^3.0.0",
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.3.6",
+ "to-arraybuffer": "^1.0.0",
+ "xtend": "^4.0.0"
+ }
+ },
+ "stream-shift": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz",
+ "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=",
+ "dev": true
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "resolved":
"https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "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",
+ "resolved":
"https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity":
"sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved":
"http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ }
+ },
+ "strip-bom": {
+ "version": "2.0.0",
+ "resolved":
"https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "requires": {
+ "is-utf8": "^0.2.0"
+ }
+ },
+ "strip-eof": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
+ "dev": true
+ },
+ "strip-indent": {
+ "version": "1.0.1",
+ "resolved":
"https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
+ "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
+ "requires": {
+ "get-stdin": "^4.0.1"
+ }
+ },
+ "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
+ },
+ "style-loader": {
+ "version": "0.23.1",
+ "resolved":
"https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz",
+ "integrity":
"sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==",
+ "dev": true,
+ "requires": {
+ "loader-utils": "^1.1.0",
+ "schema-utils": "^1.0.0"
+ },
+ "dependencies": {
+ "schema-utils": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+ "integrity":
"sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.1.0",
+ "ajv-errors": "^1.0.0",
+ "ajv-keywords": "^3.1.0"
+ }
+ }
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved":
"https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+ },
+ "symbol-observable": {
+ "version": "1.2.0",
+ "resolved":
"https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz",
+ "integrity":
"sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ=="
+ },
+ "table": {
+ "version": "5.1.0",
+ "resolved":
"https://registry.npmjs.org/table/-/table-5.1.0.tgz",
+ "integrity":
"sha512-e542in22ZLhD/fOIuXs/8yDZ9W61ltF8daM88rkRNtgTIct+vI2fTnAyu/Db2TCfEcI8i7mjZz6meLq0nW7TYg==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.5.3",
+ "lodash": "^4.17.10",
+ "slice-ansi": "1.0.0",
+ "string-width": "^2.1.1"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "6.5.4",
+ "resolved":
"https://registry.npmjs.org/ajv/-/ajv-6.5.4.tgz",
+ "integrity":
"sha512-4Wyjt8+t6YszqaXnLDfMmG/8AlO5Zbcsy3ATHncCzjW/NoPzAId8AK6749Ybjmdt+kUY1gP60fCu46oDxPv/mg==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^2.0.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved":
"https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "fast-deep-equal": {
+ "version": "2.0.1",
+ "resolved":
"https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
+ "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
+ "dev": true
+ },
+ "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
+ },
+ "json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved":
"https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity":
"sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "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-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.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"
+ }
+ }
+ }
+ },
+ "table-resolver": {
+ "version": "4.1.1",
+ "resolved":
"https://registry.npmjs.org/table-resolver/-/table-resolver-4.1.1.tgz",
+ "integrity":
"sha512-eW3Rg2/uBbXzFsj9KXFgWdqnNZsH7m/pPn92LblhVW/Six6emMVizZTH8Sf9JOc2xXBsS58m+tU+s/EHErUjAw==",
+ "requires": {
+ "lodash": "^4.17.4"
+ }
+ },
+ "tapable": {
+ "version": "1.1.0",
+ "resolved":
"https://registry.npmjs.org/tapable/-/tapable-1.1.0.tgz",
+ "integrity":
"sha512-IlqtmLVaZA2qab8epUXbVWRn3aB1imbDMJtjB3nu4X0NqPkcY/JH9ZtCBWKHWPxs8Svi9tyo8w2dBoi07qZbBA==",
+ "dev": true
+ },
+ "tar": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz",
+ "integrity":
"sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==",
+ "requires": {
+ "block-stream": "*",
+ "fstream": "^1.0.12",
+ "inherits": "2"
+ }
+ },
+ "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
+ },
+ "through": {
+ "version": "2.3.8",
+ "resolved":
"http://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
+ "dev": true
+ },
+ "through2": {
+ "version": "2.0.3",
+ "resolved":
"https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
+ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "^2.1.5",
+ "xtend": "~4.0.1"
+ }
+ },
+ "timers-browserify": {
+ "version": "2.0.10",
+ "resolved":
"https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz",
+ "integrity":
"sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==",
+ "dev": true,
+ "requires": {
+ "setimmediate": "^1.0.4"
+ }
+ },
+ "tmp": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+ "integrity":
"sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+ "dev": true,
+ "requires": {
+ "os-tmpdir": "~1.0.2"
+ }
+ },
+ "to-arraybuffer": {
+ "version": "1.0.1",
+ "resolved":
"https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
+ "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
+ "dev": true
+ },
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved":
"https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true
+ },
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved":
"https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved":
"https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "to-regex": {
+ "version": "3.0.2",
+ "resolved":
"https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity":
"sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "dev": true,
+ "requires": {
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "regex-not": "^1.0.2",
+ "safe-regex": "^1.1.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved":
"https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "dev": true,
+ "requires": {
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1"
+ }
+ },
+ "tough-cookie": {
+ "version": "2.4.3",
+ "resolved":
"https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
+ "integrity":
"sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
+ "requires": {
+ "psl": "^1.1.24",
+ "punycode": "^1.4.1"
+ }
+ },
+ "trim-newlines": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
+ "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM="
+ },
+ "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
+ },
+ "true-case-path": {
+ "version": "1.0.3",
+ "resolved":
"https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz",
+ "integrity":
"sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==",
+ "requires": {
+ "glob": "^7.1.2"
+ }
+ },
+ "tslib": {
+ "version": "1.9.3",
+ "resolved":
"https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
+ "integrity":
"sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==",
+ "dev": true
+ },
+ "tty-browserify": {
+ "version": "0.0.0",
+ "resolved":
"https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
+ "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
+ "dev": true
+ },
+ "tunnel-agent": {
+ "version": "0.6.0",
+ "resolved":
"https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+ "requires": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "tweetnacl": {
+ "version": "0.14.5",
+ "resolved":
"https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
+ },
+ "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": {
+ "prelude-ls": "~1.1.2"
+ }
+ },
+ "typed-styles": {
+ "version": "0.0.5",
+ "resolved":
"https://registry.npmjs.org/typed-styles/-/typed-styles-0.0.5.tgz",
+ "integrity":
"sha512-ht+rEe5UsdEBAa3gr64+QjUOqjOLJfWLvl5HZR5Ev9uo/OnD3p43wPeFSB1hNFc13GXQF/JU1Bn0YHLUqBRIlw=="
+ },
+ "typedarray": {
+ "version": "0.0.6",
+ "resolved":
"https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
+ "dev": true
+ },
+ "ua-parser-js": {
+ "version": "0.7.19",
+ "resolved":
"https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.19.tgz",
+ "integrity":
"sha512-T3PVJ6uz8i0HzPxOF9SWzWAlfN/DavlpQqepn22xgve/5QecC+XMCAtmUNnY7C9StehaV6exjUCI801lOI7QlQ=="
+ },
+ "uglify-es": {
+ "version": "3.3.9",
+ "resolved":
"https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz",
+ "integrity":
"sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==",
+ "dev": true,
+ "requires": {
+ "commander": "~2.13.0",
+ "source-map": "~0.6.1"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "2.13.0",
+ "resolved":
"https://registry.npmjs.org/commander/-/commander-2.13.0.tgz",
+ "integrity":
"sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved":
"https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity":
"sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "uglifyjs-webpack-plugin": {
+ "version": "1.3.0",
+ "resolved":
"https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz",
+ "integrity":
"sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw==",
+ "dev": true,
+ "requires": {
+ "cacache": "^10.0.4",
+ "find-cache-dir": "^1.0.0",
+ "schema-utils": "^0.4.5",
+ "serialize-javascript": "^1.4.0",
+ "source-map": "^0.6.1",
+ "uglify-es": "^3.3.4",
+ "webpack-sources": "^1.1.0",
+ "worker-farm": "^1.5.2"
+ },
+ "dependencies": {
+ "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
+ }
+ }
+ },
+ "ultron": {
+ "version": "1.1.1",
+ "resolved":
"https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz",
+ "integrity":
"sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==",
+ "dev": true
+ },
+ "uncontrollable": {
+ "version": "5.1.0",
+ "resolved":
"https://registry.npmjs.org/uncontrollable/-/uncontrollable-5.1.0.tgz",
+ "integrity":
"sha512-5FXYaFANKaafg4IVZXUNtGyzsnYEvqlr9wQ3WpZxFpEUxl29A3H6Q4G1Dnnorvq9TGOGATBApWR4YpLAh+F5hw==",
+ "requires": {
+ "invariant": "^2.2.4"
+ }
+ },
+ "unicode-canonical-property-names-ecmascript": {
+ "version": "1.0.4",
+ "resolved":
"https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
+ "integrity":
"sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==",
+ "dev": true
+ },
+ "unicode-match-property-ecmascript": {
+ "version": "1.0.4",
+ "resolved":
"https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz",
+ "integrity":
"sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==",
+ "dev": true,
+ "requires": {
+ "unicode-canonical-property-names-ecmascript": "^1.0.4",
+ "unicode-property-aliases-ecmascript": "^1.0.4"
+ }
+ },
+ "unicode-match-property-value-ecmascript": {
+ "version": "1.0.2",
+ "resolved":
"https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz",
+ "integrity":
"sha512-Rx7yODZC1L/T8XKo/2kNzVAQaRE88AaMvI1EF/Xnj3GW2wzN6fop9DDWuFAKUVFH7vozkz26DzP0qyWLKLIVPQ==",
+ "dev": true
+ },
+ "unicode-property-aliases-ecmascript": {
+ "version": "1.0.4",
+ "resolved":
"https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz",
+ "integrity":
"sha512-2WSLa6OdYd2ng8oqiGIWnJqyFArvhn+5vgx5GTxMbUYjCYKUcuKS62YLFF0R/BDGlB1yzXjQOLtPAfHsgirEpg==",
+ "dev": true
+ },
+ "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,
+ "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.0"
+ }
+ },
+ "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.1",
+ "to-object-path": "^0.3.0"
+ }
+ }
+ }
+ },
+ "uniq": {
+ "version": "1.0.1",
+ "resolved":
"https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
+ "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=",
+ "dev": true
+ },
+ "unique-filename": {
+ "version": "1.1.1",
+ "resolved":
"https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
+ "integrity":
"sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
+ "dev": true,
+ "requires": {
+ "unique-slug": "^2.0.0"
+ }
+ },
+ "unique-slug": {
+ "version": "2.0.1",
+ "resolved":
"https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz",
+ "integrity":
"sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==",
+ "dev": true,
+ "requires": {
+ "imurmurhash": "^0.1.4"
+ }
+ },
+ "unset-value": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "dev": true,
+ "requires": {
+ "has-value": "^0.3.1",
+ "isobject": "^3.0.0"
+ },
+ "dependencies": {
+ "has-value": {
+ "version": "0.3.1",
+ "resolved":
"https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "dev": true,
+ "requires": {
+ "get-value": "^2.0.3",
+ "has-values": "^0.1.4",
+ "isobject": "^2.0.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved":
"https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "has-values": {
+ "version": "0.1.4",
+ "resolved":
"https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+ "dev": true
+ }
+ }
+ },
+ "upath": {
+ "version": "1.1.0",
+ "resolved":
"https://registry.npmjs.org/upath/-/upath-1.1.0.tgz",
+ "integrity":
"sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==",
+ "dev": true
+ },
+ "uri-js": {
+ "version": "4.2.2",
+ "resolved":
"https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
+ "integrity":
"sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
+ "requires": {
+ "punycode": "^2.1.0"
+ },
+ "dependencies": {
+ "punycode": {
+ "version": "2.1.1",
+ "resolved":
"https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity":
"sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
+ }
+ }
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved":
"https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+ "dev": true
+ },
+ "url": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
+ "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
+ "dev": true,
+ "requires": {
+ "punycode": "1.3.2",
+ "querystring": "0.2.0"
+ },
+ "dependencies": {
+ "punycode": {
+ "version": "1.3.2",
+ "resolved":
"https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
+ "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
+ "dev": true
+ }
+ }
+ },
+ "use": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
+ "integrity":
"sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
+ "dev": true
+ },
+ "util": {
+ "version": "0.10.4",
+ "resolved":
"https://registry.npmjs.org/util/-/util-0.10.4.tgz",
+ "integrity":
"sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3"
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved":
"https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+ },
+ "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,
+ "requires": {
+ "define-properties": "^1.1.2",
+ "object.getownpropertydescriptors": "^2.0.3"
+ }
+ },
+ "uuid": {
+ "version": "3.3.2",
+ "resolved":
"https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
+ "integrity":
"sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA=="
+ },
+ "v8-compile-cache": {
+ "version": "2.0.2",
+ "resolved":
"https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz",
+ "integrity":
"sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw==",
+ "dev": true
+ },
+ "validate-npm-package-license": {
+ "version": "3.0.4",
+ "resolved":
"https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+ "integrity":
"sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+ "requires": {
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
+ }
+ },
+ "verror": {
+ "version": "1.10.0",
+ "resolved":
"https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+ "requires": {
+ "assert-plus": "^1.0.0",
+ "core-util-is": "1.0.2",
+ "extsprintf": "^1.2.0"
+ }
+ },
+ "vm-browserify": {
+ "version": "0.0.4",
+ "resolved":
"https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz",
+ "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=",
+ "dev": true,
+ "requires": {
+ "indexof": "0.0.1"
+ }
+ },
+ "warning": {
+ "version": "3.0.0",
+ "resolved":
"https://registry.npmjs.org/warning/-/warning-3.0.0.tgz",
+ "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=",
+ "requires": {
+ "loose-envify": "^1.0.0"
+ }
+ },
+ "watchpack": {
+ "version": "1.6.0",
+ "resolved":
"https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz",
+ "integrity":
"sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==",
+ "dev": true,
+ "requires": {
+ "chokidar": "^2.0.2",
+ "graceful-fs": "^4.1.2",
+ "neo-async": "^2.5.0"
+ }
+ },
+ "webpack": {
+ "version": "4.22.0",
+ "resolved":
"https://registry.npmjs.org/webpack/-/webpack-4.22.0.tgz",
+ "integrity":
"sha512-2+3EYFqyhPl12buLQ42QPHEEh8BHn3P9ipRvGRHhdfKJ1u9svhZ3QjhIoEdL5SeIhL5gfOZVbBnartYEabkEsg==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/ast": "1.7.8",
+ "@webassemblyjs/helper-module-context": "1.7.8",
+ "@webassemblyjs/wasm-edit": "1.7.8",
+ "@webassemblyjs/wasm-parser": "1.7.8",
+ "acorn": "^5.6.2",
+ "acorn-dynamic-import": "^3.0.0",
+ "ajv": "^6.1.0",
+ "ajv-keywords": "^3.1.0",
+ "chrome-trace-event": "^1.0.0",
+ "enhanced-resolve": "^4.1.0",
+ "eslint-scope": "^4.0.0",
+ "json-parse-better-errors": "^1.0.2",
+ "loader-runner": "^2.3.0",
+ "loader-utils": "^1.1.0",
+ "memory-fs": "~0.4.1",
+ "micromatch": "^3.1.8",
+ "mkdirp": "~0.5.0",
+ "neo-async": "^2.5.0",
+ "node-libs-browser": "^2.0.0",
+ "schema-utils": "^0.4.4",
+ "tapable": "^1.1.0",
+ "uglifyjs-webpack-plugin": "^1.2.4",
+ "watchpack": "^1.5.0",
+ "webpack-sources": "^1.3.0"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "6.5.4",
+ "resolved":
"https://registry.npmjs.org/ajv/-/ajv-6.5.4.tgz",
+ "integrity":
"sha512-4Wyjt8+t6YszqaXnLDfMmG/8AlO5Zbcsy3ATHncCzjW/NoPzAId8AK6749Ybjmdt+kUY1gP60fCu46oDxPv/mg==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^2.0.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "eslint-scope": {
+ "version": "4.0.0",
+ "resolved":
"https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz",
+ "integrity":
"sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==",
+ "dev": true,
+ "requires": {
+ "esrecurse": "^4.1.0",
+ "estraverse": "^4.1.1"
+ }
+ },
+ "fast-deep-equal": {
+ "version": "2.0.1",
+ "resolved":
"https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
+ "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
+ "dev": true
+ },
+ "json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved":
"https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity":
"sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ }
+ }
+ },
+ "webpack-cli": {
+ "version": "3.1.2",
+ "resolved":
"https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.1.2.tgz",
+ "integrity":
"sha512-Cnqo7CeqeSvC6PTdts+dywNi5CRlIPbLx1AoUPK2T6vC1YAugMG3IOoO9DmEscd+Dghw7uRlnzV1KwOe5IrtgQ==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.4.1",
+ "cross-spawn": "^6.0.5",
+ "enhanced-resolve": "^4.1.0",
+ "global-modules-path": "^2.3.0",
+ "import-local": "^2.0.0",
+ "interpret": "^1.1.0",
+ "loader-utils": "^1.1.0",
+ "supports-color": "^5.5.0",
+ "v8-compile-cache": "^2.0.2",
+ "yargs": "^12.0.2"
+ },
+ "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.0"
+ }
+ },
+ "camelcase": {
+ "version": "4.1.0",
+ "resolved":
"https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved":
"https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity":
"sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "cliui": {
+ "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",
+ "strip-ansi": "^4.0.0",
+ "wrap-ansi": "^2.0.0"
+ }
+ },
+ "cross-spawn": {
+ "version": "6.0.5",
+ "resolved":
"https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+ "integrity":
"sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+ "dev": true,
+ "requires": {
+ "nice-try": "^1.0.4",
+ "path-key": "^2.0.1",
+ "semver": "^5.5.0",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
+ }
+ },
+ "decamelize": {
+ "version": "2.0.0",
+ "resolved":
"https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz",
+ "integrity":
"sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==",
+ "dev": true,
+ "requires": {
+ "xregexp": "4.0.0"
+ }
+ },
+ "find-up": {
+ "version": "3.0.0",
+ "resolved":
"https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+ "integrity":
"sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^3.0.0"
+ }
+ },
+ "invert-kv": {
+ "version": "2.0.0",
+ "resolved":
"https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz",
+ "integrity":
"sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved":
"https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true
+ },
+ "lcid": {
+ "version": "2.0.0",
+ "resolved":
"https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz",
+ "integrity":
"sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==",
+ "dev": true,
+ "requires": {
+ "invert-kv": "^2.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "3.0.0",
+ "resolved":
"https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity":
"sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
+ }
+ },
+ "os-locale": {
+ "version": "3.0.1",
+ "resolved":
"https://registry.npmjs.org/os-locale/-/os-locale-3.0.1.tgz",
+ "integrity":
"sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw==",
+ "dev": true,
+ "requires": {
+ "execa": "^0.10.0",
+ "lcid": "^2.0.0",
+ "mem": "^4.0.0"
+ }
+ },
+ "p-limit": {
+ "version": "2.0.0",
+ "resolved":
"https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz",
+ "integrity":
"sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==",
+ "dev": true,
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "3.0.0",
+ "resolved":
"https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity":
"sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^2.0.0"
+ }
+ },
+ "p-try": {
+ "version": "2.0.0",
+ "resolved":
"https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz",
+ "integrity":
"sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==",
+ "dev": true
+ },
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved":
"https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+ "dev": true
+ },
+ "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-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.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"
+ }
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved":
"https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity":
"sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ },
+ "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
+ },
+ "yargs": {
+ "version": "12.0.2",
+ "resolved":
"https://registry.npmjs.org/yargs/-/yargs-12.0.2.tgz",
+ "integrity":
"sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ==",
+ "dev": true,
+ "requires": {
+ "cliui": "^4.0.0",
+ "decamelize": "^2.0.0",
+ "find-up": "^3.0.0",
+ "get-caller-file": "^1.0.1",
+ "os-locale": "^3.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 || ^4.0.0",
+ "yargs-parser": "^10.1.0"
+ }
+ },
+ "yargs-parser": {
+ "version": "10.1.0",
+ "resolved":
"https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz",
+ "integrity":
"sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==",
+ "dev": true,
+ "requires": {
+ "camelcase": "^4.1.0"
+ }
+ }
+ }
+ },
+ "webpack-sources": {
+ "version": "1.3.0",
+ "resolved":
"https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz",
+ "integrity":
"sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==",
+ "dev": true,
+ "requires": {
+ "source-list-map": "^2.0.0",
+ "source-map": "~0.6.1"
+ },
+ "dependencies": {
+ "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
+ }
+ }
+ },
+ "whatwg-fetch": {
+ "version": "3.0.0",
+ "resolved":
"https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz",
+ "integrity":
"sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q=="
+ },
+ "which": {
+ "version": "1.3.1",
+ "resolved":
"https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity":
"sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ },
+ "which-module": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
+ "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8="
+ },
+ "wide-align": {
+ "version": "1.1.3",
+ "resolved":
"https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
+ "integrity":
"sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
+ "requires": {
+ "string-width": "^1.0.2 || 2"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved":
"https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "worker-farm": {
+ "version": "1.6.0",
+ "resolved":
"https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz",
+ "integrity":
"sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==",
+ "dev": true,
+ "requires": {
+ "errno": "~0.1.7"
+ }
+ },
+ "wrap-ansi": {
+ "version": "2.1.0",
+ "resolved":
"http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
+ "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
+ "requires": {
+ "string-width": "^1.0.1",
+ "strip-ansi": "^3.0.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved":
"https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+ },
+ "write": {
+ "version": "0.2.1",
+ "resolved":
"https://registry.npmjs.org/write/-/write-0.2.1.tgz",
+ "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
+ "dev": true,
+ "requires": {
+ "mkdirp": "^0.5.1"
+ }
+ },
+ "ws": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz",
+ "integrity":
"sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==",
+ "dev": true,
+ "requires": {
+ "async-limiter": "~1.0.0",
+ "safe-buffer": "~5.1.0",
+ "ultron": "~1.1.0"
+ }
+ },
+ "xregexp": {
+ "version": "4.0.0",
+ "resolved":
"https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz",
+ "integrity":
"sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==",
+ "dev": true
+ },
+ "xtend": {
+ "version": "4.0.1",
+ "resolved":
"https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
+ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
+ "dev": true
+ },
+ "y18n": {
+ "version": "3.2.1",
+ "resolved":
"https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
+ "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE="
+ },
+ "yallist": {
+ "version": "2.1.2",
+ "resolved":
"https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
+ },
+ "yargs": {
+ "version": "7.1.0",
+ "resolved":
"https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz",
+ "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=",
+ "requires": {
+ "camelcase": "^3.0.0",
+ "cliui": "^3.2.0",
+ "decamelize": "^1.1.1",
+ "get-caller-file": "^1.0.1",
+ "os-locale": "^1.4.0",
+ "read-pkg-up": "^1.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^1.0.1",
+ "set-blocking": "^2.0.0",
+ "string-width": "^1.0.2",
+ "which-module": "^1.0.0",
+ "y18n": "^3.2.1",
+ "yargs-parser": "^5.0.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "3.0.0",
+ "resolved":
"https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+ "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo="
+ }
+ }
+ },
+ "yargs-parser": {
+ "version": "5.0.0",
+ "resolved":
"https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz",
+ "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=",
+ "requires": {
+ "camelcase": "^3.0.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "3.0.0",
+ "resolved":
"https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+ "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo="
+ }
+ }
+ }
+ }
+}
diff --git a/src/cockpit/389-console/package.json b/src/cockpit/389-console/package.json
index 0699691..5ce97c8 100644
--- a/src/cockpit/389-console/package.json
+++ b/src/cockpit/389-console/package.json
@@ -2,11 +2,16 @@
"version": "1.0.0",
"name": "389-console",
"description": "Cockpit plugin for managing 389 Directory Server",
+ "repository": {
+ "type": "git",
+ "url": "https://pagure.io/389-ds-base.git"
+ },
"author": "",
"license": "GPL-3.0-or-later",
"main": "index.js",
"scripts": {
"build": "webpack",
+ "audit-ci": "audit-ci --config audit-ci.json",
"eslint": "eslint --ext .jsx --ext .es6 src/",
"eslint:fix": "eslint --fix --ext .jsx --ext .es6 src/"
},
@@ -15,12 +20,13 @@
"@babel/preset-env": "^7.0.0",
"@babel/preset-react": "^7.0.0",
"ajv": "^6.0.0",
+ "audit-ci": "^1.7.0",
"babel-eslint": "^9.0.0",
"babel-loader": "^8.0.0",
"chrome-remote-interface": "^0.25.5",
"compression-webpack-plugin": "^1.1.11",
"copy-webpack-plugin": "^4.5.2",
- "css-loader": "^0.28.11",
+ "css-loader": "^2.1.1",
"eslint": "^5.4.0",
"eslint-config-standard": "^11.0.0",
"eslint-config-standard-react": "^6.0.0",
@@ -42,16 +48,16 @@
"webpack-cli": "^3.1.0"
},
"dependencies": {
- "patternfly": "3.58.0",
- "patternfly-react": "2.24.5",
- "bootstrap": "4.2.1",
+ "bootstrap": "^4.3.1",
"node-sass": "4.11.0",
+ "patternfly": "^3.59.1",
+ "patternfly-react": "^2.34.3",
+ "prop-types": "15.6.2",
+ "react": "16.6.1",
"react-bootstrap": "0.32.4",
"react-bootstrap-typeahead": "3.2.4",
- "react": "16.6.1",
"react-dom": "16.6.1",
- "prop-types": "15.6.2",
- "table-resolver": "4.1.1",
- "recompose": "0.30.0"
+ "recompose": "0.30.0",
+ "table-resolver": "4.1.1"
}
}
diff --git a/src/cockpit/389-console/src/ds.js b/src/cockpit/389-console/src/ds.js
index 32a97dc..ec57488 100644
--- a/src/cockpit/389-console/src/ds.js
+++ b/src/cockpit/389-console/src/ds.js
@@ -194,22 +194,31 @@ function check_inst_alive (connect_err) {
if (connect_err === undefined) {
connect_err = 0;
}
- cmd = ['status-dirsrv', server_inst];
- cockpit.spawn(cmd, { superuser: true }).done(function () {
- if (connect_err) {
- $("#ds-navigation").hide();
- $(".all-pages").hide();
- $("#no-connect").show();
- } else {
- // if nav page was hidden reset everything
- if ($("#ds-navigation").is(":hidden") ){
+ cmd = [DSCTL, '-j', server_inst, 'status'];
+ cockpit.spawn(cmd, { superuser: true}).
+ done(function(status_data) {
+ var status_json = JSON.parse(status_data);
+ if (status_json.running == true) {
+ if (connect_err) {
+ $("#ds-navigation").hide();
$(".all-pages").hide();
- $("#ds-navigation").show();
- $("#server-content").show();
- $("#server-config").show();
+ $("#no-connect").show();
+ } else {
+ // if nav page was hidden reset everything
+ if ($("#ds-navigation").is(":hidden") ){
+ $(".all-pages").hide();
+ $("#ds-navigation").show();
+ $("#server-content").show();
+ $("#server-config").show();
+ }
+ $("#not-running").hide();
+ $("#no-connect").hide();
}
- $("#not-running").hide();
- $("#no-connect").hide();
+ } else {
+ $("#loading-page").hide();
+ $("#ds-navigation").hide();
+ $(".all-pages").hide();
+ $("#not-running").show();
}
}).fail(function(data) {
$("#loading-page").hide();
diff --git a/src/cockpit/389-console/src/lib/plugins/accountPolicy.jsx
b/src/cockpit/389-console/src/lib/plugins/accountPolicy.jsx
index 2d769d1..3225f5a 100644
--- a/src/cockpit/389-console/src/lib/plugins/accountPolicy.jsx
+++ b/src/cockpit/389-console/src/lib/plugins/accountPolicy.jsx
@@ -1,9 +1,26 @@
+import cockpit from "cockpit";
import React from "react";
-import { noop } from "patternfly-react";
+import {
+ Icon,
+ Modal,
+ Button,
+ Row,
+ Col,
+ Form,
+ noop,
+ FormGroup,
+ FormControl,
+ Checkbox,
+ ControlLabel
+} from "patternfly-react";
+import { Typeahead } from "react-bootstrap-typeahead";
import PropTypes from "prop-types";
import PluginBasicConfig from "./pluginBasicConfig.jsx";
+import { log_cmd } from "../tools.jsx";
import "../../css/ds.css";
+// Use default aacount policy name
+
class AccountPolicy extends React.Component {
componentWillMount(prevProps) {
this.updateFields();
@@ -365,6 +382,31 @@ class AccountPolicy extends React.Component {
}
render() {
+ const {
+ attributes,
+ configArea,
+ configDN,
+ altStateAttrName,
+ alwaysRecordLogin,
+ alwaysRecordLoginAttr,
+ limitAttrName,
+ specAttrName,
+ stateAttrName,
+ newEntry,
+ configEntryModalShow
+ } = this.state;
+
+ let specificPluginCMD = [
+ "dsconf",
+ "-j",
+ "ldapi://%2fvar%2frun%2fslapd-" + this.props.serverId +
".socket",
+ "plugin",
+ "account-policy",
+ "set",
+ "--config-entry",
+ configArea || "delete"
+ ];
+
return (
<div>
<Modal show={configEntryModalShow} onHide={this.closeModal}>
@@ -590,6 +632,7 @@ class AccountPolicy extends React.Component {
cn="Account Policy Plugin"
pluginName="Account Policy"
cmdName="account-policy"
+ specificPluginCMD={specificPluginCMD}
savePluginHandler={this.props.savePluginHandler}
pluginListHandler={this.props.pluginListHandler}
addNotification={this.props.addNotification}
diff --git a/src/cockpit/389-console/src/lib/plugins/attributeUniqueness.jsx
b/src/cockpit/389-console/src/lib/plugins/attributeUniqueness.jsx
index 3d81d58..2a572ac 100644
--- a/src/cockpit/389-console/src/lib/plugins/attributeUniqueness.jsx
+++ b/src/cockpit/389-console/src/lib/plugins/attributeUniqueness.jsx
@@ -1,7 +1,24 @@
+import cockpit from "cockpit";
import React from "react";
-import { noop } from "patternfly-react";
-import PropTypes from "prop-types";
+import {
+ Icon,
+ Modal,
+ Button,
+ Row,
+ Col,
+ Form,
+ Switch,
+ noop,
+ FormGroup,
+ FormControl,
+ Checkbox,
+ ControlLabel
+} from "patternfly-react";
+import { Typeahead } from "react-bootstrap-typeahead";
+import { AttrUniqConfigTable } from "./pluginTables.jsx";
import PluginBasicConfig from "./pluginBasicConfig.jsx";
+import PropTypes from "prop-types";
+import { log_cmd } from "../tools.jsx";
import "../../css/ds.css";
class AttributeUniqueness extends React.Component {
@@ -428,6 +445,20 @@ class AttributeUniqueness extends React.Component {
}
render() {
+ const {
+ configEntryModalShow,
+ configName,
+ attrNames,
+ subtrees,
+ acrossAllSubtrees,
+ configEnabled,
+ topEntryOc,
+ subtreeEnriesOc,
+ newEntry,
+ attributes,
+ objectClasses
+ } = this.state;
+
return (
<div>
<Modal show={configEntryModalShow} onHide={this.closeModal}>
@@ -637,6 +668,7 @@ class AttributeUniqueness extends React.Component {
</div>
</Modal>
<PluginBasicConfig
+ removeSwitch
rows={this.props.rows}
serverId={this.props.serverId}
cn="attribute uniqueness"
diff --git a/src/cockpit/389-console/src/lib/plugins/linkedAttributes.jsx
b/src/cockpit/389-console/src/lib/plugins/linkedAttributes.jsx
index 8a7743c..a36ac21 100644
--- a/src/cockpit/389-console/src/lib/plugins/linkedAttributes.jsx
+++ b/src/cockpit/389-console/src/lib/plugins/linkedAttributes.jsx
@@ -1,7 +1,22 @@
+import cockpit from "cockpit";
import React from "react";
-import { noop } from "patternfly-react";
-import PropTypes from "prop-types";
+import {
+ Icon,
+ Modal,
+ Button,
+ Row,
+ Col,
+ Form,
+ noop,
+ FormGroup,
+ FormControl,
+ ControlLabel
+} from "patternfly-react";
+import { Typeahead } from "react-bootstrap-typeahead";
+import { LinkedAttributesTable } from "./pluginTables.jsx";
import PluginBasicConfig from "./pluginBasicConfig.jsx";
+import PropTypes from "prop-types";
+import { log_cmd } from "../tools.jsx";
import "../../css/ds.css";
class LinkedAttributes extends React.Component {
@@ -311,6 +326,16 @@ class LinkedAttributes extends React.Component {
}
render() {
+ const {
+ configEntryModalShow,
+ configName,
+ linkType,
+ managedType,
+ linkScope,
+ newEntry,
+ attributes
+ } = this.state;
+
return (
<div>
<Modal show={configEntryModalShow} onHide={this.closeModal}>
diff --git a/src/cockpit/389-console/src/lib/plugins/memberOf.jsx
b/src/cockpit/389-console/src/lib/plugins/memberOf.jsx
index 8117da7..b816944 100644
--- a/src/cockpit/389-console/src/lib/plugins/memberOf.jsx
+++ b/src/cockpit/389-console/src/lib/plugins/memberOf.jsx
@@ -21,6 +21,7 @@ import "../../css/ds.css";
class MemberOf extends React.Component {
componentWillMount(prevProps) {
+ this.getObjectClasses();
this.updateFields();
}
@@ -33,6 +34,7 @@ class MemberOf extends React.Component {
constructor(props) {
super(props);
+ this.getObjectClasses = this.getObjectClasses.bind(this);
this.updateFields = this.updateFields.bind(this);
this.handleFieldChange = this.handleFieldChange.bind(this);
this.handleCheckboxChange = this.handleCheckboxChange.bind(this);
@@ -46,11 +48,13 @@ class MemberOf extends React.Component {
this.toggleFixupModal = this.toggleFixupModal.bind(this);
this.state = {
+ objectClasses: [],
+
memberOfAttr: [],
memberOfGroupAttr: [],
memberOfEntryScope: "",
memberOfEntryScopeExcludeSubtree: "",
- memberOfAutoAddOC: "",
+ memberOfAutoAddOC: [],
memberOfAllBackends: false,
memberOfSkipNested: false,
memberOfConfigEntry: "",
@@ -62,7 +66,7 @@ class MemberOf extends React.Component {
configGroupAttr: [],
configEntryScope: "",
configEntryScopeExcludeSubtree: "",
- configAutoAddOC: "",
+ configAutoAddOC: [],
configAllBackends: false,
configSkipNested: false,
newEntry: true,
@@ -130,6 +134,7 @@ class MemberOf extends React.Component {
}
openModal() {
+ this.getObjectClasses();
if (!this.state.memberOfConfigEntry) {
this.setState({
configEntryModalShow: true,
@@ -139,7 +144,7 @@ class MemberOf extends React.Component {
configGroupAttr: [],
configEntryScope: "",
configEntryScopeExcludeSubtree: "",
- configAutoAddOC: "",
+ configAutoAddOC: [],
configAllBackends: false,
configSkipNested: false
});
@@ -220,9 +225,11 @@ class MemberOf extends React.Component {
{ id: value, label: value }
];
}
- this.setState({ configGroupAttr: configGroupAttrObjectList
});
- this.props.toggleLoadingHandler();
+ this.setState({
+ configGroupAttr: configGroupAttrObjectList
+ });
}
+ this.props.toggleLoadingHandler();
})
.fail(_ => {
this.setState({
@@ -233,7 +240,7 @@ class MemberOf extends React.Component {
configGroupAttr: [],
configEntryScope: "",
configEntryScopeExcludeSubtree: "",
- configAutoAddOC: "",
+ configAutoAddOC: [],
configAllBackends: false,
configSkipNested: false
});
@@ -279,8 +286,6 @@ class MemberOf extends React.Component {
configEntryScopeExcludeSubtree || action == "add"
? configEntryScopeExcludeSubtree
: "delete",
- "--autoaddoc",
- configAutoAddOC || action == "add" ? configAutoAddOC :
"delete",
"--allbackends",
configAllBackends ? "on" : "off",
"--skipnested",
@@ -411,8 +416,13 @@ class MemberOf extends React.Component {
this.setState({
memberOfAutoAddOC:
pluginRow["memberofautoaddoc"] === undefined
- ? ""
- : pluginRow["memberofautoaddoc"][0],
+ ? []
+ : [
+ {
+ id: pluginRow["memberofautoaddoc"][0],
+ label: pluginRow["memberofautoaddoc"][0]
+ }
+ ],
memberOfAllBackends: !(
pluginRow["memberofallbackends"] === undefined ||
pluginRow["memberofallbackends"][0] == "off"
@@ -454,7 +464,9 @@ class MemberOf extends React.Component {
{ id: value, label: value }
];
}
- this.setState({ memberOfGroupAttr: memberOfGroupAttrObjectList });
+ this.setState({
+ memberOfGroupAttr: memberOfGroupAttrObjectList
+ });
}
}
}
@@ -492,6 +504,7 @@ class MemberOf extends React.Component {
render() {
const {
+ objectClasses,
memberOfAttr,
memberOfGroupAttr,
memberOfEntryScope,
@@ -526,8 +539,6 @@ class MemberOf extends React.Component {
memberOfEntryScope || "delete",
"--exclude",
memberOfEntryScopeExcludeSubtree || "delete",
- "--autoaddoc",
- memberOfAutoAddOC || "delete",
"--config-entry",
memberOfConfigEntry || "delete",
"--allbackends",
@@ -583,7 +594,9 @@ class MemberOf extends React.Component {
<Form horizontal>
<FormGroup controlId="fixupDN"
key="fixupDN">
<Col sm={3}>
- <ControlLabel>Base
DN</ControlLabel>
+ <ControlLabel title="Base DN that
contains entries to fix up">
+ Base DN
+ </ControlLabel>
</Col>
<Col sm={9}>
<FormControl
@@ -595,7 +608,9 @@ class MemberOf extends React.Component {
</FormGroup>
<FormGroup controlId="fixupFilter"
key="fixupFilter">
<Col sm={3}>
- <ControlLabel>Filter
DN</ControlLabel>
+ <ControlLabel title="Filter for
entries to fix up. If omitted, all entries with objectclass inetuser/inetadmin/nsmemberof
under the specified base will have their memberOf attribute regenerated.">
+ Filter DN
+ </ControlLabel>
</Col>
<Col sm={9}>
<FormControl
@@ -642,7 +657,9 @@ class MemberOf extends React.Component {
<Form horizontal>
<FormGroup controlId="configDN">
<Col sm={3}>
- <ControlLabel>Config
DN</ControlLabel>
+ <ControlLabel title="The config
entry full DN">
+ Config DN
+ </ControlLabel>
</Col>
<Col sm={9}>
<FormControl
@@ -658,7 +675,11 @@ class MemberOf extends React.Component {
controlId="configAttr"
disabled={false}
- <Col
componentClass={ControlLabel} sm={3}>
+ <Col
+ componentClass={ControlLabel}
+ sm={3}
+ title="Specifies the attribute in
the user entry for the Directory Server to manage to reflect group membership
(memberOfAttr)"
+
Attribute
</Col>
<Col sm={9}>
@@ -687,7 +708,11 @@ class MemberOf extends React.Component {
controlId="configGroupAttr"
disabled={false}
- <Col
componentClass={ControlLabel} sm={3}>
+ <Col
+ componentClass={ControlLabel}
+ sm={3}
+ title="Specifies the attribute in
the group entry to use to identify the DNs of group members (memberOfGroupAttr)"
+
Group
Attribute
</Col>
<Col sm={9}>
@@ -722,7 +747,11 @@ class MemberOf extends React.Component {
controlId="configEntryScope"
disabled={false}
- <Col
componentClass={ControlLabel} sm={3}>
+ <Col
+ componentClass={ControlLabel}
+ sm={3}
+ title="Specifies backends or
multiple-nested suffixes for the MemberOf plug-in to work on (memberOfEntryScope)"
+
Entry Scope
</Col>
<Col sm={6}>
@@ -748,7 +777,11 @@ class MemberOf extends React.Component {
controlId="configEntryScopeExcludeSubtree"
disabled={false}
- <Col
componentClass={ControlLabel} sm={3}>
+ <Col
+ componentClass={ControlLabel}
+ sm={3}
+ title="Specifies backends or
multiple-nested suffixes for the MemberOf plug-in to exclude
(memberOfEntryScopeExcludeSubtree)"
+
Entry Scope
Exclude Subtree
</Col>
<Col sm={6}>
@@ -777,13 +810,22 @@ class MemberOf extends React.Component {
<Form horizontal>
<FormGroup
controlId="configAutoAddOC" disabled={false}>
<Col sm={3}>
- <ControlLabel>Auto Add
OC</ControlLabel>
+ <ControlLabel title="If an entry
does not have an object class that allows the memberOf attribute then the memberOf plugin
will automatically add the object class listed in the memberOfAutoAddOC
parameter">
+ Auto Add OC
+ </ControlLabel>
</Col>
<Col sm={9}>
- <FormControl
- type="text"
- value={configAutoAddOC}
- onChange={this.handleFieldChange}
+ <Typeahead
+ allowNew
+ onChange={value => {
+ this.setState({
+ configAutoAddOC: value
+ });
+ }}
+ selected={configAutoAddOC}
+ options={objectClasses}
+ newSelectionPrefix="Add a
memberOf objectClass: "
+ placeholder="Type an
objectClass..."
/>
</Col>
</FormGroup>
@@ -835,7 +877,11 @@ class MemberOf extends React.Component {
controlId="memberOfAttr"
disabled={false}
- <Col
componentClass={ControlLabel} sm={3}>
+ <Col
+ componentClass={ControlLabel}
+ sm={3}
+ title="Specifies the attribute in the user
entry for the Directory Server to manage to reflect group membership (memberOfAttr)"
+
Attribute
</Col>
<Col sm={9}>
@@ -872,7 +918,11 @@ class MemberOf extends React.Component {
controlId="memberOfGroupAttr"
disabled={false}
- <Col
componentClass={ControlLabel} sm={3}>
+ <Col
+ componentClass={ControlLabel}
+ sm={3}
+ title="Specifies the attribute in the group
entry to use to identify the DNs of group members (memberOfGroupAttr)"
+
Group Attribute
</Col>
<Col sm={9}>
@@ -919,7 +969,11 @@ class MemberOf extends React.Component {
controlId="memberOfEntryScope"
disabled={false}
- <Col
componentClass={ControlLabel} sm={3}>
+ <Col
+ componentClass={ControlLabel}
+ sm={3}
+ title="Specifies backends or multiple-nested
suffixes for the MemberOf plug-in to work on (memberOfEntryScope)"
+
Entry Scope
</Col>
<Col sm={6}>
@@ -934,6 +988,7 @@ class MemberOf extends React.Component {
id="memberOfAllBackends"
checked={memberOfAllBackends}
onChange={this.handleCheckboxChange}
+ title="Specifies whether to search the
local suffix for user entries on all available suffixes (memberOfAllBackends)"
All Backends
</Checkbox>
@@ -944,7 +999,11 @@ class MemberOf extends React.Component {
controlId="memberOfEntryScopeExcludeSubtree"
disabled={false}
- <Col
componentClass={ControlLabel} sm={3}>
+ <Col
+ componentClass={ControlLabel}
+ sm={3}
+ title="Specifies backends or multiple-nested
suffixes for the MemberOf plug-in to exclude (memberOfEntryScopeExcludeSubtree)"
+
Entry Scope Exclude
Subtree
</Col>
<Col sm={6}>
@@ -959,6 +1018,7 @@ class MemberOf extends React.Component {
id="memberOfSkipNested"
checked={memberOfSkipNested}
onChange={this.handleCheckboxChange}
+ title="Specifies wherher to skip nested
groups or not (memberOfSkipNested)"
Skip Nested
</Checkbox>
@@ -974,7 +1034,11 @@ class MemberOf extends React.Component {
key="memberOfConfigEntry"
controlId="memberOfConfigEntry"
- <Col
componentClass={ControlLabel} sm={3}>
+ <Col
+ componentClass={ControlLabel}
+ sm={3}
+ title="The value to set as
nsslapd-pluginConfigArea"
+
Shared Config Entry
</Col>
<Col sm={6}>
@@ -1008,10 +1072,17 @@ class MemberOf extends React.Component {
<ControlLabel>Auto Add
OC</ControlLabel>
</Col>
<Col sm={9}>
- <FormControl
- type="text"
- value={memberOfAutoAddOC}
- onChange={this.handleFieldChange}
+ <Typeahead
+ allowNew
+ onChange={value => {
+ this.setState({
+ memberOfAutoAddOC: value
+ });
+ }}
+ selected={memberOfAutoAddOC}
+ options={objectClasses}
+ newSelectionPrefix="Add a memberOf
objectClass: "
+ placeholder="Type an
objectClass..."
/>
</Col>
</FormGroup>
diff --git a/src/cockpit/389-console/src/lib/plugins/pluginBasicConfig.jsx
b/src/cockpit/389-console/src/lib/plugins/pluginBasicConfig.jsx
index e2cb6a7..fe6b962 100644
--- a/src/cockpit/389-console/src/lib/plugins/pluginBasicConfig.jsx
+++ b/src/cockpit/389-console/src/lib/plugins/pluginBasicConfig.jsx
@@ -193,6 +193,7 @@ class PluginBasicConfig extends React.Component {
</ControlLabel>
</h3>
</Col>
+
{this.props.removeSwitch || (
<Col smOffset={1} sm={3}>
<FormGroup key="switchPluginStatus"
controlId="switchPluginStatus">
@@ -327,6 +328,7 @@ PluginBasicConfig.propTypes = {
cn: PropTypes.string,
pluginName: PropTypes.string,
cmdName: PropTypes.string,
+ removeSwitch: PropTypes.bool,
specificPluginCMD: PropTypes.array,
savePluginHandler: PropTypes.func,
pluginListHandler: PropTypes.func,
@@ -340,6 +342,7 @@ PluginBasicConfig.defaultProps = {
cn: "",
pluginName: "",
cmdName: "",
+ removeSwitch: false,
specificPluginCMD: [],
savePluginHandler: noop,
pluginListHandler: noop,
diff --git a/src/cockpit/389-console/src/lib/plugins/referentialIntegrity.jsx
b/src/cockpit/389-console/src/lib/plugins/referentialIntegrity.jsx
index bf3deee..d25e32e 100644
--- a/src/cockpit/389-console/src/lib/plugins/referentialIntegrity.jsx
+++ b/src/cockpit/389-console/src/lib/plugins/referentialIntegrity.jsx
@@ -1,3 +1,4 @@
+import cockpit from "cockpit";
import React from "react";
import {
noop,
@@ -14,6 +15,7 @@ import {
import { Typeahead } from "react-bootstrap-typeahead";
import PropTypes from "prop-types";
import PluginBasicConfig from "./pluginBasicConfig.jsx";
+import { log_cmd } from "../tools.jsx";
import "../../css/ds.css";
class ReferentialIntegrity extends React.Component {
@@ -613,6 +615,7 @@ class ReferentialIntegrity extends React.Component {
cn="referential integrity postoperation"
pluginName="Referential Integrity"
cmdName="referential-integrity"
+ specificPluginCMD={specificPluginCMD}
savePluginHandler={this.props.savePluginHandler}
pluginListHandler={this.props.pluginListHandler}
addNotification={this.props.addNotification}
diff --git a/src/cockpit/389-console/src/lib/plugins/retroChangelog.jsx
b/src/cockpit/389-console/src/lib/plugins/retroChangelog.jsx
index 41eb859..237d9aa 100644
--- a/src/cockpit/389-console/src/lib/plugins/retroChangelog.jsx
+++ b/src/cockpit/389-console/src/lib/plugins/retroChangelog.jsx
@@ -1,7 +1,19 @@
+import cockpit from "cockpit";
import React from "react";
-import { noop } from "patternfly-react";
+import {
+ noop,
+ FormGroup,
+ FormControl,
+ Row,
+ Col,
+ Form,
+ ControlLabel,
+ Checkbox
+} from "patternfly-react";
import PropTypes from "prop-types";
+import { Typeahead } from "react-bootstrap-typeahead";
import PluginBasicConfig from "./pluginBasicConfig.jsx";
+import { log_cmd } from "../tools.jsx";
import "../../css/ds.css";
class RetroChangelog extends React.Component {
@@ -147,6 +159,7 @@ class RetroChangelog extends React.Component {
cn="Retro Changelog Plugin"
pluginName="Retro Changelog"
cmdName="retro-changelog"
+ specificPluginCMD={specificPluginCMD}
savePluginHandler={this.props.savePluginHandler}
pluginListHandler={this.props.pluginListHandler}
addNotification={this.props.addNotification}
diff --git a/src/cockpit/389-console/src/lib/plugins/rootDNAccessControl.jsx
b/src/cockpit/389-console/src/lib/plugins/rootDNAccessControl.jsx
index d1bac89..bdd8483 100644
--- a/src/cockpit/389-console/src/lib/plugins/rootDNAccessControl.jsx
+++ b/src/cockpit/389-console/src/lib/plugins/rootDNAccessControl.jsx
@@ -98,6 +98,65 @@ class RootDNAccessControl extends React.Component {
}
render() {
+ const {
+ allowHost,
+ denyHost,
+ allowIP,
+ denyIP,
+ openTime,
+ closeTime,
+ daysAllowed
+ } = this.state;
+
+ let specificPluginCMD = [
+ "dsconf",
+ "-j",
+ "ldapi://%2fvar%2frun%2fslapd-" + this.props.serverId +
".socket",
+ "plugin",
+ "root-dn",
+ "set",
+ "--open-time",
+ openTime || "delete",
+ "--close-time",
+ closeTime || "delete",
+ "--days-allowed",
+ daysAllowed || "delete"
+ ];
+
+ // Delete attributes if the user set an empty value to the field
+ specificPluginCMD = [...specificPluginCMD, "--allow-host"];
+ if (allowHost.length != 0) {
+ for (let value of allowHost) {
+ specificPluginCMD = [...specificPluginCMD, value.label];
+ }
+ } else {
+ specificPluginCMD = [...specificPluginCMD, "delete"];
+ }
+ specificPluginCMD = [...specificPluginCMD, "--deny-host"];
+ if (denyHost.length != 0) {
+ for (let value of denyHost) {
+ specificPluginCMD = [...specificPluginCMD, value.label];
+ }
+ } else {
+ specificPluginCMD = [...specificPluginCMD, "delete"];
+ }
+ specificPluginCMD = [...specificPluginCMD, "--allow-ip"];
+ if (allowIP.length != 0) {
+ for (let value of allowIP) {
+ specificPluginCMD = [...specificPluginCMD, value.label];
+ }
+ } else {
+ specificPluginCMD = [...specificPluginCMD, "delete"];
+ }
+ specificPluginCMD = [...specificPluginCMD, "--allow-host"];
+ if (allowHost.length != 0) {
+ for (let value of allowHost) {
+ specificPluginCMD = [...specificPluginCMD, value.label];
+ }
+ } else {
+ specificPluginCMD = [...specificPluginCMD, "delete"];
+ }
+
return (
<div>
<PluginBasicConfig
@@ -106,6 +165,7 @@ class RootDNAccessControl extends React.Component {
cn="RootDN Access Control"
pluginName="RootDN Access Control"
cmdName="root-dn"
+ specificPluginCMD={specificPluginCMD}
savePluginHandler={this.props.savePluginHandler}
pluginListHandler={this.props.pluginListHandler}
addNotification={this.props.addNotification}
diff --git a/src/cockpit/389-console/src/plugins.jsx
b/src/cockpit/389-console/src/plugins.jsx
index 1dc267c..0523614 100644
--- a/src/cockpit/389-console/src/plugins.jsx
+++ b/src/cockpit/389-console/src/plugins.jsx
@@ -4,7 +4,7 @@ import PropTypes from "prop-types";
import { log_cmd } from "./lib/tools.jsx";
import { Col, Row, Tab, Nav, NavItem, Spinner } from "patternfly-react";
import PluginEditModal from "./lib/plugins/pluginModal.jsx";
-import PluginTable from "./lib/plugins/pluginTable.jsx";
+import { PluginTable } from "./lib/plugins/pluginTables.jsx";
import AccountPolicy from "./lib/plugins/accountPolicy.jsx";
import AttributeUniqueness from "./lib/plugins/attributeUniqueness.jsx";
import AutoMembership from "./lib/plugins/autoMembership.jsx";
@@ -17,6 +17,7 @@ import ReferentialIntegrity from
"./lib/plugins/referentialIntegrity.jsx";
import RetroChangelog from "./lib/plugins/retroChangelog.jsx";
import RootDNAccessControl from "./lib/plugins/rootDNAccessControl.jsx";
import USN from "./lib/plugins/usn.jsx";
+import WinSync from "./lib/plugins/winsync.jsx";
import { NotificationController } from "./lib/notifications.jsx";
import "./css/ds.css";
@@ -341,10 +342,10 @@ export class Plugins extends React.Component {
/>
)
},
- autoMembership: {
- name: "Auto Membership",
+ linkedAttributes: {
+ name: "Linked Attributes",
component: (
- <AutoMembership
+ <LinkedAttributes
rows={this.state.rows}
serverId={this.props.serverId}
savePluginHandler={this.savePlugin}
@@ -367,10 +368,10 @@ export class Plugins extends React.Component {
/>
)
},
- linkedAttributes: {
- name: "Linked Attributes",
+ autoMembership: {
+ name: "Auto Membership",
component: (
- <LinkedAttributes
+ <AutoMembership
rows={this.state.rows}
serverId={this.props.serverId}
savePluginHandler={this.savePlugin}
@@ -419,6 +420,19 @@ export class Plugins extends React.Component {
/>
)
},
+ winsync: {
+ name: "Posix Winsync",
+ component: (
+ <WinSync
+ rows={this.state.rows}
+ serverId={this.props.serverId}
+ savePluginHandler={this.savePlugin}
+ pluginListHandler={this.pluginList}
+ addNotification={this.addNotification}
+ toggleLoadingHandler={this.toggleLoading}
+ />
+ )
+ },
referentialIntegrity: {
name: "Referential Integrity",
component: (
diff --git a/src/cockpit/389-console/src/servers.js
b/src/cockpit/389-console/src/servers.js
index f23b785..1aa9783 100644
--- a/src/cockpit/389-console/src/servers.js
+++ b/src/cockpit/389-console/src/servers.js
@@ -410,7 +410,7 @@ function save_config() {
}
function do_backup(server_inst, backup_name) {
- var cmd = ['status-dirsrv', server_inst];
+ var cmd = [DSCTL, '-j', server_inst, 'status'];
$("#backup-spinner").show();
cockpit.spawn(cmd, { superuser: true}).
done(function(status_data) {
@@ -444,18 +444,7 @@ function do_backup(server_inst, backup_name) {
}
}).
fail(function() {
- var cmd = [DSCTL, server_inst, 'db2bak', backup_name];
- log_cmd('#ds-backup-btn (click)', 'Backup server instance (offline)',
cmd);
- cockpit.spawn(cmd, { superuser: true, "err": "message",
"environ": [ENV]}).
- done(function(data) {
- $("#backup-spinner").hide();
- popup_success("Backup has been created");
- $("#backup-form").modal('toggle');
- }).
- fail(function(data) {
- $("#backup-spinner").hide();
- popup_err("Failed to backup the server", data.message);
- });
+ popup_err("Failed to check the server status", data.message);
});
}
@@ -525,7 +514,7 @@ $(document).ready( function() {
document.getElementById("remove-server-btn").addEventListener("click",
function() {
popup_confirm("Are you sure you want to this remove instance:
<b>" + server_id + "</b>", "Confirmation", function
(yes) {
if (yes) {
- var cmd = [DSCTL, server_id, "remove", "--do-it"];
+ var cmd = [DSCTL, server_inst, "remove", "--do-it"];
$("#ds-remove-inst").html("<span class=\"spinner
spinner-xs spinner-inline\"></span> Removing instance <b>" +
server_id + "</b>...");
$("#remove-instance-form").modal('toggle');
log_cmd('#remove-server-btn (click)', 'Remove instance',
cmd);
@@ -1328,8 +1317,8 @@ $(document).ready( function() {
}
// First check if backup name is already used
- var check_cmd = [DSCTL, '-j', server_id, 'backups'];
- log_cmd('#ds-backup-btn (click)', 'Check backup name', check_cmd);
+ var check_cmd = [DSCTL, '-j', server_inst, 'backups'];
+ log_cmd('#restore-server-btn (click)', 'Restore server instance',
check_cmd);
cockpit.spawn(check_cmd, { superuser: true, "err": "message",
"environ": [ENV]}).done(function(data) {
var obj = JSON.parse(data);
var found_backup = false;
@@ -1359,7 +1348,7 @@ $(document).ready( function() {
/* Restore. load restore table with current backups */
$("#restore-server-btn").on('click', function () {
- var cmd = [DSCTL, '-j', server_id, 'backups'];
+ var cmd = [DSCTL, '-j', server_inst, 'backups'];
log_cmd('#restore-server-btn (click)', 'Restore server instance',
cmd);
cockpit.spawn(cmd, { superuser: true, "err": "message",
"environ": [ENV]}).done(function(data) {
var backup_btn = "<button class=\"btn btn-default restore-btn\"
type=\"button\">Restore</button>";
@@ -1384,36 +1373,41 @@ $(document).ready( function() {
var restore_name = data[0];
popup_confirm("Are you sure you want to restore this backup: <b>"
+ restore_name + "<b>", "Confirmation", function (yes) {
if (yes) {
- var cmd = ['status-dirsrv', server_inst];
+ var cmd = [DSCTL, '-j', server_inst, 'status'];
$("#restore-spinner").show();
cockpit.spawn(cmd, { superuser: true}).
- done(function() {
- var cmd = [DSCONF, server_inst, 'backup', 'restore',
restore_name];
- log_cmd('.restore-btn (click)', 'Restore server
instance(online)', cmd);
- cockpit.spawn(cmd, { superuser: true, "err": "message",
"environ": [ENV]}).
- done(function(data) {
- $("#restore-spinner").hide();
- popup_success("The backup has been restored");
- $("#restore-form").modal('toggle');
- }).
- fail(function(data) {
- $("#restore-spinner").hide();
- popup_err("Failed to restore from the backup", data.message);
- });
+ done(function(status_data) {
+ var status_json = JSON.parse(status_data);
+ if (status_json.running == true) {
+ var cmd = [DSCONF, server_inst, 'backup', 'restore',
restore_name];
+ log_cmd('.restore-btn (click)', 'Restore server
instance(online)', cmd);
+ cockpit.spawn(cmd, { superuser: true, "err": "message",
"environ": [ENV]}).
+ done(function(data) {
+ $("#restore-spinner").hide();
+ popup_success("The backup has been restored");
+ $("#restore-form").modal('toggle');
+ }).
+ fail(function(data) {
+ $("#restore-spinner").hide();
+ popup_err("Failed to restore from the backup", data.message);
+ });
+ } else {
+ var cmd = [DSCTL, server_inst, 'bak2db', restore_name];
+ log_cmd('.restore-btn (click)', 'Restore server
instance(offline)', cmd);
+ cockpit.spawn(cmd, { superuser: true, "err": "message",
"environ": [ENV]}).
+ done(function(data) {
+ $("#restore-spinner").hide();
+ popup_success("The backup has been restored");
+ $("#restore-form").modal('toggle');
+ }).
+ fail(function(data) {
+ $("#restore-spinner").hide();
+ popup_err("Failed to restore from the backup", data.message);
+ });
+ }
}).
fail(function() {
- var cmd = [DSCTL, server_inst, 'bak2db', restore_name];
- log_cmd('.restore-btn (click)', 'Restore server
instance(offline)', cmd);
- cockpit.spawn(cmd, { superuser: true, "err": "message",
"environ": [ENV]}).
- done(function(data) {
- $("#restore-spinner").hide();
- popup_success("The backup has been restored");
- $("#restore-form").modal('toggle');
- }).
- fail(function(data) {
- $("#restore-spinner").hide();
- popup_err("Failed to restore from the backup", data.message);
- });
+ popup_err("Failed to check the server status", data.message);
});
}
});
@@ -1446,9 +1440,9 @@ $(document).ready( function() {
$("#schema-reload-btn").on("click", function () {
var schema_dir = $("#reload-dir").val();
if (schema_dir != ""){
- var cmd = [DSCONF, server_id, 'schema', 'reload',
'--schemadir', schema_dir, '--wait'];
+ var cmd = [DSCONF, server_inst, 'schema', 'reload',
'--schemadir', schema_dir, '--wait'];
} else {
- var cmd = [DSCONF, server_id, 'schema', 'reload',
'--wait'];
+ var cmd = [DSCONF, server_inst, 'schema', 'reload',
'--wait'];
}
$("#reload-spinner").show();
log_cmd('#schema-reload-btn (click)', 'Reload schema files', cmd);
diff --git a/src/cockpit/389-console/webpack.config.js
b/src/cockpit/389-console/webpack.config.js
index d4ac364..8c0b433 100644
--- a/src/cockpit/389-console/webpack.config.js
+++ b/src/cockpit/389-console/webpack.config.js
@@ -32,7 +32,6 @@ var info = {
"index.html",
"replication.html",
"replication.js",
- "rhds-banner.html",
"schema.html",
"schema.js",
"security.html",
diff --git a/src/lib389/cli/dsconf b/src/lib389/cli/dsconf
index 3eba307..c0c0b4d 100755
--- a/src/lib389/cli/dsconf
+++ b/src/lib389/cli/dsconf
@@ -25,6 +25,7 @@ from lib389.cli_conf import directory_manager as cli_directory_manager
from lib389.cli_conf import plugin as cli_plugin
from lib389.cli_conf import schema as cli_schema
from lib389.cli_conf import health as cli_health
+from lib389.cli_conf import monitor as cli_monitor
from lib389.cli_conf import saslmappings as cli_sasl
from lib389.cli_conf import pwpolicy as cli_pwpolicy
from lib389.cli_conf import backup as cli_backup
@@ -82,6 +83,7 @@ cli_chaining.create_parser(subparsers)
cli_config.create_parser(subparsers)
cli_directory_manager.create_parsers(subparsers)
cli_health.create_parser(subparsers)
+cli_monitor.create_parser(subparsers)
cli_plugin.create_parser(subparsers)
cli_pwpolicy.create_parser(subparsers)
cli_replication.create_parser(subparsers)
diff --git a/src/lib389/cli/dscreate b/src/lib389/cli/dscreate
index 8dd145d..4af852b 100755
--- a/src/lib389/cli/dscreate
+++ b/src/lib389/cli/dscreate
@@ -28,8 +28,6 @@ fromfile_parser = subparsers.add_parser('from-file',
help="Create an instance of
fromfile_parser.add_argument('file', help="Inf file to use with prepared
answers. You can generate an example of this with 'dscreate
create-template'")
fromfile_parser.add_argument('-n', '--dryrun', help="Validate system
and configurations only. Do not alter the system.",
action='store_true', default=False)
-fromfile_parser.add_argument('-c', '--containerised', help="Indicate
to the installer that this is running in a container. Used to disable systemd native
components, even if they are installed.",
- action='store_true', default=False)
fromfile_parser.set_defaults(func=cli_instance.instance_create)
interactive_parser = subparsers.add_parser('interactive', help="Start
interactive installer for Directory Server installation")
diff --git a/src/lib389/cli/dsctl b/src/lib389/cli/dsctl
index cad37ae..ed8fc8f 100755
--- a/src/lib389/cli/dsctl
+++ b/src/lib389/cli/dsctl
@@ -14,6 +14,7 @@ import argparse, argcomplete
import logging
import sys
import signal
+import os
from lib389.utils import get_instance_list
from lib389.cli_base import _get_arg
from lib389 import DirSrv
@@ -44,7 +45,10 @@ parser.add_argument('--remove-all', nargs="?",
default=False, const=None,
)
subparsers = parser.add_subparsers(help="action")
-cli_instance.create_parser(subparsers)
+# We can only use the instance tools like start/stop etc in a non-container
+# environment. If we are in a container, we only allow the tasks.
+if not os.path.exists('/data/config/container.inf'):
+ cli_instance.create_parser(subparsers)
cli_dbtasks.create_parser(subparsers)
argcomplete.autocomplete(parser)
@@ -99,11 +103,16 @@ if __name__ == '__main__':
signal.signal(signal.SIGINT, signal_handler)
try:
insts = inst.list(serverid=args.instance)
- except PermissionError:
- log.error("Unable to access instance information. Are you running as
root or dirsrv?")
+ except (PermissionError, IOError) as e:
+ log.error("Unable to access instance information. Are you running as the
correct user? (usually dirsrv or root)")
+ log.error("Error: %s" % str(e))
+ sys.exit(1)
+ except Exception as e:
+ log.error("Error: %s" % str(e))
sys.exit(1)
if len(insts) != 1:
- log.error("No such instance %s" % args.instance)
+ log.error("No such instance '%s'" % args.instance)
+ log.error("Unable to access instance information. Are you running as the
correct user? (usually dirsrv or root)")
sys.exit(1)
inst.allocate(insts[0])
diff --git a/src/lib389/cli/dsidm b/src/lib389/cli/dsidm
index 386bc11..9e5b998 100755
--- a/src/lib389/cli/dsidm
+++ b/src/lib389/cli/dsidm
@@ -22,6 +22,7 @@ from lib389.cli_idm import organizationalunit as cli_ou
from lib389.cli_idm import group as cli_group
from lib389.cli_idm import posixgroup as cli_posixgroup
from lib389.cli_idm import user as cli_user
+from lib389.cli_idm import client_config as cli_client_config
from lib389.cli_base import connect_instance, disconnect_instance, setup_script_logger
from lib389.cli_base.dsrc import dsrc_to_ldap, dsrc_arg_concat
@@ -71,6 +72,7 @@ cli_init.create_parser(subparsers)
cli_ou.create_parser(subparsers)
cli_posixgroup.create_parser(subparsers)
cli_user.create_parser(subparsers)
+cli_client_config.create_parser(subparsers)
argcomplete.autocomplete(parser)
diff --git a/src/lib389/lib389/__init__.py b/src/lib389/lib389/__init__.py
index 0dae5eb..c7324f1 100644
--- a/src/lib389/lib389/__init__.py
+++ b/src/lib389/lib389/__init__.py
@@ -48,7 +48,7 @@ import decimal
import glob
import tarfile
import subprocess
-import collections
+from collections.abc import Callable
import signal
import errno
import pwd
@@ -58,6 +58,10 @@ import json
from shutil import copy2
import six
+# Deprecation
+import warnings
+import inspect
+
from ldap.ldapobject import SimpleLDAPObject
from ldap.cidict import cidict
from ldap import LDAPError
@@ -82,7 +86,9 @@ from lib389.utils import (
ensure_bytes,
ensure_str,
ensure_list_str,
- format_cmd_list)
+ format_cmd_list,
+ selinux_present,
+ selinux_label_port)
from lib389.paths import Paths
from lib389.nss_ssl import NssSsl
from lib389.tasks import BackupTask, RestoreTask
@@ -105,6 +111,8 @@ RE_DBMONATTRSUN = re.compile(r'^([a-zA-Z]+)-([a-zA-Z]+)$')
# This controls pyldap debug levels
TRACE_LEVEL = 0
+DEBUGGING = os.getenv('DEBUGGING', default=False)
+
# My logger
logger = logging.getLogger(__name__)
@@ -131,6 +139,30 @@ def wrapper(f, name):
extract the raw data from the entry object to pass in.
"""
def inner(*args, **kwargs):
+ if name in [
+ 'add_s',
+ 'bind_s',
+ 'delete_s',
+ 'modify_s',
+ 'modrdn_s',
+ 'rename_s',
+ 'sasl_interactive_bind_s',
+ 'search_s',
+ 'search_ext_s',
+ 'simple_bind_s',
+ 'unbind_s',
+ 'getEntry',
+ ] and not ('escapehatch' in kwargs and kwargs['escapehatch'] ==
'i am sure'):
+ c_stack = inspect.stack()
+ frame = c_stack[1]
+
+ warnings.warn(DeprecationWarning("Use of raw ldap function %s. This will
be removed in a future release. "
+ "Found in: %s:%s" % (name,
frame.filename, frame.lineno)))
+ # Later, we will add a sleep here to make it even more painful.
+ # Finally, it will raise an exception.
+ elif 'escapehatch' in kwargs:
+ kwargs.pop('escapehatch')
+
if name == 'result':
objtype, data = f(*args, **kwargs)
# data is either a 2-tuple or a list of 2-tuples
@@ -180,6 +212,11 @@ def pid_exists(pid):
return True
else:
raise
+ # Tell the OS to reap this please ...
+ try:
+ os.waitpid(pid, os.WNOHANG)
+ except ChildProcessError:
+ pass
return True
def pid_from_file(pidfile):
@@ -292,7 +329,7 @@ class DirSrv(SimpleLDAPObject, object):
else:
super(DirSrv, self).__init__(uri, trace_level=TRACE_LEVEL)
# self.start_tls_s()
- self.simple_bind_s(ensure_str(self.binddn), self.bindpw)
+ self.simple_bind_s(ensure_str(self.binddn), self.bindpw, escapehatch='i am
sure')
def __add_brookers__(self):
from lib389.config import Config
@@ -385,6 +422,9 @@ class DirSrv(SimpleLDAPObject, object):
self.confdir = None
self.ds_paths = Paths(instance=self)
+ # Set the default systemd status. This MAY be overidden in the setup utils
+ # as required.
+ self.systemd = self.ds_paths.with_systemd
# Reset the args (py.test reuses the args_instance for each test case)
# We allocate a "default" prefix here which allows an un-allocate or
@@ -393,7 +433,6 @@ class DirSrv(SimpleLDAPObject, object):
# ds = lib389.DirSrv()
# ds.list(all=True)
# self.ds_paths.prefix = args_instance[SER_DEPLOYED_DIR]
- self.containerised = False
self.__wrapmethods()
self.__add_brookers__()
@@ -600,10 +639,7 @@ class DirSrv(SimpleLDAPObject, object):
def list(self, all=False, serverid=None):
"""
Returns a list dictionary. For a created instance that is on the
- local file system (e.g. <prefix>/etc/dirsrv/slapd-*), it exists
- a file describing its properties
- (environment): <prefix>/etc/sysconfig/dirsrv-<serverid> or
- $HOME/.dirsrv/dirsv-<serverid>
+ local file system (e.g. <prefix>/etc/dirsrv/slapd-*/dse.ldif).
A dictionary is created with the following properties:
CONF_SERVER_DIR
CONF_SERVERBIN_DIR
@@ -627,16 +663,8 @@ class DirSrv(SimpleLDAPObject, object):
@raise IOError - if the file containing the properties is not
foundable or readable
"""
- def test_and_set(prop, propname, variable, value):
- '''
- If variable is 'propname' it adds to
- 'prop' dictionary the propname:value
- '''
- if variable == propname:
- prop[propname] = value
- return 1
- return 0
+ ### This inner function WILL BE REMOVED soon.
def _parse_configfile(filename=None, serverid=None):
'''
This method read 'filename' and build a dictionary with
@@ -652,46 +680,24 @@ class DirSrv(SimpleLDAPObject, object):
prop = {}
prop[CONF_SERVER_ID] = serverid
prop[SER_SERVERID_PROP] = serverid
- myfile = open(filename, 'r')
- for line in myfile:
- # retrieve the value in line::
- # <PROPNAME>=<string> [';' export
<PROPNAME>]
-
- # skip comment lines
- if line.startswith('#'):
- continue
-
- # skip lines without assignment
- if '=' not in line:
- continue
- value = line.split(';', 1)[0]
-
- # skip lines without assignment
- if '=' not in value:
- continue
-
- variable = value.split('=', 1)[0]
- value = value.split('=', 1)[1]
- value = value.strip(' \t\n')
- for property in (CONF_SERVER_DIR,
- CONF_SERVERBIN_DIR,
- CONF_CONFIG_DIR,
- CONF_INST_DIR,
- CONF_RUN_DIR,
- CONF_DS_ROOT,
- CONF_PRODUCT_NAME):
- if test_and_set(prop, property, variable, value):
- break
- # Now, we have passed the sysconfig environment file.
- # read in and parse the dse.ldif to determine our SER_* values.
- # probably should use path join?
- dsefile = '%s/dse.ldif' % prop[CONF_CONFIG_DIR]
- if os.path.exists(dsefile):
- ldifconn = LDIFConn(dsefile)
- configentry = ldifconn.get(DN_CONFIG)
- for key in args_dse_keys:
- prop[key] = configentry.getValue(args_dse_keys[key])
+ inst_paths = Paths(serverid)
+
+ # WARNING: This is not correct, but is a stop gap until:
https://pagure.io/389-ds-base/issue/50207
+ # Once that's done, this will "just work". Saying this, the
whole prop dictionary
+ # concept is fundamentally broken, and we should be using ds_paths anyway.
+ prop[CONF_SERVER_DIR] = inst_paths.lib_dir
+ prop[CONF_SERVERBIN_DIR] = inst_paths.sbin_dir
+ prop[CONF_CONFIG_DIR] = inst_paths.config_dir
+ prop[CONF_INST_DIR] = inst_paths.inst_dir
+ prop[CONF_RUN_DIR] = inst_paths.run_dir
+ prop[CONF_DS_ROOT] = ''
+ prop[CONF_PRODUCT_NAME] = 'slapd'
+
+ ldifconn = LDIFConn(filename)
+ configentry = ldifconn.get(DN_CONFIG)
+ for key in args_dse_keys:
+ prop[key] = configentry.getValue(args_dse_keys[key])
# SER_HOST (host) nsslapd-localhost
# SER_PORT (port) nsslapd-port
# SER_SECURE_PORT (sslport) nsslapd-secureport
@@ -701,73 +707,19 @@ class DirSrv(SimpleLDAPObject, object):
# nsslapd-defaultnamingcontext
# SER_USER_ID (userid) nsslapd-localuser
# SER_SERVERID_PROP (serverid) Already have this
- # SER_GROUP_ID (groupid) ???
+ # SER_GROUP_ID (groupid)
# SER_DEPLOYED_DIR (prefix) Already provided to for
# discovery
- # SER_BACKUP_INST_DIR (backupdir) nsslapd-bakdir <<-- maybe?
+ # SER_BACKUP_INST_DIR (backupdir) nsslapd-bakdir
# We need to convert these two to int
# because other routines get confused if we don't
for intkey in [SER_PORT, SER_SECURE_PORT]:
- if prop[intkey] is not None:
+ if intkey in prop and prop[intkey] is not None:
prop[intkey] = int(prop[intkey])
return prop
+ ### end _parse_configfile
- def search_dir(instances, pattern, stop_value=None):
- '''
- It search all the files matching pattern.
- It there is not stop_value, it adds the properties found in
- each file to the 'instances'
- Else it searches the specific stop_value (instance's serverid)
- to add only its properties in the 'instances'
-
- @param instances - list of dictionary containing the instances
- properties
- @param pattern - pattern to find the files containing the
- properties
- @param stop_value - serverid value if we are looking only for
- one specific instance
-
- @return True or False - If stop_value is None it returns False.
- If stop_value is specified, it returns
- True if it added the property
- dictionary in instances. Or False if it
- did not find it.
- '''
- added = False
- for instance in glob.glob(pattern):
- serverid = os.path.basename(instance)[len(DEFAULT_ENV_HEAD):]
-
- # skip removed instance and admin server entry
- if '.removed' in serverid or 'dirsrv-admin' in instance:
- continue
-
- # it is found, store its properties in the list
- if stop_value:
- if stop_value == serverid:
- instances.append(_parse_configfile(instance, serverid))
- added = True
- break
- else:
- # this is not the searched value, continue
- continue
- else:
- # we are not looking for a specific value, just add it
- instances.append(_parse_configfile(instance, serverid))
-
- return added
-
- # Retrieves all instances under '/etc/sysconfig' and
'/etc/dirsrv'
-
- # Instances/Environment are
- #
- # file: /etc/sysconfig/dirsrv-<serverid> (env)
- # inst: /etc/dirsrv/slapd-<serverid> (conf)
- #
- # or
- #
- # file: $HOME/.dirsrv/dirsrv-<serverid> (env)
- # inst: <prefix>/etc/dirsrv/slapd-<serverid> (conf)
- #
+ # Retrieves all instances under '<prefix>/etc/dirsrv'
# Don't need a default value now since it's set in init.
if serverid is None and hasattr(self, 'serverid'):
@@ -775,68 +727,48 @@ class DirSrv(SimpleLDAPObject, object):
elif serverid is not None:
serverid = serverid.replace('slapd-', '')
- # first identify the directories we will scan
- sysconfig_head = self.ds_paths.initconfig_dir
- privconfig_head = os.path.expanduser(os.path.join('~', ENV_LOCAL_DIR))
- if not os.path.isdir(sysconfig_head):
- privconfig_head = None
- self.log.debug("dir (sys) : %s", sysconfig_head)
- if privconfig_head:
- self.log.debug("dir (priv): %s", privconfig_head)
+ if self.serverid is None:
+ # Need to set the Paths in case it does exist
+ self.ds_paths = Paths(serverid)
# list of the found instances
instances = []
# now prepare the list of instances properties
if not all:
+ # Don't use self.ds_paths here, because it has no server id : this
+ # causes the config_dir to have a formatting issue.
+ #
+ # As dse.ldif is one of the only fixed locations in the server, this is
+ # okay to use this without parsing of dse.ldif to add the other paths
+ # required: yet.
+ inst_paths = Paths(serverid)
+ dse_ldif = os.path.join(inst_paths.config_dir, 'dse.ldif')
# easy case we just look for the current instance
-
- # we have two location to retrieve the self.serverid
- # privconfig_head and sysconfig_head
-
- # first check the private repository
- if privconfig_head:
- pattern = "%s*" % os.path.join(privconfig_head,
- DEFAULT_ENV_HEAD)
- found = search_dir(instances, pattern, serverid)
- if len(instances) > 0:
- self.log.debug("List from %s", privconfig_head)
- for instance in instances:
- self.log.debug("list instance %r\n", instance)
- if found:
- assert len(instances) == 1
- else:
- assert len(instances) == 0
+ if os.path.exists(dse_ldif):
+ # It's real
+ # Now just populate that instance dict (soon to be changed ...)
+ instances.append(_parse_configfile(dse_ldif, serverid))
else:
- found = False
-
- # second, if not already found, search the system repository
- if not found:
- pattern = "%s*" % os.path.join(sysconfig_head,
- DEFAULT_ENV_HEAD)
- search_dir(instances, pattern, serverid)
- if len(instances) > 0:
- self.log.debug("List from %s", privconfig_head)
- for instance in instances:
- self.log.debug("list instance %r\n", instance)
-
+ # it's not=
+ self.log.debug("list instance not found in {}:
{}\n".format(dse_ldif, serverid))
else:
- # all instances must be retrieved
- if privconfig_head:
- pattern = "%s*" % os.path.join(privconfig_head,
- DEFAULT_ENV_HEAD)
- search_dir(instances, pattern)
- if len(instances) > 0:
- self.log.debug("List from %s", privconfig_head)
- for instance in instances:
- self.log.debug("list instance %r\n", instance)
-
- pattern = "%s*" % os.path.join(sysconfig_head, DEFAULT_ENV_HEAD)
- search_dir(instances, pattern)
- if len(instances) > 0:
- self.log.debug("List from %s", privconfig_head)
- for instance in instances:
- self.log.debug("list instance %r\n", instance)
+ # For each dir that starts with slapd-*
+ inst_path = self.ds_paths.sysconf_dir + "/dirsrv"
+ potential_inst = [
+ os.path.join(inst_path, f)
+ for f in os.listdir(inst_path)
+ if f.startswith('slapd-')
+ ]
+
+ # check it has dse.ldif
+ for pi in potential_inst:
+ pi_dse_ldif = os.path.join(pi, 'dse.ldif')
+ # Takes /etc/dirsrv/slapd-instance -> slapd-instance -> instance
+ pi_name = pi.split('/')[-1].split('-')[-1]
+ # parse + append
+ if os.path.exists(pi_dse_ldif):
+ instances.append(_parse_configfile(pi_dse_ldif, pi_name))
return instances
@@ -1118,22 +1050,22 @@ class DirSrv(SimpleLDAPObject, object):
self.set_option(ldap.OPT_X_TLS_NEWCTX, 0)
if starttls and not uri.startswith('ldaps'):
- self.start_tls_s()
+ self.start_tls_s(escapehatch='i am sure')
if saslmethod and sasltoken is not None:
# Just pass the sasltoken in!
- self.sasl_interactive_bind_s("", sasltoken)
+ self.sasl_interactive_bind_s("", sasltoken, escapehatch='i am
sure')
elif saslmethod and saslmethod.lower() == 'gssapi':
"""
Perform kerberos/gssapi authentication
"""
sasl_auth = ldap.sasl.gssapi("")
- self.sasl_interactive_bind_s("", sasl_auth)
+ self.sasl_interactive_bind_s("", sasl_auth, escapehatch='i am
sure')
elif saslmethod == 'EXTERNAL':
# Do nothing.
sasl_auth = ldap.sasl.external()
- self.sasl_interactive_bind_s("", sasl_auth)
+ self.sasl_interactive_bind_s("", sasl_auth, escapehatch='i am
sure')
elif saslmethod:
# Unknown or unsupported method
self.log.debug('Unsupported SASL method: %s', saslmethod)
@@ -1144,14 +1076,14 @@ class DirSrv(SimpleLDAPObject, object):
# do nothing: the bind is complete.
self.log.debug("open(): Using root autobind ...")
sasl_auth = ldap.sasl.external()
- self.sasl_interactive_bind_s("", sasl_auth)
+ self.sasl_interactive_bind_s("", sasl_auth, escapehatch='i am
sure')
else:
"""
Do a simple bind
"""
try:
- self.simple_bind_s(ensure_str(self.binddn), self.bindpw)
+ self.simple_bind_s(ensure_str(self.binddn), self.bindpw,
escapehatch='i am sure')
except ldap.SERVER_DOWN as e:
# TODO add server info in exception
self.log.debug("Cannot connect to %r", uri)
@@ -1183,7 +1115,7 @@ class DirSrv(SimpleLDAPObject, object):
# check that DirSrv was in DIRSRV_STATE_ONLINE state
if self.state == DIRSRV_STATE_ONLINE:
# Don't raise an error. Just move the state and return
- self.unbind_s()
+ self.unbind_s(escapehatch='i am sure')
self.state = DIRSRV_STATE_OFFLINE
@@ -1203,12 +1135,14 @@ class DirSrv(SimpleLDAPObject, object):
if self.status() is True:
return
- if self.with_systemd() and not self.containerised:
+ if self.with_systemd():
+ self.log.debug("systemd status -> True")
# Do systemd things here ...
subprocess.check_call(["systemctl",
"start",
"dirsrv@%s" % self.serverid])
else:
+ self.log.debug("systemd status -> False")
# Start the process.
# Wait for it to terminate
# This means the server is probably ready to go ....
@@ -1229,7 +1163,8 @@ class DirSrv(SimpleLDAPObject, object):
self.log.debug("DEBUG: starting with %s" % cmd)
output = subprocess.check_output(*cmd, env=env,
stderr=subprocess.STDOUT)
except subprocess.CalledProcessError:
- self.log.error(output)
+ self.log.error('Failed to start ns-slapd: "%s"' %
output)
+ raise ValueError('Failed to start DS')
count = timeout
pid = pid_from_file(self.ds_paths.pid_file)
while (pid is None) and count > 0:
@@ -1266,12 +1201,14 @@ class DirSrv(SimpleLDAPObject, object):
if self.status() is False:
return
- if self.with_systemd() and not self.containerised:
+ if self.with_systemd():
+ self.log.debug("systemd status -> True")
# Do systemd things here ...
subprocess.check_call(["systemctl",
"stop",
"dirsrv@%s" % self.serverid])
else:
+ self.log.debug("systemd status -> False")
# TODO: Make the pid path in the files things
# TODO: use the status call instead!!!!
count = timeout
@@ -1293,7 +1230,8 @@ class DirSrv(SimpleLDAPObject, object):
Will update the self.state parameter.
"""
- if self.with_systemd() and not self.containerised:
+ if self.with_systemd():
+ self.log.debug("systemd status -> True")
# Do systemd things here ...
rc = subprocess.call(["systemctl",
"is-active", "--quiet",
@@ -1305,6 +1243,7 @@ class DirSrv(SimpleLDAPObject, object):
self.state = DIRSRV_STATE_OFFLINE
return False
else:
+ self.log.debug("systemd status -> False")
# TODO: Make the pid path in the files things
# TODO: use the status call instead!!!!
pid = pid_from_file(self.ds_paths.pid_file)
@@ -1659,6 +1598,9 @@ class DirSrv(SimpleLDAPObject, object):
self.config.set('nsslapd-security', 'on')
self.use_ldaps_uri()
+ if selinux_present():
+ selinux_label_port(self.sslport)
+
if self.ds_paths.perl_enabled:
# We don't setup sslport correctly in perl installer ....
self.config.set('nsslapd-secureport', '%s' % self.sslport)
@@ -1782,7 +1724,7 @@ class DirSrv(SimpleLDAPObject, object):
return self.ds_paths.asan_enabled
def with_systemd(self):
- return self.ds_paths.with_systemd
+ return self.systemd
def get_server_tls_subject(self):
""" Get the servers TLS subject line for enrollment purposes.
@@ -1845,7 +1787,7 @@ class DirSrv(SimpleLDAPObject, object):
wrap entries in an Entry class that provides some useful
methods"""
for name in dir(self.__class__.__bases__[0]):
attr = getattr(self, name)
- if isinstance(attr, collections.Callable):
+ if isinstance(attr, Callable):
setattr(self, name, wrapper(attr, name))
def addLDIF(self, input_file, cont=False):
@@ -2185,7 +2127,7 @@ class DirSrv(SimpleLDAPObject, object):
try:
self.add_s(ent)
except ldap.ALREADY_EXISTS:
- self.log.warn("Entry %s already exists", binddn)
+ self.log.warning("Entry %s already exists", binddn)
try:
entry = self._test_entry(binddn, ldap.SCOPE_BASE)
@@ -2323,11 +2265,11 @@ class DirSrv(SimpleLDAPObject, object):
except ldap.NO_SUCH_OBJECT:
entry = None
if entry:
- self.log.warn("Agreement exists:", dn_agreement)
+ self.log.warning("Agreement exists:", dn_agreement)
self.suffixes.setdefault(nsuffix, {})[str(consumer)] = dn_agreement
return dn_agreement
if (nsuffix in self.agmt) and (consumer in self.agmt[nsuffix]):
- self.log.warn("Agreement exists:", dn_agreement)
+ self.log.warning("Agreement exists:", dn_agreement)
return dn_agreement
# In a separate function in this scope?
@@ -2521,7 +2463,7 @@ class DirSrv(SimpleLDAPObject, object):
})
self.setupBindDN(*attrs)
except ldap.ALREADY_EXISTS:
- self.log.warn("User already exists: %r ", user)
+ self.log.warning("User already exists: %r ", user)
# setup replica
# map old style args to new style replica args
@@ -3133,6 +3075,32 @@ class DirSrv(SimpleLDAPObject, object):
return output
+ def dbverify(self, bename):
+ """
+ @param bename - the backend name to verify
+ @return - True if the verify succeded
+ """
+ prog = os.path.join(self.ds_paths.sbin_dir, 'ns-slapd')
+
+ if self.status():
+ self.log.error("dbverify: Can not operate while directory server is
running")
+ return False
+
+ cmd = [
+ prog,
+ 'dbverify',
+ '-D', self.get_config_dir(),
+ '-n', bename
+ ]
+
+ try:
+ result = subprocess.check_output(cmd, encoding='utf-8')
+ except subprocess.CalledProcessError as e:
+ self.log.debug("Command: %s failed with the return code %s and the error
%s",
+ format_cmd_list(cmd), e.returncode, e.output)
+ return False
+ return True
+
def searchAccessLog(self, pattern):
"""
Search all the access logs
@@ -3466,11 +3434,11 @@ class DirSrv(SimpleLDAPObject, object):
return status
def delete_branch_s(self, basedn, scope, filterstr="(objectclass=*)",
serverctrls=None, clientctrls=None):
- ents = self.search_s(basedn, scope, filterstr)
+ ents = self.search_s(basedn, scope, filterstr, escapehatch='i am sure')
for ent in sorted(ents, key=lambda e: len(e.dn), reverse=True):
self.log.debug("Delete entry children %s", ent.dn)
- self.delete_ext_s(ent.dn, serverctrls=serverctrls, clientctrls=clientctrls)
+ self.delete_ext_s(ent.dn, serverctrls=serverctrls, clientctrls=clientctrls,
escapehatch='i am sure')
def backup_online(self, archive=None, db_type=None):
"""Creates a backup of the database"""
diff --git a/src/lib389/lib389/_entry.py b/src/lib389/lib389/_entry.py
index 399e717..041d0c2 100644
--- a/src/lib389/lib389/_entry.py
+++ b/src/lib389/lib389/_entry.py
@@ -371,7 +371,7 @@ class Entry(object):
try:
self.add_s(ent)
except ldap.ALREADY_EXISTS:
- log.warn("Entry %s already exists" % entry_dn)
+ log.warning("Entry %s already exists" % entry_dn)
try:
entry = self._test_entry(entry_dn, ldap.SCOPE_BASE)
diff --git a/src/lib389/lib389/_mapped_object.py b/src/lib389/lib389/_mapped_object.py
index b9d1fd0..3953a67 100644
--- a/src/lib389/lib389/_mapped_object.py
+++ b/src/lib389/lib389/_mapped_object.py
@@ -56,6 +56,8 @@ def _gen_not(extra=None):
def _gen_filter(attrtypes, values, extra=None):
filt = ''
+ if attrtypes is None:
+ raise ValueError("Attempting to filter on type that doesn't support
filtering!")
for attr, value in zip(attrtypes, values):
if attr is not None and value is not None:
filt += '(%s=%s)' % (attr, ldap_filter.escape_filter_chars(value))
@@ -105,7 +107,7 @@ class DSLdapObject(DSLogging):
self._rdn_attribute = None
self._must_attributes = None
# attributes, we don't want to compare
- self._compare_exclude = ['entryid']
+ self._compare_exclude = ['entryid', 'modifytimestamp',
'nsuniqueid']
self._lint_functions = None
self._server_controls = None
self._client_controls = None
@@ -121,13 +123,15 @@ class DSLdapObject(DSLogging):
def __str__(self):
return self.__unicode__()
- def raw_entry(self):
+ def _unsafe_raw_entry(self):
"""Get an Entry object
:returns: Entry object
"""
- return self._instance.search_ext_s(self._dn, ldap.SCOPE_BASE,
self._object_filter, attrlist=["*"], serverctrls=self._server_controls,
clientctrls=self._client_controls)[0]
+ return self._instance.search_ext_s(self._dn, ldap.SCOPE_BASE,
self._object_filter, attrlist=["*"],
+ serverctrls=self._server_controls,
clientctrls=self._client_controls,
+ escapehatch='i am sure')[0]
def exists(self):
"""Check if the entry exists
@@ -136,7 +140,9 @@ class DSLdapObject(DSLogging):
"""
try:
- self._instance.search_ext_s(self._dn, ldap.SCOPE_BASE, self._object_filter,
attrsonly=1, serverctrls=self._server_controls, clientctrls=self._client_controls)
+ self._instance.search_ext_s(self._dn, ldap.SCOPE_BASE, self._object_filter,
attrsonly=1,
+ serverctrls=self._server_controls,
clientctrls=self._client_controls,
+ escapehatch='i am sure')
except ldap.NO_SUCH_OBJECT:
return False
@@ -147,7 +153,9 @@ class DSLdapObject(DSLogging):
:returns: LDIF formatted string
"""
- e = self._instance.search_ext_s(self._dn, ldap.SCOPE_BASE, self._object_filter,
attrlist=["*"], serverctrls=self._server_controls,
clientctrls=self._client_controls)[0]
+ e = self._instance.search_ext_s(self._dn, ldap.SCOPE_BASE, self._object_filter,
attrlist=attrlist,
+ serverctrls=self._server_controls,
clientctrls=self._client_controls,
+ escapehatch='i am sure')[0]
return e.__repr__()
def display_attr(self, attr):
@@ -224,7 +232,9 @@ class DSLdapObject(DSLogging):
raise ValueError("Invalid state. Cannot get presence on instance that is
not ONLINE")
self._log.debug("%s present(%r) %s" % (self._dn, attr, value))
- e = self._instance.search_ext_s(self._dn, ldap.SCOPE_BASE, self._object_filter,
attrlist=[attr, ], serverctrls=self._server_controls,
clientctrls=self._client_controls)[0]
+ e = self._instance.search_ext_s(self._dn, ldap.SCOPE_BASE, self._object_filter,
attrlist=[attr, ],
+ serverctrls=self._server_controls,
clientctrls=self._client_controls,
+ escapehatch='i am sure')[0]
values = self.get_attr_vals_bytes(attr)
self._log.debug("%s contains %s" % (self._dn, values))
@@ -277,7 +287,8 @@ class DSLdapObject(DSLogging):
else:
value = [ensure_bytes(arg[1])]
mods.append((ldap.MOD_REPLACE, ensure_str(arg[0]), value))
- return self._instance.modify_ext_s(self._dn, mods,
serverctrls=self._server_controls, clientctrls=self._client_controls)
+ return self._instance.modify_ext_s(self._dn, mods,
serverctrls=self._server_controls,
+ clientctrls=self._client_controls,
escapehatch='i am sure')
# This needs to work on key + val, and key
def remove(self, key, value):
@@ -372,7 +383,8 @@ class DSLdapObject(DSLogging):
value = [ensure_bytes(value)]
return self._instance.modify_ext_s(self._dn, [(action, key, value)],
- serverctrls=self._server_controls, clientctrls=self._client_controls)
+ serverctrls=self._server_controls,
clientctrls=self._client_controls,
+ escapehatch='i am sure')
def apply_mods(self, mods):
"""Perform modification operation using several mods at once
@@ -410,7 +422,24 @@ class DSLdapObject(DSLogging):
else:
# Error too many items
raise ValueError('Too many arguments in the mod op')
- return self._instance.modify_ext_s(self._dn, mod_list,
serverctrls=self._server_controls, clientctrls=self._client_controls)
+ return self._instance.modify_ext_s(self._dn, mod_list,
serverctrls=self._server_controls, clientctrls=self._client_controls, escapehatch='i
am sure')
+
+ def _unsafe_compare_attribute(self, other):
+ """Compare two attributes from two objects. This is currently
marked unsafe as it's
+ not complete yet.
+
+ The idea is to use the native ldap compare operation, rather than simple
comparison of
+ values due to schema awareness. LDAP doesn't normalise values, so two objects
with:
+
+ cn: value
+ cn: VaLuE
+
+ This will fail to compare in python, but would succeed in LDAP beacuse CN is
case
+ insensitive.
+
+ To allow schema aware checking, we need to call ldap compare extop here.
+ """
+ pass
@classmethod
def compare(cls, obj1, obj2):
@@ -441,16 +470,20 @@ class DSLdapObject(DSLogging):
raise ValueError("Invalid arguments: Expecting object types that
inherits 'DSLdapObject' class")
# check if RDN of objects is same
if obj1.rdn != obj2.rdn:
+ obj1._log.debug("%s != %s" % (obj1.rdn, obj2.rdn))
return False
obj1_attrs = obj1.get_compare_attrs()
obj2_attrs = obj2.get_compare_attrs()
# Bail fast if the keys don't match
if set(obj1_attrs.keys()) != set(obj2_attrs.keys()):
+ obj1._log.debug("%s != %s" % (obj1_attrs.keys(),
obj2_attrs.keys()))
return False
# Check the values of each key
# using obj1_attrs.keys() because obj1_attrs.iterkleys() is not supported in
python3
for key in obj1_attrs.keys():
if set(obj1_attrs[key]) != set(obj2_attrs[key]):
+ obj1._log.debug(" v-- %s != %s" % (key, key))
+ obj1._log.debug("%s != %s" % (obj1_attrs[key],
obj2_attrs[key]))
return False
return True
@@ -460,10 +493,17 @@ class DSLdapObject(DSLogging):
"""
self._log.debug("%s get_compare_attrs" % (self._dn))
+
all_attrs_dict = self.get_all_attrs()
+ all_attrs_lower = {}
+ for k in all_attrs_dict:
+ all_attrs_lower[k.lower()] = all_attrs_dict[k]
+
# removing _compate_exclude attrs from all attrs
- compare_attrs = set(all_attrs_dict.keys()) - set(self._compare_exclude)
- compare_attrs_dict = {attr: all_attrs_dict[attr] for attr in compare_attrs}
+ cx = [x.lower() for x in self._compare_exclude]
+ compare_attrs = set(all_attrs_lower.keys()) - set(cx)
+
+ compare_attrs_dict = {attr.lower(): all_attrs_lower[attr] for attr in
compare_attrs}
return compare_attrs_dict
@@ -478,9 +518,13 @@ class DSLdapObject(DSLogging):
raise ValueError("Invalid state. Cannot get properties on instance that
is not ONLINE")
else:
# retrieving real(*) and operational attributes(+)
- attrs_entry = self._instance.search_ext_s(self._dn, ldap.SCOPE_BASE,
self._object_filter, attrlist=["*", "+"],
serverctrls=self._server_controls, clientctrls=self._client_controls)[0]
+ attrs_entry = self._instance.search_ext_s(self._dn, ldap.SCOPE_BASE,
self._object_filter,
+ attrlist=["*",
"+"], serverctrls=self._server_controls,
+ clientctrls=self._client_controls,
escapehatch='i am sure')[0]
# getting dict from 'entry' object
attrs_dict = attrs_entry.data
+ # Should we normalise the attr names here to lower()?
+ # This could have unforseen consequences ...
return attrs_dict
def get_attrs_vals(self, keys, use_json=False):
@@ -488,7 +532,9 @@ class DSLdapObject(DSLogging):
if self._instance.state != DIRSRV_STATE_ONLINE:
raise ValueError("Invalid state. Cannot get properties on instance that
is not ONLINE")
else:
- entry = self._instance.search_ext_s(self._dn, ldap.SCOPE_BASE,
self._object_filter, attrlist=keys, serverctrls=self._server_controls,
clientctrls=self._client_controls)[0]
+ entry = self._instance.search_ext_s(self._dn, ldap.SCOPE_BASE,
self._object_filter,
+ attrlist=keys,
serverctrls=self._server_controls,
+ clientctrls=self._client_controls,
escapehatch='i am sure')[0]
return entry.getValuesSet(keys)
def get_attrs_vals_utf8(self, keys, use_json=False):
@@ -514,7 +560,9 @@ class DSLdapObject(DSLogging):
else:
# It would be good to prevent the entry code intercepting this ....
# We have to do this in this method, because else we ignore the scope base.
- entry = self._instance.search_ext_s(self._dn, ldap.SCOPE_BASE,
self._object_filter, attrlist=[key], serverctrls=self._server_controls,
clientctrls=self._client_controls)[0]
+ entry = self._instance.search_ext_s(self._dn, ldap.SCOPE_BASE,
self._object_filter,
+ attrlist=[key],
serverctrls=self._server_controls,
+ clientctrls=self._client_controls,
escapehatch='i am sure')[0]
vals = entry.getValues(key)
if use_json:
result = {key: []}
@@ -532,7 +580,9 @@ class DSLdapObject(DSLogging):
# In the future, I plan to add a mode where if local == true, we
# can use get on dse.ldif to get values offline.
else:
- entry = self._instance.search_ext_s(self._dn, ldap.SCOPE_BASE,
self._object_filter, attrlist=[key], serverctrls=self._server_controls,
clientctrls=self._client_controls)[0]
+ entry = self._instance.search_ext_s(self._dn, ldap.SCOPE_BASE,
self._object_filter,
+ attrlist=[key],
serverctrls=self._server_controls,
+ clientctrls=self._client_controls,
escapehatch='i am sure')[0]
return entry.getValue(key)
def get_attr_val_bytes(self, key, use_json=False):
@@ -660,7 +710,10 @@ class DSLdapObject(DSLogging):
# and the superior as the base (if it changed)
if self._protected:
return
- self._instance.rename_s(self._dn, new_rdn, newsuperior,
serverctrls=self._server_controls, clientctrls=self._client_controls)
+
+ self._instance.rename_s(self._dn, new_rdn, newsuperior,
+ serverctrls=self._server_controls,
clientctrls=self._client_controls,
+ delold=deloldrdn, escapehatch='i am sure')
search_base = self._basedn
if newsuperior is not None:
# Well, the new DN should be rdn + newsuperior.
@@ -682,7 +735,13 @@ class DSLdapObject(DSLogging):
self._log.debug("%s delete" % (self._dn))
if not self._protected:
# Is there a way to mark this as offline and kill it
- self._instance.delete_ext_s(self._dn, serverctrls=self._server_controls,
clientctrls=self._client_controls)
+ if recursive:
+ filterstr = "(|(objectclass=*)(objectclass=ldapsubentry))"
+ ents = self._instance.search_s(self._dn, ldap.SCOPE_SUBTREE, filterstr,
escapehatch='i am sure')
+ for ent in sorted(ents, key=lambda e: len(e.dn), reverse=True):
+ self._instance.delete_ext_s(ent.dn,
serverctrls=self._server_controls, clientctrls=self._client_controls, escapehatch='i
am sure')
+ else:
+ self._instance.delete_ext_s(self._dn, serverctrls=self._server_controls,
clientctrls=self._client_controls, escapehatch='i am sure')
def _validate(self, rdn, properties, basedn):
"""Used to validate a create request.
@@ -725,14 +784,19 @@ class DSLdapObject(DSLogging):
# Turn it into a list instead.
properties[k] = [v, ]
- # This change here, means we can pre-load a full dn to _dn, or we can
- # accept based on the rdn
+ # If we were created with a dn= in the object init, we set tdn now, and skip
+ # any possible dn derivation steps that follow.
tdn = self._dn
+ # However, if no DN was provided, we attempt to derive the DN from the relevant
+ # properties of the object. The idea being that by defining only the attributes
+ # of the object, we can just solve a possible rdn instead of asking for the same
+ # data twice.
if tdn is None:
if basedn is None:
raise ldap.UNWILLING_TO_PERFORM('Invalid request to create. basedn
cannot be None')
+ # Were we given a relative component? Yes? Go ahead!
if rdn is not None:
tdn = ensure_str('%s,%s' % (rdn, basedn))
elif properties.get(self._rdn_attribute, None) is not None:
@@ -771,11 +835,14 @@ class DSLdapObject(DSLogging):
exists = False
- try:
- self._instance.search_ext_s(dn, ldap.SCOPE_BASE, self._object_filter,
attrsonly=1, serverctrls=self._server_controls, clientctrls=self._client_controls)
- exists = True
- except ldap.NO_SUCH_OBJECT:
- pass
+ if ensure:
+ # If we are running in stateful ensure mode, we need to check if the object
exists, and
+ # we can see the state that it is in.
+ try:
+ self._instance.search_ext_s(dn, ldap.SCOPE_BASE, self._object_filter,
attrsonly=1, serverctrls=self._server_controls, clientctrls=self._client_controls,
escapehatch='i am sure')
+ exists = True
+ except ldap.NO_SUCH_OBJECT:
+ pass
if exists and ensure:
# update properties
@@ -785,22 +852,28 @@ class DSLdapObject(DSLogging):
mods = []
for k, v in list(valid_props.items()):
mods.append((ldap.MOD_REPLACE, k, v))
- self._instance.modify_ext_s(self._dn, mods,
serverctrls=self._server_controls, clientctrls=self._client_controls)
- elif exists and not ensure:
- # raise "already exists."
- raise ldap.ALREADY_EXISTS("Entry %s already exists" % dn)
- if not exists:
+ self._instance.modify_ext_s(self._dn, mods,
serverctrls=self._server_controls, clientctrls=self._client_controls, escapehatch='i
am sure')
+ elif not exists:
+ # This case is reached in two cases. One is we are in ensure mode, and we
KNOW the entry
+ # doesn't exist.
+ # The alternate, is that we are in a non-stateful create, so we "just
create" and see
+ # what happens. I believe the technical term is "yolo create".
self._log.debug('Creating %s' % dn)
e = Entry(dn)
e.update({'objectclass':
ensure_list_bytes(self._create_objectclasses)})
e.update(valid_props)
# We rely on exceptions here to indicate failure to the parent.
- self._instance.add_ext_s(e, serverctrls=self._server_controls,
clientctrls=self._client_controls)
+ self._instance.add_ext_s(e, serverctrls=self._server_controls,
clientctrls=self._client_controls, escapehatch='i am sure')
self._log.debug('Created entry %s : %s' % (dn,
display_log_data(e.data)))
# If it worked, we need to fix our instance dn for the object's self
reference. Because
# we may not have a self reference yet (just created), it may have changed
(someone
# set dn, but validate altered it).
self._dn = dn
+ else:
+ # This case can't be reached now that we only check existance on ensure.
+ # However, it's good to keep it for "complete" behaviour,
exhausting all states.
+ # We could highlight bugs ;)
+ raise AssertionError("Impossible State Reached in _create")
return self
def create(self, rdn=None, properties=None, basedn=None):
@@ -890,6 +963,16 @@ class DSLdapObjects(DSLogging):
_gen_filter(_term_gen('objectclass'), self._objectclasses)
)
+ def _get_selector_filter(self, selector):
+ return _gen_and([
+ self._get_objectclass_filter(),
+ _gen_or(
+ # This will yield all combinations of selector to filterattrs.
+ # This won't work with multiple values in selector (yet)
+ _gen_filter(self._filterattrs, _term_gen(selector))
+ ),
+ ])
+
def _entry_to_instance(self, dn=None, entry=None):
# Normally this won't be used. But for say the plugin type where we
# have "many" possible child types, this allows us to overload
@@ -915,7 +998,8 @@ class DSLdapObjects(DSLogging):
scope=self._scope,
filterstr=filterstr,
attrlist=self._list_attrlist,
- serverctrls=self._server_controls, clientctrls=self._client_controls
+ serverctrls=self._server_controls, clientctrls=self._client_controls,
+ escapehatch='i am sure'
)
# def __init__(self, instance, dn=None):
insts = [self._entry_to_instance(dn=r.dn, entry=r) for r in results]
@@ -924,6 +1008,25 @@ class DSLdapObjects(DSLogging):
insts = []
return insts
+ def exists(self, selector=[], dn=None):
+ """Check if a child entry exists
+
+ :returns: True if it exists
+ """
+ results = []
+ try:
+ if dn is not None:
+ results = self._get_dn(dn)
+ else:
+ results = self._get_selector(selector)
+ except:
+ return False
+
+ if len(results) == 1:
+ return True
+ else:
+ return False
+
def get(self, selector=[], dn=None, json=False):
"""Get a child entry (DSLdapObject, Replica, etc.) with dn or
selector
using a base DN and objectClasses of our object (DSLdapObjects, Replicas, etc.)
@@ -963,28 +1066,23 @@ class DSLdapObjects(DSLogging):
scope=ldap.SCOPE_BASE,
filterstr=filterstr,
attrlist=self._list_attrlist,
- serverctrls=self._server_controls, clientctrls=self._client_controls
+ serverctrls=self._server_controls, clientctrls=self._client_controls,
+ escapehatch='i am sure'
)
def _get_selector(self, selector):
# Filter based on the objectclasses and the basedn
# Based on the selector, we should filter on that too.
# This will yield and & filter for objectClass with as many terms as needed.
- filterstr = _gen_and([
- self._get_objectclass_filter(),
- _gen_or(
- # This will yield all combinations of selector to filterattrs.
- # This won't work with multiple values in selector (yet)
- _gen_filter(self._filterattrs, _term_gen(selector))
- ),
- ])
+ filterstr = self._get_selector_filter(selector)
self._log.debug('_gen_selector filter = %s' % filterstr)
return self._instance.search_ext_s(
base=self._basedn,
scope=self._scope,
filterstr=filterstr,
attrlist=self._list_attrlist,
- serverctrls=self._server_controls, clientctrls=self._client_controls
+ serverctrls=self._server_controls, clientctrls=self._client_controls,
+ escapehatch='i am sure'
)
def _validate(self, rdn, properties):
@@ -1039,3 +1137,22 @@ class DSLdapObjects(DSLogging):
(rdn, properties) = self._validate(rdn, properties)
# Now actually commit the creation req
return co.ensure_state(rdn, properties, self._basedn)
+
+ def filter(self, search):
+ # This will yield and & filter for objectClass with as many terms as needed.
+ search_filter = _gen_and([self._get_objectclass_filter(), search])
+ self._log.debug('list filter = %s' % search_filter)
+ try:
+ results = self._instance.search_ext_s(
+ base=self._basedn,
+ scope=self._scope,
+ filterstr=search_filter,
+ attrlist=self._list_attrlist,
+ serverctrls=self._server_controls, clientctrls=self._client_controls
+ )
+ # def __init__(self, instance, dn=None):
+ insts = [self._entry_to_instance(dn=r.dn, entry=r) for r in results]
+ except ldap.NO_SUCH_OBJECT:
+ # There are no objects to select from, se we return an empty array
+ insts = []
+ return insts
diff --git a/src/lib389/lib389/agreement.py b/src/lib389/lib389/agreement.py
index 9edd514..84e2f8c 100644
--- a/src/lib389/lib389/agreement.py
+++ b/src/lib389/lib389/agreement.py
@@ -966,7 +966,7 @@ class AgreementLegacy(object):
# we can just raise ALREADY_EXISTS
try:
entry = self.conn.getEntry(dn_agreement, ldap.SCOPE_BASE)
- self.log.warn("Agreement already exists: %r", dn_agreement)
+ self.log.warning("Agreement already exists: %r", dn_agreement)
return dn_agreement
except ldap.NO_SUCH_OBJECT:
entry = None
diff --git a/src/lib389/lib389/changelog.py b/src/lib389/lib389/changelog.py
index 4cb3063..cb218d4 100644
--- a/src/lib389/lib389/changelog.py
+++ b/src/lib389/lib389/changelog.py
@@ -128,7 +128,7 @@ class ChangelogLegacy(object):
try:
self.conn.add_s(entry)
except ldap.ALREADY_EXISTS:
- self.log.warn("entry %s already exists", dn)
+ self.log.warning("entry %s already exists", dn)
return dn
def delete(self):
diff --git a/src/lib389/lib389/cli_base/__init__.py
b/src/lib389/lib389/cli_base/__init__.py
index ab1ce0f..d139040 100644
--- a/src/lib389/lib389/cli_base/__init__.py
+++ b/src/lib389/lib389/cli_base/__init__.py
@@ -274,6 +274,7 @@ def _generic_del_attr(inst, basedn, log, manager_class, args=None):
# Missing value
raise ValueError("Missing attribute to delete")
+
def _generic_modify_change_to_mod(change):
values = change.split(":")
if len(values) <= 2:
@@ -298,22 +299,38 @@ def _generic_modify_change_to_mod(change):
else:
raise ValueError("Unknown action '%s'. Expected add, delete,
replace" % change)
+
+def _generic_modify_inner(log, o, changes):
+ # Now parse the series of arguments.
+ # Turn them into mod lists. See apply_mods.
+ mods = [_generic_modify_change_to_mod(x) for x in changes]
+ log.debug("Requested mods: %s" % mods)
+ # Now push them to dsldapobject to modify
+ o.apply_mods(mods)
+ print('Successfully modified %s' % o.dn)
+
+
def _generic_modify(inst, basedn, log, manager_class, selector, args=None):
+ if not args or not args.changes:
+ raise ValueError("Missing modify actions to perform.")
# Here, we should have already selected the type etc. mc should be a
- # type of DSLdapObject (singular)
+ # type of DSLdapObjects (plural)
mc = manager_class(inst, basedn)
- # Get the object
- if args and args.changes:
- o = mc.get(selector)
- # Now parse the series of arguments.
- # Turn them into mod lists. See apply_mods.
- mods = [_generic_modify_change_to_mod(x) for x in args.changes]
- log.debug("Requested mods: %s" % mods)
- # Now push them to dsldapobject to modify
- o.apply_mods(mods)
- print('Successfully modified %s' % o.dn)
- else:
+ # Get the object singular by selector
+ o = mc.get(selector)
+ _generic_modify_inner(log, o, args.changes)
+
+
+def _generic_modify_dn(inst, basedn, log, manager_class, dn, args=None):
+ if not args or not args.changes:
raise ValueError("Missing modify actions to perform.")
+ # Here, we should have already selected the type etc. mc should be a
+ # type of DSLdapObjects (plural)
+ mc = manager_class(inst, basedn)
+ # Get the object singular by dn
+ o = mc.get(dn=dn)
+ _generic_modify_inner(log, o, args.changes)
+
class LogCapture(logging.Handler):
"""
@@ -368,7 +385,7 @@ def setup_script_logger(name, verbose=False):
"""
root = logging.getLogger()
log = logging.getLogger(name)
- log_handler = logging.StreamHandler()
+ log_handler = logging.StreamHandler(sys.stdout)
if verbose:
log.setLevel(logging.DEBUG)
diff --git a/src/lib389/lib389/cli_conf/__init__.py
b/src/lib389/lib389/cli_conf/__init__.py
index 2e8f2a6..b74247d 100644
--- a/src/lib389/lib389/cli_conf/__init__.py
+++ b/src/lib389/lib389/cli_conf/__init__.py
@@ -84,33 +84,33 @@ def generic_object_edit(dsldap_object, log, args, arg_to_attr):
def generic_show(inst, basedn, log, args):
"""Display plugin configuration."""
plugin = args.plugin_cls(inst)
- print(plugin.display())
+ log.info(plugin.display())
def generic_enable(inst, basedn, log, args):
plugin = args.plugin_cls(inst)
if plugin.status():
- print("Plugin '%s' already enabled", plugin.rdn)
+ log.info("Plugin '%s' already enabled" % plugin.rdn)
else:
plugin.enable()
- print("Enabled plugin '%s'", plugin.rdn)
+ log.info("Enabled plugin '%s'" % plugin.rdn)
def generic_disable(inst, basedn, log, args):
plugin = args.plugin_cls(inst)
if not plugin.status():
- print("Plugin '%s' already disabled", plugin.rdn)
+ log.info("Plugin '%s' already disabled" % plugin.rdn)
else:
plugin.disable()
- print("Disabled plugin '%s'", plugin.rdn)
+ log.info("Disabled plugin '%s'" % plugin.rdn)
def generic_status(inst, basedn, log, args):
plugin = args.plugin_cls(inst)
if plugin.status() is True:
- print("Plugin '%s' is enabled", plugin.rdn)
+ log.info("Plugin '%s' is enabled" % plugin.rdn)
else:
- print("Plugin '%s' is disabled", plugin.rdn)
+ log.info("Plugin '%s' is disabled" % plugin.rdn)
def add_generic_plugin_parsers(subparser, plugin_cls):
diff --git a/src/lib389/lib389/cli_conf/plugins/accountpolicy.py
b/src/lib389/lib389/cli_conf/plugins/accountpolicy.py
index 60134c7..d28ef2f 100644
--- a/src/lib389/lib389/cli_conf/plugins/accountpolicy.py
+++ b/src/lib389/lib389/cli_conf/plugins/accountpolicy.py
@@ -11,7 +11,7 @@ from lib389.plugins import AccountPolicyPlugin, AccountPolicyConfigs,
AccountPol
from lib389.cli_conf import add_generic_plugin_parsers, generic_object_edit,
generic_object_add
arg_to_attr = {
- 'config_entry': 'nsslapd-pluginConfigArea'
+ 'config_entry': 'nsslapd_pluginconfigarea'
}
arg_to_attr_config = {
@@ -23,6 +23,7 @@ arg_to_attr_config = {
'state_attr': 'stateattrname'
}
+
def accountpolicy_edit(inst, basedn, log, args):
log = log.getChild('accountpolicy_edit')
plugin = AccountPolicyPlugin(inst)
diff --git a/src/lib389/lib389/cli_conf/plugins/attruniq.py
b/src/lib389/lib389/cli_conf/plugins/attruniq.py
index a26154c..fee4137 100644
--- a/src/lib389/lib389/cli_conf/plugins/attruniq.py
+++ b/src/lib389/lib389/cli_conf/plugins/attruniq.py
@@ -14,6 +14,7 @@ from lib389.cli_conf import (add_generic_plugin_parsers,
generic_object_edit, ge
from lib389._constants import DN_PLUGIN
arg_to_attr = {
+ 'enabled': 'nsslapd-pluginenabled',
'attr_name': 'uniqueness-attribute-name',
'subtree': 'uniqueness-subtrees',
'across_all_subtrees': 'uniqueness-across-all-subtrees',
@@ -80,6 +81,8 @@ def attruniq_del(inst, basedn, log, args):
def _add_parser_args(parser):
parser.add_argument('NAME', help='Sets the name of the plug-in
configuration record. (cn) You can use any string, '
'but "attribute_name Attribute
Uniqueness" is recommended.')
+ parser.add_argument('--enabled', choices=['on', 'off'],
+ help='Identifies whether or not the config is enabled.')
parser.add_argument('--attr-name', nargs='+',
help='Sets the name of the attribute whose values must be
unique. '
'This attribute is multi-valued.
(uniqueness-attribute-name)')
diff --git a/src/lib389/lib389/cli_conf/plugins/linkedattr.py
b/src/lib389/lib389/cli_conf/plugins/linkedattr.py
index 781767c..12b75e1 100644
--- a/src/lib389/lib389/cli_conf/plugins/linkedattr.py
+++ b/src/lib389/lib389/cli_conf/plugins/linkedattr.py
@@ -123,4 +123,3 @@ def create_parser(subparsers):
show.set_defaults(func=linkedattr_show)
delete = config_subcommands.add_parser('delete', help='Delete the config
entry')
delete.set_defaults(func=linkedattr_del)
-
diff --git a/src/lib389/lib389/cli_conf/plugins/memberof.py
b/src/lib389/lib389/cli_conf/plugins/memberof.py
index eb3d5e0..cacca04 100644
--- a/src/lib389/lib389/cli_conf/plugins/memberof.py
+++ b/src/lib389/lib389/cli_conf/plugins/memberof.py
@@ -78,8 +78,10 @@ def do_fixup(inst, basedn, log, args):
fixup_task = plugin.fixup(args.DN, args.filter)
fixup_task.wait()
exitcode = fixup_task.get_exit_code()
- assert exitcode == 0, 'MemberOf fixup task for %s has failed. Please, check
logs'
- log.info('Successfully added task entry for %s', args.DN)
+ if exitcode != 0:
+ log.error('MemberOf fixup task for %s has failed. Please, check logs')
+ else:
+ log.info('Successfully added task entry')
def _add_parser_args(parser):
@@ -140,4 +142,3 @@ def create_parser(subparsers):
help='Filter for entries to fix up.\n If omitted, all entries
with objectclass '
'inetuser/inetadmin/nsmemberof under the specified base
will have '
'their memberOf attribute regenerated.')
-
diff --git a/src/lib389/lib389/cli_conf/plugins/posix_winsync.py
b/src/lib389/lib389/cli_conf/plugins/posix_winsync.py
index 5c5d6cc..e2856af 100644
--- a/src/lib389/lib389/cli_conf/plugins/posix_winsync.py
+++ b/src/lib389/lib389/cli_conf/plugins/posix_winsync.py
@@ -26,7 +26,7 @@ def winsync_edit(inst, basedn, log, args):
def _add_parser_args(parser):
parser.add_argument('--create-memberof-task', choices=['true',
'false'], type=str.lower,
- help=' sets whether to run the memberOf fix-up task
immediately after a sync run in order '
+ help='Sets whether to run the memberOf fix-up task
immediately after a sync run in order '
'to update group memberships for synced users
(posixWinsyncCreateMemberOfTask)')
parser.add_argument('--lower-case-uid', choices=['true',
'false'], type=str.lower,
help='Sets whether to store (and, if necessary, convert) the
UID value in the memberUID '
diff --git a/src/lib389/lib389/cli_conf/plugins/referint.py
b/src/lib389/lib389/cli_conf/plugins/referint.py
index 01bd4f0..3044231 100644
--- a/src/lib389/lib389/cli_conf/plugins/referint.py
+++ b/src/lib389/lib389/cli_conf/plugins/referint.py
@@ -79,7 +79,7 @@ def _add_parser_args(parser):
parser.add_argument('--exclude-entry-scope',
help='Defines the subtree in which the plug-in ignores any
operations '
'for deleting or renaming a user
(nsslapd-pluginExcludeEntryScope)')
- parser.add_argument('--container_scope',
+ parser.add_argument('--container-scope',
help='Specifies which branch the plug-in searches for the
groups to which the user belongs. '
'It only updates groups that are under the specified
container branch, '
'and leaves all other groups not updated
(nsslapd-pluginContainerScope)')
diff --git a/src/lib389/lib389/cli_conf/plugins/retrochangelog.py
b/src/lib389/lib389/cli_conf/plugins/retrochangelog.py
index e677310..2fcaf20 100644
--- a/src/lib389/lib389/cli_conf/plugins/retrochangelog.py
+++ b/src/lib389/lib389/cli_conf/plugins/retrochangelog.py
@@ -25,7 +25,7 @@ def retrochangelog_edit(inst, basedn, log, args):
def _add_parser_args(parser):
- parser.add_argument('--is-replicated', choices=['true',
'false'], type=str.lower,
+ parser.add_argument('--is-replicated', choices=['TRUE',
'FALSE'], type=str.upper,
help='Sets a flag to indicate on a change in the changelog
whether the change is newly made '
'on that server or whether it was replicated over from
another server (isReplicated)')
parser.add_argument('--attribute',
diff --git a/src/lib389/lib389/cli_conf/pwpolicy.py
b/src/lib389/lib389/cli_conf/pwpolicy.py
index 5755fb8..f911997 100644
--- a/src/lib389/lib389/cli_conf/pwpolicy.py
+++ b/src/lib389/lib389/cli_conf/pwpolicy.py
@@ -8,54 +8,12 @@
import json
import ldap
-from lib389.utils import ensure_str, ensure_list_str
+from lib389.utils import ensure_str
from lib389.pwpolicy import PwPolicyEntries, PwPolicyManager
from lib389.idm.account import Account
-arg_to_attr = {
- 'pwdlocal': 'nsslapd-pwpolicy-local',
- 'pwdscheme': 'passwordstoragescheme',
- 'pwdchange': 'passwordChange',
- 'pwdmustchange': 'passwordMustChange',
- 'pwdhistory': 'passwordHistory',
- 'pwdhistorycount': 'passwordInHistory',
- 'pwdadmin': 'passwordAdminDN',
- 'pwdtrack': 'passwordTrackUpdateTime',
- 'pwdwarning': 'passwordWarning',
- 'pwdisglobal': 'passwordIsGlobalPolicy',
- 'pwdexpire': 'passwordExp',
- 'pwdmaxage': 'passwordMaxAge',
- 'pwdminage': 'passwordMinAge',
- 'pwdgracelimit': 'passwordGraceLimit',
- 'pwdsendexpiring': 'passwordSendExpiringTime',
- 'pwdlockout': 'passwordLockout',
- 'pwdunlock': 'passwordUnlock',
- 'pwdlockoutduration': 'passwordLockoutDuration',
- 'pwdmaxfailures': 'passwordMaxFailure',
- 'pwdresetfailcount': 'passwordResetFailureCount',
- 'pwdchecksyntax': 'passwordCheckSyntax',
- 'pwdminlen': 'passwordMinLength',
- 'pwdmindigits': 'passwordMinDigits',
- 'pwdminalphas': 'passwordMinAlphas',
- 'pwdminuppers': 'passwordMinUppers',
- 'pwdminlowers': 'passwordMinLowers',
- 'pwdminspecials': 'passwordMinSpecials',
- 'pwdmin8bits': 'passwordMin8bit',
- 'pwdmaxrepeats': 'passwordMaxRepeats',
- 'pwdpalindrome': 'passwordPalindrome',
- 'pwdmaxseq': 'passwordMaxSequence',
- 'pwdmaxseqsets': 'passwordMaxSeqSets',
- 'pwdmaxclasschars': 'passwordMaxClassChars',
- 'pwdmincatagories': 'passwordMinCategories',
- 'pwdmintokenlen': 'passwordMinTokenLength',
- 'pwdbadwords': 'passwordBadWords',
- 'pwduserattrs': 'passwordUserAttributes',
- 'pwddictcheck': 'passwordDictCheck',
- 'pwddictpath': 'passwordDictPath',
- 'pwdallowhash': 'nsslapd-allow-hashed-passwords'
- }
-
-def _args_to_attrs(args):
+
+def _args_to_attrs(args, arg_to_attr):
attrs = {}
for arg in vars(args):
val = getattr(args, arg)
@@ -68,50 +26,44 @@ def _get_policy_type(inst, dn=None):
pwp_manager = PwPolicyManager(inst)
if dn is None:
return "Global Password Policy"
- elif pwp_manager.is_user_policy(dn):
- return "User Policy"
elif pwp_manager.is_subtree_policy(dn):
return "Subtree Policy"
else:
- raise ValueError("The policy wasn't set up for the target dn entry or it
is invalid")
+ return "User Policy"
def _get_pw_policy(inst, targetdn, log, use_json=None):
pwp_manager = PwPolicyManager(inst)
policy_type = _get_policy_type(inst, targetdn)
-
+ attr_list = pwp_manager.get_attr_list()
if "global" in policy_type.lower():
targetdn = 'cn=config'
- pwp_manager.pwp_attributes.extend(['passwordIsGlobalPolicy',
'nsslapd-pwpolicy_local'])
+ attr_list.extend(['passwordIsGlobalPolicy',
'nsslapd-pwpolicy_local'])
+ attrs = inst.config.get_attrs_vals_utf8(attr_list)
else:
- targetdn = pwp_manager.get_pwpolicy_entry(targetdn).dn
-
- entries = inst.search_s(targetdn, ldap.SCOPE_BASE, 'objectclass=*',
pwp_manager.pwp_attributes)
- entry = entries[0]
+ policy = pwp_manager.get_pwpolicy_entry(targetdn)
+ targetdn = policy.dn
+ attrs = policy.get_attrs_vals_utf8(attr_list)
if use_json:
- str_attrs = {}
- for k in entry.data:
- str_attrs[ensure_str(k)] = ensure_list_str(entry.data[k])
-
- # ensure all the keys are lowercase
- str_attrs = dict((k.lower(), v) for k, v in str_attrs.items())
-
- print(json.dumps({"type": "entry", "pwp_type":
policy_type, "dn": ensure_str(targetdn), "attrs": str_attrs}))
+ print(json.dumps({"type": "entry", "pwp_type":
policy_type, "dn": ensure_str(targetdn), "attrs": attrs}))
else:
if "global" in policy_type.lower():
response = "Global Password Policy:
cn=config\n------------------------------------\n"
else:
response = "Local {} Policy:
{}\n------------------------------------\n".format(policy_type, targetdn)
- for k in entry.data:
- response += "{}: {}\n".format(k, ensure_str(entry.data[k][0]))
+ for key, value in list(attrs.items()):
+ if len(value) == 0:
+ value = ""
+ else:
+ value = value[0]
+ response += "{}: {}\n".format(key, value)
print(response)
def list_policies(inst, basedn, log, args):
log = log.getChild('list_policies')
targetdn = args.DN[0]
- pwp_manager = PwPolicyManager(inst)
if args.json:
result = {'type': 'list', 'items': []}
@@ -125,26 +77,16 @@ def list_policies(inst, basedn, log, args):
# User pwpolicy entry is under the container that is under the parent,
# so we need to go one level up
- if pwp_manager.is_user_policy(targetdn):
- policy_type = _get_policy_type(inst, user_entry.dn)
+ pwp_entries = PwPolicyEntries(inst, targetdn)
+ for pwp_entry in pwp_entries.list():
+ dn_comps = ldap.dn.explode_dn(pwp_entry.get_attr_val_utf8_l('cn'))
+ dn_comps.pop(0)
+ entrydn = ",".join(dn_comps)
+ policy_type = _get_policy_type(inst, entrydn)
if args.json:
- result['items'].append([user_entry.dn, policy_type])
+ result['items'].append([entrydn, policy_type])
else:
- result += "%s (%s)\n" % (user_entry.dn, policy_type.lower())
- else:
- pwp_entries = PwPolicyEntries(inst, targetdn)
- for pwp_entry in pwp_entries.list():
- cn = pwp_entry.get_attr_val_utf8_l('cn')
- if pwp_entry.is_subtree_policy():
- entrydn = cn.replace('cn=nspwpolicyentry_subtree,', '')
- else:
- entrydn = cn.replace('cn=nspwpolicyentry_user,', '')
- policy_type = _get_policy_type(inst, entrydn)
-
- if args.json:
- result['items'].append([entrydn, policy_type])
- else:
- result += "%s (%s)\n" % (entrydn, policy_type.lower())
+ result += "%s (%s)\n" % (entrydn, policy_type.lower())
if args.json:
print(json.dumps(result))
@@ -165,8 +107,8 @@ def get_global_policy(inst, basedn, log, args):
def create_subtree_policy(inst, basedn, log, args):
log = log.getChild('create_subtree_policy')
# Gather the attributes
- attrs = _args_to_attrs(args)
pwp_manager = PwPolicyManager(inst)
+ attrs = _args_to_attrs(args, pwp_manager.arg_to_attr)
pwp_manager.create_subtree_policy(args.DN[0], attrs)
print('Successfully created subtree password policy')
@@ -174,9 +116,8 @@ def create_subtree_policy(inst, basedn, log, args):
def create_user_policy(inst, basedn, log, args):
log = log.getChild('create_user_policy')
- # Gather the attributes
- attrs = _args_to_attrs(args)
pwp_manager = PwPolicyManager(inst)
+ attrs = _args_to_attrs(args, pwp_manager.arg_to_attr)
pwp_manager.create_user_policy(args.DN[0], attrs)
print('Successfully created user password policy')
@@ -184,9 +125,8 @@ def create_user_policy(inst, basedn, log, args):
def set_global_policy(inst, basedn, log, args):
log = log.getChild('set_global_policy')
- # Gather the attributes
- attrs = _args_to_attrs(args)
pwp_manager = PwPolicyManager(inst)
+ attrs = _args_to_attrs(args, pwp_manager.arg_to_attr)
pwp_manager.set_global_policy(attrs)
print('Successfully updated global password policy')
@@ -195,9 +135,8 @@ def set_global_policy(inst, basedn, log, args):
def set_local_policy(inst, basedn, log, args):
log = log.getChild('set_local_policy')
targetdn = args.DN[0]
- # Gather the attributes
- attrs = _args_to_attrs(args)
pwp_manager = PwPolicyManager(inst)
+ attrs = _args_to_attrs(args, pwp_manager.arg_to_attr)
pwp_entry = pwp_manager.get_pwpolicy_entry(args.DN[0])
policy_type = _get_policy_type(inst, targetdn)
diff --git a/src/lib389/lib389/cli_ctl/dbtasks.py b/src/lib389/lib389/cli_ctl/dbtasks.py
index ee7df9d..590a1ea 100644
--- a/src/lib389/lib389/cli_ctl/dbtasks.py
+++ b/src/lib389/lib389/cli_ctl/dbtasks.py
@@ -1,5 +1,6 @@
# --- BEGIN COPYRIGHT BLOCK ---
# Copyright (C) 2016 Red Hat, Inc.
+# Copyright (C) 2019 William Brown <william(a)blackhats.net.au>
# All rights reserved.
#
# License: GPL (version 3 or any later version).
@@ -79,6 +80,14 @@ def dbtasks_ldifs(inst, log, args):
log.info("backups successful")
+def dbtasks_verify(inst, log, args):
+ if not inst.dbverify(bename=args.backend):
+ log.fatal("dbverify failed")
+ return False
+ else:
+ log.info("dbverify successful")
+
+
def create_parser(subcommands):
db2index_parser = subcommands.add_parser('db2index', help="Initialise a
reindex of the server database. The server must be stopped for this to proceed.")
# db2index_parser.add_argument('suffix', help="The suffix to reindex. IE
dc=example,dc=com.")
@@ -98,6 +107,10 @@ def create_parser(subcommands):
db2ldif_parser.add_argument('--encrypted', help="Export encrypted
attributes", default=False, action='store_true')
db2ldif_parser.set_defaults(func=dbtasks_db2ldif)
+ dbverify_parser = subcommands.add_parser('dbverify', help="Perform a db
verification. You should only do this at direction of support")
+ dbverify_parser.add_argument('backend', help="The backend to verify. IE
userRoot")
+ dbverify_parser.set_defaults(func=dbtasks_verify)
+
bak2db_parser = subcommands.add_parser('bak2db', help="Restore a BDB
backup of the database. The server must be stopped for this to proceed.")
bak2db_parser.add_argument('archive', help="The archive to restore. This
will erase all current server databases.")
bak2db_parser.set_defaults(func=dbtasks_bak2db)
@@ -112,7 +125,7 @@ def create_parser(subcommands):
backups_parser.add_argument('--delete', nargs=1, help="Delete backup
directory")
backups_parser.set_defaults(func=dbtasks_backups)
- ldifs_parser = subcommands.add_parser('ldifs', help="List all the DLIF
files located in the server's LDIF directory")
+ ldifs_parser = subcommands.add_parser('ldifs', help="List all the LDIF
files located in the server's LDIF directory")
ldifs_parser.add_argument('--delete', nargs=1, help="Delete LDIF
file")
ldifs_parser.set_defaults(func=dbtasks_ldifs)
diff --git a/src/lib389/lib389/cli_ctl/instance.py
b/src/lib389/lib389/cli_ctl/instance.py
index b70ec7c..95958e1 100644
--- a/src/lib389/lib389/cli_ctl/instance.py
+++ b/src/lib389/lib389/cli_ctl/instance.py
@@ -1,22 +1,22 @@
# --- BEGIN COPYRIGHT BLOCK ---
-# Copyright (C) 2018 Red Hat, Inc.
+# Copyright (C) 2019 Red Hat, Inc.
# All rights reserved.
#
# License: GPL (version 3 or any later version).
# See LICENSE for details.
# --- END COPYRIGHT BLOCK ---
-from lib389._constants import *
-
+import os
+import json
+import time
+import sys
+from getpass import getpass
from lib389 import DirSrv
from lib389.tools import DirSrvTools
from lib389.instance.setup import SetupDs
from lib389.utils import get_instance_list
from lib389.instance.remove import remove_ds_instance
-from getpass import getpass
-import os
-import time
-import sys
+from lib389._constants import CONF_SERVER_ID
from lib389.instance.options import General2Base, Slapd2Base, Backend2Base
@@ -51,6 +51,10 @@ def instance_stop(inst, log, args):
def instance_status(inst, log, args):
+ if args.json:
+ print(json.dumps({"type": "result", "running":
inst.status()}))
+ return
+
if inst.status() is True:
log.info('Instance "{}" is running'.format(inst.serverid))
else:
@@ -63,10 +67,7 @@ def instance_create_interactive(inst, log, args):
def instance_create(inst, log, args):
- if args.containerised:
- log.debug("Containerised features requested.")
-
- sd = SetupDs(args.verbose, args.dryrun, log, args.containerised)
+ sd = SetupDs(args.verbose, args.dryrun, log)
if sd.create_from_inf(args.file):
# print("Successfully created instance")
return True
@@ -76,15 +77,8 @@ def instance_create(inst, log, args):
def instance_example(inst, log, args):
- gpl_copyright = """
-; --- BEGIN COPYRIGHT BLOCK ---
-; Copyright (C) 2018 Red Hat, Inc.
-; All rights reserved.
-;
-; License: GPL (version 3 or any later version).
-; See LICENSE for details.
-; --- END COPYRIGHT BLOCK ---
-
+ header = """
+;
; This is a version 2 ds setup inf file.
; It is used by the python versions of setup-ds-*
; Most options map 1 to 1 to the original .inf file.
@@ -113,7 +107,7 @@ def instance_example(inst, log, args):
# Open file and populate it
template_file = open(args.template_file, 'w')
- template_file.write(gpl_copyright)
+ template_file.write(header)
template_file.write(g2b.collect_help())
template_file.write(s2b.collect_help())
template_file.write(b2b.collect_help())
@@ -122,7 +116,7 @@ def instance_example(inst, log, args):
log.error("Failed trying to create template file ({}), error:
{}".format(args.template_file, str(e)))
return False
else:
- print(gpl_copyright)
+ print(header)
print(g2b.collect_help())
print(s2b.collect_help())
print(b2b.collect_help())
diff --git a/src/lib389/lib389/cli_idm/account.py b/src/lib389/lib389/cli_idm/account.py
index 610ae7e..f95c6c6 100644
--- a/src/lib389/lib389/cli_idm/account.py
+++ b/src/lib389/lib389/cli_idm/account.py
@@ -11,15 +11,35 @@ import argparse
from lib389.idm.account import Account, Accounts
from lib389.cli_base import (
+ _generic_get,
+ _generic_get_dn,
_generic_list,
+ _generic_delete,
+ _generic_modify_dn,
_get_arg,
+ _warn,
)
MANY = Accounts
+SINGULAR = Account
def list(inst, basedn, log, args):
_generic_list(inst, basedn, log.getChild('_generic_list'), MANY, args)
+def get_dn(inst, basedn, log, args):
+ dn = _get_arg( args.dn, msg="Enter dn to retrieve")
+ _generic_get_dn(inst, basedn, log.getChild('_generic_get_dn'), MANY, dn,
args)
+
+def delete(inst, basedn, log, args, warn=True):
+ dn = _get_arg( args.dn, msg="Enter dn to delete")
+ if warn:
+ _warn(dn, msg="Deleting %s %s" % (SINGULAR.__name__, dn))
+ _generic_delete(inst, basedn, log.getChild('_generic_delete'), SINGULAR, dn,
args)
+
+def modify(inst, basedn, log, args, warn=True):
+ dn = _get_arg( args.dn, msg="Enter dn to modify")
+ _generic_modify_dn(inst, basedn, log.getChild('_generic_modify'), MANY, dn,
args)
+
def status(inst, basedn, log, args):
dn = _get_arg( args.dn, msg="Enter dn to check")
accounts = Accounts(inst, basedn)
@@ -64,13 +84,27 @@ def change_password(inst, basedn, log, args):
def create_parser(subparsers):
- account_parser = subparsers.add_parser('account', help='Manage generic
accounts IE account locking and unlocking.')
+ account_parser = subparsers.add_parser('account', help='''Manage
generic accounts, with tasks
+like modify, locking and unlocking. To create an account, see "user" subcommand
instead.''')
subcommands = account_parser.add_subparsers(help='action')
- list_parser = subcommands.add_parser('list', help='list')
+ list_parser = subcommands.add_parser('list', help='list accounts that
could login to the directory')
list_parser.set_defaults(func=list)
+ get_dn_parser = subcommands.add_parser('get-by-dn', help='get-by-dn
<dn>')
+ get_dn_parser.set_defaults(func=get_dn)
+ get_dn_parser.add_argument('dn', nargs='?', help='The dn to get
and display')
+
+ modify_dn_parser = subcommands.add_parser('modify-by-dn',
help='modify-by-dn <dn>
<add|delete|replace>:<attribute>:<value> ...')
+ modify_dn_parser.set_defaults(func=modify)
+ modify_dn_parser.add_argument('dn', nargs=1, help='The dn to get and
display')
+ modify_dn_parser.add_argument('changes', nargs='+', help="A list
of changes to apply in format:
<add|delete|replace>:<attribute>:<value>")
+
+ delete_parser = subcommands.add_parser('delete', help='deletes the
account')
+ delete_parser.set_defaults(func=delete)
+ delete_parser.add_argument('dn', nargs='?', help='The dn of the
account to delete')
+
lock_parser = subcommands.add_parser('lock', help='lock')
lock_parser.set_defaults(func=lock)
lock_parser.add_argument('dn', nargs='?', help='The dn to
lock')
diff --git a/src/lib389/lib389/cli_idm/client_config.py
b/src/lib389/lib389/cli_idm/client_config.py
new file mode 100644
index 0000000..61c6fd5
--- /dev/null
+++ b/src/lib389/lib389/cli_idm/client_config.py
@@ -0,0 +1,290 @@
+# --- BEGIN COPYRIGHT BLOCK ---
+# Copyright (C) 2019, William Brown <william(a)blackhats.net.au>
+# All rights reserved.
+#
+# License: GPL (version 3 or any later version).
+# See LICENSE for details.
+# --- END COPYRIGHT BLOCK ---
+
+import argparse
+
+from lib389.idm.user import nsUserAccount, nsUserAccounts
+from lib389.idm.group import Group, Groups
+from lib389.plugins import MemberOfPlugin
+
+from lib389.utils import basedn_to_ldap_dns_uri
+
+SSSD_CONF_TEMPLATE = """
+#
+# sssd.conf
+# Generated by 389 Directory Server - dsidm
+#
+# For more details see man sssd.conf and man sssd-ldap
+# Be sure to review the content of this file to ensure it is secure and correct
+# in your environment.
+
+[domain/ldap]
+# Uncomment this for more verbose logging.
+# debug_level=3
+
+# Cache hashes of user authentication for offline auth.
+cache_credentials = True
+id_provider = ldap
+auth_provider = ldap
+access_provider = ldap
+chpass_provider = ldap
+ldap_schema = {schema_type}
+ldap_search_base = {basedn}
+ldap_uri = {ldap_uri}
+# If you have DNS SRV records, you can use the following instead. This derives
+# from your ldap_search_base.
+# ldap_uri = _srv_
+
+ldap_tls_reqcert = demand
+# To use cacert dir, place *.crt files in this path then run:
+# /usr/bin/c_rehash /etc/openldap/certs
+ldap_tls_cacertdir = /etc/openldap/certs
+
+# Path to the cacert
+# ldap_tls_cacert = /etc/openldap/certs/ca.crt
+
+# Only users who match this filter can login and authorise to this machine. Note
+# that users who do NOT match, will still have their uid/gid resolve, but they
+# can't login.
+ldap_access_filter = {ldap_access_filter}
+
+enumerate = false
+access_provider = ldap
+ldap_user_member_of = memberof
+ldap_user_gecos = cn
+ldap_user_uuid = nsUniqueId
+ldap_group_uuid = nsUniqueId
+# This is really important as it allows SSSD to respect nsAccountLock
+ldap_account_expire_policy = rhds
+ldap_access_order = filter, expire
+# Setup for ssh keys
+# Inside /etc/ssh/sshd_config add the lines:
+# AuthorizedKeysCommand /usr/bin/sss_ssh_authorizedkeys
+# AuthorizedKeysCommandUser nobody
+# You can test with the command: sss_ssh_authorizedkeys <username>
+ldap_user_ssh_public_key = nsSshPublicKey
+
+# This prevents an issue where the Directory is recursively walked on group
+# and user look ups. It makes the client faster and more responsive in almost
+# every scenario.
+ignore_group_members = False
+
+[sssd]
+services = nss, pam, ssh, sudo
+config_file_version = 2
+
+domains = ldap
+[nss]
+homedir_substring = /home
+
+"""
+
+def sssd_conf(inst, basedn, log, args):
+
+ schema_type = "rfc2307"
+ try:
+ mo_plugin = MemberOfPlugin(inst)
+ if mo_plugin.status():
+ schema_type = "rfc2307bis"
+ except:
+ schema_type = "unknown - likely access denied to memberof plugin
config"
+
+ ldap_access_filter = None
+ if args.allowed_group:
+ groups = Groups(inst, basedn)
+ g_access = groups.get(args.allowed_group)
+ ldap_access_filter = '(memberOf=%s)' % g_access.dn
+
+ # Print a customised sssd.config.
+ print(SSSD_CONF_TEMPLATE.format(
+ basedn=basedn,
+ schema_type=schema_type,
+ ldap_uri=inst.ldapuri,
+ ldap_access_filter=ldap_access_filter,
+ ))
+
+LDAP_CONF_TEMPLATE = """
+#
+# OpenLDAP client configuration
+# Generated by 389 Directory Server - dsidm
+#
+
+# See ldap.conf(5) for details
+# This file should be world readable but not world writable.
+
+BASE {basedn}
+# Remember to check this: you can have multiple uris on this line. You may have
+# multiple servers or load balancers in your environment.
+URI {ldap_uri}
+# If you have DNS SRV records you can use:
+# URI {ldap_dns_uri}
+
+DEREF never
+# To use cacert dir, place *.crt files in this path then run:
+# /usr/bin/c_rehash /etc/openldap/certs
+TLS_CACERTDIR /etc/openldap/certs
+# TLS_CACERT /etc/openldap/certs/ca.crt
+
+"""
+
+def ldap_conf(inst, basedn, log, args):
+ # Print a customised ldap.conf or ldaprc
+ print(LDAP_CONF_TEMPLATE.format(
+ basedn=basedn,
+ ldap_uri=inst.ldapuri,
+ ldap_dns_uri=basedn_to_ldap_dns_uri(basedn),
+ ))
+
+DISPLAY_TEMPLATE = """
+# This is a generic list of LDAP client configuration parameters you may require
+# for connecting a client to this server. Some of them may or may not apply
+# to your application, so consult your application documentation for further
+# assistance.
+#
+# This program makes a number of assumptions about your data and configuration
+# which may not be correct. Be sure to check these values for your situation.
+
+; ldap uri
+; This is the uri of the server you will connect to and authenticate to. It
+; must be a valid subjectAltName in the presented TLS certificate. Note that this
+; is not an exhaustive list of your LDAP servers, and other applications in your
+; network like load balancers may affect this. This is just what we derive from
+; your current connection.
+ldap_uri = {ldap_uri}
+
+; ldap dns discovery uri
+; In some environments, you may have DNS SRV records such as
+; "_ldap._tcp.<domain name>". If these are present in your dns server,
you can
+; use the following uri.
+ldap_uri = {ldap_dns_uri}
+
+; ca_cert
+; To correctly use TLS, you require the valid CA cert that issued your LDAP TLS
+; certificates. Sometimes a copy of this may be in your server instance as
+ca_cert = /etc/dirsrv/slapd-<instance>/ca.crt
+; However that's not guaranteed. You can show the certs from the LDAP server
+; by sshing to the server and running:
+certutil -L -d /etc/dirsrv/slapd-<instance>/
+; If you can identify the CA certificate name, you can then view it with:
+certutil -L -n <ca cert name> -a -d /etc/dirsrv/slapd-<instance>/
+; This should be a pem file you can use in your application's CA.
+; Some applications don't require a ca certificate parameter, and will use the
+; ca certificate from /etc/openldap/ldap.conf. You should configure ldap.conf
+; in these cases. See the 'client_config ldap.conf' command in dsidm.
+
+; basedn
+; The basedn is the root suffix where all searches will originate from for
+; LDAP objects.
+basedn = {basedn}
+
+; schema_type
+; LDAP servers have different ways to structure their objects and group
+; relationships. Legacy servers will use rfc2307, where as modern servers will
+; use rfc2307bis (requires MemberOf plugin to be enabled). This is the schema
+; setting of your directory based on your running configuration (if we can
+; detect it).
+schema_type = {schema_type}
+
+; user/account basedn
+; Some applications may optionally use a user/account basedn to limit searches
+; in the directory. This can be for performance or security reasons. Generally
+; you shouldn't need this, preferring to use groups and filters for access
+; control.
+user_basedn = {user_basedn}
+
+; user filter
+; This is an ldap filter that will return only user objects. Additionally some
+; applications will template into the filter (similar to sql statements) or they
+; will generate the filter based on attributes. We list a number of possible
+; filters you might use, but you should customise this for your application.
+;
+; If you are using rfc2307bis, you can use this filter to provide authorisation
+; support by adding filters such as: (memberOf=<groupdn>)
+user_filter = {user_filter}
+user_filter = {user_id_filter}
+
+; group basedn
+; Some applications may optionnaly use a group basedn to limit searches in the
+; directory. This can be for performance or security reasons. Generally you
+; shouldn't need this, preferring to use groups and filters for access control.
+group_basedn = {group_basedn}
+
+; group filter
+; This is an ldap filter that will return only group objects. Additionally
+; some applications will template into the filter (similar to sql statements)
+; or they will generate the filter base on attributes. We list a number of
+; possible filters you might use, but you should customise this for your
+; application.
+group_filter = {group_filter}
+group_filter = {group_id_filter}
+
+; attribute mappings
+; Due to the variety of schemas and attribute mappings in LDAP, there are
+; different representations of attributes and values. This is a guess at
+; the mappings that exist in your server, and what attributes you should
+; configure and use.
+unique id = {uuid_attr}
+user rdn = {user_rdn}
+user identifier = {user_rdn}
+group rdn = {group_rdn}
+group member attribute = {group_member}
+
+"""
+
+
+def display(inst, basedn, log, args):
+
+ users = nsUserAccounts(inst, basedn)
+ groups = Groups(inst, basedn)
+
+ schema_type = "rfc2307"
+ try:
+ mo_plugin = MemberOfPlugin(inst)
+ if mo_plugin.status():
+ schema_type = "rfc2307bis"
+ except:
+ schema_type = "unknown - likely access denied to memberof plugin
config"
+
+ # Get required information
+ print(DISPLAY_TEMPLATE.format(
+ ldap_uri=inst.ldapuri,
+ ldap_dns_uri=basedn_to_ldap_dns_uri(basedn),
+ basedn=basedn,
+ schema_type=schema_type,
+ user_basedn=users._basedn,
+ user_filter=users._get_objectclass_filter(),
+ user_id_filter=users._get_selector_filter('<PARAM>'),
+ group_basedn=groups._basedn,
+ group_filter=groups._get_objectclass_filter(),
+ group_id_filter=groups._get_selector_filter('<PARAM>'),
+ uuid_attr='nsUniqueId',
+ user_rdn=users._filterattrs[0],
+ group_rdn=groups._filterattrs[0],
+ group_member='member',
+ ))
+
+def create_parser(subparsers):
+ client_config_parser = subparsers.add_parser('client_config',
+ help="Display and generate client example configs for this LDAP
server")
+
+ subcommands = client_config_parser.add_subparsers(help='action')
+
+ sssd_conf_parser = subcommands.add_parser('sssd.conf',
+ help="Generate a SSSD configuration for this LDAP server")
+ # Allowed login groups for filter?
+ sssd_conf_parser.add_argument('allowed_group', nargs='?',
help="The name of the group allowed access to this system")
+ sssd_conf_parser.set_defaults(func=sssd_conf)
+
+ ldap_conf_parser = subcommands.add_parser('ldap.conf',
+ help="Generate an OpenLDAP ldap.conf configuration for this LDAP
server")
+ ldap_conf_parser.set_defaults(func=ldap_conf)
+
+ display_parser = subcommands.add_parser('display',
+ help="Display generic application parameters for LDAP connection")
+ display_parser.set_defaults(func=display)
+
diff --git a/src/lib389/lib389/cli_idm/posixgroup.py
b/src/lib389/lib389/cli_idm/posixgroup.py
index 87c951a..5213985 100644
--- a/src/lib389/lib389/cli_idm/posixgroup.py
+++ b/src/lib389/lib389/cli_idm/posixgroup.py
@@ -39,7 +39,7 @@ def get_dn(inst, basedn, log, args):
_generic_get_dn(inst, basedn, log.getChild('_generic_get_dn'), MANY, dn,
args)
def create(inst, basedn, log, args):
- kwargs = _get_attributes(args.extra, MUST_ATTRIBUTES)
+ kwargs = _get_attributes(args, MUST_ATTRIBUTES)
_generic_create(inst, basedn, log.getChild('_generic_create'), MANY, kwargs,
args)
def delete(inst, basedn, log, args):
diff --git a/src/lib389/lib389/cos.py b/src/lib389/lib389/cos.py
index 0e15941..3f79087 100644
--- a/src/lib389/lib389/cos.py
+++ b/src/lib389/lib389/cos.py
@@ -156,3 +156,44 @@ class CosPointerDefinitions(DSLdapObjects):
self._basedn = '{},{}'.format(ensure_str(rdn), ensure_str(basedn))
+class CosClassicDefinition(DSLdapObject):
+ """A Cos CosClassicDefinition associating a dn syntax type as a link
+ attr to a template type.
+
+ :param instance: DirSrv instance
+ :type instance: DirSrv
+ :param dn: The dn of the template
+ :type dn: str
+ """
+ def __init__(self, instance, dn=None):
+ super(CosClassicDefinition, self).__init__(instance, dn)
+ self._rdn_attribute = 'cn'
+ self._must_attributes = ['cn']
+ self._create_objectclasses = [
+ 'top',
+ 'cossuperdefinition',
+ 'cosClassicDefinition',
+ ]
+ self._protected = False
+
+
+class CosClassicDefinitions(DSLdapObjects):
+ """The set of cos CosClassicDefinition that exist.
+ :param instance: A dirsrv instance
+ :type instance: DirSrv
+ :param basedn: The basedn of the templates
+ :type basedn: str
+ :param rdn: The rdn of the templates
+ :type rdn: str
+ """
+
+ def __init__(self, instance, basedn):
+ super(CosClassicDefinitions, self).__init__(instance)
+ self._objectclasses = [
+ 'top',
+ 'cossuperdefinition',
+ 'cosClassicDefinition',
+ ]
+ self._filterattrs = ['cn']
+ self._childobject = CosClassicDefinition
+ self._basedn = basedn
diff --git a/src/lib389/lib389/dirsrv_log.py b/src/lib389/lib389/dirsrv_log.py
index 1a626c2..b23fbe7 100644
--- a/src/lib389/lib389/dirsrv_log.py
+++ b/src/lib389/lib389/dirsrv_log.py
@@ -46,8 +46,8 @@ class DirsrvLog(object):
"""
self.dirsrv = dirsrv
self.log = self.dirsrv.log
- self.prog_timestamp =
re.compile('\[(?P<day>\d*)\/(?P<month>\w*)\/(?P<year>\d*):(?P<hour>\d*):(?P<minute>\d*):(?P<second>\d*)(.(?P<nanosecond>\d*))+\s(?P<tz>[\+\-]\d*)')
# noqa
- self.prog_datetime = re.compile('^(?P<timestamp>\[.*\])')
+ self.prog_timestamp =
re.compile(r'\[(?P<day>\d*)\/(?P<month>\w*)\/(?P<year>\d*):(?P<hour>\d*):(?P<minute>\d*):(?P<second>\d*)(.(?P<nanosecond>\d*))+\s(?P<tz>[\+\-]\d*)')
# noqa
+ self.prog_datetime = re.compile(r'^(?P<timestamp>\[.*\])')
def _get_log_path(self):
"""Return the current log file location"""
@@ -180,13 +180,13 @@ class DirsrvAccessLog(DirsrvLog):
"""
super(DirsrvAccessLog, self).__init__(dirsrv)
## We precompile our regex for parse_line to make it faster.
- self.prog_m1 =
re.compile('^(?P<timestamp>\[.*\])\sconn=(?P<conn>\d*)\sop=(?P<op>\d*)\s(?P<action>\w*)\s(?P<rem>.*)')
- self.prog_con =
re.compile('^(?P<timestamp>\[.*\])\sconn=(?P<conn>\d*)\sfd=(?P<fd>\d*)\sslot=(?P<slot>\d*)\sconnection\sfrom\s(?P<remote>[^\s]*)\sto\s(?P<local>[^\s]*)')
- self.prog_discon =
re.compile('^(?P<timestamp>\[.*\])\sconn=(?P<conn>\d*)\sop=(?P<op>\d*)\sfd=(?P<fd>\d*)\s(?P<action>closed)\s-\s(?P<status>\w*)')
+ self.prog_m1 =
re.compile(r'^(?P<timestamp>\[.*\])\sconn=(?P<conn>\d*)\sop=(?P<op>\d*)\s(?P<action>\w*)\s(?P<rem>.*)')
+ self.prog_con =
re.compile(r'^(?P<timestamp>\[.*\])\sconn=(?P<conn>\d*)\sfd=(?P<fd>\d*)\sslot=(?P<slot>\d*)\sconnection\sfrom\s(?P<remote>[^\s]*)\sto\s(?P<local>[^\s]*)')
+ self.prog_discon =
re.compile(r'^(?P<timestamp>\[.*\])\sconn=(?P<conn>\d*)\sop=(?P<op>\d*)\sfd=(?P<fd>\d*)\s(?P<action>closed)\s-\s(?P<status>\w*)')
# RESULT regex's (based off action.rem)
- self.prog_notes =
re.compile('err=(?P<err>\d*)\stag=(?P<tag>\d*)\snentries=(?P<nentries>\d*)\setime=(?P<etime>[0-9.]*)\snotes=(?P<notes>\w*)')
- self.prog_repl =
re.compile('err=(?P<err>\d*)\stag=(?P<tag>\d*)\snentries=(?P<nentries>\d*)\setime=(?P<etime>[0-9.]*)\scsn=(?P<csn>\w*)')
- self.prog_result =
re.compile('err=(?P<err>\d*)\stag=(?P<tag>\d*)\snentries=(?P<nentries>\d*)\setime=(?P<etime>[0-9.]*)\s(?P<rem>.*)')
+ self.prog_notes =
re.compile(r'err=(?P<err>\d*)\stag=(?P<tag>\d*)\snentries=(?P<nentries>\d*)\setime=(?P<etime>[0-9.]*)\snotes=(?P<notes>\w*)')
+ self.prog_repl =
re.compile(r'err=(?P<err>\d*)\stag=(?P<tag>\d*)\snentries=(?P<nentries>\d*)\setime=(?P<etime>[0-9.]*)\scsn=(?P<csn>\w*)')
+ self.prog_result =
re.compile(r'err=(?P<err>\d*)\stag=(?P<tag>\d*)\snentries=(?P<nentries>\d*)\setime=(?P<etime>[0-9.]*)\s(?P<rem>.*)')
# Lists for each regex type
self.full_regexs = [self.prog_m1, self.prog_con, self.prog_discon]
self.result_regexs = [self.prog_notes, self.prog_repl,
@@ -246,7 +246,7 @@ class DirsrvErrorLog(DirsrvLog):
@param diursrv - A DirSrv object
"""
super(DirsrvErrorLog, self).__init__(dirsrv)
- self.prog_m1 =
re.compile('^(?P<timestamp>\[.*\])\s(?P<message>.*)')
+ self.prog_m1 =
re.compile(r'^(?P<timestamp>\[.*\])\s(?P<message>.*)')
def _get_log_path(self):
"""Return the current log file location"""
diff --git a/src/lib389/lib389/ds_instance.py b/src/lib389/lib389/ds_instance.py
index d4601da..3ac4102 100644
--- a/src/lib389/lib389/ds_instance.py
+++ b/src/lib389/lib389/ds_instance.py
@@ -9,7 +9,7 @@
import os
import re
import sys
-import collections
+from collections.abc import Callable
class DSDecorator(object):
@@ -81,7 +81,7 @@ class DSModuleProxy(object):
# for each function from module create decorated one
for attr in dir(module):
fun = getattr(module, attr)
- if isinstance(fun, collections.Callable):
+ if isinstance(fun, Callable):
decorated = DSDecorator(fun, ds)
setattr(proxy, attr, decorated)
setattr(obj, item, proxy)
diff --git a/src/lib389/lib389/idm/account.py b/src/lib389/lib389/idm/account.py
index a709473..4a5c5c4 100644
--- a/src/lib389/lib389/idm/account.py
+++ b/src/lib389/lib389/idm/account.py
@@ -8,6 +8,7 @@
from lib389._mapped_object import DSLdapObject, DSLdapObjects, _gen_or, _gen_filter,
_term_gen
from lib389._constants import SER_ROOT_DN, SER_ROOT_PW
+from lib389.utils import ds_is_older
import os
import subprocess
@@ -59,7 +60,7 @@ class Account(DSLdapObject):
:param password: An entry password
:type password: str
"""
- self._instance.simple_bind_s(self.dn, password)
+ self._instance.simple_bind_s(self.dn, password, escapehatch='i am sure')
def sasl_bind(self, *args, **kwargs):
"""Open a new connection and bind with the entry via SASL.
@@ -140,7 +141,7 @@ class Account(DSLdapObject):
# Please see _mapped_object.py and DSLdapObject for why this is structured
# in this way re-controls.
self._instance.passwd_s(self._dn, current_password, new_password,
- serverctrls=self._server_controls, clientctrls=self._client_controls)
+ serverctrls=self._server_controls, clientctrls=self._client_controls,
escapehatch='i am sure')
class Accounts(DSLdapObjects):
"""DSLdapObjects that represents Account entry
@@ -169,7 +170,7 @@ class Accounts(DSLdapObjects):
'posixGroup',
'mailRecipient',
]
- # MUST BE NONE.
+ # MUST BE NONE. For more, see _gen_filter in _mapped_object.py.
self._filterattrs = None
self._childobject = Account
self._basedn = basedn
@@ -181,3 +182,21 @@ class Accounts(DSLdapObjects):
_gen_filter(_term_gen('objectclass'), self._objectclasses)
)
+
+class Anonymous(DSLdapObject):
+ """A single instance of Anonymous bind
+
+ :param instance: An instance
+ :type instance: lib389.DirSrv
+ """
+ def __init__(self, instance):
+ super(Anonymous, self).__init__(instance, dn=None)
+
+ def bind(self, *args, **kwargs):
+ """Open a new connection and Anonymous bind .
+ You can pass arguments that will be passed to openConnection.
+ :returns: Connection with a binding as the Anonymous
+ """
+ inst_clone = self._instance.clone({SER_ROOT_DN: '', SER_ROOT_PW:
''})
+ inst_clone.open(*args, **kwargs)
+ return inst_clone
diff --git a/src/lib389/lib389/idm/directorymanager.py
b/src/lib389/lib389/idm/directorymanager.py
index 150a549..bb3b583 100644
--- a/src/lib389/lib389/idm/directorymanager.py
+++ b/src/lib389/lib389/idm/directorymanager.py
@@ -43,3 +43,9 @@ class DirectoryManager(Account):
"""
return super(DirectoryManager, self).bind(password, *args, **kwargs)
+ def rebind(self, password=PW_DM):
+ """Rebind on the same connection
+ :param password: Directory Manager password
+ :type password: str
+ """
+ self._instance.simple_bind_s(self.dn, password, escapehatch='i am sure')
diff --git a/src/lib389/lib389/idm/role.py b/src/lib389/lib389/idm/role.py
new file mode 100644
index 0000000..b630bff
--- /dev/null
+++ b/src/lib389/lib389/idm/role.py
@@ -0,0 +1,163 @@
+# --- BEGIN COPYRIGHT BLOCK ---
+# Copyright (C) 2019 Red Hat, Inc.
+# All rights reserved.
+#
+# License: GPL (version 3 or any later version).
+# See LICENSE for details.
+# --- END COPYRIGHT BLOCK ----
+
+
+from lib389._mapped_object import DSLdapObject, DSLdapObjects
+
+
+class FilterRole(DSLdapObject):
+ """A single instance of FilterRole entry to create FilterRole role.
+
+ :param instance: An instance
+ :type instance: lib389.DirSrv
+ :param dn: Entry DN
+ :type dn: str
+ Usages:
+ user1 = 'cn=anuj,ou=people,dc=example,ed=com'
+ user2 = 'cn=unknownuser,ou=people,dc=example,ed=com'
+
role=FilterRole(topo.standalone,'cn=NameofRole,ou=People,dc=example,dc=com')
+ role_props={'cn':'Anuj',
'nsRoleFilter':'cn=anuj*'}
+ role.create(properties=role_props, basedn=SUFFIX)
+ The user1 entry matches the filter (possesses the cn=anuj* attribute with the
value anuj)
+ therefore, it is a member of this filtered role automatically.
+ """
+ def __init__(self, instance, dn=None):
+ super(FilterRole, self).__init__(instance, dn)
+ self._rdn_attribute = 'cn'
+ self._create_objectclasses = [
+ 'top',
+ 'nsRoleDefinition',
+ 'nsComplexRoleDefinition',
+ 'nsFilteredRoleDefinition'
+ ]
+
+
+class FilterRoles(DSLdapObjects):
+ """DSLdapObjects that represents all filtertrole entries in suffix.
+
+ This instance is used mainly for search operation filtred role
+
+ :param instance: An instance
+ :type instance: lib389.DirSrv
+ :param basedn: Suffix DN
+ :type basedn: str
+ :param rdn: The DN that will be combined wit basedn
+ :type rdn: str
+ Usages:
+ role_props={'cn':'Anuj', 'nsRoleFilter':'cn=*'}
+ FilterRoles(topo.standalone, DEFAULT_SUFFIX).create(properties=role_props)
+ FilterRoles(topo.standalone, DEFAULT_SUFFIX).list()
+ user1 = 'cn=anuj,ou=people,dc=example,ed=com'
+ user2 = 'uid=unknownuser,ou=people,dc=example,ed=com'
+ The user1 entry matches the filter (possesses the cn=* attribute with the value
cn)
+ therefore, it is a member of this filtered role automatically.
+ """
+ def __init__(self, instance, basedn):
+ super(FilterRoles, self).__init__(instance)
+ self._objectclasses = [
+ 'top',
+ 'nsRoleDefinition',
+ 'nsComplexRoleDefinition',
+ 'nsFilteredRoleDefinition'
+ ]
+ self._filterattrs = ['cn']
+ self._basedn = basedn
+ self._childobject = FilterRole
+
+
+class ManagedRole(DSLdapObject):
+ """A single instance of ManagedRole entry to create ManagedRole role.
+
+ :param instance: An instance
+ :type instance: lib389.DirSrv
+ :param dn: Entry DN
+ :type dn: str
+
+ """
+ def __init__(self, instance, dn=None):
+ super(ManagedRole, self).__init__(instance, dn)
+ self._rdn_attribute = 'cn'
+ self._create_objectclasses = [
+ 'top',
+ 'nsRoleDefinition',
+ 'nsSimpleRoleDefinition',
+ 'nsManagedRoleDefinition'
+ ]
+
+
+class ManagedRoles(DSLdapObjects):
+ """DSLdapObjects that represents all ManagedRoles entries in suffix.
+
+ This instance is used mainly for search operation ManagedRoles role
+
+ :param instance: An instance
+ :type instance: lib389.DirSrv
+ :param basedn: Suffix DN
+ :type basedn: str
+ :param rdn: The DN that will be combined wit basedn
+ :type rdn: str
+ """
+ def __init__(self, instance, basedn):
+ super(ManagedRoles, self).__init__(instance)
+ self._objectclasses = [
+ 'top',
+ 'nsRoleDefinition',
+ 'nsSimpleRoleDefinition',
+ 'nsManagedRoleDefinition'
+ ]
+ self._filterattrs = ['cn']
+ self._basedn = basedn
+ self._childobject = ManagedRole
+
+
+class NestedRole(DSLdapObject):
+ """A single instance of NestedRole entry to create NestedRole role.
+
+ :param instance: An instance
+ :type instance: lib389.DirSrv
+ :param dn: Entry DN
+ :type dn: str
+
+ """
+ def __init__(self, instance, dn=None):
+ super(NestedRole, self).__init__(instance, dn)
+ self._must_attributes = ['cn', 'nsRoleDN']
+ self._rdn_attribute = 'cn'
+ self._create_objectclasses = [
+ 'top',
+ 'nsRoleDefinition',
+ 'nsComplexRoleDefinition',
+ 'ldapSubEntry',
+ 'nsNestedRoleDefinition'
+ ]
+
+
+class NestedRoles(DSLdapObjects):
+ """DSLdapObjects that represents all NestedRoles entries in suffix.
+
+ This instance is used mainly for search operation NestedRoles role
+
+ :param instance: An instance
+ :type instance: lib389.DirSrv
+ :param basedn: Suffix DN
+ :type basedn: str
+ :param rdn: The DN that will be combined wit basedn
+ :type rdn: str
+ """
+ def __init__(self, instance, basedn):
+ super(NestedRoles, self).__init__(instance)
+ self._objectclasses = [
+ 'top',
+ 'nsRoleDefinition',
+ 'nsComplexRoleDefinition',
+ 'ldapSubEntry',
+ 'nsNestedRoleDefinition'
+ ]
+ self._filterattrs = ['cn']
+ self._basedn = basedn
+ self._childobject = NestedRole
diff --git a/src/lib389/lib389/instance/options.py
b/src/lib389/lib389/instance/options.py
index a1be9b6..5ee69a3 100644
--- a/src/lib389/lib389/instance/options.py
+++ b/src/lib389/lib389/instance/options.py
@@ -1,5 +1,5 @@
# --- BEGIN COPYRIGHT BLOCK ---
-# Copyright (C) 2016 Red Hat, Inc.
+# Copyright (C) 2019 Red Hat, Inc.
# All rights reserved.
#
# License: GPL (version 3 or any later version).
@@ -116,7 +116,7 @@ class General2Base(Options2):
self._options['strict_host_checking'] = True
self._type['strict_host_checking'] = bool
- self._helptext['strict_host_checking'] = "Sets whether the server
verifies the forward and reverse record set in the \"full_machine_name\"
parameter. When installing this instance with GSSAPI authentication behind a load
balancer, set this parameter to \"false\"."
+ self._helptext['strict_host_checking'] = "Sets whether the server
verifies the forward and reverse record set in the \"full_machine_name\"
parameter. When installing this instance with GSSAPI authentication behind a load
balancer, set this parameter to \"false\". Container installs imply
\"false\"."
self._options['selinux'] = True
self._type['selinux'] = bool
@@ -126,6 +126,10 @@ class General2Base(Options2):
self._type['systemd'] = bool
self._helptext['systemd'] = "Enables systemd platform features. If
set to \"True\", dscreate auto-detects whether systemd is installed. Set this
only to \"False\" in a development environment."
+ self._options['start'] = True
+ self._type['start'] = bool
+ self._helptext['start'] = "Starts the instance after the install
completes. If false, the instance is created but started."
+
self._options['defaults'] = INSTALL_LATEST_CONFIG
self._type['defaults'] = str
self._helptext['defaults'] = "Directory Server enables
administrators to use the default values for cn=config entries from a specific version. If
you set this parameter to \"{LATEST}\", which is the default, the instance
always uses the default values of the latest version. For example, to configure that the
instance uses default values from version 1.3.5, set this parameter to
\"001003005\". The format of this value is XXXYYYZZZ, where X is the major
version, Y the minor version [...]
diff --git a/src/lib389/lib389/instance/remove.py b/src/lib389/lib389/instance/remove.py
index bde5e53..378cd64 100644
--- a/src/lib389/lib389/instance/remove.py
+++ b/src/lib389/lib389/instance/remove.py
@@ -1,5 +1,5 @@
# --- BEGIN COPYRIGHT BLOCK ---
-# Copyright (C) 2016 Red Hat, Inc.
+# Copyright (C) 2019 Red Hat, Inc.
# All rights reserved.
#
# License: GPL (version 3 or any later version).
@@ -9,20 +9,35 @@
import os
import shutil
import subprocess
-from lib389.utils import selinux_label_port
+from lib389.nss_ssl import NssSsl
+from lib389.utils import selinux_label_port, assert_c
+
+
+######################## WARNING #############################
+# DO NOT CHANGE THIS FILE OR ITS CONTENTS WITHOUT READING
+# ALL OF THE COMMENTS FIRST. THERE ARE VERY DELICATE
+# AND DETAILED INTERACTIONS OF COMPONENTS IN THIS FILE.
+#
+# IF IN DOUBT CONTACT WILLIAM BROWN <william(a)blackhats.net.au>
def remove_ds_instance(dirsrv, force=False):
"""
- This will delete the instance as it is define. This must be a local instance.
+ This will delete the instance as it is define. This must be a local instance. This
is
+ designed to raise exceptions quickly and often if *any* error is hit. However, this
can
+ be run repeatedly, and only when the instance is truely removed, will this program
fail
+ to run further.
+
+ :param dirsrv: A directory server instance
+ :type dirsrv: DirSrv
+ :param force: A psycological aid, for people who think force means do something,
harder. Does
+ literally nothing in this program because state machines are a thing.
+ :type force: bool
"""
_log = dirsrv.log.getChild('remove_ds')
_log.debug("Removing instance %s" % dirsrv.serverid)
- # Stop the instance (if running)
- _log.debug("Stopping instance %s" % dirsrv.serverid)
- dirsrv.stop()
- # Copy all the paths we are about to tamp with
+ # Copy all the paths we are about to tamper with
remove_paths = {}
remove_paths['backup_dir'] = dirsrv.ds_paths.backup_dir
remove_paths['cert_dir'] = dirsrv.ds_paths.cert_dir
@@ -37,32 +52,37 @@ def remove_ds_instance(dirsrv, force=False):
remove_paths['lock_dir'] = dirsrv.ds_paths.lock_dir
remove_paths['log_dir'] = dirsrv.ds_paths.log_dir
# remove_paths['run_dir'] = dirsrv.ds_paths.run_dir
- remove_paths['tmpfiles_d'] = dirsrv.ds_paths.tmpfiles_d +
"/dirsrv-" + dirsrv.serverid + ".conf"
remove_paths['inst_dir'] = dirsrv.ds_paths.inst_dir
+ remove_paths['etc_sysconfig'] = "%s/sysconfig/dirsrv-%s" %
(dirsrv.ds_paths.sysconf_dir, dirsrv.serverid)
- marker_path = "%s/sysconfig/dirsrv-%s" % (dirsrv.ds_paths.sysconf_dir,
dirsrv.serverid)
- etc_dirsrv_path = os.path.join(dirsrv.ds_paths.sysconf_dir, 'dirsrv/')
- ssca_path = os.path.join(etc_dirsrv_path, 'ssca/')
+ tmpfiles_d_path = dirsrv.ds_paths.tmpfiles_d + "/dirsrv-" + dirsrv.serverid
+ ".conf"
+
+ # These are handled in a special way.
+ dse_ldif_path = os.path.join(dirsrv.ds_paths.config_dir, 'dse.ldif')
# Check the marker exists. If it *does not* warn about this, and say that to
# force removal you should touch this file.
- _log.debug("Checking for instance marker at %s" % marker_path)
- assert os.path.exists(marker_path)
+ _log.debug("Checking for instance marker at %s" % dse_ldif_path)
+ if not os.path.exists(dse_ldif_path):
+ _log.info("Instance configuration not found, no action will be taken")
+ _log.info("If you want us to cleanup anyway, recreate '%s'" %
dse_ldif_path)
+ return
+ _log.debug("Found instance marker at %s! Proceeding to remove ..." %
dse_ldif_path)
- # Move the config_dir to config_dir.removed
- config_dir = dirsrv.ds_paths.config_dir
- config_dir_rm = "{}.removed".format(config_dir)
+ # Stop the instance (if running) and now we know it really does exist
+ # and hopefully have permission to access it ...
+ _log.debug("Stopping instance %s" % dirsrv.serverid)
+ dirsrv.stop()
- if os.path.exists(config_dir_rm):
- _log.debug("Removing previously existed %s" % config_dir_rm)
- shutil.rmtree(config_dir_rm)
+ _log.debug("Found instance marker at %s! Proceeding to remove ..." %
dse_ldif_path)
- _log.debug("Copying %s to %s" % (config_dir, config_dir_rm))
- try:
- shutil.copytree(config_dir, config_dir_rm)
- except FileNotFoundError:
- pass
+ # Stop the instance (if running) and now we know it really does exist
+ # and hopefully have permission to access it ...
+ _log.debug("Stopping instance %s" % dirsrv.serverid)
+ dirsrv.stop()
+
+ ### ANY NEW REMOVAL ACTION MUST BE BELOW THIS LINE!!!
# Remove these paths:
# for path in ('backup_dir', 'cert_dir', 'config_dir',
'db_dir',
@@ -74,36 +94,56 @@ def remove_ds_instance(dirsrv, force=False):
# Remove parent (/var/lib/dirsrv/slapd-INST)
shutil.rmtree(remove_paths['db_dir'].replace('db', ''),
ignore_errors=True)
- # Finally remove the sysconfig marker.
- os.remove(marker_path)
- _log.debug("Removing %s" % marker_path)
+ # We can not assume we have systemd ...
+ if dirsrv.ds_paths.with_systemd:
+ # Remove the systemd symlink
+ _log.debug("Removing the systemd symlink")
+ subprocess.check_call(["systemctl", "disable",
"dirsrv(a){}".format(dirsrv.serverid)])
- # Remove the systemd symlink
- _log.debug("Removing the systemd symlink")
- subprocess.check_call(["systemctl", "disable",
"dirsrv(a){}".format(dirsrv.serverid)])
+ _log.debug("Removing %s" % tmpfiles_d_path)
+ shutil.rmtree(tmpfiles_d_path, ignore_errors=True)
- # Remove selinux port label
- _log.debug("Removing the port label")
- try:
+ # Nor can we assume we have selinux. Try docker sometime ;)
+ if dirsrv.ds_paths.with_selinux:
+ # Remove selinux port label
+ _log.debug("Removing the port labels")
selinux_label_port(dirsrv.port, remove_label=True)
- except ValueError as e:
- if force:
- pass
- else:
- _log.error(str(e))
- raise e
- if dirsrv.sslport is not None:
- selinux_label_port(dirsrv.sslport, remove_label=True)
+ # This is a compatability with ancient installs, all modern install have tls
port
+ if dirsrv.sslport is not None:
+ selinux_label_port(dirsrv.sslport, remove_label=True)
- # If this was the last instance, remove the ssca directory
+ # If this was the last instance, remove the ssca instance
insts = dirsrv.list(all=True)
if len(insts) == 0:
- # Remove /etc/dirsrv/ssca
- try:
- shutil.rmtree(ssca_path)
- except FileNotFoundError:
- pass
+ ssca = NssSsl(dbpath=dirsrv.get_ssca_dir())
+ ssca.remove_db()
+
+ ### ANY NEW REMOVAL ACTIONS MUST BE ABOVE THIS LINE!!!
+
+ # Finally means FINALLY, the last thing, the LAST LAST thing. By doing this
absolutely
+ # last, it means that we can have any failure above, and continue to re-run until
resolved
+ # because this instance marker (dse.ldif) continues to exist!
+ # Move the config_dir to config_dir.removed
+ config_dir = dirsrv.ds_paths.config_dir
+ config_dir_rm = "{}.removed".format(config_dir)
+
+ if os.path.exists(config_dir_rm):
+ _log.debug("Removing previously existed %s" % config_dir_rm)
+ shutil.rmtree(config_dir_rm)
+
+ assert_c(not os.path.exists(config_dir_rm))
+
+ # That's it, everything before this MUST have suceeded, so now we can move the
+ # config dir (containing dse.ldif, the marker) out of the way.
+ _log.debug("Moving %s to %s" % (config_dir, config_dir_rm))
+ try:
+ shutil.move(config_dir, config_dir_rm)
+ except FileNotFoundError:
+ pass
+
+ # DO NOT PUT ANY CODE BELOW THIS COMMENT BECAUSE THAT WOULD VIOLATE THE ASSERTIONS OF
THE
+ # ABOVE CODE.
# Done!
_log.debug("Complete")
diff --git a/src/lib389/lib389/instance/setup.py b/src/lib389/lib389/instance/setup.py
index 0a52be2..347eba9 100644
--- a/src/lib389/lib389/instance/setup.py
+++ b/src/lib389/lib389/instance/setup.py
@@ -1,5 +1,5 @@
# --- BEGIN COPYRIGHT BLOCK ---
-# Copyright (C) 2016 Red Hat, Inc.
+# Copyright (C) 2019 Red Hat, Inc.
# Copyright (C) 2019 William Brown <william(a)blackhats.net.au>
# All rights reserved.
#
@@ -35,7 +35,8 @@ from lib389.utils import (
normalizeDN,
socket_check_open,
selinux_label_port,
- selinux_restorecon)
+ selinux_restorecon,
+ selinux_present)
ds_paths = Paths()
@@ -239,7 +240,7 @@ class SetupDs(object):
# Set the defaults
general = {'config_version': 2, 'full_machine_name':
socket.getfqdn(),
'strict_host_checking': True, 'selinux': True,
'systemd': ds_paths.with_systemd,
- 'defaults': '999999999'}
+ 'defaults': '999999999', 'start': True}
slapd = {'self_sign_cert_valid_months': 24,
'group': ds_paths.group,
@@ -271,6 +272,12 @@ class SetupDs(object):
'log_dir': ds_paths.log_dir,
'schema_dir': ds_paths.schema_dir}
+ # Let them know about the selinux status
+ if not selinux_present():
+ val = input('\nSelinux support will be disabled, continue? [yes]: ')
+ if val.strip().lower().startswith('n'):
+ return
+
# Start asking questions, beginning with the hostname...
val = input('\nEnter system\'s hostname [{}]:
'.format(general['full_machine_name'])).rstrip()
if val != "":
@@ -471,6 +478,19 @@ class SetupDs(object):
else:
break
+ # Start the instance?
+ while 1:
+ val = input('\nDo you want to start the instance after the installation?
[yes]: ').rstrip().lower()
+ if val == '' or val == 'yes' or val == 'y':
+ # Default behaviour
+ break
+ elif val == "no" or val == 'n':
+ general['start'] = False
+ break
+ else:
+ print('Invalid value, please use \"yes\" or
\"no\"')
+ continue
+
# Are you ready?
while 1:
val = input('\nAre you ready to install? [no]: ').rstrip().lower()
@@ -584,10 +604,16 @@ class SetupDs(object):
self.log.debug("PASSED: root user checking")
assert_c(slapd['port'] is not None, "Configuration port in section
[slapd] not found")
- assert_c(socket_check_open('::1', slapd['port']) is False,
"port %s is already in use" % slapd['port'])
+
+ if self.containerised:
+ if slapd['port'] <= 1024:
+ self.log.warning("WARNING: slapd port %s may not work without
NET_BIND_SERVICE in containers" % slapd['port'])
+ if slapd['secure_port'] <= 1024:
+ self.log.warning("WARNING: slapd secure_port %s may not work without
NET_BIND_SERVICE in containers" % slapd['secure_port'])
+ assert_c(socket_check_open('::1', slapd['port']) is False,
"port %s is already in use, or missing NET_BIND_SERVICE" %
slapd['port'])
# We enable secure port by default.
assert_c(slapd['secure_port'] is not None, "Configuration
secure_port in section [slapd] not found")
- assert_c(socket_check_open('::1', slapd['secure_port']) is False,
"secure_port %s is already in use" % slapd['secure_port'])
+ assert_c(socket_check_open('::1', slapd['secure_port']) is False,
"secure_port %s is already in use, or missing NET_BIND_SERVICE" %
slapd['secure_port'])
self.log.debug("PASSED: network avaliability checking")
# Make assertions of the paths?
@@ -636,42 +662,78 @@ class SetupDs(object):
self.log.debug("FINISH: Completed installation for %s",
slapd['instance_name'])
if not self.verbose:
self.log.info("Completed installation for %s",
slapd['instance_name'])
+ return True
def _install_ds(self, general, slapd, backends):
"""
Actually install the Ds from the dicts provided.
- You should never call this directly, as it bypasses assert_cions.
+ You should never call this directly, as it bypasses assertions.
"""
- # register the instance to /etc/sysconfig
- # We do this first so that we can trick remove-ds.pl if needed.
- # There may be a way to create this from template like the dse.ldif ...
- initconfig = ""
- with open("%s/dirsrv/config/template-initconfig" %
slapd['sysconf_dir']) as template_init:
- for line in template_init.readlines():
- initconfig += line.replace('{{', '{',
1).replace('}}', '}', 1).replace('-', '_')
+ ######################## WARNING #############################
+ # DO NOT CHANGE THIS FUNCTION OR ITS CONTENTS WITHOUT READING
+ # ALL OF THE COMMENTS FIRST. THERE ARE VERY DELICATE
+ # AND DETAILED INTERACTIONS OF COMPONENTS IN THIS FUNCTION.
+ #
+ # IF IN DOUBT CONTACT WILLIAM BROWN <william(a)blackhats.net.au>
+
+
+ ### This first section is about creating the *minimal* required paths and config
to get
+ # directory server to start: After this, we then perform all configuration as
online
+ # changes from after this point.
+
+ # Create dse.ldif with a temporary root password.
+ # This is done first, because instances are found for removal and listing by
detecting
+ # the present of their dse.ldif!!!!
+ # The template is in slapd['data_dir']/dirsrv/data/template-dse.ldif
+ # Variables are done with %KEY%.
+ self.log.debug("ACTION: Creating dse.ldif")
try:
- # /etc/sysconfig
- os.makedirs("%s" % slapd['initconfig_dir'], mode=0o770)
- except FileExistsError:
+ os.umask(0o007) # For parent dirs that get created -> sets 770 for perms
+ os.makedirs(slapd['config_dir'], mode=0o770)
+ except OSError:
pass
- sysconfig_filename = "%s/dirsrv-%s" % (slapd['initconfig_dir'],
slapd['instance_name'])
- with open(sysconfig_filename, 'w') as f:
- f.write(initconfig.format(
- SERVER_DIR=slapd['lib_dir'],
- SERVERBIN_DIR=slapd['sbin_dir'],
- CONFIG_DIR=slapd['config_dir'],
- INST_DIR=slapd['inst_dir'],
- RUN_DIR=slapd['run_dir'],
- DS_ROOT='',
- PRODUCT_NAME='slapd',
+
+ # Get suffix for some plugin defaults (if possible)
+ # annoyingly for legacy compat backend takes TWO key types
+ # and we have to now deal with that ....
+ #
+ # Create ds_suffix here else it won't be in scope ....
+ ds_suffix = ''
+ if len(backends) > 0:
+ ds_suffix = normalizeDN(backends[0]['nsslapd-suffix'])
+
+ dse = ""
+ with open(os.path.join(slapd['data_dir'], 'dirsrv',
'data', 'template-dse.ldif')) as template_dse:
+ for line in template_dse.readlines():
+ dse += line.replace('%', '{', 1).replace('%',
'}', 1)
+
+ with open(os.path.join(slapd['config_dir'], 'dse.ldif'),
'w') as file_dse:
+ file_dse.write(dse.format(
+ schema_dir=slapd['schema_dir'],
+ lock_dir=slapd['lock_dir'],
+ tmp_dir=slapd['tmp_dir'],
+ cert_dir=slapd['cert_dir'],
+ ldif_dir=slapd['ldif_dir'],
+ bak_dir=slapd['backup_dir'],
+ run_dir=slapd['run_dir'],
+ inst_dir=slapd['inst_dir'],
+ log_dir=slapd['log_dir'],
+ fqdn=general['full_machine_name'],
+ ds_port=slapd['port'],
+ ds_user=slapd['user'],
+ rootdn=slapd['root_dn'],
+ ds_passwd=self._secure_password, # We set our own password here, so we
can connect and mod.
+ # This is because we never know the users input root password as they can
validily give
+ # us a *hashed* input.
+ ds_suffix=ds_suffix,
+ config_dir=slapd['config_dir'],
+ db_dir=slapd['db_dir'],
))
- os.chmod(sysconfig_filename, 0o440)
- os.chown(sysconfig_filename, slapd['user_uid'],
slapd['group_gid'])
# Create all the needed paths
# we should only need to make bak_dir, cert_dir, config_dir, db_dir, ldif_dir,
lock_dir, log_dir, run_dir?
- for path in ('backup_dir', 'cert_dir', 'config_dir',
'db_dir', 'ldif_dir', 'lock_dir', 'log_dir',
'run_dir'):
+ for path in ('backup_dir', 'cert_dir', 'db_dir',
'ldif_dir', 'lock_dir', 'log_dir', 'run_dir'):
self.log.debug("ACTION: creating %s", slapd[path])
try:
os.umask(0o007) # For parent dirs that get created -> sets 770 for
perms
@@ -713,7 +775,7 @@ class SetupDs(object):
os.chmod(dstfile, 0o440)
# If we are on the correct platform settings, systemd
- if general['systemd'] and not self.containerised:
+ if general['systemd']:
# Should create the symlink we need, but without starting it.
subprocess.check_call(["systemctl",
"enable",
@@ -732,56 +794,18 @@ class SetupDs(object):
# Bind sockets to our type?
- # Get suffix for some plugin defaults (if possible)
- # annoyingly for legacy compat backend takes TWO key types
- # and we have to now deal with that ....
- #
- # Create ds_suffix here else it won't be in scope ....
- ds_suffix = ''
- if len(backends) > 0:
- ds_suffix = normalizeDN(backends[0]['nsslapd-suffix'])
# Create certdb in sysconfidir
self.log.debug("ACTION: Creating certificate database is %s",
slapd['cert_dir'])
- # Create dse.ldif with a temporary root password.
- # The template is in slapd['data_dir']/dirsrv/data/template-dse.ldif
- # Variables are done with %KEY%.
- # You could cheat and read it in, do a replace of % to { and } then use format?
- self.log.debug("ACTION: Creating dse.ldif")
- dse = ""
- with open(os.path.join(slapd['data_dir'], 'dirsrv',
'data', 'template-dse.ldif')) as template_dse:
- for line in template_dse.readlines():
- dse += line.replace('%', '{', 1).replace('%',
'}', 1)
-
- with open(os.path.join(slapd['config_dir'], 'dse.ldif'),
'w') as file_dse:
- file_dse.write(dse.format(
- schema_dir=slapd['schema_dir'],
- lock_dir=slapd['lock_dir'],
- tmp_dir=slapd['tmp_dir'],
- cert_dir=slapd['cert_dir'],
- ldif_dir=slapd['ldif_dir'],
- bak_dir=slapd['backup_dir'],
- run_dir=slapd['run_dir'],
- inst_dir=slapd['inst_dir'],
- log_dir=slapd['log_dir'],
- fqdn=general['full_machine_name'],
- ds_port=slapd['port'],
- ds_user=slapd['user'],
- rootdn=slapd['root_dn'],
- # ds_passwd=slapd['root_password'],
- ds_passwd=self._secure_password, # We set our own password here, so we
can connect and mod.
- ds_suffix=ds_suffix,
- config_dir=slapd['config_dir'],
- db_dir=slapd['db_dir'],
- ))
-
- # open the connection to the instance.
+ # BELOWE THIS LINE - all actions are now ONLINE changes to the directory server.
+ # if it all possible, ALWAYS ADD NEW INSTALLER CHANGES AS ONLINE ACTIONS.
# Should I move this import? I think this prevents some recursion
from lib389 import DirSrv
ds_instance = DirSrv(self.verbose)
- ds_instance.containerised = self.containerised
+ if self.containerised:
+ ds_instance.systemd = general['systemd']
args = {
SER_PORT: slapd['port'],
SER_SERVERID_PROP: slapd['instance_name'],
@@ -820,12 +844,12 @@ class SetupDs(object):
csr = tlsdb.create_rsa_key_and_csr()
(ca, crt) = ssca.rsa_ca_sign_csr(csr)
tlsdb.import_rsa_crt(ca, crt)
- if not self.containerised and general['selinux']:
+ if general['selinux']:
# Set selinux port label
selinux_label_port(slapd['secure_port'])
# Do selinux fixups
- if not self.containerised and general['selinux']:
+ if general['selinux']:
selinux_paths = ('backup_dir', 'cert_dir',
'config_dir', 'db_dir', 'ldif_dir',
'lock_dir', 'log_dir', 'run_dir',
'schema_dir', 'tmp_dir')
for path in selinux_paths:
@@ -852,10 +876,7 @@ class SetupDs(object):
# tests with standalone.enable_tls if we do not. It's only when security; on
# that we actually start listening on it.
if not slapd['secure_port']:
- if self.containerised:
- slapd['secure_port'] = "3636"
- else:
- slapd['secure_port'] = "636"
+ slapd['secure_port'] = "636"
ds_instance.config.set('nsslapd-secureport', '%s' %
slapd['secure_port'])
if slapd['self_sign_cert']:
ds_instance.config.set('nsslapd-security', 'on')
@@ -883,6 +904,7 @@ class SetupDs(object):
ds_instance.config.set('nsslapd-ldapiautobind', 'on')
ds_instance.config.set('nsslapd-ldapimaprootdn',
slapd['root_dn'])
+
# Create all required sasl maps: if we have a single backend ...
# our default maps are really really bad, and we should feel bad.
# they basically only work with a single backend, and they'll break
@@ -907,15 +929,17 @@ class SetupDs(object):
else:
self.log.debug("Skipping default SASL maps - no backend found!")
- # Complete.
# Change the root password finally
- ds_instance.config.set('nsslapd-rootpw',
- ensure_str(slapd['root_password']))
+ ds_instance.config.set('nsslapd-rootpw', slapd['root_password'])
+ # We need to log the password when containerised
if self.containerised:
- # In a container build we need to stop DirSrv at the end
- ds_instance.stop()
self.log.debug("Root DN password:
{}".format(slapd['root_password']))
- else:
+
+ # Complete.
+ if general['start']:
# Restart for changes to take effect - this could be removed later
ds_instance.restart(post_open=False)
+ else:
+ # Just stop the instance now.
+ ds_instance.stop()
diff --git a/src/lib389/lib389/monitor.py b/src/lib389/lib389/monitor.py
index 9c11d34..9ee16b2 100644
--- a/src/lib389/lib389/monitor.py
+++ b/src/lib389/lib389/monitor.py
@@ -83,6 +83,26 @@ class Monitor(DSLdapObject):
starttime = self.get_attr_vals_utf8('starttime')
return (dtablesize, readwaiters, entriessent, bytessent, currenttime, starttime)
+ def get_status(self, use_json=False):
+ return self.get_attrs_vals_utf8([
+ 'version',
+ 'threads',
+ 'connection',
+ 'currentconnections',
+ 'totalconnections',
+ 'currentconnectionsatmaxthreads',
+ 'maxthreadsperconnhits',
+ 'dtablesize',
+ 'readwaiters',
+ 'opsinitiated',
+ 'opscompleted',
+ 'entriessent',
+ 'bytessent',
+ 'currenttime',
+ 'starttime',
+ 'nbackends',
+ ])
+
class MonitorLDBM(DSLdapObject):
def __init__(self, instance, dn=None):
@@ -150,6 +170,8 @@ class MonitorBackend(DSLdapObject):
'currentnormalizeddncachecount'
])
+ # Issue: get status should return a dict and the called should be
+ # formatting it. See:
https://pagure.io/389-ds-base/issue/50189
def get_status(self, use_json=False):
return self.get_attrs_vals_utf8(self._backend_keys)
diff --git a/src/lib389/lib389/nss_ssl.py b/src/lib389/lib389/nss_ssl.py
index da1dbab..a54095c 100644
--- a/src/lib389/lib389/nss_ssl.py
+++ b/src/lib389/lib389/nss_ssl.py
@@ -60,7 +60,7 @@ class NssSsl(object):
self.db_files = {"dbm_backend": ["%s/%s" % (self._certdb, f)
for f in ("key3.db", "cert8.db", "secmod.db")],
"sql_backend": ["%s/%s" % (self._certdb, f)
for f in ("key4.db", "cert9.db", "pkcs11.txt")],
- "support": ["%s/%s" % (self._certdb, f) for
f in ("noise.txt", "pin.txt", "pwdfile.txt")]}
+ "support": ["%s/%s" % (self._certdb, f) for
f in ("noise.txt", PIN_TXT, PWD_TXT)]}
def detect_alt_names(self, alt_names=[]):
"""Attempt to determine appropriate subject alternate names for a
host.
@@ -104,9 +104,12 @@ class NssSsl(object):
def _generate_noise(self, fpath):
noise = password_generate(256)
- with open(fpath, 'w') as f:
- f.write(noise)
- os.chmod(fpath, 0o660)
+ prv_mask = os.umask(0o177)
+ try:
+ with open(fpath, 'w') as f:
+ f.write(noise)
+ finally:
+ prv_mask = os.umask(prv_mask)
def reinit(self):
"""
@@ -120,20 +123,35 @@ class NssSsl(object):
except FileExistsError:
pass
+ # Write a README to let people know what this is
+ readme_file = '%s/%s' % (self._certdb, 'README.txt')
+ if not os.path.exists(readme_file):
+ with open(readme_file, 'w') as f:
+ f.write("""
+SSCA - Simple Self-Signed Certificate Authority
+
+This is part of the 389 Directory Server project's lib389 toolkit. It
+creates a simple, standalone certificate authority for testing and
+development purposes. It's suitable for evaluation and testing purposes
+only.
+ """)
+
# In the future we may add the needed option to avoid writing the pin
# files.
# Write the pin.txt, and the pwdfile.txt
- pin_file = '%s/%s' % (self._certdb, PIN_TXT)
- if not os.path.exists(pin_file):
- with open(pin_file, 'w') as f:
- f.write('Internal (Software) Token:%s' % self.dbpassword)
- os.chmod(pin_file, 0o660)
-
- pwd_text_file = '%s/%s' % (self._certdb, PWD_TXT)
- if not os.path.exists(pwd_text_file):
- with open(pwd_text_file, 'w') as f:
- f.write('%s' % self.dbpassword)
- os.chmod(pwd_text_file, 0o660)
+ prv_mask = os.umask(0o177)
+ try:
+ pin_file = '%s/%s' % (self._certdb, PIN_TXT)
+ if not os.path.exists(pin_file):
+ with open(pin_file, 'w') as f:
+ f.write('Internal (Software) Token:%s' % self.dbpassword)
+
+ pwd_text_file = '%s/%s' % (self._certdb, PWD_TXT)
+ if not os.path.exists(pwd_text_file):
+ with open(pwd_text_file, 'w') as f:
+ f.write('%s' % self.dbpassword)
+ finally:
+ prv_mask = os.umask(prv_mask)
# Init the db.
# 48886; This needs to be sql format ...
@@ -166,9 +184,6 @@ class NssSsl(object):
except FileNotFoundError:
pass
- if os.path.isdir(self._certdb) and not os.listdir(self._certdb):
- os.removedirs(self._certdb)
-
assert not self._db_exists()
return True
diff --git a/src/lib389/lib389/passwd.py b/src/lib389/lib389/passwd.py
index eda1ea9..b0ce730 100644
--- a/src/lib389/lib389/passwd.py
+++ b/src/lib389/lib389/passwd.py
@@ -44,7 +44,10 @@ def password_hash(pw, scheme=None, bin_dir='/bin'):
def password_generate(length=64):
"""Generate a complex password with at least
one upper case letter, a lower case letter, a digit
- and a special character
+ and a special character. The special characters are limited
+ to a set that can be highlighted with double-click to allow
+ easier copy-paste to a password-manager. Most password strength
+ comes from length anyway, so this is why we use a long length (64)
:param length: a password length
:type length: int
@@ -56,13 +59,19 @@ def password_generate(length=64):
# The number of possible values for a byte is 256 which is a multiple of 64
# Maybe it is an overkill for our case but it can come handy one day
# (especially consider the fact we can use it for CLI tools)
- chars = string.ascii_letters + string.digits + '*&'
+ #
+ # So it turns out we don't escape the - properly, which means that in certain
+ # cases the "chars" yield a string like "-ntoauhtnonhtunothu",
which of course
+ # means that the pwdhash binary says "no such option -n".
+ chars = string.ascii_letters + string.digits + '.'
# Get the minimal requirements
+ # Don't use characters that prevent easy highlight for copy paste ...
+ # It's the little details that make us great
pw = [random.choice(string.ascii_lowercase),
random.choice(string.ascii_uppercase),
random.choice(string.digits),
- '!']
+ '.']
# Use the simple algorithm to generate more or less secure password
for i in range(length - 3):
diff --git a/src/lib389/lib389/plugins.py b/src/lib389/lib389/plugins.py
index 0691e4e..8271e03 100644
--- a/src/lib389/lib389/plugins.py
+++ b/src/lib389/lib389/plugins.py
@@ -1,5 +1,5 @@
# --- BEGIN COPYRIGHT BLOCK ---
-# Copyright (C) 2015 Red Hat, Inc.
+# Copyright (C) 2019 Red Hat, Inc.
# All rights reserved.
#
# License: GPL (version 3 or any later version).
@@ -15,6 +15,7 @@ from lib389 import tasks
from lib389._mapped_object import DSLdapObjects, DSLdapObject
from lib389.lint import DSRILE0001
from lib389.utils import ensure_str, ensure_list_bytes
+from lib389.schema import Schema
from lib389._constants import DN_PLUGIN
from lib389.properties import (
PLUGINS_OBJECTCLASS_VALUE, PLUGIN_PROPNAME_TO_ATTRNAME,
@@ -184,7 +185,7 @@ class AttributeUniquenessPlugins(DSLdapObjects):
"""
def __init__(self, instance, basedn="cn=plugins,cn=config"):
- super(DSLdapObjects, self).__init__(instance)
+ super(DSLdapObjects, self).__init__(instance.verbose)
self._instance = instance
self._objectclasses = ['top', 'nsslapdplugin',
'extensibleObject']
self._filterattrs = ['cn', 'nsslapd-pluginPath']
@@ -294,9 +295,17 @@ class MEPConfig(DSLdapObject):
def __init__(self, instance, dn):
super(MEPConfig, self).__init__(instance, dn)
self._rdn_attribute = 'cn'
- self._must_attributes = ['cn', 'originScope',
'originFilter',
- 'managedBase', 'managedTemplate']
- self._create_objectclasses = ['top', 'mepConfigEntry']
+ schema = Schema(instance)
+ for oc in schema.get_objectclasses():
+ if oc.oid == '2.16.840.1.113730.3.2.336':
+ self._must_attributes = ['cn', 'originScope',
'originFilter',
+ 'managedBase',
'managedTemplate']
+ self._create_objectclasses = ['top', 'mepConfigEntry']
+ break
+ else:
+ # Workaround for older versions without MEP schema
+ self._must_attributes = ['cn']
+ self._create_objectclasses = ['top', 'extensibleObject']
self._protected = False
@@ -311,7 +320,14 @@ class MEPConfigs(DSLdapObjects):
def __init__(self, instance, basedn=None):
super(MEPConfigs, self).__init__(instance)
- self._objectclasses = ['top', 'mepConfigEntry']
+ schema = Schema(instance)
+ for oc in schema.get_objectclasses():
+ if oc.oid == '2.16.840.1.113730.3.2.336':
+ self._objectclasses = ['top', 'mepConfigEntry']
+ break
+ else:
+ # Workaround for older versions without MEP schema
+ self._objectclasses = ['top', 'extensibleObject']
self._filterattrs = ['cn']
self._childobject = MEPConfig
# So we can set the configArea easily
@@ -1047,7 +1063,7 @@ class AutoMembershipDefinition(DSLdapObject):
:type dn: str
"""
- def __init__(self, instance, dn=None):
+ def __init__(self, instance, dn):
super(AutoMembershipDefinition, self).__init__(instance, dn)
self._rdn_attribute = 'cn'
self._must_attributes = ['cn', 'autoMemberScope',
'autoMemberFilter', 'autoMemberGroupingAttr']
@@ -2114,3 +2130,16 @@ class PluginsLegacy(object):
self.conn.modify_s(dn, [(ldap.MOD_REPLACE,
PLUGIN_PROPNAME_TO_ATTRNAME[PLUGIN_ENABLE],
PLUGINS_ENABLE_OFF_VALUE)])
+
+
+class BitwisePlugin(Plugin):
+ """A single instance of Bitwise plugin entry
+
+ :param instance: An instance
+ :type instance: lib389.DirSrv
+ :param dn: Entry DN
+ :type dn: str
+ """
+
+ def __init__(self, instance, dn="cn=Bitwise Plugin,cn=plugins,cn=config"):
+ super(BitwisePlugin, self).__init__(instance, dn)
diff --git a/src/lib389/lib389/pwpolicy.py b/src/lib389/lib389/pwpolicy.py
index 2221958..b74ff6f 100644
--- a/src/lib389/lib389/pwpolicy.py
+++ b/src/lib389/lib389/pwpolicy.py
@@ -13,9 +13,6 @@ from lib389.idm.account import Account
from lib389.idm.nscontainer import nsContainers, nsContainer
from lib389.cos import CosPointerDefinitions, CosPointerDefinition, CosTemplates
-USER_POLICY = 1
-SUBTREE_POLICY = 2
-
class PwPolicyManager(object):
"""Manages user, subtree and global password policies
@@ -70,44 +67,20 @@ class PwPolicyManager(object):
'pwdallowhash': 'nsslapd-allow-hashed-passwords'
}
- def is_user_policy(self, dn):
- """Check if the entry has a user password policy
-
- :param dn: Entry DN with PwPolicy set up
- :type dn: str
-
- :returns: True if the entry has a user policy, False otherwise
- """
-
- # CoSTemplate entry also can have 'pwdpolicysubentry', so we better
validate this part too
- entry = Account(self._instance, dn)
- try:
- if entry.present("objectclass", "costemplate"):
- # It is a CoSTemplate entry, not user policy
- return False
-
- # Check if it's a subtree or a user policy
- if entry.present("pwdpolicysubentry"):
- return True
- else:
- return False
- except ldap.NO_SUCH_OBJECT:
- return False
-
def is_subtree_policy(self, dn):
- """Check if the entry has a subtree password policy
+ """Check if the entry has a subtree password policy. If we can
find a
+ template entry it is subtree policy
:param dn: Entry DN with PwPolicy set up
:type dn: str
:returns: True if the entry has a subtree policy, False otherwise
"""
-
- # CoSTemplate entry also can have 'pwdpolicysubentry', so we better
validate this part too
- cos_pointer_def = CosPointerDefinition(self._instance,
'cn=nsPwPolicy_CoS,%s' % dn)
- if cos_pointer_def.exists():
+ cos_templates = CosTemplates(self._instance,
'cn=nsPwPolicyContainer,{}'.format(dn))
+ try:
+ cos_templates.get('cn=nsPwTemplateEntry,%s' % dn)
return True
- else:
+ except:
return False
def create_user_policy(self, dn, properties):
@@ -127,9 +100,9 @@ class PwPolicyManager(object):
if not user_entry.exists():
raise ValueError('Can not create user password policy because the target
dn does not exist')
- rdns = ldap.dn.explode_dn(user_entry.dn)
- rdns.pop(0)
- parentdn = ",".join(rdns)
+ dn_comps = ldap.dn.explode_dn(user_entry.dn)
+ dn_comps.pop(0)
+ parentdn = ",".join(dn_comps)
# Create the pwp container if needed
pwp_containers = nsContainers(self._instance, basedn=parentdn)
@@ -139,9 +112,13 @@ class PwPolicyManager(object):
properties['cn'] = 'cn=nsPwPolicyEntry_user,%s' % dn
pwp_entries = PwPolicyEntries(self._instance, pwp_container.dn)
pwp_entry = pwp_entries.create(properties=properties)
-
- # Add policy to the entry
- user_entry.replace('pwdpolicysubentry', pwp_entry.dn)
+ try:
+ # Add policy to the entry
+ user_entry.replace('pwdpolicysubentry', pwp_entry.dn)
+ except ldap.LDAPError as e:
+ # failure, undo what we have done
+ pwp_entry.delete()
+ raise e
# make sure that local policies are enabled
self.set_global_policy({'nsslapd-pwpolicy-local': 'on'})
@@ -170,22 +147,31 @@ class PwPolicyManager(object):
pwp_container = pwp_containers.ensure_state(properties={'cn':
'nsPwPolicyContainer'})
# Create policy entry
+ pwp_entry = None
properties['cn'] = 'cn=nsPwPolicyEntry_subtree,%s' % dn
pwp_entries = PwPolicyEntries(self._instance, pwp_container.dn)
pwp_entry = pwp_entries.create(properties=properties)
-
- # The CoS template entry (nsPwTemplateEntry)
- # that has the pwdpolicysubentry value pointing to the above (nsPwPolicyEntry)
entry
- cos_templates = CosTemplates(self._instance, pwp_container.dn)
- cos_template = cos_templates.create(properties={'cosPriority':
'1',
- 'pwdpolicysubentry':
pwp_entry.dn,
- 'cn':
'cn=nsPwTemplateEntry,%s' % dn})
-
- # The CoS specification entry at the subtree level
- cos_pointer_defs = CosPointerDefinitions(self._instance, dn)
- cos_pointer_defs.create(properties={'cosAttribute':
'pwdpolicysubentry default operational',
- 'cosTemplateDn': cos_template.dn,
- 'cn': 'nsPwPolicy_CoS'})
+ try:
+ # The CoS template entry (nsPwTemplateEntry) that has the pwdpolicysubentry
+ # value pointing to the above (nsPwPolicyEntry) entry
+ cos_template = None
+ cos_templates = CosTemplates(self._instance, pwp_container.dn)
+ cos_template = cos_templates.create(properties={'cosPriority':
'1',
+ 'pwdpolicysubentry':
pwp_entry.dn,
+ 'cn':
'cn=nsPwTemplateEntry,%s' % dn})
+
+ # The CoS specification entry at the subtree level
+ cos_pointer_defs = CosPointerDefinitions(self._instance, dn)
+ cos_pointer_defs.create(properties={'cosAttribute':
'pwdpolicysubentry default operational',
+ 'cosTemplateDn':
cos_template.dn,
+ 'cn': 'nsPwPolicy_CoS'})
+ except ldap.LDAPError as e:
+ # Something went wrong, remove what we have done
+ if pwp_entry is not None:
+ pwp_entry.delete()
+ if cos_template is not None:
+ cos_template.delete()
+ raise e
# make sure that local policies are enabled
self.set_global_policy({'nsslapd-pwpolicy-local': 'on'})
@@ -201,23 +187,28 @@ class PwPolicyManager(object):
:returns: PwPolicyEntry instance
"""
- # Verify target dn exists before getting started
entry = Account(self._instance, dn)
if not entry.exists():
raise ValueError('Can not get the password policy entry because the
target dn does not exist')
- # Check if it's a subtree or a user policy
- if self.is_user_policy(entry.dn):
- pwp_entry_dn = entry.get_attr_val_utf8("pwdpolicysubentry")
- elif self.is_subtree_policy(entry.dn):
- pwp_container = nsContainer(self._instance,
'cn=nsPwPolicyContainer,%s' % dn)
-
- pwp_entries = PwPolicyEntries(self._instance, pwp_container.dn)
- pwp_entry_dn = pwp_entries.get('cn=nsPwPolicyEntry_subtree,%s' %
dn).dn
- else:
- raise ValueError("The policy wasn't set up for the target dn entry
or it is invalid")
-
- return PwPolicyEntry(self._instance, pwp_entry_dn)
+ # Get the parent DN
+ dn_comps = ldap.dn.explode_dn(entry.dn)
+ dn_comps.pop(0)
+ parentdn = ",".join(dn_comps)
+
+ # Get the parent's policies
+ pwp_entries = PwPolicyEntries(self._instance, parentdn)
+ policies = pwp_entries.list()
+ for policy in policies:
+ dn_comps = ldap.dn.explode_dn(policy.get_attr_val_utf8_l('cn'))
+ dn_comps.pop(0)
+ pwp_dn = ",".join(dn_comps)
+ if pwp_dn == dn.lower():
+ # This DN does have a policy associated with it
+ return policy
+
+ # Did not find a policy for this entry
+ raise ValueError("No password policy was found for this entry")
def delete_local_policy(self, dn):
"""Delete a local password policy entry
@@ -227,43 +218,59 @@ class PwPolicyManager(object):
"""
subtree = False
- # Verify target dn exists before getting started
+
+ # Verify target dn exists, and has a policy
entry = Account(self._instance, dn)
if not entry.exists():
raise ValueError('The target entry dn does not exist')
+ pwp_entry = self.get_pwpolicy_entry(entry.dn)
+ # Subtree or user policy?
if self.is_subtree_policy(entry.dn):
parentdn = dn
subtree = True
- elif self.is_user_policy(entry.dn):
- rdns = ldap.dn.explode_dn(entry.dn)
- rdns.pop(0)
- parentdn = ",".join(rdns)
else:
- raise ValueError("The policy wasn't set up for the target dn entry
or the policy is invalid")
+ dn_comps = ldap.dn.explode_dn(dn)
+ dn_comps.pop(0)
+ parentdn = ",".join(dn_comps)
+ # Starting deleting the policy, ignore the parts that might already have been
removed
pwp_container = nsContainer(self._instance, 'cn=nsPwPolicyContainer,%s' %
parentdn)
-
- pwp_entries = PwPolicyEntries(self._instance, pwp_container.dn)
if subtree:
- pwp_entry = pwp_entries.get('cn=nsPwPolicyEntry_subtree,%s' % dn)
+ try:
+ # Delete template
+ cos_templates = CosTemplates(self._instance, pwp_container.dn)
+ cos_template = cos_templates.get('cn=nsPwTemplateEntry,%s' % dn)
+ cos_template.delete()
+ except ldap.NO_SUCH_OBJECT:
+ # Already deleted
+ pass
+ try:
+ # Delete definition
+ cos_pointer_def = CosPointerDefinition(self._instance,
'cn=nsPwPolicy_CoS,%s' % dn)
+ cos_pointer_def.delete()
+ except ldap.NO_SUCH_OBJECT:
+ # Already deleted
+ pass
else:
- pwp_entry = pwp_entries.get('cn=nsPwPolicyEntry_user,%s' % dn)
-
- if self.is_subtree_policy(entry.dn):
- cos_templates = CosTemplates(self._instance, pwp_container.dn)
- cos_template = cos_templates.get('cn=nsPwTemplateEntry,%s' % dn)
- cos_template.delete()
-
- cos_pointer_def = CosPointerDefinition(self._instance,
'cn=nsPwPolicy_CoS,%s' % dn)
- cos_pointer_def.delete()
- else:
- entry.remove("pwdpolicysubentry", pwp_entry.dn)
+ try:
+ # Cleanup user entry
+ entry.remove("pwdpolicysubentry", pwp_entry.dn)
+ except ldap.NO_SUCH_ATTRIBUTE:
+ # Policy already removed from user
+ pass
+
+ # Remove the local policy
+ try:
+ pwp_entry.delete()
+ except ldap.NO_SUCH_OBJECT:
+ # Already deleted
+ pass
- pwp_entry.delete()
try:
pwp_container.delete()
- except ldap.NOT_ALLOWED_ON_NONLEAF:
+ except (ldap.NOT_ALLOWED_ON_NONLEAF, ldap.NO_SUCH_OBJECT):
+ # There are other policies still using this container, no problem
pass
def set_global_policy(self, properties):
diff --git a/src/lib389/lib389/replica.py b/src/lib389/lib389/replica.py
index 333645b..ab20775 100644
--- a/src/lib389/lib389/replica.py
+++ b/src/lib389/lib389/replica.py
@@ -1216,7 +1216,8 @@ class Replica(DSLdapObject):
scope=ldap.SCOPE_SUBTREE,
filterstr='(&(nsuniqueid=ffffffff-ffffffff-ffffffff-ffffffff)(objectclass=nstombstone))',
attrlist=['nsds50ruv'],
- serverctrls=self._server_controls, clientctrls=self._client_controls)[0]
+ serverctrls=self._server_controls, clientctrls=self._client_controls,
+ escapehatch='i am sure')[0]
data = ensure_list_str(ent.getValues('nsds50ruv'))
@@ -1235,7 +1236,8 @@ class Replica(DSLdapObject):
scope=ldap.SCOPE_SUBTREE,
filterstr='(&(nsuniqueid=ffffffff-ffffffff-ffffffff-ffffffff)(objectclass=nstombstone))',
attrlist=['nsds5agmtmaxcsn'],
- serverctrls=self._server_controls, clientctrls=self._client_controls)[0]
+ serverctrls=self._server_controls, clientctrls=self._client_controls,
+ escapehatch='i am sure')[0]
return ensure_list_str(ent.getValues('nsds5agmtmaxcsn'))
diff --git a/src/lib389/lib389/repltools.py b/src/lib389/lib389/repltools.py
index 180a37d..b2676f3 100644
--- a/src/lib389/lib389/repltools.py
+++ b/src/lib389/lib389/repltools.py
@@ -168,7 +168,7 @@ class ReplTools(object):
for inst in all_replicas:
replObj = inst.replicas.get(suffix)
if replObj is None:
- inst.log.warn('(%s) not setup for replication of (%s)' %
+ inst.log.warning('(%s) not setup for replication of (%s)' %
(inst.serverid, suffix))
continue
ctime = _getCSNTime(inst, csnstr)
diff --git a/src/lib389/lib389/tasks.py b/src/lib389/lib389/tasks.py
index b55c29f..6a86a42 100644
--- a/src/lib389/lib389/tasks.py
+++ b/src/lib389/lib389/tasks.py
@@ -39,8 +39,14 @@ class Task(DSLdapObject):
self._exit_code = None
self._task_log = ""
+ def status(self):
+ """Return the decoded status of the task
+ """
+ return self.get_attr_val_utf8('nsTaskStatus')
+
def is_complete(self):
"""Return True if task is complete, else False."""
+
self._exit_code = self.get_attr_val_utf8("nsTaskExitCode")
self._task_log = self.get_attr_val_utf8("nsTaskLog")
if not self.exists():
@@ -257,11 +263,24 @@ class ImportTask(Task):
def __init__(self, instance, dn=None):
self.cn = 'import_' + Task._get_task_date()
- dn = "cn=" + self.cn + ",cn=import," + DN_TASKS
+ dn = "cn=%s,%s" % (self.cn, DN_IMPORT_TASK)
self._properties = None
super(ImportTask, self).__init__(instance, dn)
+ # We can add all the needed and valid option combos here.
+ def import_suffix_from_ldif(self, ldiffile, suffix):
+ # TODO: Check that the arguments we were given are valid combinations.
+ # Write out new ones.
+ _properties = {
+ 'nsFilename': ldiffile,
+ 'nsIncludeSuffix': suffix,
+ }
+ self.create(properties=_properties)
+
+ # The correlating function would be import_backend_from_ldif which
+ # would list a bename not suffix
+
class ExportTask(Task):
"""Create the export to ldif task
@@ -272,11 +291,18 @@ class ExportTask(Task):
def __init__(self, instance, dn=None):
self.cn = 'export_' + Task._get_task_date()
- dn = "cn=" + self.cn + ",cn=export," + DN_TASKS
+ dn = "cn=%s,%s" % (self.cn, DN_EXPORT_TASK)
self._properties = None
super(ExportTask, self).__init__(instance, dn)
+ def export_suffix_to_ldif(self, ldiffile, suffix):
+ _properties = {
+ 'nsFilename': ldiffile,
+ 'nsIncludeSuffix': suffix,
+ }
+ self.create(properties=_properties)
+
class BackupTask(Task):
"""Create the backup DB task
diff --git a/src/lib389/lib389/tests/cli/__init__.py
b/src/lib389/lib389/tests/cli/__init__.py
index d6173dc..56da03a 100644
--- a/src/lib389/lib389/tests/cli/__init__.py
+++ b/src/lib389/lib389/tests/cli/__init__.py
@@ -78,19 +78,34 @@ def topology_be_001003006(request):
def check_output(some_string, missing=False, ignorecase=True):
"""Check the output of captured STDOUT. This assumes "sys.stdout
= io.StringIO()"
- otherwise there would be nothing to read
- :param some_string - text to search for in output
+ otherwise there would be nothing to read. Flush IO after performing check.
+ :param some_string - text, or list of strings, to search for in output
:param missing - test if some_string is NOT present in output
:param ignorecase - Set whether to ignore the character case in both the output
and some_string
"""
output = sys.stdout.getvalue()
+ is_list = isinstance(some_string, list)
+
if ignorecase:
output = output.lower()
- some_string = some_string.lower()
+ if is_list:
+ some_string = [text.lower() for text in some_string]
+ else:
+ some_string = some_string.lower()
+
if missing:
- assert(some_string not in output)
+ if is_list:
+ for text in some_string:
+ assert(text not in output)
+ else:
+ assert(some_string not in output)
else:
- assert(some_string in output)
- # clear buffer
+ if is_list:
+ for text in some_string:
+ assert(text in output)
+ else:
+ assert(some_string in output)
+
+ # Clear the buffer
sys.stdout = io.StringIO()
diff --git a/src/lib389/lib389/tests/cli/conf_plugin_test.py
b/src/lib389/lib389/tests/cli/conf_plugin_test.py
index 3f1955f..6cd630b 100644
--- a/src/lib389/lib389/tests/cli/conf_plugin_test.py
+++ b/src/lib389/lib389/tests/cli/conf_plugin_test.py
@@ -8,7 +8,7 @@
import pytest
-from lib389.cli_conf.plugin import plugin_list, plugin_get, plugin_get_dn, plugin_enable,
plugin_disable
+from lib389.cli_conf.plugin import plugin_list, plugin_get
from lib389.cli_base import LogCapture, FakeArgs
diff --git a/src/lib389/lib389/tests/cli/conf_pwpolicy_test.py
b/src/lib389/lib389/tests/cli/conf_pwpolicy_test.py
new file mode 100644
index 0000000..71caefc
--- /dev/null
+++ b/src/lib389/lib389/tests/cli/conf_pwpolicy_test.py
@@ -0,0 +1,151 @@
+import io
+import sys
+import pytest
+
+from lib389.cli_conf.pwpolicy import (create_user_policy, create_subtree_policy,
+ list_policies, set_local_policy,
+ get_local_policy, del_local_policy,
+ get_global_policy, set_global_policy)
+
+from lib389.cli_base import LogCapture, FakeArgs
+from lib389.tests.cli import check_output
+from lib389.topologies import topology_st
+from lib389.idm.user import UserAccounts, TEST_USER_PROPERTIES
+from lib389.idm.organizationalunit import OrganizationalUnits
+from lib389._constants import (DEFAULT_SUFFIX)
+from lib389.utils import ds_is_older
+
+pytestmark = pytest.mark.skipif(ds_is_older('1.4.0'), reason="Not
implemented")
+
+USER_DN = "uid=testuser,ou=people,{}".format(DEFAULT_SUFFIX)
+USER_OUTPUT = "{} (user policy)".format(USER_DN)
+OU_DN = "ou=people,{}".format(DEFAULT_SUFFIX)
+OU_OUTPUT = "{} (subtree policy)".format(OU_DN)
+
+
+(a)pytest.fixture(scope="function")
+def test_args(dn):
+ args = FakeArgs()
+ args.suffix = False
+ args.json = False
+ args.verbose = False
+ args.DN = [dn]
+ return args
+
+
+(a)pytest.fixture(scope="function")
+def do_setup(topology_st, request):
+ """Create a user and make sure ou=pople exists
+ """
+ sys.stdout = io.StringIO()
+
+ users = UserAccounts(topology_st.standalone, DEFAULT_SUFFIX)
+ users.ensure_state(properties=TEST_USER_PROPERTIES)
+
+ ou = OrganizationalUnits(topology_st.standalone, DEFAULT_SUFFIX)
+ ou.ensure_state(properties={'ou': 'people'})
+
+
+def test_pwp_cli(topology_st, do_setup):
+ """Test creating, listing, getting, and deleting a backend (and
subsuffix)
+ :id: 800f432a-52ab-4661-ac66-a2bdd9b984da
+ :setup: Standalone instance
+ :steps:
+ 1. Create User policy
+ 2. Create Subtree policy
+ 3. List policies
+ 4. Set user policy
+ 5. Get user policy
+ 6. Set subtree policy
+ 7. Get subtree policy
+ 8. Delete user policy
+ 9. Delete subtree policy
+ 10. List local policies - make sure none are returned
+ 11. Get global policy
+ 12. Set global policy
+ 13. Verify global policy update
+ :expectedresults:
+ 1. Success
+ 2. Success
+ 3. Success
+ 4. Success
+ 5. Success
+ 6. Success
+ 7. Success
+ 8. Success
+ 9. Success
+ 10. Success
+ 11. Success
+ 12. Success
+ 13. Success
+ """
+ topology_st.logcap = LogCapture()
+ sys.stdout = io.StringIO()
+
+ # Create User Policy
+ args = test_args(USER_DN)
+ args.pwdchange = 'on'
+ create_user_policy(topology_st.standalone, None, topology_st.logcap.log, args)
+
+ # Create Subtree Policy
+ args = test_args(OU_DN)
+ args.pwdchange = 'off'
+ create_subtree_policy(topology_st.standalone, None, topology_st.logcap.log, args)
+
+ # List policies
+ args = test_args(DEFAULT_SUFFIX)
+ list_policies(topology_st.standalone, None, topology_st.logcap.log, args)
+ check_output([USER_OUTPUT, OU_OUTPUT])
+
+ # Set User Policy
+ args = test_args(USER_DN)
+ args.pwdhistory = 'on'
+ set_local_policy(topology_st.standalone, None, topology_st.logcap.log, args)
+
+ # Get User Policy
+ args = test_args(USER_DN)
+ get_local_policy(topology_st.standalone, None, topology_st.logcap.log, args)
+ check_output("passwordHistory: on")
+
+ # Set Subtree Policy
+ args = test_args(OU_DN)
+ args.pwdexpire = 'on'
+ set_local_policy(topology_st.standalone, None, topology_st.logcap.log, args)
+
+ # Get Subtree Policy
+ args = test_args(OU_DN)
+ get_local_policy(topology_st.standalone, None, topology_st.logcap.log, args)
+ check_output("passwordExp: on")
+
+ # Delete User Policy (and verify)
+ args = test_args(USER_DN)
+ del_local_policy(topology_st.standalone, None, topology_st.logcap.log, args)
+
+ with pytest.raises(ValueError):
+ get_local_policy(topology_st.standalone, None, topology_st.logcap.log, args)
+
+ # Delete Subtree Policy (and verify)
+ args = test_args(OU_DN)
+ del_local_policy(topology_st.standalone, None, topology_st.logcap.log, args)
+
+ with pytest.raises(ValueError):
+ get_local_policy(topology_st.standalone, None, topology_st.logcap.log, args)
+
+ # List policies (or lack there of)
+ args = test_args(DEFAULT_SUFFIX)
+ list_policies(topology_st.standalone, None, topology_st.logcap.log, args)
+ check_output([USER_OUTPUT, OU_OUTPUT], missing=True)
+
+ # Get global policy
+ args = test_args(DEFAULT_SUFFIX)
+ get_global_policy(topology_st.standalone, None, topology_st.logcap.log, args)
+ check_output('passwordLockout: off')
+
+ # Set global policy
+ args = test_args(DEFAULT_SUFFIX)
+ args.pwdlockout = "on"
+ set_global_policy(topology_st.standalone, None, topology_st.logcap.log, args)
+
+ # Check update was applied
+ get_global_policy(topology_st.standalone, None, topology_st.logcap.log, args)
+ check_output('passwordLockout: on')
diff --git a/src/lib389/lib389/tests/dsadmin_basic_test.py
b/src/lib389/lib389/tests/dsadmin_basic_test.py
index 8164c84..a4f509d 100644
--- a/src/lib389/lib389/tests/dsadmin_basic_test.py
+++ b/src/lib389/lib389/tests/dsadmin_basic_test.py
@@ -46,7 +46,7 @@ def tearDown():
try:
conn.delete_s(e)
except ldap.NO_SUCH_OBJECT:
- log.warn("entry not found %r" % e)
+ log.warning("entry not found %r" % e)
def bind_test():
diff --git a/src/lib389/lib389/tests/dsadmin_test.py
b/src/lib389/lib389/tests/dsadmin_test.py
index 114cb9d..edc2805 100644
--- a/src/lib389/lib389/tests/dsadmin_test.py
+++ b/src/lib389/lib389/tests/dsadmin_test.py
@@ -6,13 +6,6 @@
# See LICENSE for details.
# --- END COPYRIGHT BLOCK ---
-# from nose import *
-# from nose.tools import *
-
-from . import config
-from .config import log
-from .config import *
-
import ldap
import time
import lib389
diff --git a/src/lib389/lib389/tombstone.py b/src/lib389/lib389/tombstone.py
index 839fc3e..527f601 100644
--- a/src/lib389/lib389/tombstone.py
+++ b/src/lib389/lib389/tombstone.py
@@ -35,7 +35,7 @@ class Tombstone(DSLdapObject):
# We need to always add this filter, else we won't see the ts
self._object_filter =
'(&(objectclass=nsTombStone)({}))'.format(self._entry_rdn)
- def raw_entry(self):
+ def _unsafe_raw_entry(self):
"""Get an Entry object
:returns: Entry object
diff --git a/src/lib389/lib389/utils.py b/src/lib389/lib389/utils.py
index e7a7bf7..1472309 100644
--- a/src/lib389/lib389/utils.py
+++ b/src/lib389/lib389/utils.py
@@ -36,6 +36,7 @@ import filecmp
import pwd
import six
import shlex
+import operator
import subprocess
from socket import getfqdn
from ldapurl import LDAPUrl
@@ -174,6 +175,36 @@ _chars = {
# Utilities
#
+def selinux_present():
+ """
+ Determine if selinux libraries are on a system, and if so, if we are in
+ a state to consume them (enabled, disabled).
+
+ :returns: bool
+ """
+ status = False
+
+ try:
+ import selinux
+ if selinux.is_selinux_enabled():
+ # We have selinux, continue.
+ status = True
+ else:
+ # We have the module, but it's disabled.
+ log.error('selinux is disabled, will not relabel ports or files.' )
+ except ImportError:
+ # No python module, so who knows what state we are in.
+ log.error('selinux python module not found, will not relabel files.' )
+
+ try:
+ if status:
+ # Only if we know it's enabled, check if we can manage ports too.
+ import sepolicy
+ except ImportError:
+ log.error('sepolicy python module not found, will not relabel ports.' )
+
+ return status
+
def selinux_restorecon(path):
"""
@@ -186,11 +217,11 @@ def selinux_restorecon(path):
try:
import selinux
except ImportError:
- log.error('selinux python module not found, skipping relabel path %s' %
path)
+ log.debug('selinux python module not found, skipping relabel path %s' %
path)
return
if not selinux.is_selinux_enabled():
- log.error('selinux is disabled, skipping relabel path %s' % path)
+ log.debug('selinux is disabled, skipping relabel path %s' % path)
return
try:
@@ -212,17 +243,17 @@ def selinux_label_port(port, remove_label=False):
try:
import selinux
except ImportError:
- log.error('selinux python module not found, skipping port labeling.')
+ log.debug('selinux python module not found, skipping port labeling.')
return
try:
import sepolicy
except ImportError:
- log.error('sepolicy python module not found, skipping port labeling.')
+ log.debug('sepolicy python module not found, skipping port labeling.')
return
if not selinux.is_selinux_enabled():
- log.error('selinux is disabled, skipping port relabel')
+ log.debug('selinux is disabled, skipping port relabel')
return
# We only label ports that ARE NOT in the default policy that comes with
@@ -255,7 +286,7 @@ def selinux_label_port(port, remove_label=False):
raise ValueError("Port {} was already labelled with: ({}) Please choose
a different port number".format(port, policy['type']))
if (remove_label and label_set) or (not remove_label and not label_set):
- for i in range(3):
+ for i in range(5):
try:
subprocess.check_call(["semanage", "port",
@@ -928,7 +959,7 @@ def formatInfData(args):
content = ("[General]" "\n")
content += ("FullMachineName= %s\n" % args[SER_HOST])
content += ("SuiteSpotUserID= %s\n" % args[SER_USER_ID])
- content += ("nSuiteSpotGroup= %s\n" % args[SER_GROUP_ID])
+ content += ("SuiteSpotGroup= %s\n" % args[SER_GROUP_ID])
content += ("StrictHostCheck= %s\n" % args[SER_STRICT_HOSTNAME_CHECKING])
if args.get('have_admin'):
@@ -1025,14 +1056,33 @@ def get_ds_version():
return p.version
-def ds_is_older(ver):
- """Return True if current version of ns-slapd is older than provided
- version"""
- return get_ds_version() < ver
+def ds_is_related(relation, *ver):
+ """
+ Return a result of a comparison between the current version of ns-slapd and a
provided version.
+ """
+ ops = {'older': operator.lt,
+ 'newer': operator.ge}
+ ds_ver = get_ds_version()
+ if len(ver) > 1:
+ for cmp_ver in ver:
+ if cmp_ver.startswith(ds_ver[:3]):
+ return ops[relation](ds_ver,cmp_ver)
+ else:
+ return ops[relation](ds_ver, ver[0])
-def ds_is_newer(ver):
- return get_ds_version() >= ver
+def ds_is_older(*ver):
+ """
+ Return True if the current version of ns-slapd is older than a provided version
+ """
+ return ds_is_related('older', *ver)
+
+
+def ds_is_newer(*ver):
+ """
+ Return True if the current version of ns-slapd is newer than a provided version
+ """
+ return ds_is_related('newer', *ver)
def getDateTime():
@@ -1189,6 +1239,19 @@ def get_user_is_ds_owner():
return False
+def get_user_is_root():
+ cur_uid = os.getuid()
+ if cur_uid == 0:
+ # We are root, we have permission
+ return True
+ return False
+
+
+def basedn_to_ldap_dns_uri(basedn):
+ # ldap:///dc%3Dexample%2Cdc%3Dcom
+ return "ldaps:///" + basedn.replace("=",
"%3D").replace(",", "%2C")
+
+
def display_log_value(attr, value, hide_sensitive=True):
# Mask all the sensitive attribute values
if DEBUGGING or not hide_sensitive:
diff --git a/src/lib389/setup.py b/src/lib389/setup.py
index bef89eb..61de441 100644
--- a/src/lib389/setup.py
+++ b/src/lib389/setup.py
@@ -45,12 +45,10 @@ setup(
'Development Status :: 4 - Beta',
'Intended Audience :: Developers',
'Operating System :: POSIX :: Linux',
- 'Programming Language :: Python :: 2',
- 'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3',
- 'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6',
+ 'Programming Language :: Python :: 3.7',
'Topic :: Software Development :: Libraries',
'Topic :: Software Development :: Quality Assurance',
'Topic :: Software Development :: Testing'],
@@ -65,6 +63,7 @@ setup(
'cli/dsconf',
'cli/dscreate',
'cli/dsidm',
+ 'cli/dscontainer',
]),
('/usr/share/man/man8', [
'man/dsctl.8',
diff --git a/src/lib389/tox.ini b/src/lib389/tox.ini
index c1da3c8..d90ee98 100644
--- a/src/lib389/tox.ini
+++ b/src/lib389/tox.ini
@@ -1,5 +1,5 @@
[tox]
-envlist = py27, py34, py35, py36
+envlist = py35, py36, py37
[testenv]
deps = -rrequirements.txt
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.