From: alex Date: Sat, 11 Apr 2020 00:10:32 +0000 (-0700) Subject: major refactor X-Git-Tag: v1.0.0~7 X-Git-Url: http://git.infiniteadaptability.org/?a=commitdiff_plain;h=ba4b0845bde3465381959b07465339725842231a;p=workouts major refactor created backend in c added automake/autoconf functionality moved original project into gui/ directory created light http server in c in server/ connected gui and backend via server refactored gui, updated tests updated dockerfiles (both main and gui) --- diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..4f2d40a --- /dev/null +++ b/.dockerignore @@ -0,0 +1,2 @@ +include/config.h +server/config.h \ No newline at end of file diff --git a/.gitignore b/.gitignore index 0aace87..fd35706 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,21 @@ -.nyc_output/** -.env \ No newline at end of file +workouts +server/workouts-server +workouts*/ +workouts*.tar.gz +*.o + +# autoconf/automake +.deps +.dirstamp +aclocal.m4 +autom4te.cache/ +build-aux/ +config.h +config.h.in +config.h.in~ +config.log +config.status +configure +Makefile +Makefile.in +stamp-h1 \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index d4e2c54..da6c491 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,26 +1,78 @@ -FROM node:latest as builder -WORKDIR /app +FROM debian:latest as base + +RUN apt-get update +RUN apt-get install -y libsqlite3-dev autoconf automake gcc make + +FROM base as unit-tester + +RUN apt-get install -y gdb sqlite3 valgrind + +FROM base as core +ARG VERSION + +WORKDIR / +RUN test -n "${VERSION}" +ADD workouts-${VERSION}.tar.gz . +WORKDIR /workouts-${VERSION}/ + +RUN autoreconf -ivf +RUN ./configure +RUN make +# RUN make distcheck +RUN make install + +FROM unit-tester +ARG VERSION + +WORKDIR /build +COPY --from=core /workouts-${VERSION}/ /build/ + +RUN ./configure +RUN make check + +WORKDIR /build/test/unit +RUN make memcheck -COPY package.json . -COPY package-lock.json . +FROM node:latest as integration-tester +ARG VERSION + +USER node +WORKDIR /home/node/ + +COPY --from=core --chown=node:node /workouts-${VERSION}/workouts . +COPY --from=core --chown=node:node /workouts-${VERSION}/test/integration/index.js . +COPY --from=core --chown=node:node /workouts-${VERSION}/test/integration/package.json . +COPY --from=core --chown=node:node /workouts-${VERSION}/test/integration/package-lock.json . RUN npm install -FROM node:latest as app -WORKDIR /home/node/app -COPY --from=builder /app/node_modules ./node_modules/ -COPY package.json . -COPY package-lock.json . -COPY src/ src/ -COPY test/ test/ -COPY index.html . -COPY webpack.config.js . -COPY webpack.dev.config.js . -COPY webpack.prod.config.js . -COPY workouts.json . +COPY --from=core /workouts-${VERSION}/test/integration/test/ test/ + +RUN npm test + +FROM node:latest as builder +ARG VERSION + +USER node +WORKDIR /home/node/ + +COPY --from=core --chown=node:node /workouts-${VERSION}/gui/ . +RUN npm install RUN npm run build -# RUN npm run test +FROM core + +WORKDIR /data +COPY --from=builder /home/node/index.html . +COPY --from=builder /home/node/workouts.js . + +RUN workouts attr add lower +RUN workouts attr add upper +RUN workouts new "P90X - Kenpo X" +RUN workouts new "P90X - Kenpo X2" +RUN workouts toggle "P90X - Kenpo X" lower +RUN workouts toggle "P90X - Kenpo X2" upper +RUN workouts add "P90X - Kenpo X" 2020-07-01 -ENTRYPOINT npm run start \ No newline at end of file +ENTRYPOINT workouts-server \ No newline at end of file diff --git a/Makefile b/Makefile deleted file mode 100644 index 0d227c7..0000000 --- a/Makefile +++ /dev/null @@ -1,41 +0,0 @@ -build: - docker build -t workouts . - -run: - docker run -d -p "8080:8080" --read-only -v `pwd`/src/:/home/node/app/src/ --name workouts-test workouts - -extract: build run - docker cp workouts-test:/home/node/app/workouts.min.js ./workouts.min.js - $(MAKE) stop - -start: build - -docker run -it --rm -p "8080:8080" --read-only -v `pwd`/src/:/home/node/app/src/ --name workouts-test workouts - -stop: - docker stop workouts-test - docker rm workouts-test - -package_init: - docker run -d --name workouts_package_init node:latest tail -f /dev/null - docker cp package.json workouts_package_init:/home/node/ - docker cp package-lock.json workouts_package_init:/home/node/ - -package_extract: - docker cp workouts_package_init:/home/node/package.json ./package.json - docker cp workouts_package_init:/home/node/package-lock.json ./package-lock.json - $(MAKE) -s package_stop - -package_stop: - docker stop workouts_package_init - docker rm workouts_package_init - -outdated: package_init - -docker exec -it -w /home/node $$(docker container ls -q -f name=workouts_package_init) npm outdated - $(MAKE) -s package_stop - -update: package_init - -docker exec -it -w /home/node $$(docker container ls -q -f name=workouts_package_init) /bin/bash - $(MAKE) -s package_extract - -inspect: - docker exec -it $$(docker container ls -q -f name=workouts_package_init) /bin/bash \ No newline at end of file diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..c1173f4 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,67 @@ +AM_CPPFLAGS = -I$(top_builddir)/include/ -I$(top_srcdir)/include/ + +bin_PROGRAMS = workouts +workouts_SOURCES = \ + src/add.c \ + src/attr.c \ + src/data/attr.c \ + src/default.c \ + src/ls.c \ + src/main.c \ + src/new.c \ + src/opt.c \ + src/recent.c \ + src/toggle.c \ + src/usage.c \ + src/data/recent.c \ + src/data/setup.c \ + src/data/workout.c \ + src/opt/homedir.c \ + src/opt/rows.c \ + src/opt/verbose.c +workouts_SOURCES += \ + include/add.h \ + include/attr.h \ + include/data.h \ + include/default.h \ + include/ls.h \ + include/main.h \ + include/new.h \ + include/opt.h \ + include/recent.h \ + include/toggle.h \ + include/usage.h + +SUBDIRS = gui server test/integration test/unit + +if HAVE_DOCKER +IMAGE_NAME=workouts +CONTAINER_NAME=workouts-test +build: + make dist + docker build -t $(IMAGE_NAME) --build-arg VERSION=$(VERSION) . + +run: build + docker run -d \ + -p "8080:8080" \ + --cap-add=SYS_PTRACE --security-opt seccomp=unconfined \ + --name $(CONTAINER_NAME) \ + $(IMAGE_NAME) + +start: build + -docker run -it --rm \ + -p "8080:8080" \ + --cap-add=SYS_PTRACE --security-opt seccomp=unconfined \ + $(IMAGE_NAME) + +stop: + docker stop $(CONTAINER_NAME) + docker rm $(CONTAINER_NAME); +else +build: missing-local +run: missing-local +start: missing-local +stop: missing-local +missing-local: + @echo "docker not found" +endif \ No newline at end of file diff --git a/README.md b/README.md index 1247c11..5432d12 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,17 @@ ### Workout Management Tool -Tool for quickly and easily managing and keeping track of workouts. +Tool for managing and keeping track of workouts. ### To Do: -- [x] move nyc to devdependcies -- [x] update default sort order in recent -- [x] fix scrolling css -- [ ] fix tests -- [ ] make updates to attributes/new workouts update automatically - - [ ] currently update in the background and wait for reload of view -- [ ] upgrade npm packages to next major versions - - [ ] makefile command to do automatically? - - [ ] upgrade - - [ ] verify & pass tests \ No newline at end of file +- [ ] workouts rm [!name] [!date] +- [ ] update date of recent workout from cli + - [ ] rm then add +- [ ] make attributes customizable + - [ ] modify workout.js +- [ ] add delete functionality +- [ ] add attribute add functionality to gui +- [ ] workouts rm attr [!name] +- [ ] rename workouts functionality + +### Later +- [ ] add --format option to ls commands +- [ ] bash completion \ No newline at end of file diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..08b83fa --- /dev/null +++ b/configure.ac @@ -0,0 +1,91 @@ +AC_PREREQ([2.69]) +AC_INIT([workouts], [0.0.1]) + +# Store build files not in main directory +AC_CONFIG_AUX_DIR([build-aux]) + +AM_INIT_AUTOMAKE([foreign subdir-objects nostdinc -Wall -Werror]) + +AC_CONFIG_SRCDIR([src/main.c]) +AC_CONFIG_HEADERS([include/config.h]) + +AC_ARG_ENABLE([gui], + [AS_HELP_STRING([--disable-gui], + [disable gui (enabled by default if node is present)])], + [enable_gui=$enableval], + [enable_gui=yes]) + +AC_ARG_ENABLE([tests], + [AS_HELP_STRING([--disable-tests], + [disable tests (enabled by default)])], + [enable_tests=$enableval], + [enable_tests=yes]) + +AC_ARG_ENABLE([memcheck], + [AS_HELP_STRING([--disable-memcheck], + [disable valgrind (enabled by default)])], + [enable_memcheck=$enableval], + [enable_memcheck=yes]) + +AC_PATH_PROG([DOCKER], [docker]) +AM_CONDITIONAL([HAVE_DOCKER], [test -n "$DOCKER"]) +AC_PATH_PROG([NODE], [node]) +AM_CONDITIONAL([HAVE_NODE], [test -n "$NODE"]) +AC_PATH_PROG([VALGRIND], [valgrind]) +AM_CONDITIONAL([HAVE_VALGRIND], [test -n "$VALGRIND"]) + +dnl disable gui if neither docker nor node are found +if test "x$enable_gui" = "xyes"; then + if test -z "$NODE"; then + if test -z "$DOCKER"; then + enable_gui=no + fi + fi +fi + +AC_MSG_CHECKING([if gui should be enabled]) +if test x$enable_gui != xno; then + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) +fi + +AM_CONDITIONAL([ENABLE_GUI],[test x$enable_gui = xyes]) + +dnl disable memcheck if valgrind not found +if test "x$enable_memcheck" != "xyes"; then + if test -n "$HAVE_VALGRIND"; then + enable_memcheck=no + fi +fi + +AC_MSG_CHECKING([if memcheck should be enabled]) +if test x$enable_memcheck != xno; then + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) +fi + +AM_CONDITIONAL([ENABLE_MEMCHECK],[test x$enable_memcheck = xyes]) + +# Checks for programs. +AC_PROG_CC + +# Checks for libraries. +AC_CHECK_LIB([sqlite3], [sqlite3_open_v2]) + +# Checks for header files. +AC_CHECK_HEADERS([stdlib.h string.h]) + +# Checks for typedefs, structures, and compiler characteristics. + +# Checks for library functions. +AC_FUNC_MALLOC +AC_CHECK_FUNCS([strtoul]) + +AC_CONFIG_FILES([Makefile + gui/Makefile + test/integration/Makefile + test/unit/Makefile]) +AC_CONFIG_SUBDIRS([server]) +AC_OUTPUT diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 288502d..0000000 --- a/docker-compose.yml +++ /dev/null @@ -1,16 +0,0 @@ -version: "3.7" - -services: - workouts: - build: - args: - BUILD_CONFIGURATION: ${BUILD_CONFIGURATION} - context: . - env_file: .env - image: workouts - ports: - - "8080:8080" - volumes: - - type: bind - source: ./src - target: /home/node/app/src \ No newline at end of file diff --git a/gui/.babelrc b/gui/.babelrc new file mode 100644 index 0000000..ff3059c --- /dev/null +++ b/gui/.babelrc @@ -0,0 +1,3 @@ +{ + "presets": ["@babel/preset-env"] +} \ No newline at end of file diff --git a/gui/Dockerfile b/gui/Dockerfile new file mode 100644 index 0000000..8c273bb --- /dev/null +++ b/gui/Dockerfile @@ -0,0 +1,27 @@ +FROM node:latest as builder +WORKDIR /app + +COPY package.json . +COPY package-lock.json . + +RUN npm install + +FROM node:latest as app +WORKDIR /home/node/app +COPY --from=builder /app/node_modules ./node_modules/ +COPY package.json . +COPY package-lock.json . +COPY src/ src/ +COPY test/ test/ +COPY index.html . +COPY webpack.config.js . +COPY webpack.dev.config.js . +COPY webpack.prod.config.js . +COPY .babelrc . +COPY workouts.json . + +RUN npm run build + +RUN npm run test + +ENTRYPOINT npm run start \ No newline at end of file diff --git a/gui/Makefile.am b/gui/Makefile.am new file mode 100644 index 0000000..1008693 --- /dev/null +++ b/gui/Makefile.am @@ -0,0 +1,137 @@ +EXTRA_DIST = \ + .babelrc \ + index.html \ + Makefile.am \ + package.json \ + package-lock.json \ + src/classes/workout.js \ + src/components/days.ago/days.ago.component.js \ + src/components/days.ago/days.ago.css \ + src/components/days.ago/days.ago.js \ + src/components/header/header.component.js \ + src/components/header/header.css \ + src/components/header/header.js \ + src/components/main/main.component.js \ + src/components/main/main.css \ + src/components/main/main.js \ + src/components/manage/manage.component.js \ + src/components/manage/manage.css \ + src/components/manage/manage.js \ + src/components/manage.row/manage.row.css \ + src/components/manage.row/manage.row.js \ + src/components/recent/recent.component.js \ + src/components/recent/recent.css \ + src/components/recent/recent.js \ + src/components/recent.row/recent.row.css \ + src/components/recent.row/recent.row.js \ + src/constants.js \ + src/data/action.js \ + src/data/attributes.js \ + src/data/load.js \ + src/data/recent.js \ + src/data/workouts.js \ + src/index.js \ + src/reducers/combined.js \ + src/reducers/sync.js \ + src/reducers/view.js \ + src/reducers/workouts.js \ + src/util/request.js \ + src/util/backend.js \ + test/data.action.tests.js \ + test/sync.reducer.tests.js \ + test/view.reducer.tests.js \ + test/workouts.reducer.tests.js \ + test/workout.tests.js \ + webpack.config.js \ + webpack.dev.config.js \ + webpack.prod.config.js \ + workouts.json + +if ENABLE_GUI + +if HAVE_DOCKER +IMAGE_NAME=workouts +CONTAINER_NAME=workouts-test + +PACKAGE_CONTAINER_NAME=workouts_package_init +EXTRACTION_TARGET=workouts.js + +build: + docker build -t $(IMAGE_NAME) . + +run: + docker run -d -p "8080:8080" --read-only -v `pwd`/src/:/home/node/app/src/ --name $(CONTAINER_NAME) $(IMAGE_NAME) + +extract: build run + docker cp $(CONTAINER_NAME):/home/node/app/$(EXTRACTION_TARGET) ./$(EXTRACTION_TARGET) + $(MAKE) stop + +start: build + -docker run -it --rm -p "8080:8080" --read-only -v `pwd`/src/:/home/node/app/src/ --name $(CONTAINER_NAME) $(IMAGE_NAME) + +stop: + docker stop $(CONTAINER_NAME) + docker rm $(CONTAINER_NAME) + +package_init: + docker run -d --name $(PACKAGE_CONTAINER_NAME) node:latest tail -f /dev/null + docker cp package.json $(PACKAGE_CONTAINER_NAME):/home/node/ + docker cp package-lock.json $(PACKAGE_CONTAINER_NAME):/home/node/ + +package_extract: + docker cp $(PACKAGE_CONTAINER_NAME):/home/node/package.json ./package.json + docker cp $(PACKAGE_CONTAINER_NAME):/home/node/package-lock.json ./package-lock.json + $(MAKE) -s package_stop + +package_stop: + docker stop $(PACKAGE_CONTAINER_NAME) + docker rm $(PACKAGE_CONTAINER_NAME) + +outdated: buid package_init + -docker exec -it -w /home/node $$(docker container ls -q -f name=$(PACKAGE_CONTAINER_NAME)) npm outdated + $(MAKE) -s package_stop + +update: build package_init + -docker exec -it -w /home/node $$(docker container ls -q -f name=$(PACKAGE_CONTAINER_NAME)) /bin/bash + $(MAKE) -s package_extract + +inspect: + docker exec -it $$(docker container ls -q -f name=$(PACKAGE_CONTAINER_NAME)) /bin/bash + +else +build: missing-local +run: missing-local +extract: missing-local +start: missing-local +stop: missing-local +package_init: missing-local +package_extract: missing-local +package_stop: missing-local +outdated: missing-local +update: missing-local +inspect: missing-local +missing-local: + @echo "docker not found" +endif + +if HAVE_NODE +all-local: + npm install + npm run build + +clean-local: + rm -f workouts.js + +check-local: + npm run test +else +all-local: missing-local +check-local: missing-local +missing-local: + @echo "node not found" +endif + +else +all-local: + @echo "gui not enabled" +endif \ No newline at end of file diff --git a/index.html b/gui/index.html similarity index 100% rename from index.html rename to gui/index.html diff --git a/package-lock.json b/gui/package-lock.json similarity index 65% rename from package-lock.json rename to gui/package-lock.json index 980b7b2..793efee 100644 --- a/package-lock.json +++ b/gui/package-lock.json @@ -5,712 +5,974 @@ "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "requires": { - "@babel/highlight": "^7.8.3" + "@babel/highlight": "^7.10.4" }, "dependencies": { "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", "dev": true, "requires": { + "@babel/helper-validator-identifier": "^7.10.4", "chalk": "^2.0.0", - "esutils": "^2.0.2", "js-tokens": "^4.0.0" } } } }, "@babel/compat-data": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.8.5.tgz", - "integrity": "sha512-jWYUqQX/ObOhG1UiEkbH5SANsE/8oKXiQWjj7p7xgj9Zmnt//aUvyz4dBkK0HNsS8/cbyC5NmmH87VekW+mXFg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.10.4.tgz", + "integrity": "sha512-t+rjExOrSVvjQQXNp5zAIYDp00KjdvGl/TpDX5REPr0S9IAIPQMTilcfG6q8c0QFmj9lSTVySV2VTsyggvtNIw==", "dev": true, "requires": { - "browserslist": "^4.8.5", + "browserslist": "^4.12.0", "invariant": "^2.2.4", "semver": "^5.5.0" } }, "@babel/core": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.4.tgz", - "integrity": "sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helpers": "^7.8.4", - "@babel/parser": "^7.8.4", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3", + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.5.tgz", + "integrity": "sha512-O34LQooYVDXPl7QWCdW9p4NR+QlzOr7xShPPJz8GsuCU3/8ua/wqTr7gmnxXv+WBESiGU/G5s16i6tUvHkNb+w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.5", + "@babel/helper-module-transforms": "^7.10.5", + "@babel/helpers": "^7.10.4", + "@babel/parser": "^7.10.5", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.5", + "@babel/types": "^7.10.5", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", + "json5": "^2.1.2", + "lodash": "^4.17.19", "resolve": "^1.3.2", "semver": "^5.4.1", "source-map": "^0.5.0" }, "dependencies": { - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "@babel/helper-module-transforms": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.5.tgz", + "integrity": "sha512-4P+CWMJ6/j1W915ITJaUkadLObmCRRSC234uctJfn/vHrsLNxsR8dwlcXv9ZhJWzl77awf+mWXSZEKt5t0OnlA==", "dev": true, "requires": { - "@babel/types": "^7.8.3" + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.5", + "lodash": "^4.17.19" } }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", + "@babel/types": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", + "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" } } } }, "@babel/generator": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.7.tgz", - "integrity": "sha512-/AOIBpHh/JU1l0ZFS4kiRCBnLi6OTHzh0RPk3h9isBxkkqELtQNFi1Vr/tiG9p1yfoUdKVwISuXWQR+hwwM4VQ==", + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.5.tgz", + "integrity": "sha512-3vXxr3FEW7E7lJZiWQ3bM4+v/Vyr9C+hpolQ8BGFr9Y8Ri2tFLWTixmwKBafDujO1WVah4fhZBeU1bieKdghig==", "dev": true, "requires": { - "@babel/types": "^7.7.4", + "@babel/types": "^7.10.5", "jsesc": "^2.5.1", - "lodash": "^4.17.13", "source-map": "^0.5.0" }, "dependencies": { "@babel/types": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", - "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", + "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", "dev": true, "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } } } }, "@babel/helper-annotate-as-pure": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz", - "integrity": "sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", + "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", "dev": true, "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.10.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz", - "integrity": "sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==", - "dev": true, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-call-delegate": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.8.3.tgz", - "integrity": "sha512-6Q05px0Eb+N4/GTyKPPvnkig7Lylw+QzihMpws9iiZQv7ZImf84ZsZpQH7QoWN4n4tm81SnSzPgHw2qtO0Zf3A==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", + "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/helper-explode-assignable-expression": "^7.10.4", + "@babel/types": "^7.10.4" }, "dependencies": { - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", + "@babel/types": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", "dev": true, "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", + "@babel/helper-validator-identifier": "^7.10.4", "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" + "to-fast-properties": "^2.0.0" } } } }, "@babel/helper-compilation-targets": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.4.tgz", - "integrity": "sha512-3k3BsKMvPp5bjxgMdrFyq0UaEO48HciVrOVF0+lon8pp95cyJ2ujAh0TrBHNMnJGT2rr0iKOJPFFbSqjDyf/Pg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz", + "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==", "dev": true, "requires": { - "@babel/compat-data": "^7.8.4", - "browserslist": "^4.8.5", + "@babel/compat-data": "^7.10.4", + "browserslist": "^4.12.0", "invariant": "^2.2.4", "levenary": "^1.1.1", "semver": "^5.5.0" } }, + "@babel/helper-create-class-features-plugin": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.4.tgz", + "integrity": "sha512-9raUiOsXPxzzLjCXeosApJItoMnX3uyT4QdM2UldffuGApNrF8e938MwNpDCK9CPoyxrEoCgT+hObJc3mZa6lQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4" + }, + "dependencies": { + "@babel/helper-split-export-declaration": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", + "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/types": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.3.tgz", - "integrity": "sha512-Gcsm1OHCUr9o9TcJln57xhWHtdXbA2pgQ58S0Lxlks0WMGNXuki4+GLfX0p+L2ZkINUGZvfkz8rzoqJQSthI+Q==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", + "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", "dev": true, "requires": { - "@babel/helper-regex": "^7.8.3", - "regexpu-core": "^4.6.0" + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-regex": "^7.10.4", + "regexpu-core": "^4.7.0" } }, "@babel/helper-define-map": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz", - "integrity": "sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.4.tgz", + "integrity": "sha512-nIij0oKErfCnLUCWaCaHW0Bmtl2RO9cN7+u2QT8yqTywgALKlyUVOvHDElh+b5DwVC6YB1FOYFOTWcN/+41EDA==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/types": "^7.8.3", + "@babel/helper-function-name": "^7.10.4", + "@babel/types": "^7.10.4", "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/types": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-explode-assignable-expression": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz", - "integrity": "sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.4.tgz", + "integrity": "sha512-4K71RyRQNPRrR85sr5QY4X3VwG4wtVoXZB9+L3r1Gp38DhELyHCtovqydRi7c1Ovb17eRGiQ/FD5s8JdU0Uy5A==", "dev": true, "requires": { - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" }, "dependencies": { "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.4.tgz", + "integrity": "sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng==", "dev": true, "requires": { - "@babel/types": "^7.8.3", + "@babel/types": "^7.10.4", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", + "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", "dev": true, "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.10.4" } }, + "@babel/parser": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz", + "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==", + "dev": true + }, "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.4.tgz", + "integrity": "sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } + }, + "@babel/types": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } } } }, "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + }, + "dependencies": { + "@babel/parser": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz", + "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==", + "dev": true + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/types": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", "dev": true, "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.10.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-hoist-variables": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz", - "integrity": "sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", + "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", "dev": true, "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.10.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-member-expression-to-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", - "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.4.tgz", + "integrity": "sha512-m5j85pK/KZhuSdM/8cHUABQTAslV47OjfIB9Cc7P+PvlAoBzdb79BGNfw8RhT5Mq3p+xGd0ZfAKixbrUZx0C7A==", "dev": true, "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.10.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-module-imports": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", - "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", "dev": true, "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.10.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-module-transforms": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.8.3.tgz", - "integrity": "sha512-C7NG6B7vfBa/pwCOshpMbOYUmrYQDfCpVL/JCRu0ek8B5p8kue1+BCXpg2vOYs7w5ACB9GTOBYQ5U6NwrMg+3Q==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.4.tgz", + "integrity": "sha512-Er2FQX0oa3nV7eM1o0tNCTx7izmQtwAQsIiaLRWtavAAEcskb0XJ5OjJbVrYXWOTr8om921Scabn4/tzlx7j1Q==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-simple-access": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3", + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4", "lodash": "^4.17.13" }, "dependencies": { "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", + "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/parser": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz", + "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==", + "dev": true + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/types": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", "dev": true, "requires": { - "@babel/types": "^7.8.3" + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "dev": true } } }, "@babel/helper-optimise-call-expression": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", - "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", "dev": true, "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.10.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", "dev": true }, "@babel/helper-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.3.tgz", - "integrity": "sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.4.tgz", + "integrity": "sha512-inWpnHGgtg5NOF0eyHlC0/74/VkdRITY9dtTpB2PrxKKn+AkVMRiZz/Adrx+Ssg+MLDesi2zohBW6MVq6b4pOQ==", "dev": true, "requires": { "lodash": "^4.17.13" } }, "@babel/helper-remap-async-to-generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz", - "integrity": "sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.4.tgz", + "integrity": "sha512-86Lsr6NNw3qTNl+TBcF1oRZMaVzJtbWTyTko+CQL/tvNvcGYEFKbLXDPxtW0HKk3McNOk4KzY55itGWCAGK5tg==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-wrap-function": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-wrap-function": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" }, "dependencies": { "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.4.tgz", + "integrity": "sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng==", "dev": true, "requires": { - "@babel/types": "^7.8.3", + "@babel/types": "^7.10.4", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", + "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/parser": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz", + "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==", + "dev": true + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", "dev": true, "requires": { - "@babel/types": "^7.8.3" + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.4.tgz", + "integrity": "sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } + }, + "@babel/types": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } } } }, "@babel/helper-replace-supers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz", - "integrity": "sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", + "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" }, "dependencies": { "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.4.tgz", + "integrity": "sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng==", "dev": true, "requires": { - "@babel/types": "^7.8.3", + "@babel/types": "^7.10.4", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", + "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", "dev": true, "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.10.4" } }, + "@babel/parser": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz", + "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==", + "dev": true + }, "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.4.tgz", + "integrity": "sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } + }, + "@babel/types": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } } } }, "@babel/helper-simple-access": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", - "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", + "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", "dev": true, "requires": { - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + }, + "dependencies": { + "@babel/parser": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz", + "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==", + "dev": true + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/types": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-split-export-declaration": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz", - "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", + "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", "dev": true, "requires": { - "@babel/types": "^7.7.4" + "@babel/types": "^7.10.4" }, "dependencies": { "@babel/types": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", - "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", + "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", "dev": true, "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } } } }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, "@babel/helper-wrap-function": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz", - "integrity": "sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", + "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/helper-function-name": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" }, "dependencies": { "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.4.tgz", + "integrity": "sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng==", "dev": true, "requires": { - "@babel/types": "^7.8.3", + "@babel/types": "^7.10.4", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", + "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/parser": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz", + "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==", + "dev": true + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", "dev": true, "requires": { - "@babel/types": "^7.8.3" + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.4.tgz", + "integrity": "sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } + }, + "@babel/types": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } } } }, "@babel/helpers": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz", - "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", + "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", "dev": true, "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3" + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" }, "dependencies": { - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", + "@babel/types": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", + "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", "dev": true, "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" } } } }, - "@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" - } - }, "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.5.tgz", + "integrity": "sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ==", "dev": true }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz", - "integrity": "sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.4.tgz", + "integrity": "sha512-MJbxGSmejEFVOANAezdO39SObkURO5o/8b6fSH6D1pi9RZQt+ldppKPXfqgUWpSQ9asM6xaSaSJIaeWMDRP0Zg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-remap-async-to-generator": "^7.8.3", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.10.4", "@babel/plugin-syntax-async-generators": "^7.8.0" } }, + "@babel/plugin-proposal-class-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz", + "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz", - "integrity": "sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz", + "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-dynamic-import": "^7.8.0" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz", - "integrity": "sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz", + "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.0" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", + "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" } }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz", + "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-8qvuPwU/xxUCt78HocNlv0mXXo0wdh9VT1R04WU8HGOfaOob26pF+9P5/lYjN/q7DHOX1bvX60hnhOvuQUJdbA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.4.tgz", + "integrity": "sha512-6vh4SqRuLLarjgeOf4EaROJAHjvu9Gl+/346PbDH9yWbJyfnJ/ah3jmYKYtswEyCoWZiidvVHjHshd4WgjB9BA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.10.4" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz", + "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.3.tgz", - "integrity": "sha512-QIoIR9abkVn+seDE3OjA08jWcs3eZ9+wJCKSRgo3WdEU2csFYgdScb+8qHB3+WXsGJD55u+5hWCISI7ejXS+kg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.4.tgz", + "integrity": "sha512-ZIhQIEeavTgouyMSdZRap4VPPHqJJ3NEs2cuHs5p0erH+iz6khB0qfgU8g7UuJkG88+fBMy23ZiU+nuHvekJeQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-optional-chaining": "^7.8.0" } }, + "@babel/plugin-proposal-private-methods": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz", + "integrity": "sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.3.tgz", - "integrity": "sha512-1/1/rEZv2XGweRwwSkLpY+s60za9OZ1hJs4YDqFHCw0kYWYwL5IFljVY1MYBL+weT1l9pokDO2uhSTLVxzoHkQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz", + "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-async-generators": { @@ -722,6 +984,15 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, + "@babel/plugin-syntax-class-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", + "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, "@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", @@ -749,6 +1020,15 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, "@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", @@ -777,555 +1057,634 @@ } }, "@babel/plugin-syntax-top-level-await": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz", - "integrity": "sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz", + "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz", - "integrity": "sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", + "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz", - "integrity": "sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz", + "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-remap-async-to-generator": "^7.8.3" + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.10.4" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz", - "integrity": "sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz", + "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz", - "integrity": "sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.4.tgz", + "integrity": "sha512-J3b5CluMg3hPUii2onJDRiaVbPtKFPLEaV5dOPY5OeAbDi1iU/UbbFFTgwb7WnanaDy7bjU35kc26W3eM5Qa0A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-plugin-utils": "^7.10.4", "lodash": "^4.17.13" } }, "@babel/plugin-transform-classes": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.3.tgz", - "integrity": "sha512-SjT0cwFJ+7Rbr1vQsvphAHwUHvSUPmMjMU/0P59G8U2HLFqSa082JO7zkbDNWs9kH/IUqpHI6xWNesGf8haF1w==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-define-map": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz", + "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-define-map": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", "globals": "^11.1.0" }, "dependencies": { "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", + "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/types": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", "dev": true, "requires": { - "@babel/types": "^7.8.3" + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" } } } }, "@babel/plugin-transform-computed-properties": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz", - "integrity": "sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz", + "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-destructuring": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.3.tgz", - "integrity": "sha512-H4X646nCkiEcHZUZaRkhE2XVsoz0J/1x3VVujnn96pSoGCtKPA99ZZA+va+gK+92Zycd6OBKCD8tDb/731bhgQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz", + "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz", - "integrity": "sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz", + "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz", - "integrity": "sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz", + "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz", - "integrity": "sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz", + "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==", "dev": true, "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-for-of": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.4.tgz", - "integrity": "sha512-iAXNlOWvcYUYoV8YIxwS7TxGRJcxyl8eQCfT+A5j8sKUzRFvJdcyjp97jL2IghWSRDaL2PU2O2tX8Cu9dTBq5A==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", + "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz", - "integrity": "sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz", + "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz", - "integrity": "sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz", + "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz", - "integrity": "sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz", + "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.3.tgz", - "integrity": "sha512-MadJiU3rLKclzT5kBH4yxdry96odTUwuqrZM+GllFI/VhxfPz+k9MshJM+MwhfkCdxxclSbSBbUGciBngR+kEQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.4.tgz", + "integrity": "sha512-3Fw+H3WLUrTlzi3zMiZWp3AR4xadAEMv6XRCYnd5jAlLM61Rn+CRJaZMaNvIpcJpQ3vs1kyifYvEVPFfoSkKOA==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "babel-plugin-dynamic-import-node": "^2.3.0" + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.3.tgz", - "integrity": "sha512-JpdMEfA15HZ/1gNuB9XEDlZM1h/gF/YOH7zaZzQu2xCFRfwc01NXBMHHSTT6hRjlXJJs5x/bfODM3LiCk94Sxg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz", + "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-simple-access": "^7.8.3", - "babel-plugin-dynamic-import-node": "^2.3.0" + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.3.tgz", - "integrity": "sha512-8cESMCJjmArMYqa9AO5YuMEkE4ds28tMpZcGZB/jl3n0ZzlsxOAi3mC+SKypTfT8gjMupCnd3YiXCkMjj2jfOg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.4.tgz", + "integrity": "sha512-Tb28LlfxrTiOTGtZFsvkjpyjCl9IoaRI52AEU/VIwOwvDQWtbNJsAqTXzh+5R7i74e/OZHH2c2w2fsOqAfnQYQ==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.8.3", - "@babel/helper-module-transforms": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "babel-plugin-dynamic-import-node": "^2.3.0" + "@babel/helper-hoist-variables": "^7.10.4", + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.3.tgz", - "integrity": "sha512-evhTyWhbwbI3/U6dZAnx/ePoV7H6OUG+OjiJFHmhr9FPn0VShjwC2kdxqIuQ/+1P50TMrneGzMeyMTFOjKSnAw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz", + "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz", - "integrity": "sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz", + "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3" + "@babel/helper-create-regexp-features-plugin": "^7.10.4" } }, "@babel/plugin-transform-new-target": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz", - "integrity": "sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz", + "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-object-super": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz", - "integrity": "sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz", + "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4" } }, "@babel/plugin-transform-parameters": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.4.tgz", - "integrity": "sha512-IsS3oTxeTsZlE5KqzTbcC2sV0P9pXdec53SU+Yxv7o/6dvGM5AkTotQKhoSffhNgZ/dftsSiOoxy7evCYJXzVA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.4.tgz", + "integrity": "sha512-RurVtZ/D5nYfEg0iVERXYKEgDFeesHrHfx8RT05Sq57ucj2eOYAP6eu5fynL4Adju4I/mP/I6SO0DqNWAXjfLQ==", "dev": true, "requires": { - "@babel/helper-call-delegate": "^7.8.3", - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-property-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz", - "integrity": "sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz", + "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-regenerator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.3.tgz", - "integrity": "sha512-qt/kcur/FxrQrzFR432FGZznkVAjiyFtCOANjkAKwCbt465L6ZCiUQh2oMYGU3Wo8LRFJxNDFwWn106S5wVUNA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz", + "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==", "dev": true, "requires": { - "regenerator-transform": "^0.14.0" + "regenerator-transform": "^0.14.2" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz", - "integrity": "sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz", + "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz", - "integrity": "sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz", + "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz", - "integrity": "sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.4.tgz", + "integrity": "sha512-1e/51G/Ni+7uH5gktbWv+eCED9pP8ZpRhZB3jOaI3mmzfvJTWHkuyYTv0Z5PYtyM+Tr2Ccr9kUdQxn60fI5WuQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz", - "integrity": "sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz", + "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-regex": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-regex": "^7.10.4" } }, "@babel/plugin-transform-template-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz", - "integrity": "sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.4.tgz", + "integrity": "sha512-4NErciJkAYe+xI5cqfS8pV/0ntlY5N5Ske/4ImxAVX7mk9Rxt2bwDTGv1Msc2BRJvWQcmYEC+yoMLdX22aE4VQ==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz", - "integrity": "sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz", + "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz", + "integrity": "sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz", - "integrity": "sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz", + "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/polyfill": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.10.4.tgz", + "integrity": "sha512-8BYcnVqQ5kMD2HXoHInBH7H1b/uP3KdnwCYXOqFnXqguOyuu443WXusbIUbWEfY3Z0Txk0M1uG/8YuAMhNl6zg==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" + "core-js": "^2.6.5", + "regenerator-runtime": "^0.13.4" } }, "@babel/preset-env": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.8.4.tgz", - "integrity": "sha512-HihCgpr45AnSOHRbS5cWNTINs0TwaR8BS8xIIH+QwiW8cKL0llV91njQMpeMReEPVs+1Ao0x3RLEBLtt1hOq4w==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.8.4", - "@babel/helper-compilation-targets": "^7.8.4", - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-proposal-async-generator-functions": "^7.8.3", - "@babel/plugin-proposal-dynamic-import": "^7.8.3", - "@babel/plugin-proposal-json-strings": "^7.8.3", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-proposal-object-rest-spread": "^7.8.3", - "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", - "@babel/plugin-proposal-optional-chaining": "^7.8.3", - "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.10.4.tgz", + "integrity": "sha512-tcmuQ6vupfMZPrLrc38d0sF2OjLT3/bZ0dry5HchNCQbrokoQi4reXqclvkkAT5b+gWc23meVWpve5P/7+w/zw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.10.4", + "@babel/helper-compilation-targets": "^7.10.4", + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-proposal-async-generator-functions": "^7.10.4", + "@babel/plugin-proposal-class-properties": "^7.10.4", + "@babel/plugin-proposal-dynamic-import": "^7.10.4", + "@babel/plugin-proposal-json-strings": "^7.10.4", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", + "@babel/plugin-proposal-numeric-separator": "^7.10.4", + "@babel/plugin-proposal-object-rest-spread": "^7.10.4", + "@babel/plugin-proposal-optional-catch-binding": "^7.10.4", + "@babel/plugin-proposal-optional-chaining": "^7.10.4", + "@babel/plugin-proposal-private-methods": "^7.10.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.10.4", "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-class-properties": "^7.10.4", "@babel/plugin-syntax-dynamic-import": "^7.8.0", "@babel/plugin-syntax-json-strings": "^7.8.0", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.0", "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.8.3", - "@babel/plugin-transform-arrow-functions": "^7.8.3", - "@babel/plugin-transform-async-to-generator": "^7.8.3", - "@babel/plugin-transform-block-scoped-functions": "^7.8.3", - "@babel/plugin-transform-block-scoping": "^7.8.3", - "@babel/plugin-transform-classes": "^7.8.3", - "@babel/plugin-transform-computed-properties": "^7.8.3", - "@babel/plugin-transform-destructuring": "^7.8.3", - "@babel/plugin-transform-dotall-regex": "^7.8.3", - "@babel/plugin-transform-duplicate-keys": "^7.8.3", - "@babel/plugin-transform-exponentiation-operator": "^7.8.3", - "@babel/plugin-transform-for-of": "^7.8.4", - "@babel/plugin-transform-function-name": "^7.8.3", - "@babel/plugin-transform-literals": "^7.8.3", - "@babel/plugin-transform-member-expression-literals": "^7.8.3", - "@babel/plugin-transform-modules-amd": "^7.8.3", - "@babel/plugin-transform-modules-commonjs": "^7.8.3", - "@babel/plugin-transform-modules-systemjs": "^7.8.3", - "@babel/plugin-transform-modules-umd": "^7.8.3", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", - "@babel/plugin-transform-new-target": "^7.8.3", - "@babel/plugin-transform-object-super": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.8.4", - "@babel/plugin-transform-property-literals": "^7.8.3", - "@babel/plugin-transform-regenerator": "^7.8.3", - "@babel/plugin-transform-reserved-words": "^7.8.3", - "@babel/plugin-transform-shorthand-properties": "^7.8.3", - "@babel/plugin-transform-spread": "^7.8.3", - "@babel/plugin-transform-sticky-regex": "^7.8.3", - "@babel/plugin-transform-template-literals": "^7.8.3", - "@babel/plugin-transform-typeof-symbol": "^7.8.4", - "@babel/plugin-transform-unicode-regex": "^7.8.3", - "@babel/types": "^7.8.3", - "browserslist": "^4.8.5", + "@babel/plugin-syntax-top-level-await": "^7.10.4", + "@babel/plugin-transform-arrow-functions": "^7.10.4", + "@babel/plugin-transform-async-to-generator": "^7.10.4", + "@babel/plugin-transform-block-scoped-functions": "^7.10.4", + "@babel/plugin-transform-block-scoping": "^7.10.4", + "@babel/plugin-transform-classes": "^7.10.4", + "@babel/plugin-transform-computed-properties": "^7.10.4", + "@babel/plugin-transform-destructuring": "^7.10.4", + "@babel/plugin-transform-dotall-regex": "^7.10.4", + "@babel/plugin-transform-duplicate-keys": "^7.10.4", + "@babel/plugin-transform-exponentiation-operator": "^7.10.4", + "@babel/plugin-transform-for-of": "^7.10.4", + "@babel/plugin-transform-function-name": "^7.10.4", + "@babel/plugin-transform-literals": "^7.10.4", + "@babel/plugin-transform-member-expression-literals": "^7.10.4", + "@babel/plugin-transform-modules-amd": "^7.10.4", + "@babel/plugin-transform-modules-commonjs": "^7.10.4", + "@babel/plugin-transform-modules-systemjs": "^7.10.4", + "@babel/plugin-transform-modules-umd": "^7.10.4", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4", + "@babel/plugin-transform-new-target": "^7.10.4", + "@babel/plugin-transform-object-super": "^7.10.4", + "@babel/plugin-transform-parameters": "^7.10.4", + "@babel/plugin-transform-property-literals": "^7.10.4", + "@babel/plugin-transform-regenerator": "^7.10.4", + "@babel/plugin-transform-reserved-words": "^7.10.4", + "@babel/plugin-transform-shorthand-properties": "^7.10.4", + "@babel/plugin-transform-spread": "^7.10.4", + "@babel/plugin-transform-sticky-regex": "^7.10.4", + "@babel/plugin-transform-template-literals": "^7.10.4", + "@babel/plugin-transform-typeof-symbol": "^7.10.4", + "@babel/plugin-transform-unicode-escapes": "^7.10.4", + "@babel/plugin-transform-unicode-regex": "^7.10.4", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.10.4", + "browserslist": "^4.12.0", "core-js-compat": "^3.6.2", "invariant": "^2.2.2", "levenary": "^1.1.1", "semver": "^5.5.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/preset-modules": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz", + "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" } }, "@babel/register": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.8.3.tgz", - "integrity": "sha512-t7UqebaWwo9nXWClIPLPloa5pN33A2leVs8Hf0e9g9YwUP8/H9NeR7DJU+4CXo23QtjChQv5a3DjEtT83ih1rg==", + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.10.5.tgz", + "integrity": "sha512-eYHdLv43nyvmPn9bfNfrcC4+iYNwdQ8Pxk1MFJuU/U5LpSYl/PH4dFMazCYZDFVi8ueG3shvO+AQfLrxpYulQw==", "dev": true, "requires": { "find-cache-dir": "^2.0.0", - "lodash": "^4.17.13", + "lodash": "^4.17.19", "make-dir": "^2.1.0", "pirates": "^4.0.0", "source-map-support": "^0.5.16" } }, "@babel/runtime": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", - "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.4.tgz", + "integrity": "sha512-UpTN5yUJr9b4EX2CnGNWIvER7Ab83ibv0pcvvHc4UOdrBI5jb8bj+32cCwPX6xu0mt2daFNjYhoi+X7beH0RSw==", "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" }, "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "@babel/types": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", + "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", "dev": true, "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" } } } }, "@babel/traverse": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.4.tgz", - "integrity": "sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==", + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.5.tgz", + "integrity": "sha512-yc/fyv2gUjPqzTz0WHeRJH2pv7jA9kA7mBX2tXl/x5iOE81uaVPuGPtaYk7wmkx4b67mQ7NqI8rmT2pF47KYKQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.7.4", - "@babel/helper-function-name": "^7.7.4", - "@babel/helper-split-export-declaration": "^7.7.4", - "@babel/parser": "^7.7.4", - "@babel/types": "^7.7.4", + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.5", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/parser": "^7.10.5", + "@babel/types": "^7.10.5", "debug": "^4.1.0", "globals": "^11.1.0", - "lodash": "^4.17.13" + "lodash": "^4.17.19" }, "dependencies": { - "@babel/code-frame": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", - "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "@babel/types": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", + "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", "dev": true, "requires": { - "@babel/highlight": "^7.0.0" + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" } + } + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true }, - "@babel/helper-function-name": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", - "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.7.4", - "@babel/template": "^7.7.4", - "@babel/types": "^7.7.4" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, - "@babel/helper-get-function-arity": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", - "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { - "@babel/types": "^7.7.4" + "p-locate": "^4.1.0" } }, - "@babel/parser": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.7.tgz", - "integrity": "sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw==", - "dev": true - }, - "@babel/template": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", - "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.4", - "@babel/types": "^7.7.4" + "p-limit": "^2.2.0" } }, - "@babel/types": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", - "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true } } }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true }, - "@types/events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", - "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", "dev": true }, "@types/glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", - "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", "dev": true, "requires": { - "@types/events": "*", "@types/minimatch": "*", "@types/node": "*" } }, + "@types/json-schema": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", + "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==", + "dev": true + }, "@types/minimatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", @@ -1333,184 +1692,183 @@ "dev": true }, "@types/node": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.0.tgz", - "integrity": "sha512-GnZbirvmqZUzMgkFn70c74OQpTTUcCzlhQliTzYjQMqg+hVKcDnxdL19Ne3UdYzdMA/+W3eb646FWn/ZaT1NfQ==", + "version": "14.0.22", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.22.tgz", + "integrity": "sha512-emeGcJvdiZ4Z3ohbmw93E/64jRzUHAItSHt8nF7M4TGgQTiWqFVGB8KNpLGFmUHmHLvjvBgFwVlqNcq+VuGv9g==", "dev": true }, "@webassemblyjs/ast": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", - "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", "dev": true, "requires": { - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5" + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", - "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", - "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", - "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", "dev": true }, "@webassemblyjs/helper-code-frame": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", - "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", "dev": true, "requires": { - "@webassemblyjs/wast-printer": "1.8.5" + "@webassemblyjs/wast-printer": "1.9.0" } }, "@webassemblyjs/helper-fsm": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", - "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", "dev": true }, "@webassemblyjs/helper-module-context": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", - "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "mamacro": "^0.0.3" + "@webassemblyjs/ast": "1.9.0" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", - "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", - "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" } }, "@webassemblyjs/ieee754": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", - "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", - "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", "dev": true, "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", - "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", - "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/helper-wasm-section": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-opt": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "@webassemblyjs/wast-printer": "1.8.5" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" } }, "@webassemblyjs/wasm-gen": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", - "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" } }, "@webassemblyjs/wasm-opt": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", - "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" } }, "@webassemblyjs/wasm-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", - "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" } }, "@webassemblyjs/wast-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", - "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/floating-point-hex-parser": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-code-frame": "1.8.5", - "@webassemblyjs/helper-fsm": "1.8.5", + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", "@xtuc/long": "4.2.2" } }, "@webassemblyjs/wast-printer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", - "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5", + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", "@xtuc/long": "4.2.2" } }, @@ -1542,6 +1900,16 @@ "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", "dev": true }, + "aggregate-error": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", + "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, "ajv": { "version": "6.10.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", @@ -1594,33 +1962,22 @@ } }, "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", "dev": true, "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" } }, "append-transform": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", - "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", "dev": true, "requires": { - "default-require-extensions": "^2.0.0" + "default-require-extensions": "^3.0.0" } }, "aproba": { @@ -1689,6 +2046,18 @@ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, + "array.prototype.map": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.2.tgz", + "integrity": "sha512-Az3OYxgsa1g7xDYp86l0nnN4bcmuEITGe1rbdEBVkrqkzMgDcbdQ2R7r41pNzti+4NMces3H8gMmuioZUilLgw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.4" + } + }, "asn1.js": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", @@ -1698,6 +2067,14 @@ "bn.js": "^4.0.0", "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } } }, "assert": { @@ -1761,9 +2138,9 @@ "dev": true }, "babel-plugin-dynamic-import-node": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", - "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", "dev": true, "requires": { "object.assign": "^4.1.0" @@ -1849,21 +2226,11 @@ "dev": true }, "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", "dev": true }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -1871,9 +2238,9 @@ "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==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz", + "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==", "dev": true }, "body-parser": { @@ -2027,25 +2394,60 @@ "requires": { "bn.js": "^4.1.0", "randombytes": "^2.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } } }, "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", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.0.tgz", + "integrity": "sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA==", + "dev": true, + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.2", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "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, @@ -2054,14 +2456,15 @@ } }, "browserslist": { - "version": "4.8.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.6.tgz", - "integrity": "sha512-ZHao85gf0eZ0ESxLfCp73GG9O/VTytYDIkIiZDlURppLTI9wErSM/5yAKEq6rcUdxBLjMELmrYUJGg5sxGKMHg==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.13.0.tgz", + "integrity": "sha512-MINatJ5ZNrLnQ6blGvePd/QOz9Xtu+Ne+x29iQSCHfkU5BugKVJwZKn/iiL8UbpIpa3JhviKjz+XxMo0m2caFQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001023", - "electron-to-chromium": "^1.3.341", - "node-releases": "^1.1.47" + "caniuse-lite": "^1.0.30001093", + "electron-to-chromium": "^1.3.488", + "escalade": "^3.0.1", + "node-releases": "^1.1.58" } }, "buffer": { @@ -2162,15 +2565,32 @@ } }, "caching-transform": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-3.0.2.tgz", - "integrity": "sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", "dev": true, "requires": { - "hasha": "^3.0.0", - "make-dir": "^2.0.0", - "package-hash": "^3.0.0", - "write-file-atomic": "^2.4.2" + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + }, + "dependencies": { + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "camelcase": { @@ -2180,9 +2600,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001024", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001024.tgz", - "integrity": "sha512-LubRSEPpOlKlhZw9wGlLHo8ZVj6ugGU3xGUfLPneNBledSd9lIM5cCGZ9Mz/mMCJUhEt4jZpYteZNVRdJw5FRA==", + "version": "1.0.30001097", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001097.tgz", + "integrity": "sha512-TeuSleKt/vWXaPkLVFqGDnbweYfq4IaZ6rUugFf3rWY6dlII8StUZ8Ddin0PkADfgYZ4wRqCdO2ORl4Rn5eZIA==", "dev": true }, "chalk": { @@ -2197,23 +2617,59 @@ } }, "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", + "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", "dev": true, + "optional": true, "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "optional": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "optional": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "optional": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "optional": true, + "requires": { + "is-number": "^7.0.0" + } + } } }, "chownr": { @@ -2264,22 +2720,61 @@ } } }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } } }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } }, "collection-visit": { "version": "1.0.0", @@ -2457,13 +2952,19 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true }, + "core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", + "dev": true + }, "core-js-compat": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.4.tgz", - "integrity": "sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA==", + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", + "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", "dev": true, "requires": { - "browserslist": "^4.8.3", + "browserslist": "^4.8.5", "semver": "7.0.0" }, "dependencies": { @@ -2481,19 +2982,6 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, - "cp-file": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-6.2.0.tgz", - "integrity": "sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "make-dir": "^2.0.0", - "nested-error-stacks": "^2.0.0", - "pify": "^4.0.1", - "safe-buffer": "^5.0.1" - } - }, "create-ecdh": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", @@ -2502,6 +2990,14 @@ "requires": { "bn.js": "^4.1.0", "elliptic": "^6.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } } }, "create-hash": { @@ -2564,22 +3060,73 @@ } }, "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==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.6.0.tgz", + "integrity": "sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==", "dev": true, "requires": { - "camelcase": "^5.2.0", - "icss-utils": "^4.1.0", + "camelcase": "^5.3.1", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", "loader-utils": "^1.2.3", "normalize-path": "^3.0.0", - "postcss": "^7.0.14", + "postcss": "^7.0.32", "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" + "postcss-modules-local-by-default": "^3.0.2", + "postcss-modules-scope": "^2.2.0", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^2.7.0", + "semver": "^6.3.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", + "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.1.tgz", + "integrity": "sha512-KWcq3xN8fDjSB+IMoh2VaXVhRI0BBGxoYp3rx7Pkb6z0cFjYR9Q9l4yZqqals0/zsioCmocC5H6UvsGD4MoIBA==", + "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 + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "cssesc": { @@ -2640,12 +3187,12 @@ } }, "default-require-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", - "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", + "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", "dev": true, "requires": { - "strip-bom": "^3.0.0" + "strip-bom": "^4.0.0" } }, "define-properties": { @@ -2748,9 +3295,9 @@ "dev": true }, "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true }, "diffie-hellman": { @@ -2762,6 +3309,14 @@ "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } } }, "dns-equal": { @@ -2814,15 +3369,15 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.345", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.345.tgz", - "integrity": "sha512-f8nx53+Z9Y+SPWGg3YdHrbYYfIJAtbUjpFfW4X1RwTZ94iUG7geg9tV8HqzAXX7XTNgyWgAFvce4yce8ZKxKmg==", + "version": "1.3.496", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.496.tgz", + "integrity": "sha512-TXY4mwoyowwi4Lsrq9vcTUYBThyc1b2hXaTZI13p8/FRhY2CTaq5lK+DVjhYkKiTLsKt569Xes+0J5JsVXFurQ==", "dev": true }, "elliptic": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", - "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", + "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", "dev": true, "requires": { "bn.js": "^4.4.0", @@ -2832,6 +3387,14 @@ "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0", "minimalistic-crypto-utils": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } } }, "emoji-regex": { @@ -2853,18 +3416,18 @@ "dev": true }, "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==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, "requires": { "once": "^1.4.0" } }, "enhanced-resolve": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", - "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.2.0.tgz", + "integrity": "sha512-S7eiFb/erugyd1rLb6mQ3Vuq+EXHv5cpCkNqqIkYkBgN2QdFnyCZzFBleqwGEx4lgNGYij81BWnCrFNK7vxvjQ==", "dev": true, "requires": { "graceful-fs": "^4.1.2", @@ -2893,32 +3456,52 @@ "prr": "~1.0.1" } }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, "es-abstract": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz", - "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==", + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", "dev": true, "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", "object-inspect": "^1.7.0", "object-keys": "^1.1.1", "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "es-get-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.0.tgz", + "integrity": "sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ==", + "dev": true, + "requires": { + "es-abstract": "^1.17.4", + "has-symbols": "^1.0.1", + "is-arguments": "^1.0.4", + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-string": "^1.0.5", + "isarray": "^2.0.5" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + } } }, "es-to-primitive": { @@ -2938,6 +3521,12 @@ "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true }, + "escalade": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.1.tgz", + "integrity": "sha512-DR6NO3h9niOT+MZs7bjxlj2a1k+POu5RN8CLTPX2+i78bRi9eLe7+0zXgUHMnGXWybYcL61E9hGhPKqedy8tQA==", + "dev": true + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -2994,15 +3583,15 @@ "dev": true }, "eventemitter3": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", - "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", + "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", "dev": true }, "events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", - "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", + "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", "dev": true }, "eventsource": { @@ -3272,13 +3861,6 @@ "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", "dev": true }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", @@ -3386,24 +3968,10 @@ } }, "follow-redirects": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.10.0.tgz", - "integrity": "sha512-4eyLK6s6lH32nOvLLwlIOnr9zrL8Sm+OvW4pVTJNoXeGzYIkHVf+pADQi+OJ0E67hiuSLezPVPyBcIZO50TmmQ==", - "dev": true, - "requires": { - "debug": "^3.0.0" - }, - "dependencies": { - "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" - } - } - } + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.12.1.tgz", + "integrity": "sha512-tmRv0AVuR7ZyouUHLeNSiO6pqulF7dYa3s19c6t+wz9LD69/uSzdMxJ2S91nTI9U3rt/IldxpzMOFejp6f0hjg==", + "dev": true }, "for-in": { "version": "1.0.2", @@ -3412,40 +3980,55 @@ "dev": true }, "foreground-child": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", - "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", "dev": true, "requires": { - "cross-spawn": "^4", - "signal-exit": "^3.0.0" + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" }, "dependencies": { "cross-spawn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", - "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "shebang-regex": "^3.0.0" } }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } } } }, @@ -3480,582 +4063,37 @@ "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=", + "fromentries": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.2.0.tgz", + "integrity": "sha512-33X7H/wdfO99GdRLLgkjUrD4geAFdq/Uv0kl3HD4da6HDixd2GUg8Mw7dahLCV9r/EARkmtYBB6Tch4EEokFTQ==", "dev": true }, - "fsevents": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", - "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1", - "node-pre-gyp": "*" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.3", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "debug": { - "version": "3.2.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "bundled": true, - "dev": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.9.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "needle": { - "version": "2.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.14.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.7", - "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, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "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.7.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.1", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.13", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "yallist": { - "version": "3.1.1", - "bundled": true, - "dev": true, - "optional": true - } + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" } }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -4074,6 +4112,12 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -4104,24 +4148,12 @@ } }, "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", "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" - } - } + "is-glob": "^4.0.1" } }, "global-modules": { @@ -4199,9 +4231,9 @@ "dev": true }, "handle-thing": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", - "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "dev": true }, "has": { @@ -4264,13 +4296,39 @@ } }, "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", "dev": true, "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } } }, "hash.js": { @@ -4284,12 +4342,21 @@ } }, "hasha": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-3.0.0.tgz", - "integrity": "sha1-UqMvq4Vp1BymmmH/GiFPjrfIvTk=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.0.tgz", + "integrity": "sha512-2W+jKdQbAdSIrggA8Q35Br8qKadTrqCTC8+XZvBWepKDK6m9XkX6Iz1a2yh2KP01kzAR/dpuMeUnocoLYDcskw==", "dev": true, "requires": { - "is-stream": "^1.0.1" + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "dependencies": { + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + } } }, "he": { @@ -4326,12 +4393,6 @@ "parse-passwd": "^1.0.0" } }, - "hosted-git-info": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", - "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==", - "dev": true - }, "hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", @@ -4345,15 +4406,15 @@ } }, "html-entities": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", - "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz", + "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==", "dev": true }, "html-escaper": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.0.tgz", - "integrity": "sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, "http-deceiver": { @@ -4375,16 +4436,10 @@ "toidentifier": "1.0.0" } }, - "http-parser-js": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", - "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", - "dev": true - }, "http-proxy": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz", - "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, "requires": { "eventemitter3": "^4.0.0", @@ -4419,16 +4474,10 @@ "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==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", "dev": true, "requires": { "postcss": "^7.0.14" @@ -4462,6 +4511,12 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, "indexes-of": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", @@ -4507,9 +4562,9 @@ } }, "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true }, "invariant": { @@ -4521,12 +4576,6 @@ "loose-envify": "^1.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 - }, "ip": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", @@ -4540,9 +4589,9 @@ "dev": true }, "ipaddr.js": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", - "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "dev": true }, "is-absolute-url": { @@ -4583,19 +4632,13 @@ "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", "dev": true }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "requires": { - "binary-extensions": "^1.0.0" + "binary-extensions": "^2.0.0" } }, "is-buffer": { @@ -4605,9 +4648,9 @@ "dev": true }, "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", "dev": true }, "is-data-descriptor": { @@ -4688,6 +4731,12 @@ "is-extglob": "^2.1.1" } }, + "is-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.1.tgz", + "integrity": "sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw==", + "dev": true + }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -4748,20 +4797,32 @@ } }, "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", + "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", "dev": true, "requires": { - "has": "^1.0.3" + "has-symbols": "^1.0.1" } }, + "is-set": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.1.tgz", + "integrity": "sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA==", + "dev": true + }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true + }, "is-symbol": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", @@ -4771,6 +4832,12 @@ "has-symbols": "^1.0.1" } }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -4802,75 +4869,188 @@ "dev": true }, "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", "dev": true }, "istanbul-lib-hook": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", - "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", "dev": true, "requires": { - "append-transform": "^1.0.0" + "append-transform": "^2.0.0" } }, "istanbul-lib-instrument": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", - "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", - "dev": true, - "requires": { - "@babel/generator": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "istanbul-lib-coverage": "^2.0.5", - "semver": "^6.0.0" + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-processinfo": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", + "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", + "dev": true, + "requires": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.0", + "istanbul-lib-coverage": "^3.0.0-alpha.1", + "make-dir": "^3.0.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^3.3.3" }, "dependencies": { + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } } } }, "istanbul-lib-report": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", - "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "dev": true, "requires": { - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "supports-color": "^6.1.0" + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" }, "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, "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==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" } } } }, "istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", "dev": true, "requires": { "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", + "istanbul-lib-coverage": "^3.0.0", "source-map": "^0.6.1" }, "dependencies": { @@ -4883,12 +5063,29 @@ } }, "istanbul-reports": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", - "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "iterate-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.1.tgz", + "integrity": "sha512-3Q6tudGN05kbkDQDI4CqjaBf4qf85w6W6GnuZDtUVYwKgtC1q8yxYX7CZed7N+tLzQqS6roujWvszf13T+n9aw==", + "dev": true + }, + "iterate-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", + "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", "dev": true, "requires": { - "html-escaper": "^2.0.0" + "es-get-iterator": "^1.0.2", + "iterate-iterator": "^1.0.1" } }, "js-tokens": { @@ -4931,12 +5128,12 @@ "dev": true }, "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", "dev": true, "requires": { - "minimist": "^1.2.0" + "minimist": "^1.2.5" } }, "killable": { @@ -4951,15 +5148,6 @@ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "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" - } - }, "leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -4975,26 +5163,6 @@ "leven": "^3.1.0" } }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^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 - } - } - }, "loader-runner": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", @@ -5034,9 +5202,9 @@ } }, "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", "dev": true }, "lodash.flattendeep": { @@ -5046,18 +5214,18 @@ "dev": true }, "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", "dev": true, "requires": { - "chalk": "^2.0.1" + "chalk": "^2.4.2" } }, "loglevel": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.6.tgz", - "integrity": "sha512-Sgr5lbboAUBo3eXCSPL4/KoVz3ROKquOjcctxmHIt+vol2DrqTQe3SwkKKuYhEiWB5kYa13YyopJ69deJ1irzQ==", + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.8.tgz", + "integrity": "sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA==", "dev": true }, "loose-envify": { @@ -5087,21 +5255,6 @@ "semver": "^5.6.0" } }, - "mamacro": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", - "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", - "dev": true - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -5134,50 +5287,22 @@ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - } - }, "memory-fs": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", - "dev": true, - "requires": { - "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 - } + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" } }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -5213,6 +5338,14 @@ "requires": { "bn.js": "^4.0.0", "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } } }, "mime": { @@ -5222,26 +5355,20 @@ "dev": true }, "mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", "dev": true }, "mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", "dev": true, "requires": { - "mime-db": "1.43.0" + "mime-db": "1.44.0" } }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -5318,51 +5445,67 @@ } }, "mocha": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.2.tgz", - "integrity": "sha512-FgDS9Re79yU1xz5d+C4rv1G7QagNGHZ+iXF81hO8zY35YZZcLEsJVfFolfsqKFWunATEvNzMK0r/CwWd/szO9A==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.0.1.tgz", + "integrity": "sha512-vefaXfdYI8+Yo8nPZQQi0QO2o+5q9UIMX1jZ1XMmK3+4+CQjc7+B0hPdUeglXiTlr8IHMVRo63IhO9Mzt6fxOg==", "dev": true, "requires": { - "ansi-colors": "3.2.3", + "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", + "chokidar": "3.3.1", "debug": "3.2.6", - "diff": "3.5.0", + "diff": "4.0.2", "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", + "find-up": "4.1.0", + "glob": "7.1.6", "growl": "1.10.5", "he": "1.2.0", "js-yaml": "3.13.1", - "log-symbols": "2.2.0", + "log-symbols": "3.0.0", "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "ms": "2.1.1", - "node-environment-flags": "1.0.5", + "ms": "2.1.2", "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", + "promise.allsettled": "1.0.2", + "serialize-javascript": "3.0.0", + "strip-json-comments": "3.0.1", + "supports-color": "7.1.0", + "which": "2.0.2", "wide-align": "1.1.3", - "yargs": "13.3.0", - "yargs-parser": "13.1.1", + "workerpool": "6.0.0", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", "yargs-unparser": "1.6.0" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "dev": true }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chokidar": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", + "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", "dev": true, "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.3.0" } }, "debug": { @@ -5374,87 +5517,121 @@ "ms": "^2.1.1" } }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { - "minimist": "0.0.8" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "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" } }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "p-locate": "^4.1.0" } }, - "supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "p-limit": "^2.2.0" } }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "readdirp": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", + "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "picomatch": "^2.0.7" } }, - "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "serialize-javascript": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.0.0.tgz", + "integrity": "sha512-skZcHYw2vEX4bw90nAr2iTTsz6x2SrHEnfxgKYmZlvJYBEZrvbKtobJWlQ20zczKb3bsHHXXTYt48zBA7ni9cw==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" + "has-flag": "^4.0.0" } }, - "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "is-number": "^7.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" } } } @@ -5495,13 +5672,6 @@ "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", "dev": true }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "dev": true, - "optional": true - }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -5528,15 +5698,9 @@ "dev": true }, "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true - }, - "nested-error-stacks": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz", - "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, "nice-try": { @@ -5545,24 +5709,6 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, - "node-environment-flags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", - "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", - "dev": true, - "requires": { - "object.getownpropertydescriptors": "^2.0.3", - "semver": "^5.7.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, "node-forge": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", @@ -5614,34 +5760,20 @@ "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", "dev": true }, - "node-releases": { - "version": "1.1.47", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.47.tgz", - "integrity": "sha512-k4xjVPx5FpwBUj0Gw7uvFOTF4Ep8Hok1I6qjwL3pLfwe7Y0REQSAqOwwv9TWBCUtMHxcXfY4PgRLRozcChvTcA==", + "node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", "dev": true, "requires": { - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } + "process-on-spawn": "^1.0.0" } }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } + "node-releases": { + "version": "1.1.59", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.59.tgz", + "integrity": "sha512-H3JrdUczbdiwxN5FuJPyCHnGHIFqQ0wWxo+9j1kAXAzqNMAHlo+4I/sYYxpyK0irQ73HgdiyzD32oqQDcU2Osw==", + "dev": true }, "normalize-path": { "version": "3.0.0", @@ -5658,50 +5790,261 @@ "path-key": "^2.0.0" } }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, "nyc": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-14.1.1.tgz", - "integrity": "sha512-OI0vm6ZGUnoGZv/tLdZ2esSVzDwUC88SNs+6JoSOMVxA+gKMB8Tk7jBwgemLx4O40lhhvZCVw1C+OYLOBOPXWw==", + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", "dev": true, "requires": { - "archy": "^1.0.0", - "caching-transform": "^3.0.2", - "convert-source-map": "^1.6.0", - "cp-file": "^6.2.0", - "find-cache-dir": "^2.1.0", - "find-up": "^3.0.0", - "foreground-child": "^1.5.6", - "glob": "^7.1.3", - "istanbul-lib-coverage": "^2.0.5", - "istanbul-lib-hook": "^2.0.7", - "istanbul-lib-instrument": "^3.3.0", - "istanbul-lib-report": "^2.0.8", - "istanbul-lib-source-maps": "^3.0.6", - "istanbul-reports": "^2.2.4", - "js-yaml": "^3.13.1", - "make-dir": "^2.1.0", - "merge-source-map": "^1.1.0", - "resolve-from": "^4.0.0", - "rimraf": "^2.6.3", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", "signal-exit": "^3.0.2", - "spawn-wrap": "^1.4.2", - "test-exclude": "^5.2.3", - "uuid": "^3.3.2", - "yargs": "^13.2.2", - "yargs-parser": "^13.0.0" + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" }, "dependencies": { - "resolve-from": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "path-exists": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } } } }, @@ -5748,16 +6091,20 @@ } }, "object-inspect": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", "dev": true }, "object-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz", - "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", + "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } }, "object-keys": { "version": "1.1.1", @@ -5786,16 +6133,6 @@ "object-keys": "^1.0.11" } }, - "object.getownpropertydescriptors": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", - "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - } - }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", @@ -5859,41 +6196,12 @@ "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=", - "dev": true - }, - "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-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true - }, "p-limit": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", @@ -5934,21 +6242,21 @@ "dev": true }, "package-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-3.0.0.tgz", - "integrity": "sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", "dev": true, "requires": { "graceful-fs": "^4.1.15", - "hasha": "^3.0.0", + "hasha": "^5.0.0", "lodash.flattendeep": "^4.4.0", "release-zalgo": "^1.0.0" } }, "pako": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", - "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "dev": true }, "parallel-transform": { @@ -5976,16 +6284,6 @@ "safe-buffer": "^5.1.1" } }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, "parse-passwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", @@ -6052,27 +6350,10 @@ "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", "dev": true }, - "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" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", + "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", "dev": true, "requires": { "create-hash": "^1.1.2", @@ -6082,6 +6363,12 @@ "sha.js": "^2.4.8" } }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true + }, "pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", @@ -6122,9 +6409,9 @@ } }, "portfinder": { - "version": "1.0.25", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", - "integrity": "sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==", + "version": "1.0.26", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.26.tgz", + "integrity": "sha512-Xi7mKxJHHMI3rIUrnm/jjUgwhbYMkp/XKEcZX3aG4BrumLpq3nmoQMX+ClYnDZnZ/New7IatC1no5RX0zo1vXQ==", "dev": true, "requires": { "async": "^2.6.2", @@ -6150,9 +6437,9 @@ "dev": true }, "postcss": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.14.tgz", - "integrity": "sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg==", + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -6187,20 +6474,21 @@ } }, "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==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz", + "integrity": "sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ==", "dev": true, "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0", - "postcss-value-parser": "^3.3.1" + "icss-utils": "^4.1.1", + "postcss": "^7.0.16", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.0" } }, "postcss-modules-scope": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.1.0.tgz", - "integrity": "sha512-91Rjps0JnmtUB0cujlc8KIKCsJXWjzuxGeT/+Q2i2HXKZ7nBUeF9YQTZZTNvHVoNYj1AthsjnGLtqDUE0Op79A==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", "dev": true, "requires": { "postcss": "^7.0.6", @@ -6208,12 +6496,12 @@ } }, "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==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", "dev": true, "requires": { - "icss-replace-symbols": "^1.1.0", + "icss-utils": "^4.0.0", "postcss": "^7.0.6" } }, @@ -6229,15 +6517,9 @@ } }, "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 - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", "dev": true }, "process": { @@ -6252,12 +6534,34 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, + "process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "requires": { + "fromentries": "^1.2.0" + } + }, "promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", "dev": true }, + "promise.allsettled": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.2.tgz", + "integrity": "sha512-UpcYW5S1RaNKT6pd+s9jp9K9rlQge1UXKskec0j6Mmuq7UJCvlS2J2/s/yuPN8ehftf9HXMxWlKiPbGGUzpoRg==", + "dev": true, + "requires": { + "array.prototype.map": "^1.0.1", + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "iterate-value": "^1.0.0" + } + }, "prop-types": { "version": "15.7.2", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", @@ -6269,13 +6573,13 @@ } }, "proxy-addr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", - "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", "dev": true, "requires": { "forwarded": "~0.1.2", - "ipaddr.js": "1.9.0" + "ipaddr.js": "1.9.1" } }, "prr": { @@ -6284,12 +6588,6 @@ "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=", - "dev": true - }, "public-encrypt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", @@ -6302,6 +6600,14 @@ "parse-asn1": "^5.0.0", "randombytes": "^2.0.1", "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } } }, "pump": { @@ -6450,27 +6756,6 @@ "react-is": "^16.9.0" } }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", - "dev": true, - "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - } - }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -6487,14 +6772,13 @@ } }, "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", "dev": true, + "optional": true, "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" + "picomatch": "^2.2.1" } }, "redux": { @@ -6507,15 +6791,15 @@ } }, "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", + "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==", "dev": true }, "regenerate-unicode-properties": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz", - "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", "dev": true, "requires": { "regenerate": "^1.4.0" @@ -6527,12 +6811,12 @@ "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" }, "regenerator-transform": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz", - "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==", + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", "dev": true, "requires": { - "private": "^0.1.6" + "@babel/runtime": "^7.8.4" } }, "regex-not": { @@ -6556,29 +6840,29 @@ } }, "regexpu-core": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz", - "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", + "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", "dev": true, "requires": { "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.1.0", - "regjsgen": "^0.5.0", - "regjsparser": "^0.6.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.1.0" + "unicode-match-property-value-ecmascript": "^1.2.0" } }, "regjsgen": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", - "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", "dev": true }, "regjsparser": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.2.tgz", - "integrity": "sha512-E9ghzUtoLwDekPT0DYCp+c4h+bvuUpe6rRHCTYn6eGoqj1LgKXxT6I0Il4WbjhQkOghzi/V+y03bPKvbllL93Q==", + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", "dev": true, "requires": { "jsesc": "~0.5.0" @@ -6638,9 +6922,9 @@ "dev": true }, "resolve": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", - "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "dev": true, "requires": { "path-parse": "^1.0.6" @@ -6833,10 +7117,13 @@ } }, "serialize-javascript": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", - "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", - "dev": true + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", + "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } }, "serve-index": { "version": "1.9.1", @@ -6951,6 +7238,15 @@ "safe-buffer": "^5.0.1" } }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -7101,13 +7397,22 @@ } }, "sockjs": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", - "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz", + "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==", "dev": true, "requires": { "faye-websocket": "^0.10.0", - "uuid": "^3.0.1" + "uuid": "^3.4.0", + "websocket-driver": "0.6.5" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } } }, "sockjs-client": { @@ -7170,9 +7475,9 @@ } }, "source-map-support": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", - "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -7194,55 +7499,58 @@ "dev": true }, "spawn-wrap": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.3.tgz", - "integrity": "sha512-IgB8md0QW/+tWqcavuFgKYR/qIRvJkRLPJDFaoXtLLUaVcCDK0+HeFTkmQHj3eprcYhc+gOl0aEA1w7qZlYezw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", "dev": true, "requires": { - "foreground-child": "^1.5.6", - "mkdirp": "^0.5.0", - "os-homedir": "^1.0.1", - "rimraf": "^2.6.2", + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", "signal-exit": "^3.0.2", - "which": "^1.3.0" - } - }, - "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "which": "^2.0.1" + }, + "dependencies": { + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } } }, - "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", - "dev": true - }, "spdy": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz", - "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "dev": true, "requires": { "debug": "^4.1.0", @@ -7267,9 +7575,9 @@ }, "dependencies": { "readable-stream": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.5.0.tgz", - "integrity": "sha512-gSz026xs2LfxBPudDuI41V1lka8cxg64E66SGe78zJlsUofOg/yqwezdIcdfwik6B4h8LFmWPA9ef9X3FiNFLA==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -7379,24 +7687,24 @@ "strip-ansi": "^4.0.0" } }, - "string.prototype.trimleft": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", - "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", "dev": true, "requires": { "define-properties": "^1.1.3", - "function-bind": "^1.1.1" + "es-abstract": "^1.17.5" } }, - "string.prototype.trimright": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", - "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", "dev": true, "requires": { "define-properties": "^1.1.3", - "function-bind": "^1.1.1" + "es-abstract": "^1.17.5" } }, "string_decoder": { @@ -7418,9 +7726,9 @@ } }, "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true }, "strip-eof": { @@ -7430,19 +7738,73 @@ "dev": true }, "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=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", "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==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.2.1.tgz", + "integrity": "sha512-ByHSTQvHLkWE9Ir5+lGbVOXhxX10fbprhLvdg96wedFZb4NDekDPxVKv5Fwmio+QcMlkkNfuK+5W1peQ5CUhZg==", "dev": true, "requires": { - "loader-utils": "^1.1.0", - "schema-utils": "^1.0.0" + "loader-utils": "^2.0.0", + "schema-utils": "^2.6.6" + }, + "dependencies": { + "ajv": { + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", + "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.1.tgz", + "integrity": "sha512-KWcq3xN8fDjSB+IMoh2VaXVhRI0BBGxoYp3rx7Pkb6z0cFjYR9Q9l4yZqqals0/zsioCmocC5H6UvsGD4MoIBA==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + } + } } }, "supports-color": { @@ -7466,9 +7828,9 @@ "dev": true }, "terser": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.1.tgz", - "integrity": "sha512-w0f2OWFD7ka3zwetgVAhNMeyzEbj39ht2Tb0qKflw9PmW9Qbo5tjTh01QJLkhO9t9RDDQYvk+WXqpECI2C6i2A==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", "dev": true, "requires": { "commander": "^2.20.0", @@ -7485,16 +7847,16 @@ } }, "terser-webpack-plugin": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", - "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.4.tgz", + "integrity": "sha512-U4mACBHIegmfoEe5fdongHESNJWqsGU+W0S/9+BmYGVQDw1+c2Ow05TpMhxjPK1sRb7cuYq1BPl1e5YHJMTCqA==", "dev": true, "requires": { "cacache": "^12.0.2", "find-cache-dir": "^2.1.0", "is-wsl": "^1.1.0", "schema-utils": "^1.0.0", - "serialize-javascript": "^2.1.2", + "serialize-javascript": "^3.1.0", "source-map": "^0.6.1", "terser": "^4.1.2", "webpack-sources": "^1.4.0", @@ -7510,15 +7872,30 @@ } }, "test-exclude": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", - "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, "requires": { - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^2.0.0" + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } } }, "through2": { @@ -7613,9 +7990,9 @@ "dev": true }, "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", "dev": true }, "tty-browserify": { @@ -7624,6 +8001,12 @@ "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -7640,6 +8023,15 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, "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", @@ -7657,15 +8049,15 @@ } }, "unicode-match-property-value-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", - "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", "dev": true }, "unicode-property-aliases-ecmascript": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", - "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", "dev": true }, "union-value": { @@ -7833,21 +8225,11 @@ "dev": true }, "v8-compile-cache": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", - "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", "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==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -7861,14 +8243,130 @@ "dev": true }, "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.2.tgz", + "integrity": "sha512-ymVbbQP40MFTp+cNMvpyBpBtygHnPzPkHqoIwRRj/0B8KhqQwV8LaKjtbaxF2lK4vl8zN9wCxS46IFCU5K4W0g==", + "dev": true, + "requires": { + "chokidar": "^3.4.0", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.0" + } + }, + "watchpack-chokidar2": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", + "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", "dev": true, + "optional": true, "requires": { - "chokidar": "^2.0.2", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" + "chokidar": "^2.1.8" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "optional": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "optional": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "optional": true + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "optional": 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, + "optional": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "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, + "optional": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + } } }, "wbuf": { @@ -7881,16 +8379,16 @@ } }, "webpack": { - "version": "4.41.5", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.5.tgz", - "integrity": "sha512-wp0Co4vpyumnp3KlkmpM5LWuzvZYayDwM2n17EHFr4qxBBbRokC7DJawPJC7TfSFZ9HZ6GsdH40EBj4UV0nmpw==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.43.0.tgz", + "integrity": "sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/wasm-edit": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "acorn": "^6.2.1", + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", "ajv": "^6.10.2", "ajv-keywords": "^3.4.1", "chrome-trace-event": "^1.0.2", @@ -7901,53 +8399,59 @@ "loader-utils": "^1.2.3", "memory-fs": "^0.4.1", "micromatch": "^3.1.10", - "mkdirp": "^0.5.1", + "mkdirp": "^0.5.3", "neo-async": "^2.6.1", "node-libs-browser": "^2.2.1", "schema-utils": "^1.0.0", "tapable": "^1.1.3", "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.6.0", + "watchpack": "^1.6.1", "webpack-sources": "^1.4.1" }, "dependencies": { "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", + "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", "dev": true, "requires": { - "fast-deep-equal": "^2.0.1", + "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.1.tgz", + "integrity": "sha512-KWcq3xN8fDjSB+IMoh2VaXVhRI0BBGxoYp3rx7Pkb6z0cFjYR9Q9l4yZqqals0/zsioCmocC5H6UvsGD4MoIBA==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true } } }, "webpack-cli": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.10.tgz", - "integrity": "sha512-u1dgND9+MXaEt74sJR4PR7qkPxXUSQ0RXYq8x1L6Jg1MYVEmGPrH6Ah6C4arD4r0J1P5HKjRqpab36k0eIzPqg==", - "dev": true, - "requires": { - "chalk": "2.4.2", - "cross-spawn": "6.0.5", - "enhanced-resolve": "4.1.0", - "findup-sync": "3.0.0", - "global-modules": "2.0.0", - "import-local": "2.0.0", - "interpret": "1.2.0", - "loader-utils": "1.2.3", - "supports-color": "6.1.0", - "v8-compile-cache": "2.0.3", - "yargs": "13.2.4" + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", + "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "cross-spawn": "^6.0.5", + "enhanced-resolve": "^4.1.1", + "findup-sync": "^3.0.0", + "global-modules": "^2.0.0", + "import-local": "^2.0.0", + "interpret": "^1.4.0", + "loader-utils": "^1.4.0", + "supports-color": "^6.1.0", + "v8-compile-cache": "^2.1.1", + "yargs": "^13.3.2" }, "dependencies": { "ansi-regex": { @@ -7956,26 +8460,30 @@ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "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": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "minimist": "^1.2.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==", + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "tapable": "^1.0.0" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" } }, "string-width": { @@ -8007,40 +8515,28 @@ "has-flag": "^3.0.0" } }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, "yargs": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", - "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, "requires": { "cliui": "^5.0.0", "find-up": "^3.0.0", "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^3.0.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^13.1.0" + "yargs-parser": "^13.1.2" } }, "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, "requires": { "camelcase": "^5.0.0", @@ -8063,17 +8559,17 @@ }, "dependencies": { "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", "dev": true } } }, "webpack-dev-server": { - "version": "3.10.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.10.2.tgz", - "integrity": "sha512-pxZKPYb+n77UN8u9YxXT4IaIrGcNtijh/mi8TXbErHmczw0DtPnMTTjHj+eNjkqLOaAZM/qD7V59j/qJsEiaZA==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz", + "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==", "dev": true, "requires": { "ansi-html": "0.0.7", @@ -8084,31 +8580,31 @@ "debug": "^4.1.1", "del": "^4.1.1", "express": "^4.17.1", - "html-entities": "^1.2.1", + "html-entities": "^1.3.1", "http-proxy-middleware": "0.19.1", "import-local": "^2.0.0", "internal-ip": "^4.3.0", "ip": "^1.1.5", "is-absolute-url": "^3.0.3", "killable": "^1.0.1", - "loglevel": "^1.6.6", + "loglevel": "^1.6.8", "opn": "^5.5.0", "p-retry": "^3.0.1", - "portfinder": "^1.0.25", + "portfinder": "^1.0.26", "schema-utils": "^1.0.0", "selfsigned": "^1.10.7", "semver": "^6.3.0", "serve-index": "^1.9.1", - "sockjs": "0.3.19", + "sockjs": "0.3.20", "sockjs-client": "1.4.0", - "spdy": "^4.0.1", + "spdy": "^4.0.2", "strip-ansi": "^3.0.1", "supports-color": "^6.1.0", "url": "^0.11.0", "webpack-dev-middleware": "^3.7.2", "webpack-log": "^2.0.0", "ws": "^6.2.1", - "yargs": "12.0.5" + "yargs": "^13.3.2" }, "dependencies": { "ansi-regex": { @@ -8117,17 +8613,100 @@ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", "dev": true }, - "require-main-filename": { + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true + }, + "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" + } + } + } + }, + "is-binary-path": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true + "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" + } + }, + "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" + } }, "semver": { "version": "6.3.0", @@ -8135,6 +8714,34 @@ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -8154,29 +8761,27 @@ } }, "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", + "cliui": "^5.0.0", "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", + "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", + "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^2.0.0", + "string-width": "^3.0.0", "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" } }, "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, "requires": { "camelcase": "^5.0.0", @@ -8196,12 +8801,13 @@ } }, "webpack-merge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", - "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.0.9.tgz", + "integrity": "sha512-P4teh6O26xIDPugOGX61wPxaeP918QOMjmzhu54zTVcLtOS28ffPWtnv+ilt3wscwBUCL2WNMnh97XkrKqt9Fw==", "dev": true, "requires": { - "lodash": "^4.17.15" + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" } }, "webpack-sources": { @@ -8223,20 +8829,18 @@ } }, "websocket-driver": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", - "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", + "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", "dev": true, "requires": { - "http-parser-js": ">=0.4.0 <0.4.11", - "safe-buffer": ">=5.1.0", "websocket-extensions": ">=0.1.1" } }, "websocket-extensions": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true }, "which": { @@ -8263,6 +8867,12 @@ "string-width": "^1.0.2 || 2" } }, + "wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, "worker-farm": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", @@ -8272,49 +8882,47 @@ "errno": "~0.1.7" } }, + "workerpool": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.0.tgz", + "integrity": "sha512-fU2OcNA/GVAJLLyKUoHkAgIhKb0JoCpSjLC/G2vYKxUjVmQwGbRVeoPJ1a8U4pnVofz4AQV5Y/NEw8oKqxEBtA==", + "dev": true + }, "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" }, "dependencies": { "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" } }, "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "^4.1.0" } } } @@ -8326,14 +8934,15 @@ "dev": true }, "write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, "requires": { - "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" } }, "ws": { @@ -8364,9 +8973,9 @@ "dev": true }, "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, "requires": { "cliui": "^5.0.0", @@ -8378,7 +8987,7 @@ "string-width": "^3.0.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" + "yargs-parser": "^13.1.2" }, "dependencies": { "ansi-regex": { @@ -8387,17 +8996,6 @@ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -8417,24 +9015,13 @@ "requires": { "ansi-regex": "^4.1.0" } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } } } }, "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, "requires": { "camelcase": "^5.0.0", @@ -8450,84 +9037,6 @@ "flat": "^4.1.0", "lodash": "^4.17.15", "yargs": "^13.3.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" - } - }, - "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } } } } diff --git a/package.json b/gui/package.json similarity index 50% rename from package.json rename to gui/package.json index 12c1195..8226513 100644 --- a/package.json +++ b/gui/package.json @@ -2,11 +2,11 @@ "name": "@infinito/workouts", "version": "0.0.0", "description": "Tool for quickly and easily managing and keeping track of workouts.", - "main": "workouts.min.js", + "main": "workouts.js", "scripts": { - "build": "webpack --config webpack.prod.config.js", + "build": "webpack --config webpack.dev.config.js", "start": "webpack-dev-server --config webpack.dev.config.js --host 0.0.0.0", - "test": "nyc mocha --require @babel/register" + "test": "nyc mocha --require @babel/register --require @babel/polyfill" }, "repository": { "type": "git", @@ -19,22 +19,23 @@ }, "homepage": "https://github.com/infinitis/workouts#readme", "dependencies": { - "react": "^16.12.0", - "react-dom": "^16.12.0", - "react-redux": "^7.1.3", + "react": "^16.13.1", + "react-dom": "^16.13.1", + "react-redux": "^7.2.0", "redux": "^4.0.5" }, "devDependencies": { - "@babel/core": "^7.8.4", - "@babel/preset-env": "^7.8.4", - "@babel/register": "^7.8.3", - "css-loader": "^2.1.1", - "mocha": "^6.2.2", - "nyc": "^14.1.1", - "style-loader": "^0.23.1", - "webpack": "^4.41.5", - "webpack-cli": "^3.3.10", - "webpack-dev-server": "^3.10.2", - "webpack-merge": "^4.2.2" + "@babel/core": "^7.10.5", + "@babel/polyfill": "^7.10.4", + "@babel/preset-env": "^7.10.4", + "@babel/register": "^7.10.5", + "css-loader": "^3.6.0", + "mocha": "^8.0.1", + "nyc": "^15.1.0", + "style-loader": "^1.2.1", + "webpack": "^4.43.0", + "webpack-cli": "^3.3.12", + "webpack-dev-server": "^3.11.0", + "webpack-merge": "^5.0.9" } } diff --git a/gui/src/classes/workout.js b/gui/src/classes/workout.js new file mode 100644 index 0000000..0777f46 --- /dev/null +++ b/gui/src/classes/workout.js @@ -0,0 +1,106 @@ +import {constants} from '../constants.js'; +const {DEFAULT_ATTRIBUTES} = constants; + +export default class workout { + constructor(toClone) { + if((toClone !== void(0))&&(toClone instanceof workout)) { + this.attributes = {...toClone.attributes}; + this.dates = [...toClone.dates]; + this.name = toClone.name; + } else { + this.attributes = {...DEFAULT_ATTRIBUTES}; + this.dates = []; + this.name = "New Workout"; + if(typeof toClone == "object") { + if(toClone.attributes !== void(0)) { + for(let i in toClone.attributes) { + if(toClone.attributes[i] === true) { + this.toggleAttribute(i); + } + } + } + if(toClone.dates !== void(0)) { + for(let date of toClone.dates) { + this.add(date); + } + } + if(toClone.name !== void(0)) { + this.name = toClone.name; + } + } + } + } + add(date) { + date = Date.parse(date); + if(isNaN(date)) { + throw new TypeError('expects parameter `date` to be a date'); + } + this._dates.push(new Date(date).toISOString().split("T")[0]); + this.normalize(); + } + get dates() { + return this._dates; + } + set dates(dates) { + if(!(dates instanceof Array)) { + throw new TypeError('expects parameter `dates` to be an array of dates'); + } + dates = dates.map((date) => Date.parse(date)); + if(!(dates.every((x) => !isNaN(x)))) { + throw new TypeError('expects parameter `dates` to be an array of dates'); + } + + this._dates = dates; + this.normalize(); + } + equals(compare) { + if((compare === void(0)) || (!(compare instanceof workout))) { return false; } + + if(this.name !== compare.name) { return false; } + + if(Object.keys(this.attributes).length!==Object.keys(compare.attributes).length) { return false; } + for(let i in this.attributes) { + if(this.attributes[i]!==compare.attributes[i]) { return false; } + } + + if(this.dates.length!==compare.dates.length) { return false; } + for(let i in this.dates) { + if(this.dates[i] !== compare.dates[i]) { return false; } + } + + return true; + } + get last_done() { + let res = this._dates.slice(0,1); + return (res.length==0)?"":res[0]; + } + get name() { + return this._name; + } + set name(name) { + if(typeof name != "string") { + throw new TypeError('Workout::setName(name) expects parameter `name` to be a string'); + } + this._name = name; + } + normalize() { + this._dates = [...new Set([...this._dates])]; + this._dates.sort((a,b) => { return a { + const {status} = state.sync; + return {status}; +} + +export const header = connect( + mapStateToProps, + null +)(Header); \ No newline at end of file diff --git a/gui/src/components/main/main.component.js b/gui/src/components/main/main.component.js new file mode 100644 index 0000000..b04d6fa --- /dev/null +++ b/gui/src/components/main/main.component.js @@ -0,0 +1,114 @@ +import style from './main.css'; + +import {daysAgo} from '../days.ago/days.ago.js'; +import {header} from '../header/header.js'; +import {manage} from '../manage/manage.js'; +import {recent} from '../recent/recent.js'; + +import workout from '../../classes/workout.js'; + +export default class Main extends React.Component { + constructor(props) { + super(props); + this.load = this.load.bind(this); + this.save = this.save.bind(this); + this.switchView = this.switchView.bind(this); + this.handleKeyPress = this.handleKeyPress.bind(this); + } + componentDidMount() { + document.addEventListener('keydown',this.handleKeyPress); + this.switchView("manage"); + } + componentWillUnmount() { + document.removeEventListener('keydown',this.handleKeyPress); + } + handleKeyPress(event) { + if(event.ctrlKey) { + if(event.key==="s") { + this.save(); + event.preventDefault(); + } else if(event.key==="o") { + this.load(); + event.preventDefault(); + } + } + } + save(data) { + const {workouts} = this.props; + const saveFormat = {}; + for(let i of Object.keys(workouts)) { + saveFormat[i] = { + attributes:workouts[i].attributes, + dates:workouts[i].dates, + name:workouts[i].name + }; + } + const content = JSON.stringify(saveFormat); + var a = document.createElement('a'); + var blob = new Blob([content], {'type':'application/octet-stream'}); + a.href = window.URL.createObjectURL(blob); + a.download = 'workouts.json'; + document.body.appendChild(a); + a.click(); + setTimeout(() => { + document.body.removeChild(a); + window.URL.revokeObjectURL(blob); + }, 0); + } + async load(data) { + const {importWorkouts,view} = this.props; + var file = document.createElement('input'); + file.type = "file"; + file.style.display = "none"; + + try { + const workouts = await new Promise((resolve,reject) => { + const reader = new FileReader(); + + file.onchange = (input) => { + const reader = new FileReader(); + reader.readAsText(input.target.files[0]); + reader.onload = () => { + const workouts = JSON.parse(reader.result); + for(let i in workouts) { + workouts[i] = new workout(workouts[i]); + } + resolve(workouts); + }; + + reader.onerror = () => { + reject(reader.error); + }; + }; + + document.body.appendChild(file); + file.click(); + }); + + importWorkouts(workouts); + } catch(err) { + throw err; + } + document.body.removeChild(file); + } + switchView(type) { + this.props.switchView(type); + } + render() { + const {view} = this.props; + const otherView = (view=="manage")?"recent":"manage"; + return createElement("div",{className:style.container}, + createElement("div",{className:style.headerContainer}, + createElement(header,null) + ), + createElement("div",{className:style.viewContainer}, + createElement("div",{className:style.subHeaderContainer}, + createElement(daysAgo,null), + createElement("input",{type:"button",onClick:this.switchView.bind(this,otherView),value:otherView}), + createElement("input",{type:"button",onClick:this.save,value:"Save Workouts"}) + ), + (view==="manage")?createElement(manage,null):createElement(recent,null) + ) + ); + } +} \ No newline at end of file diff --git a/src/components/main/main.css b/gui/src/components/main/main.css similarity index 100% rename from src/components/main/main.css rename to gui/src/components/main/main.css diff --git a/gui/src/components/main/main.js b/gui/src/components/main/main.js new file mode 100644 index 0000000..375b504 --- /dev/null +++ b/gui/src/components/main/main.js @@ -0,0 +1,65 @@ +import {connect} from 'react-redux'; + +import Main from './main.component.js'; + +import workout from '../../classes/workout.js'; + +import {constants} from '../../constants.js'; +const { + CHANGE_VIEW, + NEW_WORKOUT, + SORT_VIEW +} = constants; + +const mapStateToParentProps = (state) => { + const {workouts} = state; + const {view} = state.view; + return { + view, + workouts + }; +} + +const mapStateToProps = (state) => { + const {view} = state.view; + return { + view + }; +}; + +const switchViewHelper = (dispatch,view,workouts) => { + dispatch({ + type:CHANGE_VIEW, + workouts, + view + }); + dispatch({ + type:SORT_VIEW, + key:(view==="manage")?"last_done":"date", + order:(view==="manage")?"asc":"desc", + shift:false + }); +}; + +const mapDispatchToProps = (dispatch,ownProps) => { + return { + importWorkouts:(workouts) => { + for(let i in workouts) { + dispatch({ + type:NEW_WORKOUT, + toAdd:workouts[i] + }); + } + switchViewHelper(dispatch,ownProps.view,workouts); + }, + switchView:(view) => switchViewHelper(dispatch,view,ownProps.workouts) + }; +}; + + +export const main = connect( + mapStateToParentProps +)(connect( + mapStateToProps, + mapDispatchToProps +)(Main)); \ No newline at end of file diff --git a/src/components/manage.row/manage.row.css b/gui/src/components/manage.row/manage.row.css similarity index 100% rename from src/components/manage.row/manage.row.css rename to gui/src/components/manage.row/manage.row.css diff --git a/src/components/manage.row/manage.row.js b/gui/src/components/manage.row/manage.row.js similarity index 88% rename from src/components/manage.row/manage.row.js rename to gui/src/components/manage.row/manage.row.js index 31792f1..7d39525 100644 --- a/src/components/manage.row/manage.row.js +++ b/gui/src/components/manage.row/manage.row.js @@ -30,7 +30,6 @@ export default class manageRow extends React.Component { ...DEFAULT_ATTRIBUTES_ORDER, "times_done", "last_done", - "description", "done" ].map((field) => { if(field=="done") { @@ -41,10 +40,6 @@ export default class manageRow extends React.Component { return createElement("td",{key:"cell-"+field}, createElement("input",{defaultValue:data[field],onBlur:this.changeName}) ); - } else if(field=="description") { - return createElement("td",{key:"cell-"+field}, - createElement("textarea",{value:data[field],onChange:this.changeDescription}) - ); } else if((field=="times_done")||(field=="last_done")) { return createElement("td",{key:"cell-"+field},data[field]); } else { diff --git a/src/components/manage/manage.component.js b/gui/src/components/manage/manage.component.js similarity index 91% rename from src/components/manage/manage.component.js rename to gui/src/components/manage/manage.component.js index 2a94464..ad775f6 100644 --- a/src/components/manage/manage.component.js +++ b/gui/src/components/manage/manage.component.js @@ -30,17 +30,15 @@ export default class Manage extends React.Component { ...DEFAULT_ATTRIBUTES_ORDER, "times done", "last done", - "description", "" ].map((x) => { return createElement("th",{key:"head-"+x,onClick:this.handleSort.bind(this,x)},x); }); - const rows = workouts.map((i) => { + const rows = workouts.map((i,index) => { return createElement(manageRow,{ - key:"row-"+i.name, + key:`row-${index}-${i.name}`, data:i, complete:() => completeWorkout(i.name), - description:(val) => changeDescription(i.name,val), name:(val) => changeName(i.name,val), toggle:(attr) => toggleAttribute(i.name,attr) }); diff --git a/src/components/manage/manage.css b/gui/src/components/manage/manage.css similarity index 100% rename from src/components/manage/manage.css rename to gui/src/components/manage/manage.css diff --git a/gui/src/components/manage/manage.js b/gui/src/components/manage/manage.js new file mode 100644 index 0000000..d9547c0 --- /dev/null +++ b/gui/src/components/manage/manage.js @@ -0,0 +1,139 @@ +import {connect} from 'react-redux'; + +import Manage from './manage.component.js'; + +import backend from '../../util/backend.js'; + +import {constants} from '../../constants.js'; +const { + ADD_WORKOUT, + CHANGE_ATTRIBUTE, + CHANGE_WORKOUT_DESCRIPTION, + CHANGE_WORKOUT_NAME, + CHANGE_VIEW, + NEW_WORKOUT, + SORT_VIEW, + SYNC_STATUS +} = constants; + + +const mapStateToParentProps = (state) => { + const {workouts} = state; + const {status} = state.sync; + return { + workouts, + sync:(status!==SYNC_STATUS.STATUS_DESYNCED) + }; +} + +const mapStateToProps = (state) => { + return { + workouts:state.view.data + }; +}; + +const mapDispatchToProps = (dispatch,ownProps) => { + return { + changeName:async(name,val) => { + if(ownProps.sync) { + backend({ + dispatch, + cmd:void(0), + data:ownProps.workouts + }); + } + + dispatch({ + type:CHANGE_WORKOUT_NAME, + workout:name, + name:val + }); + }, + completeWorkout:async(workout) => { + const now = new Date(); + const today = new Date(now.getTime() - (now.getTimezoneOffset() * 60000 )) + .toISOString(). + split("T")[0]; + + if(ownProps.sync) { + backend({ + dispatch, + cmd:`add\n${workout}\n${today}`, + data:ownProps.workouts + }); + } + + dispatch({ + type:ADD_WORKOUT, + name:workout, + toAdd:[today] + }); + + dispatch({ + type:CHANGE_VIEW, + view:"manage", + workouts:ownProps.workouts + }); + + dispatch({ + type:SORT_VIEW, + key:"last_done", + order:"asc", + shift:false + }); + }, + newWorkout:async() => { + if(ownProps.sync) { + backend({ + dispatch, + cmd:`new\nNew Workout`, + data:ownProps.workouts + }); + } + + dispatch({ + type:NEW_WORKOUT + }); + }, + sort:(key,shift) => { + dispatch({ + type:SORT_VIEW, + key, + shift + }); + }, + toggleAttribute:async(name,attr) => { + if(ownProps.sync) { + backend({ + dispatch, + cmd:`toggle\n${name}\n${attr}`, + data:ownProps.workouts + }); + } + + dispatch({ + type:CHANGE_ATTRIBUTE, + workout:name, + attribute:attr + }); + dispatch({ + type:CHANGE_VIEW, + view:"manage", + workouts:ownProps.workouts + }); + dispatch({ + type:SORT_VIEW, + key:"last_done", + order:"asc", + shift:false + }); + } + } +}; + +export const manage = connect( + mapStateToParentProps +)(connect( + mapStateToProps, + mapDispatchToProps +)(Manage)); \ No newline at end of file diff --git a/src/components/recent.row/recent.row.css b/gui/src/components/recent.row/recent.row.css similarity index 100% rename from src/components/recent.row/recent.row.css rename to gui/src/components/recent.row/recent.row.css diff --git a/src/components/recent.row/recent.row.js b/gui/src/components/recent.row/recent.row.js similarity index 100% rename from src/components/recent.row/recent.row.js rename to gui/src/components/recent.row/recent.row.js diff --git a/src/components/recent/recent.component.js b/gui/src/components/recent/recent.component.js similarity index 100% rename from src/components/recent/recent.component.js rename to gui/src/components/recent/recent.component.js diff --git a/src/components/recent/recent.css b/gui/src/components/recent/recent.css similarity index 100% rename from src/components/recent/recent.css rename to gui/src/components/recent/recent.css diff --git a/gui/src/components/recent/recent.js b/gui/src/components/recent/recent.js new file mode 100644 index 0000000..301b1dd --- /dev/null +++ b/gui/src/components/recent/recent.js @@ -0,0 +1,62 @@ +import {connect} from 'react-redux'; + +import Recent from './recent.component.js'; + +import backend from '../../util/backend.js'; + +import {constants} from '../../constants.js'; +const { + CHANGE_WORKOUT_DATE, + SORT_VIEW, + SYNC_STATUS +} = constants; + +const mapStateToParentProps = (state) => { + const {workouts} = state; + const {status} = state.sync; + return { + workouts, + sync:(status!==SYNC_STATUS.STATUS_DESYNCED) + }; +} + +const mapStateToProps = (state) => { + return { + data:state.view.data.slice(0,100) + }; +} + +const mapDispatchToProps = (dispatch,ownProps) => { + return { + handleDateChange:async(workout,old,date) => { + if(ownProps.sync) { + backend({ + dispatch, + cmd:void(0), + data:ownProps.workouts + }); + } + + dispatch({ + type:CHANGE_WORKOUT_DATE, + workout, + old, + new:date + }); + }, + handleSort:(key) => { + dispatch({ + type:SORT_VIEW, + key, + shift:false + }); + } + }; +} + +export const recent = connect( + mapStateToParentProps +)(connect( + mapStateToProps, + mapDispatchToProps +)(Recent)); \ No newline at end of file diff --git a/src/constants.js b/gui/src/constants.js similarity index 73% rename from src/constants.js rename to gui/src/constants.js index 013ea86..5d15423 100644 --- a/src/constants.js +++ b/gui/src/constants.js @@ -3,7 +3,6 @@ const constants = { CHANGE_ATTRIBUTE:"CHANGE_ATTRIBUTE", CHANGE_VIEW:"CHANGE_VIEW", CHANGE_WORKOUT_DATE:"CHANGE_WORKOUT_DATE", - CHANGE_WORKOUT_DESCRIPTION:"CHANGE_WORKOUT_DESCRIPTION", CHANGE_WORKOUT_NAME:"CHANGE_WORKOUT_NAME", DEFAULT_ATTRIBUTES:{ lower:false, @@ -26,7 +25,13 @@ const constants = { DELETE_WORKOUT:"DELETE_WORKOUT", NEW_WORKOUT:"NEW_WORKOUT", REMOVE_WORKOUT:"REMOVE_WORKOUT", - SORT_VIEW:"SORT_VIEW" + SORT_VIEW:"SORT_VIEW", + SYNC_STATUS:{ + STATUS_UNSYNCED:"STATUS_UNSYNCED", + STATUS_DESYNCED:"STATUS_DESYNCED", + STATUS_SYNCED:"STATUS_SYNCED" + }, + UPDATE_SYNC_STATUS:"UPDATE_SYNC_STATUS" }; Object.freeze(constants); export {constants}; \ No newline at end of file diff --git a/gui/src/data/action.js b/gui/src/data/action.js new file mode 100644 index 0000000..2ce6781 --- /dev/null +++ b/gui/src/data/action.js @@ -0,0 +1,23 @@ +export default async function action(params) { + const {cmd,data,backendDataLoader} = params; + + if(cmd===void(0)) { throw new Error(`missing parameter cmd`); } + if(data===void(0)) { throw new Error(`missing parameter data`); } + if(backendDataLoader===void(0)) { throw new Error(`missing parameter backendDataLoader`); } + + try { + await cmd(); // must throw if cmd fails + const backendData = await backendDataLoader(); + + for(let i in data) { + if(!data[i].equals(backendData[i])) { + return false; + } + } + + return true; + } catch(err) { + console.error(err); + return false; + } +} \ No newline at end of file diff --git a/gui/src/data/attributes.js b/gui/src/data/attributes.js new file mode 100644 index 0000000..62bb9f2 --- /dev/null +++ b/gui/src/data/attributes.js @@ -0,0 +1,6 @@ +import request from '../util/request.js'; + +export default async function attributes() { + const raw = await request('attr\nls\n'); + return raw.split('\n').filter((i) => i!==""); +} \ No newline at end of file diff --git a/gui/src/data/load.js b/gui/src/data/load.js new file mode 100644 index 0000000..a7e7886 --- /dev/null +++ b/gui/src/data/load.js @@ -0,0 +1,25 @@ +import getAttributes from './attributes.js'; +import getRecent from './recent.js' +import getWorkouts from './workouts.js'; + +import workout from '../classes/workout.js'; + +export default async function load() { + const attrs = await getAttributes(); + const workouts = await getWorkouts(); + const recent = await getRecent(); + + for(let i in workouts) { + workouts[i].dates = (recent[i]===void(0))?[]:recent[i]; + let flags = workouts[i].attributes; + workouts[i].attributes = {}; + for(let attr of attrs) { + workouts[i].attributes[attr] = (flags & 1)?true:false; + flags >>= 1; + } + workouts[i].name = i; + workouts[i] = new workout(workouts[i]); + } + + return workouts; +} \ No newline at end of file diff --git a/gui/src/data/recent.js b/gui/src/data/recent.js new file mode 100644 index 0000000..af08c8c --- /dev/null +++ b/gui/src/data/recent.js @@ -0,0 +1,24 @@ +import request from '../util/request.js'; + +export default async function workouts() { + const raw = await request('recent\n'); + + const regex = /^(.*)\t(.*)/gm; + + const recent = {}; + + let m; + + while ((m = regex.exec(raw)) !== null) { + // This is necessary to avoid infinite loops with zero-width matches + if (m.index === regex.lastIndex) { regex.lastIndex++; } + + if(recent[m[1]]===void(0)) { + recent[m[1]] = []; + } + + recent[m[1]].push(m[2]); + } + + return recent; +} \ No newline at end of file diff --git a/gui/src/data/workouts.js b/gui/src/data/workouts.js new file mode 100644 index 0000000..747070a --- /dev/null +++ b/gui/src/data/workouts.js @@ -0,0 +1,24 @@ +import request from '../util/request.js'; + +export default async function workouts() { + const raw = await request('ls\n'); + + const regex = /^(.*) \[(.*)\] \[Last done: (.*)\]/gm; + + const workouts = {}; + + let m; + + while ((m = regex.exec(raw)) !== null) { + // This is necessary to avoid infinite loops with zero-width matches + if (m.index === regex.lastIndex) { regex.lastIndex++; } + + // The result can be accessed through the `m`-variable. + workouts[m[1]] = { + attributes:m[2], + last_done:m[3] + }; + } + + return workouts; +} \ No newline at end of file diff --git a/gui/src/index.js b/gui/src/index.js new file mode 100644 index 0000000..527709d --- /dev/null +++ b/gui/src/index.js @@ -0,0 +1,43 @@ +import {render} from 'react-dom'; + +import {createStore} from 'redux'; +import {Provider} from 'react-redux'; +import reducers from 'reducers/combined.js'; + +import {main} from 'components/main/main.js'; + +import workout from 'classes/workout.js'; + +import load from 'data/load.js'; + +import sampleData from '../workouts.json'; + +window.workoutsInit = async(anchor,saveCb) => { + if(!(anchor instanceof HTMLElement)) { + throw new Error("Invalid anchor"); + } + + let data = {}; + try { + data = await load(); + } catch(err) { + if(err.message!=="request failed") { + throw err; + } else { + data = sampleData; + if((data !== void(0))&&(typeof data =="object")) { + for(let i in data) { + data[i] = new workout(data[i]); + } + } + } + } + + const store = createStore(reducers,{workouts:data}); + render( + createElement(Provider,{store}, + createElement(main,null) + ), + anchor + ); +}; \ No newline at end of file diff --git a/src/reducers/combined.js b/gui/src/reducers/combined.js similarity index 71% rename from src/reducers/combined.js rename to gui/src/reducers/combined.js index 6ba7c20..8e74e9f 100644 --- a/src/reducers/combined.js +++ b/gui/src/reducers/combined.js @@ -1,9 +1,11 @@ import {combineReducers} from 'redux'; -import workouts from './workouts.js'; +import sync from './sync.js'; import view from './view.js'; +import workouts from './workouts.js'; export default combineReducers({ - workouts, - view + sync, + view, + workouts }); \ No newline at end of file diff --git a/gui/src/reducers/sync.js b/gui/src/reducers/sync.js new file mode 100644 index 0000000..a48f06c --- /dev/null +++ b/gui/src/reducers/sync.js @@ -0,0 +1,27 @@ +import {constants} from '../constants.js'; +const { + DO_ACTION_SYNC, + UPDATE_SYNC_STATUS, + SYNC_STATUS +} = constants; + +const defaultState = { + status:SYNC_STATUS.STATUS_UNSYNCED +}; + +export default function sync(state = defaultState,action) { + if((action===void(0))||(action.type===void(0))) { return state; } + + switch(action.type) { + case UPDATE_SYNC_STATUS: + if(action.status===void(0)) { return state; } + if(SYNC_STATUS[action.status]===void(0)) { return state; } + + return { + ...state, + status:action.status + }; + default: + return state; + } +} \ No newline at end of file diff --git a/src/reducers/view.js b/gui/src/reducers/view.js similarity index 90% rename from src/reducers/view.js rename to gui/src/reducers/view.js index 74a07d0..96ba694 100644 --- a/src/reducers/view.js +++ b/gui/src/reducers/view.js @@ -1,12 +1,17 @@ import workout from '../classes/workout.js'; import {constants} from '../constants.js'; +const { + CHANGE_VIEW, + DEFAULT_ATTRIBUTES, + SORT_VIEW +} = constants; -const {DEFAULT_ATTRIBUTES} = constants; const defaultDaysAgo = {...DEFAULT_ATTRIBUTES}; Object.keys(defaultDaysAgo).map((attr) => { defaultDaysAgo[attr] = -1; }); + const defaultState = { view:"manage", daysAgo:defaultDaysAgo, @@ -38,7 +43,8 @@ const generateDaysAgo = (workouts) => { }; export default function view(state = defaultState,action) { - const {CHANGE_VIEW,SORT_VIEW} = constants; + if((action===void(0))||(action.type===void(0))) { return state; } + switch(action.type) { case CHANGE_VIEW: if((action.workouts == void(0))||(typeof action.workouts != "object" )) { @@ -47,7 +53,7 @@ export default function view(state = defaultState,action) { if(!Object.keys(action.workouts).every((x) => action.workouts[x] instanceof workout)) { return state; } - if((action.view === void(0))||(action.view == state.view)) { + if(action.view === void(0)) { return state; } switch(action.view) { @@ -65,7 +71,6 @@ export default function view(state = defaultState,action) { toPush.name = action.workouts[i].name; toPush.times_done = action.workouts[i].times_done; toPush.last_done = action.workouts[i].last_done; - toPush.description = action.workouts[i].description; newStateManageView.data.push(toPush); } newStateManageView.daysAgo = generateDaysAgo(action.workouts); @@ -77,10 +82,10 @@ export default function view(state = defaultState,action) { }; newStateRecentView.data = []; for(let i in action.workouts) { - for(let j=0;j request(cmd), + data, + backendDataLoader:load + }))) { + throw new Error(`command '${cmd}' failed`); + } + } catch(err) { + console.error(err); + alert(`Sync with backend failed. Save manually.`); + dispatch({ + type:UPDATE_SYNC_STATUS, + status:STATUS_DESYNCED + }); + } +} \ No newline at end of file diff --git a/gui/src/util/request.js b/gui/src/util/request.js new file mode 100644 index 0000000..a753346 --- /dev/null +++ b/gui/src/util/request.js @@ -0,0 +1,10 @@ +export default async function request(cmd) { + const req = await fetch("/", { + method: 'POST', + body:cmd + }); + + if(!req.ok) { throw new Error('request failed'); } + + return await req.text(); +} \ No newline at end of file diff --git a/gui/test/data.action.tests.js b/gui/test/data.action.tests.js new file mode 100644 index 0000000..131e8ba --- /dev/null +++ b/gui/test/data.action.tests.js @@ -0,0 +1,97 @@ +const assert = require('assert'); + +const action = require('../src/data/action.js').default; + +const workout = require('../src/classes/workout.js').default; + +const {constants} = require('../src/constants.js'); +const { + DEFAULT_ATTRIBUTES +} = constants; + +describe('action tests',() => { + + it('should throw when given no parameters',async() => { + const params = {}; + await assert.rejects(action(params)); + }); + + it('should throw when cmd is not a function',async() => { + const params = {cmd:1}; + await assert.rejects(action(params)); + }); + + it('should return false when not given any data',async() => { + const params = { + cmd:() => {} + }; + await assert.rejects(action(params)); + }); + + it('should throw when not given a function to load backend data',async() => { + const params = { + cmd:() => {}, + data:{} + }; + await assert.rejects(action(params)); + }); + + it('should return false when cmd function throws',async() => { + const params = { + cmd:async() => { + throw new Error("here"); + }, + data:{}, + backendDataLoader:async() => {} + }; + await assert.doesNotReject(async() => { + const originalConsoleError = console.error; + console.error = (msg) => {}; + assert.strictEqual(await action(params),false); + console.error = originalConsoleError; + }); + }); + + it('should return false when backend data and data differ',async() => { + const params = { + cmd:async() => {}, + data:{ + test:new workout(), + test2:new workout({ + attributes:DEFAULT_ATTRIBUTES, + dates:['2020-07-01'], + name:'test2' + }) + }, + backendDataLoader:async() => { + return { + test:-1, + test2:'apple' + }; + } + }; + + await assert.doesNotReject(async() => { + assert.strictEqual(await action(params),false); + }); + }); + + it('should return true upon updating and validating backend data',async() => { + const params = { + cmd:async() => {}, + data:{ + test:new workout() + }, + backendDataLoader:async() => { + return { + test:new workout() + }; + } + }; + + await assert.doesNotReject(async() => { + assert.strictEqual(await action(params),true); + }); + }); + +}); \ No newline at end of file diff --git a/gui/test/sync.reducer.tests.js b/gui/test/sync.reducer.tests.js new file mode 100644 index 0000000..72edeed --- /dev/null +++ b/gui/test/sync.reducer.tests.js @@ -0,0 +1,63 @@ +const assert = require('assert'); + +const sync = require('../src/reducers/sync.js').default; + +const {constants} = require('../src/constants.js'); +const { + UPDATE_SYNC_STATUS, + SYNC_STATUS +} = constants; + +describe('sync reducer',() => { + + describe(UPDATE_SYNC_STATUS,() => { + + it('should not change the state when given an invalid action',async() => { + const action = { + type:UPDATE_SYNC_STATUS + }; + await assert.doesNotReject(async() => { + assert.deepStrictEqual(await sync("haha",action),"haha"); + }); + }); + + it('should not change the state when given an invalid status',async() => { + const action = { + type:UPDATE_SYNC_STATUS, + status:-1 + }; + await assert.doesNotReject(async() => { + assert.deepStrictEqual(await sync("haha",action),"haha"); + }); + }); + + it('should successfully change the status',async() => { + const stateA = { + status:SYNC_STATUS.STATUS_DESYNCED + }; + const action1 = { + type:UPDATE_SYNC_STATUS, + status:SYNC_STATUS.STATUS_UNSYNCED + }; + + const stateB = { + status:SYNC_STATUS.STATUS_UNSYNCED + }; + const action2 = { + type:UPDATE_SYNC_STATUS, + status:SYNC_STATUS.STATUS_SYNCED + }; + + const stateC = { + status:SYNC_STATUS.STATUS_SYNCED + }; + + await assert.doesNotReject(async() => { + assert.deepStrictEqual(await sync(stateA,action1),stateB); + assert.deepStrictEqual(await sync(stateB,action2),stateC); + }); + }); + + }); + +}); \ No newline at end of file diff --git a/gui/test/view.reducer.tests.js b/gui/test/view.reducer.tests.js new file mode 100644 index 0000000..262042f --- /dev/null +++ b/gui/test/view.reducer.tests.js @@ -0,0 +1,381 @@ +const assert = require('assert'); + +const view = require('../src/reducers/view.js').default; + +const workout = require('../src/classes/workout.js').default; + +const {constants} = require('../src/constants.js'); +const { + CHANGE_VIEW, + DEFAULT_ATTRIBUTES, + SORT_VIEW +} = constants; + +describe('view reducers',() => { + + const defaultState = view(); + + const workouts = { + workout1:new workout({ + attributes:DEFAULT_ATTRIBUTES, + dates:['2020-07-01'], + name:'workout1' + }), + workout2:new workout({ + attributes:DEFAULT_ATTRIBUTES, + dates:['2020-06-06'], + name:'workout2' + }), + apple:new workout({ + attributes:DEFAULT_ATTRIBUTES, + dates:['2020-06-04'], + name:'apple' + }), + hello:new workout({ + attributes:DEFAULT_ATTRIBUTES, + dates:['2020-07-01'], + name:'hello' + }) + }; + + describe(CHANGE_VIEW,() => { + + it('should not change the state when an invalid action is given',() => { + const stateA = {...defaultState}; + assert.deepStrictEqual(view(stateA,void(0)),defaultState); + }); + + it('should successfully change the state to the `manage` view',() => { + const stateA = {...defaultState}; + const action = { + type:CHANGE_VIEW, + workouts:{}, + view:"manage" + }; + + const stateB = { + ...defaultState + }; + assert.deepStrictEqual(view(stateA,action),stateB); + }); + + it('should successfully change the state to the `recent` view',() => { + const stateA = {...defaultState}; + const action = { + type:CHANGE_VIEW, + workouts:{}, + view:"recent" + }; + + const stateB = { + ...defaultState, + view:"recent" + }; + assert.deepStrictEqual(view(stateA,action),stateB); + }); + + it('should successfully add all workouts to data array with appropriate manage view fields',() => { + const stateA = {...defaultState}; + const action = { + type:CHANGE_VIEW, + workouts, + view:"manage" + }; + + const stateB = { + ...defaultState, + view:"manage", + data: [ + { + "back": false, + "cardio": false, + "core": false, + "last_done": "2020-07-01", + "lower": false, + "martial": false, + "name": "workout1", + "other": false, + "times_done": 1, + "upper": false + }, + { + "back": false, + "cardio": false, + "core": false, + "last_done": "2020-06-06", + "lower": false, + "martial": false, + "name": "workout2", + "other": false, + "times_done": 1, + "upper": false + }, + { + "back": false, + "cardio": false, + "core": false, + "last_done": "2020-06-04", + "lower": false, + "martial": false, + "name": "apple", + "other": false, + "times_done": 1, + "upper": false + }, + { + "back": false, + "cardio": false, + "core": false, + "last_done": "2020-07-01", + "lower": false, + "martial": false, + "name": "hello", + "other": false, + "times_done": 1, + "upper": false + } + ] + }; + assert.deepStrictEqual(view(stateA,action),stateB); + }); + + it('should successfully add all workouts to data array with appropriate recent view fields',() => { + const stateA = {...defaultState}; + const action = { + type:CHANGE_VIEW, + workouts, + view:"recent" + }; + + const stateB = { + ...defaultState, + view:"recent", + data: [ + { + date:'2020-07-01', + name:'workout1' + }, + { + date:'2020-06-06', + name:'workout2' + }, + { + date:'2020-06-04', + name:'apple' + }, + { + date:'2020-07-01', + name:'hello' + } + ] + }; + assert.deepStrictEqual(view(stateA,action),stateB); + }); + + }); + + describe(SORT_VIEW,() => { + + it('should not change the state when an invalid action is given',() => { + const stateA = {...defaultState}; + assert.deepStrictEqual(view(stateA,void(0)),defaultState); + }); + + it('should successfully sort the manage view',() => { + const stateA = {...defaultState}; + const action = { + type:CHANGE_VIEW, + workouts, + view:'manage' + }; + + const stateB = { + ...defaultState, + view:"manage", + data: [ + { + "back": false, + "cardio": false, + "core": false, + "last_done": "2020-07-01", + "lower": false, + "martial": false, + "name": "workout1", + "other": false, + "times_done": 1, + "upper": false + }, + { + "back": false, + "cardio": false, + "core": false, + "last_done": "2020-06-06", + "lower": false, + "martial": false, + "name": "workout2", + "other": false, + "times_done": 1, + "upper": false + }, + { + "back": false, + "cardio": false, + "core": false, + "last_done": "2020-06-04", + "lower": false, + "martial": false, + "name": "apple", + "other": false, + "times_done": 1, + "upper": false + }, + { + "back": false, + "cardio": false, + "core": false, + "last_done": "2020-07-01", + "lower": false, + "martial": false, + "name": "hello", + "other": false, + "times_done": 1, + "upper": false + } + ], + sortKey: ['last_done'], + sortOrder: ['desc'] + }; + assert.deepStrictEqual(view(stateA,action),stateB); + + const action2 = { + type:SORT_VIEW, + key:'name' + }; + const stateC = { + ...defaultState, + view:"manage", + data: [ + { + "back": false, + "cardio": false, + "core": false, + "last_done": "2020-06-04", + "lower": false, + "martial": false, + "name": "apple", + "other": false, + "times_done": 1, + "upper": false + }, + { + "back": false, + "cardio": false, + "core": false, + "last_done": "2020-07-01", + "lower": false, + "martial": false, + "name": "hello", + "other": false, + "times_done": 1, + "upper": false + }, + { + "back": false, + "cardio": false, + "core": false, + "last_done": "2020-07-01", + "lower": false, + "martial": false, + "name": "workout1", + "other": false, + "times_done": 1, + "upper": false + }, + { + "back": false, + "cardio": false, + "core": false, + "last_done": "2020-06-06", + "lower": false, + "martial": false, + "name": "workout2", + "other": false, + "times_done": 1, + "upper": false + } + ], + sortKey: ['name'], + sortOrder: ['asc'] + }; + + assert.deepStrictEqual(view(stateB,action2),stateC); + }); + + it('should successfully sort the recent view',() => { + const stateA = {...defaultState}; + const action = { + type:CHANGE_VIEW, + workouts, + view:"recent" + }; + + const stateB = { + ...defaultState, + view:"recent", + data: [ + { + date:'2020-07-01', + name:'workout1' + }, + { + date:'2020-06-06', + name:'workout2' + }, + { + date:'2020-06-04', + name:'apple' + }, + { + date:'2020-07-01', + name:'hello' + } + ] + }; + assert.deepStrictEqual(view(stateA,action),stateB); + + const action2 = { + type:SORT_VIEW, + key:'name' + }; + + const stateC = { + ...defaultState, + view:"recent", + data: [ + { + date:'2020-06-04', + name:'apple' + }, + { + date:'2020-07-01', + name:'hello' + }, + { + date:'2020-07-01', + name:'workout1' + }, + { + date:'2020-06-06', + name:'workout2' + } + ], + sortKey: ['name'], + sortOrder: ['asc'] + }; + + assert.deepStrictEqual(view(stateB,action2),stateC); + }); + + }); + +}); \ No newline at end of file diff --git a/gui/test/workout.tests.js b/gui/test/workout.tests.js new file mode 100644 index 0000000..5453335 --- /dev/null +++ b/gui/test/workout.tests.js @@ -0,0 +1,95 @@ +const assert = require('assert'); + +const workout = require('../src/classes/workout.js').default; + +const {constants} = require('../src/constants.js'); +const {DEFAULT_ATTRIBUTES} = constants; + +describe('workout object tests', () => { + + it('should successfully create', () => { + assert.doesNotThrow(() => new workout()); + }); + + it('should successfully add dates', () => { + const obj = new workout(); + assert.throws(() => obj.add()); + assert.doesNotThrow(() => obj.add(['2020-07-01'])); + }); + + it('should successfully output the last time the workout was completed',() => { + const obj = new workout(); + assert.strictEqual(obj.last_done,""); + obj.add(['2020-07-01']); + assert.strictEqual(obj.last_done,'2020-07-01'); + }); + + it('should successfully remove dates', () => { + const obj = new workout(); + obj.add(['2020-07-01']); + assert.deepStrictEqual(obj.dates,['2020-07-01']); + obj.remove('2020-07-01'); + assert.deepStrictEqual(obj.dates,[]); + }); + + it('should successfully change the name', () => { + const obj = new workout(); + assert.strictEqual(obj.name,'New Workout'); + assert.throws(() => { obj.name = 1; }); + assert.doesNotThrow(() => { obj.name = 'workout1'; }); + assert.strictEqual(obj.name,'workout1'); + }); + + it('should successfully change an attribute', () => { + const obj = new workout(); + assert.deepStrictEqual(obj.attributes,DEFAULT_ATTRIBUTES); + assert.doesNotThrow(() => obj.toggleAttribute('lower')); + assert.deepStrictEqual(obj.attributes,{...DEFAULT_ATTRIBUTES,lower:true}); + }); + + it('should compare two objects appropriately', () => { + const obj = new workout(); + const obj2 = new workout({ + attributes:{lower:true,upper:false}, + dates:['2020-07-01','2020-08-01'], + name:'workout1' + }); + const obj3 = new workout(); + const obj4 = new workout({ + attributes:{lower:true,upper:true}, + dates:['2020-07-01','2020-08-01'], + name:'workout1' + }); + const obj5 = new workout({ + attributes:{lower:true,upper:false}, + dates:['2020-07-01','2020-08-01', '2020-09-01'], + name:'workout1' + }); + const obj6 = new workout({ + attributes:{lower:true,upper:false}, + dates:['2020-07-01','2020-08-01'], + name:'workout2' + }); + + assert.strictEqual(obj.equals(obj2),false); + assert.strictEqual(obj.equals(obj3),true); + assert.strictEqual(obj.equals(obj4),false); + assert.strictEqual(obj.equals(obj5),false); + assert.strictEqual(obj.equals(obj6),false); + + assert.strictEqual(obj2.equals(obj3),false); + assert.strictEqual(obj2.equals(obj4),false); + assert.strictEqual(obj2.equals(obj5),false); + assert.strictEqual(obj2.equals(obj6),false); + + assert.strictEqual(obj3.equals(obj4),false); + assert.strictEqual(obj3.equals(obj5),false); + assert.strictEqual(obj3.equals(obj6),false); + + assert.strictEqual(obj4.equals(obj5),false); + assert.strictEqual(obj4.equals(obj6),false); + + assert.strictEqual(obj5.equals(obj6),false); + }); + +}); \ No newline at end of file diff --git a/gui/test/workouts.reducer.tests.js b/gui/test/workouts.reducer.tests.js new file mode 100644 index 0000000..9702a32 --- /dev/null +++ b/gui/test/workouts.reducer.tests.js @@ -0,0 +1,421 @@ +const assert = require('assert'); + +const workouts = require('../src/reducers/workouts.js').default; + +const workout = require('../src/classes/workout.js').default; + +const {constants} = require('../src/constants.js'); +const { + ADD_WORKOUT, + CHANGE_ATTRIBUTE, + CHANGE_WORKOUT_DATE, + CHANGE_WORKOUT_NAME, + DEFAULT_ATTRIBUTES, + DELETE_WORKOUT, + NEW_WORKOUT, + REMOVE_WORKOUT +} = constants; + +describe('workouts reducer',() => { + + const now = new Date(); + let today = new Date(now.getTime() - (now.getTimezoneOffset() * 60000 )); + let yesterday = new Date(today.getTime()); + today = today.toISOString().split("T")[0]; + yesterday.setDate(yesterday.getDate() - 1); + yesterday = yesterday.toISOString().split("T")[0]; + + describe(ADD_WORKOUT,() => { + + it('should not change the state when invalid action is given',() => { + assert.deepStrictEqual(workouts("haha"),"haha"); + }); + + it('should fail to add to a non-existent workout',() => { + const stateA = { + "workout1":new workout({ + attributes:DEFAULT_ATTRIBUTES, + dates:[], + name:'workout1' + }) + }; + const action = { + type:ADD_WORKOUT, + name:'workout1' + }; + + assert.deepStrictEqual(workouts(stateA,action),stateA); + }); + + it('should successfully add a workout to an already existing workout',() => { + const stateA = { + "workout1":new workout({ + attributes:{...DEFAULT_ATTRIBUTES}, + dates:[], + name:'workout1' + }) + }; + const action = { + type:ADD_WORKOUT, + name:'workout1', + toAdd:today + }; + + const stateB = { + "workout1":new workout({ + attributes:{...DEFAULT_ATTRIBUTES}, + dates:[today], + name:'workout1' + }) + }; + + assert.deepStrictEqual(workouts(stateA,action),stateB); + }); + + }); + + describe(CHANGE_ATTRIBUTE,() => { + + it('should not change the state when an invalid action is given',() => { + const action = { + type:CHANGE_ATTRIBUTE + }; + assert.deepStrictEqual(workouts("haha",action),"haha"); + }); + + it('should not change the state when trying to change an attribute for a nonexistent workout',() => { + const stateA = { + "workout1":new workout({ + attributes:{...DEFAULT_ATTRIBUTES}, + dates:[], + name:'workout1' + }) + }; + const action = { + type:CHANGE_ATTRIBUTE, + workout:'workout2' + }; + + assert.deepStrictEqual(workouts(stateA,action),stateA); + + }); + + it('should successfully change the attribute of an already existing workout',() => { + const stateA = { + "workout1":new workout({ + attributes:{...DEFAULT_ATTRIBUTES}, + dates:[], + name:'workout1' + }) + }; + const action = { + type:CHANGE_ATTRIBUTE, + workout:'workout1', + attribute:"lower" + }; + + const stateB = { + "workout1":new workout({ + attributes:{ + ...DEFAULT_ATTRIBUTES, + "lower":true + }, + dates:[], + name:'workout1' + }) + }; + + assert.deepStrictEqual(workouts(stateA,action),stateB); + }); + + }); + + describe(CHANGE_WORKOUT_DATE,() => { + + it('should not change the state when an invalid action is given',() => { + const action = { + type:CHANGE_WORKOUT_DATE + }; + assert.deepStrictEqual(workouts("haha",action),"haha"); + }); + + it('should not change the state when old and new are the same',() => { + const action = { + type:CHANGE_WORKOUT_DATE, + old:-1, + new:-1 + }; + assert.deepStrictEqual(workouts("haha",action),"haha"); + }); + + it('should successfully change the date of a workout',() => { + + const stateA = { + "workout1":new workout({ + attributes:{...DEFAULT_ATTRIBUTES}, + dates:[today], + name:'workout1' + }) + }; + const action = { + type:CHANGE_WORKOUT_DATE, + workout:'workout1', + old:today, + new:yesterday + }; + + const stateB = { + "workout1":new workout({ + attributes:{...DEFAULT_ATTRIBUTES}, + dates:[yesterday], + name:'workout1' + }) + }; + + assert.deepStrictEqual(workouts(stateA,action),stateB); + }); + + }); + + describe(CHANGE_WORKOUT_NAME,() => { + + it('should not change the state when an invalid action is given',() => { + const action = { + type:CHANGE_WORKOUT_NAME + }; + assert.deepStrictEqual(workouts("haha",action),"haha"); + }); + + it('should not change the state when trying to change the name for a nonexistent workout',() => { + const stateA = { + "workout1":new workout({ + attributes:{...DEFAULT_ATTRIBUTES}, + dates:[], + name:'workout1' + }) + }; + const action = { + type:CHANGE_WORKOUT_NAME, + workout:"workout2" + }; + assert.deepStrictEqual(workouts("haha",action),"haha"); + }); + + it('should fail to change the name of a workout to an already existing workout',() => { + const stateA = { + "workout1":new workout({ + attributes:{...DEFAULT_ATTRIBUTES}, + dates:[], + name:'workout1' + }), + "workout2":new workout({ + attributes:{...DEFAULT_ATTRIBUTES}, + dates:[], + name:'workout2' + }) + }; + const action = { + type:CHANGE_WORKOUT_NAME, + workout:"workout1", + name:"workout2" + }; + assert.deepStrictEqual(workouts("haha",action),"haha"); + }); + + it('should successfully change the name of an already existing workout',() => { + const stateA = { + "workout1":new workout({ + attributes:{...DEFAULT_ATTRIBUTES}, + dates:[], + name:'workout1' + }), + "workout2":new workout({ + attributes:{...DEFAULT_ATTRIBUTES}, + dates:[], + name:'workout2' + }) + }; + const action = { + type:CHANGE_WORKOUT_NAME, + workout:"workout1", + name:"workout3" + }; + + const stateB = { + "workout3":new workout({ + attributes:{...DEFAULT_ATTRIBUTES}, + dates:[], + name:'workout3' + }), + "workout2":new workout({ + attributes:{...DEFAULT_ATTRIBUTES}, + dates:[], + name:'workout2' + }) + }; + + assert.deepStrictEqual(workouts(stateA,action),stateB); + }); + + }); + + describe(DELETE_WORKOUT,() => { + + it('should not change the state when an invalid action is given',() => { + const action = { + type:DELETE_WORKOUT + }; + assert.deepStrictEqual(workouts("haha",action),"haha"); + }); + + it('should not change the state when action.name refers to a nonexistent workout',() => { + const stateA = { + "workout1":new workout({ + attributes:{...DEFAULT_ATTRIBUTES}, + dates:[today], + name:'workout1' + }), + "workout2":new workout({ + attributes:{...DEFAULT_ATTRIBUTES}, + dates:[], + name:'workout2' + }) + }; + const action = { + type:DELETE_WORKOUT, + name:"workout3" + }; + assert.deepStrictEqual(workouts("haha",action),"haha"); + }); + + it('should successfully delete a workout from an existent workout',() => { + const stateA = { + "workout1":new workout({ + attributes:{...DEFAULT_ATTRIBUTES}, + dates:[today], + name:'workout1' + }), + "workout2":new workout({ + attributes:{...DEFAULT_ATTRIBUTES}, + dates:[], + name:'workout2' + }) + }; + const action = { + type:DELETE_WORKOUT, + name:"workout1", + toDel:today + }; + + const stateB = { + "workout1":new workout({ + attributes:{...DEFAULT_ATTRIBUTES}, + dates:[], + name:'workout1' + }), + "workout2":new workout({ + attributes:{...DEFAULT_ATTRIBUTES}, + dates:[], + name:'workout2' + }) + }; + assert.deepStrictEqual(workouts(stateA,action),stateB); + }); + + }); + + describe(NEW_WORKOUT,() => { + + it('should not change the state when "New Workout" workout already exists',() => { + const stateA = { + "New Workout":new workout({ + attributes:{...DEFAULT_ATTRIBUTES}, + dates:[], + name:'New Workout' + }) + }; + + const action = { + type:NEW_WORKOUT + }; + assert.deepStrictEqual(workouts(stateA,action),stateA); + }); + + it('should successfully add a new generic workout',() => { + const stateB = { + "New Workout":new workout({ + attributes:{...DEFAULT_ATTRIBUTES}, + dates:[], + name:'New Workout' + }) + }; + + const action = { + type:NEW_WORKOUT + }; + assert.deepStrictEqual(workouts({},action),stateB); + }); + + it('should successfully add a new workout',() => { + const stateB = { + "hello workout":new workout({ + attributes:{...DEFAULT_ATTRIBUTES,lower:true}, + dates:['2020-01-01'], + name:'hello workout' + }) + }; + + const action = { + type:NEW_WORKOUT, + toAdd:new workout({ + attributes:{...DEFAULT_ATTRIBUTES,lower:true}, + dates:['2020-01-01'], + name:'hello workout' + }) + }; + assert.deepStrictEqual(workouts({},action),stateB); + }); + }); + + describe(REMOVE_WORKOUT,() => { + + it('should not change the state when an invalid action is given',() => { + const action = { + type:REMOVE_WORKOUT + }; + assert.deepStrictEqual(workouts("haha",action),"haha"); + }); + + it('should fail when action.toRemove refers to a nonexistent workout',() => { + const stateA = { + "workout1":new workout({ + attributes:{...DEFAULT_ATTRIBUTES}, + dates:[], + name:'workout1' + }) + }; + const action = { + type:REMOVE_WORKOUT, + toRemove:'workout2' + }; + assert.deepStrictEqual(workouts(stateA,action),stateA); + }); + + it('should successfully remove a workout',() => { + const stateA = { + "workout1":new workout({ + attributes:{...DEFAULT_ATTRIBUTES}, + dates:[], + name:'workout1' + }) + }; + const action = { + type:REMOVE_WORKOUT, + toRemove:'workout1' + }; + assert.deepStrictEqual(workouts(stateA,action),{}); + }); + + }); + +}); \ No newline at end of file diff --git a/webpack.config.js b/gui/webpack.config.js similarity index 87% rename from webpack.config.js rename to gui/webpack.config.js index 55d328c..62b926d 100644 --- a/webpack.config.js +++ b/gui/webpack.config.js @@ -34,5 +34,9 @@ module.exports = { path.resolve('./src'), path.resolve('./node_modules') ] + }, + output: { + filename: 'workouts.js', + path: path.resolve(__dirname,'./') } }; \ No newline at end of file diff --git a/webpack.dev.config.js b/gui/webpack.dev.config.js similarity index 62% rename from webpack.dev.config.js rename to gui/webpack.dev.config.js index 9e3ff06..6ee8a0a 100644 --- a/webpack.dev.config.js +++ b/gui/webpack.dev.config.js @@ -1,5 +1,5 @@ const path = require('path'); -const merge = require('webpack-merge'); +const {merge} = require('webpack-merge'); const baseConfig = require('./webpack.config.js'); module.exports = merge(baseConfig,{ @@ -7,9 +7,5 @@ module.exports = merge(baseConfig,{ devtool: 'inline-source-map', devServer: { contentBase: './' - }, - output: { - filename: 'workouts.js', - path: path.resolve(__dirname,'./') } }); \ No newline at end of file diff --git a/gui/webpack.prod.config.js b/gui/webpack.prod.config.js new file mode 100644 index 0000000..df09550 --- /dev/null +++ b/gui/webpack.prod.config.js @@ -0,0 +1,7 @@ +const path = require('path'); +const {merge} = require('webpack-merge'); +const baseConfig = require('./webpack.config.js'); + +module.exports = merge(baseConfig,{ + mode:'production' +}); \ No newline at end of file diff --git a/gui/workouts.json b/gui/workouts.json new file mode 100644 index 0000000..0feb110 --- /dev/null +++ b/gui/workouts.json @@ -0,0 +1 @@ +{"P90X - Ab Ripper":{"attributes":{"lower":false,"core":true,"back":false,"upper":false,"cardio":false,"martial":false,"other":false},"dates":["2020-03-20","2019-11-29","2019-10-12","2019-09-08","2019-08-09","2019-06-18","2019-04-19","2019-03-15","2019-03-07","2019-02-14","2019-01-31","2018-11-14","2018-10-04","2018-07-23","2018-05-17","2018-03-07","2017-12-18","2017-09-25","2017-08-29","2017-06-27","2017-03-21","2017-02-14","2017-01-27","2016-11-11","2016-09-04","2016-04-29","2016-03-11","2016-02-05","2016-01-20","2015-12-04","2015-09-18","2015-08-14","2015-06-25","2015-05-04","2015-04-01","2015-03-19","2015-02-19","2015-01-22","2014-12-26","2014-11-25","2014-10-30","2014-06-28","2014-06-16","2014-05-25"],"name":"P90X - Ab Ripper"},"P90X - Back + Biceps":{"attributes":{"lower":false,"core":false,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"dates":[],"name":"P90X - Back + Biceps"},"P90X - Cardio X":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":true,"martial":true,"other":false},"dates":["2020-07-07","2020-06-14","2020-05-17","2020-03-10","2020-01-06","2019-10-25","2019-10-05","2019-09-07","2019-08-10","2019-06-29","2019-05-08","2019-04-28","2019-04-16","2019-03-21","2018-12-26","2018-12-14","2018-11-07","2018-10-10","2018-07-10","2018-06-05","2018-05-09","2018-04-24","2018-04-03","2018-01-27","2018-01-01","2017-11-14","2017-10-18","2017-09-17","2017-08-21","2017-07-03","2017-05-31","2017-04-27","2017-03-31","2017-03-13","2017-02-13","2017-01-30","2016-12-19","2016-11-28","2016-11-04","2016-10-21","2016-09-27","2016-09-09","2016-08-22","2016-07-29","2016-06-27","2016-06-04","2016-05-04","2016-04-16","2016-04-08","2016-03-21","2016-03-02","2016-02-22","2016-02-08","2016-02-03","2016-01-12","2015-12-28","2015-12-09","2015-11-05","2015-10-12","2015-08-26","2015-08-10","2015-07-20","2015-06-29","2015-06-11","2015-06-08","2015-05-28","2015-04-02","2015-03-09","2015-02-17","2015-01-26","2015-01-09","2014-12-26","2014-12-17","2014-12-16","2014-12-09","2014-11-21","2014-10-27","2014-10-13","2014-10-05","2014-09-13","2014-07-07","2014-06-23","2014-05-28","2014-05-14"],"name":"P90X - Cardio X"},"P90X - Chest + Back":{"attributes":{"lower":false,"core":false,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"dates":[],"name":"P90X - Chest + Back"},"P90X - Chest + Shoulders + Triceps":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":false},"dates":["2017-06-17","2017-02-17","2016-09-01"],"name":"P90X - Chest + Shoulders + Triceps"},"P90X - Core Synergistics":{"attributes":{"lower":false,"core":true,"back":false,"upper":true,"cardio":false,"martial":false,"other":false},"dates":["2020-06-12","2020-04-02","2019-11-19","2019-07-21","2019-03-29","2018-10-15","2018-06-21","2018-04-26","2017-10-02","2017-05-12","2017-02-07","2016-10-25","2016-07-25","2016-04-27","2016-03-23","2016-02-18","2016-01-21","2015-12-15","2015-10-31","2015-08-25","2015-08-05","2015-06-30","2015-04-30","2015-03-23","2015-02-11","2015-01-23","2014-12-30","2014-11-19","2014-10-01","2014-07-31","2014-06-26"],"name":"P90X - Core Synergistics"},"P90X+ - Interval X+":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":true,"martial":false,"other":false},"dates":["2020-07-18","2020-06-11","2020-04-03","2019-10-03","2019-08-07","2019-04-18","2018-12-17","2018-10-17","2018-07-18","2018-06-09","2018-05-01","2018-02-14","2017-11-21","2017-10-12","2017-08-08","2017-06-06","2017-05-02","2017-03-20","2017-01-20","2016-11-30","2016-10-24","2016-09-22","2016-08-02","2016-06-09","2016-04-28","2016-03-24","2016-02-29","2016-01-18","2015-12-16","2015-10-28","2015-09-21","2015-08-07","2015-07-08","2015-06-03","2015-04-17","2015-03-16","2015-02-12","2015-01-16","2014-12-22","2014-11-13","2014-10-17","2014-10-02","2014-09-03","2014-07-28","2014-07-09","2014-06-25","2014-06-03","2014-05-12"],"name":"P90X+ - Interval X+"},"P90X+ - Kenpo Cardio X+":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":true,"martial":true,"other":false},"dates":["2020-06-25","2020-06-01","2020-04-24","2020-03-24","2019-12-01","2019-10-15","2019-08-27","2019-07-15","2019-06-08","2019-03-28","2019-02-15","2019-01-02","2018-11-29","2018-10-22","2018-08-07","2018-06-22","2018-05-18","2018-04-19","2018-01-16","2017-12-26","2017-12-05","2017-10-24","2017-09-20","2017-08-27","2017-07-21","2017-06-28","2017-05-18","2017-04-14","2017-02-22","2017-01-01","2016-12-08","2016-11-10","2016-10-13","2016-09-15","2016-08-30","2016-08-04","2016-07-03","2016-05-18","2016-04-25","2016-03-27","2016-03-09","2016-02-24","2016-01-27","2016-01-13","2015-12-21","2015-11-23","2015-10-23","2015-10-13","2015-09-11","2015-08-31","2015-08-12","2015-07-31","2015-07-06","2015-06-17","2015-06-01","2015-04-21","2015-03-24","2015-03-13","2015-02-10","2015-01-14","2014-11-18","2014-10-21","2014-09-18","2014-07-22","2014-06-10"],"name":"P90X+ - Kenpo Cardio X+"},"P90X - Kenpo X":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":true,"martial":true,"other":false},"dates":["2020-07-15","2020-06-17","2020-05-21","2020-04-07","2020-01-10","2019-11-13","2019-10-11","2019-09-17","2019-07-20","2019-06-19","2019-06-13","2019-03-12","2019-01-24","2018-11-17","2018-07-25","2018-06-15","2018-05-12","2018-01-04","2017-11-18","2017-09-30","2017-09-14","2017-08-02","2017-07-12","2017-06-11","2017-05-05","2017-04-06","2017-02-16","2017-01-26","2016-12-02","2016-11-01","2016-10-07","2016-09-13","2016-08-15","2016-07-14","2016-05-20","2016-05-02","2016-04-13","2016-03-17","2016-02-17","2016-01-22","2015-12-30","2015-12-08","2015-11-04","2015-10-16","2015-08-19","2015-07-27","2015-06-24","2015-05-29","2015-05-08","2015-04-06","2015-02-26","2015-01-21","2015-01-05","2014-12-02","2014-11-10","2014-10-07","2014-09-26","2014-08-28","2014-08-01","2014-07-18","2014-06-30","2014-06-17","2014-06-05","2014-05-22","2014-05-09"],"name":"P90X - Kenpo X"},"P90X - Legs + Back":{"attributes":{"lower":true,"core":false,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"dates":["2017-05-16","2017-03-21","2016-12-15","2016-09-11","2016-05-12"],"name":"P90X - Legs + Back"},"P90X - Plyometrics":{"attributes":{"lower":true,"core":false,"back":false,"upper":false,"cardio":true,"martial":false,"other":false},"dates":["2020-04-20","2019-08-14","2019-03-25","2018-09-10","2018-05-24","2017-12-01","2017-10-09","2017-07-10","2017-06-03","2017-04-18","2017-02-24","2017-01-03","2016-09-26","2016-09-02","2016-05-16","2016-04-18","2016-03-15","2016-02-10","2015-12-29","2015-11-02","2015-10-14","2015-09-15","2015-07-14","2015-06-22","2015-05-06","2015-03-26","2015-02-18","2015-01-29","2015-01-07","2014-11-20","2014-10-28","2014-10-15","2014-09-19","2014-08-05","2014-06-16"],"name":"P90X - Plyometrics"},"P90X - Shoulders + Arms":{"attributes":{"lower":false,"core":false,"back":false,"upper":true,"cardio":false,"martial":false,"other":false},"dates":["2019-03-13","2017-05-15"],"name":"P90X - Shoulders + Arms"},"P90X - X Stretch":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"dates":["2020-07-17","2020-07-11","2020-07-07","2020-07-02","2020-06-28","2020-06-16","2020-06-08","2020-05-31","2020-05-27","2020-05-18","2020-05-01","2020-04-16","2020-04-08","2020-04-04","2020-03-30","2020-03-25","2020-03-20","2020-02-08","2020-01-16","2020-01-06","2019-12-16","2019-12-15","2019-12-09","2019-12-07","2019-12-03","2019-11-27","2019-11-21","2019-11-19","2019-11-14","2019-11-09","2019-11-05","2019-10-10","2019-10-08","2019-10-04","2019-09-30","2019-09-26","2019-09-24","2019-09-16","2019-09-10","2019-09-05","2019-08-31","2019-08-29","2019-08-26","2019-08-19","2019-08-13","2019-08-07","2019-07-29","2019-07-26","2019-07-23","2019-07-17","2019-07-15","2019-07-11","2019-07-08","2019-06-26","2019-06-24","2019-06-20","2019-06-11","2019-06-09","2019-06-06","2019-06-04","2019-05-08","2019-05-06","2019-05-04","2019-04-29","2019-04-17","2019-04-16","2019-04-07","2019-04-03","2019-03-31","2019-03-29","2019-03-26","2019-03-24","2019-03-18","2019-03-12","2019-03-06","2019-02-14","2019-01-01","2018-12-07","2018-12-03","2018-11-29","2018-11-14","2018-11-06","2018-10-22","2018-10-15","2018-10-06","2018-10-03","2018-10-01","2018-09-27","2018-09-18","2018-09-13","2018-09-08","2018-09-04","2018-08-16","2018-08-09","2018-07-25","2018-07-17","2018-07-07","2018-06-27","2018-06-19","2018-06-13","2018-06-10","2018-06-04","2018-05-23","2018-05-15","2018-04-25","2018-04-18","2018-04-06","2018-03-20","2018-02-19","2018-02-17","2018-02-12","2018-02-07","2018-02-02","2018-01-31","2018-01-29","2018-01-23","2018-01-18","2018-01-12","2018-01-08","2018-01-03","2017-12-30","2017-12-27","2017-12-19","2017-12-12","2017-11-30","2017-11-27","2017-11-18","2017-11-14","2017-11-12","2017-10-30","2017-10-08","2017-10-03","2017-09-29","2017-09-27","2017-09-22","2017-09-20","2017-09-18","2017-09-14","2017-09-11","2017-09-07","2017-08-28","2017-08-25","2017-08-22","2017-08-15","2017-08-06","2017-07-22","2017-07-20","2017-07-19","2017-07-15","2017-07-12","2017-07-09","2017-07-06","2017-06-30","2017-06-22","2017-06-19","2017-06-15","2017-06-11","2017-06-07","2017-05-28","2017-05-26","2017-05-23","2017-05-16","2017-05-11","2017-05-09","2017-05-01","2017-04-27","2017-04-24","2017-04-21","2017-04-19","2017-04-17","2017-04-11","2017-04-07","2017-04-04","2017-03-29","2017-03-27","2017-03-22","2017-03-17","2017-02-27","2017-02-21","2017-02-09","2017-01-23","2017-01-17","2017-01-12","2017-01-04","2016-12-31","2016-12-13","2016-12-08","2016-12-05","2016-11-30","2016-11-23","2016-11-15","2016-11-10","2016-11-07","2016-11-02","2016-10-25","2016-10-19","2016-10-14","2016-10-12","2016-10-07","2016-10-05","2016-10-03","2016-09-29","2016-09-27","2016-09-22","2016-09-20","2016-09-15","2016-09-13","2016-09-07","2016-09-02","2016-08-30","2016-08-26","2016-08-23","2016-08-16","2016-08-05","2016-08-03","2016-08-01","2016-07-29","2016-07-27","2016-07-25","2016-07-19","2016-07-14","2016-07-11","2016-07-01","2016-06-29","2016-06-24","2016-06-22","2016-06-20","2016-06-17","2016-06-14","2016-06-10","2016-06-08","2016-06-06","2016-06-03","2016-06-01","2016-05-24","2016-05-23","2016-05-21","2016-05-18","2016-05-17","2016-05-16","2016-05-13","2016-05-12","2016-05-10","2016-05-09","2016-05-05","2016-05-04","2016-04-28","2016-04-26","2016-04-21","2016-04-14","2016-04-12","2016-04-11","2016-04-06","2016-03-31","2016-03-29","2016-03-23","2016-03-22","2016-03-21","2016-03-17","2016-03-16","2016-03-15","2016-03-14","2016-03-10","2016-03-03","2016-03-01","2016-02-28","2016-02-25","2016-02-23","2016-02-18","2016-02-11","2016-02-10","2016-02-02","2016-01-28","2016-01-26","2016-01-21","2016-01-20","2016-01-19","2016-01-14","2016-01-13","2016-01-12","2016-01-08","2016-01-05","2015-12-29","2015-12-23","2015-12-22","2015-12-17","2015-12-16","2015-12-15","2015-12-10","2015-12-08","2015-12-03","2015-12-02","2015-11-28","2015-11-23","2015-11-05","2015-11-04","2015-11-02","2015-10-21","2015-10-20","2015-10-19","2015-10-15","2015-10-14","2015-10-13","2015-10-06","2015-10-05","2015-10-02","2015-09-16","2015-09-10","2015-08-30","2015-08-27","2015-08-25","2015-08-20","2015-08-18","2015-08-14","2015-08-11","2015-08-09","2015-08-04","2015-07-30","2015-07-28","2015-07-25","2015-07-14","2015-07-12","2015-07-09","2015-07-07","2015-07-02","2015-06-30","2015-06-27","2015-06-23","2015-06-20","2015-06-18","2015-06-16","2015-06-12","2015-06-10","2015-06-04","2015-06-02","2015-05-31","2015-05-29","2015-05-20","2015-05-18","2015-05-15","2015-05-13","2015-05-11","2015-05-08","2015-05-06","2015-05-05","2015-05-01","2015-04-30","2015-04-29","2015-04-27","2015-04-24","2015-04-23","2015-04-22","2015-04-21","2015-04-20","2015-04-17","2015-04-16","2015-04-15","2015-04-14","2015-04-13","2015-04-10","2015-04-09","2015-04-08","2015-04-07","2015-04-06","2015-04-05","2015-04-03","2015-04-02","2015-04-01","2015-03-31","2015-03-28","2015-03-26","2015-03-25","2015-03-17","2015-03-16","2015-03-15","2015-03-12","2015-03-11","2015-03-05","2015-03-01","2015-02-18","2015-02-16","2015-02-12","2015-02-11","2015-02-05","2015-02-04","2015-01-29","2015-01-28","2015-01-26","2015-01-21","2015-01-20","2015-01-15","2015-01-13","2015-01-10","2015-01-08","2015-01-06","2014-12-31","2014-12-24","2014-12-22","2014-12-17","2014-12-15","2014-12-09","2014-12-04","2014-12-03","2014-12-01","2014-11-25","2014-11-21","2014-11-20","2014-11-19","2014-11-17","2014-11-15","2014-11-14","2014-11-12","2014-11-10","2014-11-06","2014-11-04","2014-11-01","2014-10-29","2014-10-27","2014-10-22","2014-10-21","2014-10-16","2014-10-14","2014-10-09","2014-10-07","2014-10-02","2014-09-29","2014-09-28","2014-09-24","2014-09-17","2014-09-16","2014-09-11","2014-09-06","2014-09-02","2014-08-28","2014-08-26","2014-08-19","2014-08-12","2014-08-08","2014-08-05","2014-07-31","2014-07-29","2014-07-25","2014-07-22","2014-07-17","2014-07-10","2014-07-08","2014-07-04","2014-07-01","2014-06-26","2014-06-24","2014-06-19","2014-06-17","2014-06-10","2014-06-05","2014-06-02","2014-05-29","2014-05-26","2014-05-22","2014-05-13","2014-05-08","2014-05-06"],"name":"P90X - X Stretch"},"P90X - Yoga X":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"dates":["2020-06-10","2020-04-14","2020-01-20","2019-11-23","2019-10-07","2019-09-24","2019-07-27","2019-04-22","2019-02-21","2018-10-18","2018-04-17","2018-03-16","2017-11-11","2017-09-09","2017-08-05","2017-05-30","2017-05-06","2017-03-28","2017-02-06","2016-12-27","2016-11-21","2016-11-09","2016-10-18","2016-08-18"],"name":"P90X - Yoga X"},"P90X2 - Base and Back":{"attributes":{"lower":true,"core":false,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"dates":["2019-11-22","2019-08-06","2019-02-01","2018-11-06","2018-01-30","2017-10-26","2017-07-24","2017-04-29","2017-02-09","2016-11-07","2016-07-26","2016-04-26","2016-03-22","2016-02-04","2015-11-03","2015-08-24","2015-07-09","2015-05-14","2015-03-31","2015-02-03","2015-01-01","2014-11-12","2014-10-16","2014-09-07","2014-08-11","2014-07-03","2014-06-12"],"name":"P90X2 - Base and Back"},"P90X2 - Chest Back Balance":{"attributes":{"lower":false,"core":true,"back":true,"upper":false,"cardio":false,"martial":false,"other":false},"dates":[],"name":"P90X2 - Chest Back Balance"},"P90X2 - P.A.P. Lower":{"attributes":{"lower":true,"core":false,"back":false,"upper":false,"cardio":true,"martial":false,"other":false},"dates":["2020-01-13","2019-07-17","2019-02-20","2018-07-12","2017-08-15","2017-05-28","2017-04-11","2017-01-17","2016-10-11","2016-06-13","2016-04-11","2016-03-01","2016-01-26","2015-12-02","2015-10-20","2015-09-17","2015-07-21","2015-06-16","2015-04-28","2015-03-12","2015-02-05","2015-01-08","2014-12-04","2014-11-03","2014-10-03","2014-08-29","2014-06-24"],"name":"P90X2 - P.A.P. Lower"},"P90X2 - P.A.P. Upper":{"attributes":{"lower":false,"core":false,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"dates":["2019-09-25","2019-04-23","2018-02-05","2017-09-11","2017-04-17","2017-01-12","2016-12-05","2016-10-12","2016-09-20","2016-05-09","2016-04-12","2016-03-03","2016-01-28","2015-12-10","2015-10-21","2015-08-13","2015-06-23","2015-04-15","2015-03-17","2015-01-28","2014-12-15","2014-10-29","2014-10-09","2014-07-24","2014-06-18","2014-05-07"],"name":"P90X2 - P.A.P. Upper"},"P90X2 - Plyocide":{"attributes":{"lower":true,"core":false,"back":true,"upper":false,"cardio":true,"martial":false,"other":false},"dates":["2020-06-15","2020-03-28","2019-12-10","2019-11-18","2019-08-26","2019-04-29","2019-03-08","2018-12-03","2018-09-20","2018-06-25","2018-05-13","2018-02-17","2017-11-28","2017-10-03","2017-09-08","2017-06-09","2017-05-11","2017-04-24","2017-03-23","2017-02-01","2016-12-20","2016-10-26","2016-09-30","2016-07-24","2016-05-06","2016-04-21","2016-03-29","2016-03-10","2016-02-15","2016-01-06","2015-12-17","2015-11-25","2015-10-15","2015-09-10","2015-08-27","2015-08-11","2015-07-29","2015-06-26","2015-06-04","2015-05-20","2015-04-14","2015-03-10","2015-02-25","2015-02-09","2015-01-12","2014-12-19","2014-11-24","2014-11-14","2014-10-22","2014-10-08","2014-09-30","2014-09-16","2014-08-26","2014-08-07","2014-07-30","2014-07-15","2014-06-20","2014-05-21","2014-05-08"],"name":"P90X2 - Plyocide"},"P90X2 - X2 Ab Ripper":{"attributes":{"lower":false,"core":true,"back":false,"upper":false,"cardio":false,"martial":false,"other":false},"dates":["2020-06-16","2020-05-02","2020-01-15","2019-10-23","2019-08-19","2019-07-12","2019-06-30","2019-05-05","2019-04-10","2018-10-13","2018-08-09","2018-07-07","2018-03-15","2017-11-07","2017-09-12","2017-07-18","2017-04-20","2016-12-06","2016-05-15","2016-04-22","2016-03-04","2016-01-29","2015-12-18","2015-11-05","2015-08-28","2015-07-10","2015-05-14","2015-05-09","2015-04-12","2015-03-29","2015-02-08","2015-01-05","2014-11-15","2014-10-20","2014-09-25","2014-09-14","2014-09-07","2014-08-11","2014-07-28","2014-06-23","2014-06-08","2014-05-20"],"name":"P90X2 - X2 Ab Ripper"},"P90X2 - X2 Balance and Power":{"attributes":{"lower":true,"core":true,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"dates":["2020-07-19","2020-05-22","2020-03-19","2019-09-16","2019-04-05","2018-11-18","2018-07-17","2018-05-31","2017-11-29","2017-09-21","2017-05-25","2017-02-21","2016-12-01","2016-08-31","2016-05-03","2016-03-25","2016-02-25","2016-01-19","2015-12-07","2015-10-27","2015-08-18","2015-07-07","2015-06-09","2015-04-08","2015-02-16","2015-01-19","2014-11-17","2014-10-06","2014-09-02","2014-07-17","2014-06-09"],"name":"P90X2 - X2 Balance and Power"},"P90X2 - X2 Core":{"attributes":{"lower":false,"core":true,"back":false,"upper":true,"cardio":false,"martial":false,"other":false},"dates":["2020-07-03","2020-04-09","2020-01-09","2019-11-14","2019-06-25","2019-03-23","2018-11-30","2018-09-19","2018-06-11","2018-02-19","2017-10-05","2017-06-08","2017-04-23","2017-01-31","2016-11-03","2016-07-31","2016-05-05","2016-03-30","2016-03-14","2016-02-02","2016-01-14","2015-12-22","2015-11-24","2015-10-19","2015-09-09","2015-08-20","2015-07-30","2015-07-02","2015-06-02","2015-05-12","2015-03-27","2015-03-02","2015-02-02","2015-01-13","2014-12-18","2014-11-29","2014-11-11","2014-11-05","2014-10-23","2014-10-15","2014-09-28","2014-09-15","2014-08-27","2014-08-17","2014-08-06","2014-07-21","2014-07-02","2014-06-13","2014-06-06","2014-05-23","2014-05-06"],"name":"P90X2 - X2 Core"},"P90X2 - X2 Recovery + Mobility/Foam Rolling Sessio":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"dates":["2020-07-15","2020-07-10","2020-07-06","2020-06-30","2020-06-26","2020-06-13","2020-06-01","2020-05-28","2020-05-14","2020-04-13","2020-04-02","2020-01-08","2019-12-11","2019-11-13","2019-08-28","2019-08-16","2019-06-12","2019-03-28","2019-03-05","2019-02-21","2018-11-01","2018-09-10","2018-07-28","2018-07-26","2018-02-20","2018-02-14","2018-02-04","2018-01-11","2018-01-07","2018-01-02","2017-12-18","2017-10-13","2017-10-07","2017-10-04","2017-09-13","2017-08-09","2017-08-01","2017-07-17","2017-07-14","2017-07-10","2017-07-05","2017-06-27","2017-06-16","2017-06-06","2017-06-01","2017-05-23","2017-05-17","2017-05-07","2017-04-28","2017-04-22","2017-04-16","2017-04-03","2017-03-18","2017-02-18","2017-02-04","2017-01-28","2016-12-12","2016-11-01","2016-10-17","2016-10-11","2016-09-23","2016-08-21","2016-06-16","2016-06-05"],"name":"P90X2 - X2 Recovery + Mobility/Foam Rolling Sessio"},"P90X2 - X2 Shoulders and Arms":{"attributes":{"lower":false,"core":false,"back":false,"upper":true,"cardio":false,"martial":false,"other":false},"dates":["2018-03-20"],"name":"P90X2 - X2 Shoulders and Arms"},"P90X2 - X2 Total Body":{"attributes":{"lower":false,"core":true,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"dates":["2019-12-02","2019-08-13","2019-03-20","2018-05-15","2017-11-15","2017-09-06","2017-07-13","2017-05-09","2017-01-19","2016-10-03","2016-07-05","2016-04-20","2016-03-16","2016-02-11","2016-01-04","2015-12-03","2015-09-16","2015-07-28","2015-06-18","2015-04-23","2015-03-11","2015-01-06","2014-12-01","2014-10-20","2014-09-17","2014-08-04","2014-07-08","2014-05-27"],"name":"P90X2 - X2 Total Body"},"P90X2 - X2 Yoga":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"dates":["2020-07-05","2020-05-24","2020-03-17","2020-01-14","2019-11-11","2019-10-01","2019-09-14","2019-08-11","2019-07-09","2019-06-16","2019-04-12","2019-04-02","2019-03-05","2019-01-18","2019-01-06","2018-11-20","2018-11-03","2018-09-12","2018-08-18","2018-06-01","2018-03-27","2018-01-15","2017-12-08","2017-11-08","2017-10-17","2017-09-23","2017-08-29","2017-07-18","2017-07-01","2017-05-21","2017-04-15","2017-04-08","2017-03-14","2017-01-18","2017-01-09","2016-12-14","2016-11-16","2016-10-31","2016-09-28","2016-09-08","2016-08-16","2016-08-07","2016-07-12","2016-06-20","2016-05-11","2016-04-19","2016-04-07","2016-03-28","2016-03-08","2016-02-23","2016-02-16","2016-02-01","2016-01-11","2016-01-05","2015-12-14","2015-11-30","2015-10-22","2015-09-08","2015-08-17","2015-08-06","2015-07-05","2015-05-30","2015-05-17","2015-04-19","2015-03-18","2015-03-03","2015-02-24","2015-02-06","2015-01-15","2014-12-29","2014-12-11","2014-12-10","2014-12-03","2014-11-22","2014-11-16","2014-11-11","2014-11-02","2014-10-24","2014-09-25","2014-08-24","2014-07-29","2014-06-29","2014-06-12","2014-05-30","2014-05-20"],"name":"P90X2 - X2 Yoga"},"Long Run + Roll":{"attributes":{"lower":true,"core":false,"back":true,"upper":false,"cardio":true,"martial":false,"other":false},"dates":["2020-07-11","2020-04-10","2020-03-15","2019-12-14","2019-11-28","2019-11-06","2019-10-23","2019-10-16","2019-09-29","2019-09-21","2019-09-02","2019-08-21","2019-07-28","2019-07-19","2019-07-13","2019-06-03","2019-04-24","2019-03-30","2019-02-23","2019-01-22","2019-01-17","2018-12-19","2018-12-12","2018-12-01","2018-11-22","2018-10-21","2018-10-14","2018-10-08","2018-09-27","2018-09-23","2018-09-11","2018-09-04","2018-08-01","2018-07-16","2018-07-08","2018-06-18","2018-02-20","2018-02-03","2018-01-13","2017-12-15","2017-11-24","2017-11-12","2017-11-06","2017-10-06","2017-09-12","2017-08-26","2017-08-18","2017-08-01","2017-07-22","2017-07-04","2017-06-26","2017-06-18","2016-07-04","2016-01-31","2015-07-04","2015-05-03","2015-04-11","2014-11-06","2014-07-12","2014-06-27","2014-06-04","2014-05-05"],"name":"Long Run + Roll"},"Short Run + Roll":{"attributes":{"lower":true,"core":false,"back":true,"upper":false,"cardio":true,"martial":false,"other":false},"dates":["2020-04-28","2019-07-11","2019-06-12","2019-03-22","2019-02-18","2019-02-13","2019-01-30","2019-01-14","2018-06-28","2015-07-01","2015-03-22","2015-01-30","2015-01-22","2014-12-25","2014-11-27","2014-10-25","2014-10-18","2014-10-11","2014-09-20","2014-08-19","2014-08-12","2014-08-10","2014-08-02","2014-07-24","2014-07-21","2014-07-19","2014-07-16","2014-07-07","2014-07-04","2014-06-30","2014-06-24","2014-06-22","2014-06-21","2014-06-18","2014-06-14","2014-06-13","2014-06-09","2014-06-07","2014-06-03","2014-05-31","2014-05-30","2014-05-29","2014-05-27","2014-05-24","2014-05-23","2014-05-12"],"name":"Short Run + Roll"},"Tai Chi":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"dates":["2020-07-20","2020-07-19","2020-07-18","2020-07-17","2020-07-15","2020-07-14","2020-07-13","2020-07-10","2020-07-09","2020-07-08","2020-07-07","2020-07-06","2020-07-04","2020-07-03","2020-07-02","2020-06-30","2020-06-29","2020-06-27","2020-06-25","2020-06-24","2020-06-23","2020-06-22","2020-06-17","2020-06-15","2020-06-14","2020-06-12","2020-06-11","2020-06-10","2020-06-09","2020-06-08","2020-06-07","2020-06-03","2020-06-01","2020-05-31","2020-05-30","2020-05-28","2020-05-27","2020-05-26","2020-05-24","2020-05-22","2020-05-21","2020-05-19","2020-05-18","2020-05-15","2020-05-14","2020-05-13","2020-05-12","2020-05-06","2020-05-05","2020-05-04","2020-05-01","2020-04-30","2020-04-29","2020-04-27","2020-04-24","2020-04-23","2020-04-22","2020-04-20","2020-04-17","2020-04-15","2020-04-14","2020-04-13","2020-04-12","2020-04-11","2020-04-10","2020-04-09","2020-04-08","2020-04-07","2020-04-04","2020-04-03","2020-04-02","2020-04-01","2020-03-31","2020-03-30","2020-03-29","2020-03-28","2020-03-27","2020-03-26","2020-03-25","2020-03-24","2020-03-23","2020-03-22","2020-03-21","2020-03-19","2020-03-18","2020-03-15","2020-03-14","2020-03-12","2020-02-19","2020-02-18","2020-02-17","2020-02-16","2020-02-14","2020-02-13","2020-02-03","2020-01-21","2020-01-20","2020-01-16","2020-01-15","2020-01-13","2020-01-11","2020-01-10","2020-01-09","2020-01-08","2020-01-07","2019-12-17","2019-12-14","2019-12-13","2019-12-12","2019-12-11","2019-12-10","2019-12-09","2019-12-08","2019-12-07","2019-12-06","2019-12-05","2019-12-04","2019-12-03","2019-12-02","2019-12-01","2019-11-30","2019-11-29","2019-11-28","2019-11-27","2019-11-26","2019-11-25","2019-11-24","2019-11-23","2019-11-22","2019-11-21","2019-11-20","2019-11-19","2019-11-18","2019-11-17","2019-11-15","2019-11-14","2019-11-13","2019-11-12","2019-11-11","2019-11-10","2019-11-09","2019-11-07","2019-11-06","2019-11-05","2019-10-28","2019-10-27","2019-10-25","2019-10-22","2019-10-21","2019-10-16","2019-10-15","2019-10-14","2019-10-13","2019-10-12","2019-10-10","2019-10-09","2019-10-08","2019-10-07","2019-10-06","2019-10-05","2019-10-04","2019-10-03","2019-10-02","2019-10-01","2019-09-29","2019-09-28","2019-09-27","2019-09-26","2019-09-25","2019-09-20","2019-09-18","2019-09-17","2019-09-16","2019-09-15","2019-09-14","2019-09-12","2019-09-11","2019-09-10","2019-09-08","2019-09-07","2019-09-06","2019-09-05","2019-09-01","2019-08-31","2019-08-26","2019-08-23","2019-08-22","2019-08-21","2019-08-20","2019-08-19","2019-08-18","2019-08-17","2019-08-16","2019-08-15","2019-08-14","2019-08-12","2019-08-10","2019-08-09","2019-08-07","2019-08-06","2019-08-05","2019-08-03","2019-07-31","2019-07-30","2019-07-29","2019-07-28","2019-07-27","2019-07-26","2019-07-25","2019-07-24","2019-07-23","2019-07-22","2019-07-21","2019-07-20","2019-07-19","2019-07-18","2019-07-17","2019-07-16","2019-07-15","2019-07-14","2019-07-13","2019-07-12","2019-07-11","2019-07-09","2019-07-08","2019-07-01","2019-06-30","2019-06-29","2019-06-27","2019-06-26","2019-06-25","2019-06-24","2019-06-23","2019-06-22","2019-06-21","2019-06-20","2019-06-19","2019-06-17","2019-06-14","2019-06-13","2019-06-10","2019-06-09","2019-06-07","2019-06-06","2019-06-05","2019-06-04","2019-06-03","2019-05-08","2019-05-07","2019-05-06","2019-05-05","2019-05-04","2019-05-03","2019-04-29","2019-04-28","2019-04-25","2019-04-23","2019-04-20","2019-04-19","2019-04-18","2019-04-17","2019-04-16","2019-04-15","2019-04-10","2019-04-09","2019-04-08","2019-04-07","2019-04-05","2019-04-04","2019-04-03","2019-04-01","2019-03-30","2019-03-29","2019-03-28","2019-03-27","2019-03-26","2019-03-25","2019-03-23","2019-03-21","2019-03-20","2019-03-19","2019-03-18","2019-03-15","2019-03-14","2019-03-13","2019-03-12","2019-03-11","2019-03-08","2019-03-07","2019-03-04","2019-03-01","2019-02-28","2019-02-27","2019-02-26","2019-02-25","2019-02-24","2019-02-20","2019-02-19","2019-02-17","2019-02-16","2019-02-15","2019-02-14","2019-02-13","2019-02-12","2019-01-25","2019-01-22","2019-01-21","2019-01-18","2019-01-02","2018-12-28","2018-12-21","2018-12-20","2018-12-19","2018-12-09","2018-12-07","2018-12-06","2018-12-05","2018-12-04","2018-12-03","2018-11-30","2018-11-29","2018-11-28","2018-11-27","2018-11-26","2018-11-25","2018-11-19","2018-11-18","2018-11-14","2018-11-13","2018-11-12","2018-11-09","2018-11-08","2018-11-07","2018-11-06","2018-11-05","2018-11-02","2018-11-01","2018-10-31","2018-10-30","2018-10-29","2018-10-26","2018-10-22","2018-10-17","2018-10-15","2018-10-12","2018-10-11","2018-10-10","2018-10-09","2018-10-08","2018-10-04","2018-09-27","2018-09-23","2018-09-20","2018-09-19","2018-09-18","2018-09-14","2018-09-13","2018-09-10","2018-09-05","2018-08-19","2018-08-09","2018-08-04","2018-08-03","2018-07-31","2018-07-30","2018-07-28","2018-07-27","2018-07-26","2018-07-25","2018-07-24","2018-07-23","2018-07-19","2018-07-18","2018-07-17","2018-07-16","2018-07-13","2018-07-12","2018-07-06","2018-06-29","2018-06-10","2018-05-22","2018-05-20","2018-05-16","2018-05-15","2018-05-13","2018-05-10","2018-05-09","2018-04-30","2018-04-27","2018-04-26","2018-04-21","2018-04-19","2018-04-16","2018-04-10","2018-04-06","2018-04-04","2018-04-03","2018-03-28","2018-03-27","2018-03-26","2018-03-20","2018-03-19","2018-03-16","2018-03-15","2018-03-14","2018-03-09","2018-02-20","2018-02-19","2018-02-18","2018-02-17","2018-02-16","2018-02-15","2018-02-14","2018-02-13","2018-02-09","2018-02-08","2018-02-07","2018-02-06","2018-02-05","2018-02-03","2018-02-02","2018-02-01","2018-01-31","2018-01-30","2018-01-29","2018-01-28","2018-01-27","2018-01-25","2018-01-24","2018-01-18","2018-01-17","2018-01-16","2018-01-14","2018-01-13","2018-01-12","2018-01-11","2018-01-10","2018-01-08","2018-01-07","2018-01-06","2018-01-05","2018-01-04","2018-01-03","2018-01-02","2018-01-01","2017-12-31","2017-12-30","2017-12-29","2017-12-28","2017-12-27","2017-12-21","2017-12-20","2017-12-19","2017-12-18","2017-12-17","2017-12-15","2017-12-14","2017-12-12","2017-12-11","2017-12-10","2017-12-09","2017-12-08","2017-12-06","2017-12-05","2017-12-04","2017-12-03","2017-12-01","2017-11-29","2017-11-28","2017-11-20","2017-11-18","2017-11-17","2017-11-16","2017-11-15","2017-11-14","2017-11-13","2017-11-12","2017-11-11","2017-11-10","2017-11-09","2017-11-08","2017-11-07","2017-11-06","2017-11-01","2017-10-31","2017-10-30","2017-10-26","2017-10-25","2017-10-24","2017-10-20","2017-10-19","2017-10-18","2017-10-17","2017-10-16","2017-10-14","2017-10-13","2017-10-12","2017-10-11","2017-10-10","2017-10-09","2017-10-08","2017-10-07","2017-10-05","2017-10-04","2017-10-03","2017-10-02","2017-09-30","2017-09-29","2017-09-28","2017-09-27","2017-09-26","2017-09-25","2017-09-23","2017-09-22","2017-09-21","2017-09-20","2017-09-19","2017-09-18","2017-09-17","2017-09-16","2017-09-15","2017-09-14","2017-09-13","2017-09-12","2017-09-11","2017-09-10","2017-09-09","2017-09-08","2017-09-07","2017-09-06","2017-09-05","2017-09-02","2017-08-31","2017-08-30","2017-08-29","2017-08-28","2017-08-27","2017-08-26","2017-08-25","2017-08-24","2017-08-23","2017-08-22","2017-08-21","2017-08-20","2017-08-18","2017-08-17","2017-08-16","2017-08-15","2017-08-14","2017-08-13","2017-08-09","2017-08-08","2017-08-07","2017-08-06","2017-08-05","2017-08-04","2017-08-03","2017-08-02","2017-08-01","2017-07-31","2017-07-24","2017-07-23","2017-07-22","2017-07-21","2017-07-20","2017-07-19","2017-07-18","2017-07-17","2017-07-16","2017-07-15","2017-07-14","2017-07-13","2017-07-12","2017-07-11","2017-07-10","2017-07-09","2017-07-07","2017-07-06","2017-07-05","2017-07-03","2017-07-02","2017-07-01","2017-06-30","2017-06-29","2017-06-28","2017-06-27","2017-06-25","2017-06-24","2017-06-23","2017-06-22","2017-06-21","2017-06-20","2017-06-19","2017-06-18","2017-06-17","2017-06-16","2017-06-15","2017-06-14","2017-06-12","2017-06-11","2017-06-10","2017-06-09","2017-06-08","2017-06-07","2017-06-06","2017-06-03","2017-06-02","2017-06-01","2017-05-31","2017-05-29","2017-05-28","2017-05-27","2017-05-26","2017-05-24","2017-05-22","2017-05-20","2017-05-19","2017-05-18","2017-05-17","2017-05-16","2017-05-15","2017-05-14","2017-05-13","2017-05-12","2017-05-11","2017-05-10","2017-05-09","2017-05-08","2017-05-05","2017-05-03","2017-05-02","2017-05-01","2017-04-30","2017-04-29","2017-04-28","2017-04-27","2017-04-26","2017-04-25","2017-04-24","2017-04-23","2017-04-22","2017-04-21","2017-04-20","2017-04-19","2017-04-18","2017-04-17","2017-04-16","2017-04-14","2017-04-13","2017-04-12","2017-04-11","2017-04-10","2017-04-09","2017-04-08","2017-04-07","2017-04-06","2017-04-05","2017-04-04","2017-04-03","2017-03-31","2017-03-30","2017-03-28","2017-03-27","2017-03-24","2017-03-23","2017-03-22","2017-03-21","2017-03-20","2017-03-19","2017-03-18","2017-03-17","2017-03-16","2017-03-15","2017-03-14","2017-02-23","2017-02-21","2017-02-20","2017-02-16","2017-02-14","2017-02-09","2017-02-07","2017-02-02","2017-02-01","2017-01-27","2017-01-19","2017-01-17","2017-01-16","2017-01-12","2017-01-10","2017-01-04","2016-12-20","2016-12-12","2016-12-08","2016-12-06","2016-11-29","2016-11-15","2016-11-14","2016-11-10","2016-11-08","2016-11-07","2016-11-04","2016-11-01","2016-10-26","2016-10-25","2016-10-24","2016-10-21","2016-10-20","2016-10-19","2016-10-17","2016-10-14","2016-10-13","2016-10-12","2016-10-11","2016-10-07","2016-10-06","2016-10-05","2016-10-04","2016-10-03","2016-09-30","2016-09-29","2016-09-27","2016-09-26","2016-09-23","2016-09-22","2016-09-21","2016-09-20","2016-09-14","2016-09-13","2016-09-12","2016-09-09","2016-09-06","2016-09-05","2016-09-01","2016-08-30","2016-08-29","2016-08-26","2016-08-25","2016-08-23","2016-08-15","2016-08-05","2016-08-04","2016-08-03","2016-08-02","2016-08-01","2016-07-29","2016-07-28","2016-07-27","2016-07-26","2016-07-25","2016-07-24","2016-07-22","2016-07-21","2016-07-20","2016-07-19","2016-07-18","2016-07-15","2016-07-14","2016-07-13","2016-07-11","2016-07-05","2016-07-01","2016-06-30","2016-06-29","2016-06-28","2016-06-24","2016-06-23","2016-06-22","2016-06-21","2016-06-17","2016-06-16","2016-06-15","2016-06-14","2016-06-13","2016-06-10","2016-06-09","2016-06-08","2016-06-07","2016-06-03","2016-06-02","2016-05-31","2016-05-24","2016-05-22","2016-05-21","2016-05-17","2016-05-16","2016-05-15","2016-05-13","2016-05-12","2016-05-10","2016-05-09","2016-05-08","2016-05-05","2016-05-04","2016-05-03","2016-04-29","2016-04-22","2016-04-15","2016-04-13","2016-04-09","2016-03-25","2016-03-18","2016-03-16","2016-03-11","2016-03-07","2016-03-04","2016-02-26","2016-02-19","2016-02-12","2016-02-10","2016-02-05","2016-01-29","2016-01-20","2016-01-15","2016-01-14","2016-01-06","2016-01-02","2015-12-28","2015-12-18","2015-12-17","2015-12-16","2015-12-15","2015-12-11","2015-12-07","2015-12-04","2015-11-29","2015-11-05","2015-11-04","2015-11-02","2015-10-31","2015-10-24","2015-10-21","2015-10-20","2015-10-19","2015-10-15","2015-10-14","2015-10-13","2015-10-12","2015-10-06","2015-10-05","2015-10-02","2015-10-01","2015-09-30","2015-09-27","2015-09-25","2015-09-18","2015-09-15","2015-09-14","2015-09-10","2015-09-09","2015-08-28","2015-08-21","2015-08-13","2015-08-11","2015-08-05","2015-07-30","2015-07-24","2015-07-22","2015-07-13","2015-07-07","2015-07-03","2015-06-30","2015-06-23","2015-06-04","2015-05-29","2015-05-20","2015-05-18","2015-05-12","2015-05-06","2015-05-04","2015-04-30","2015-04-26","2015-04-17","2015-04-15","2015-04-14","2015-04-10","2015-04-08","2015-04-02","2015-03-31","2015-03-18","2015-03-10","2015-02-25","2015-02-03","2015-01-29","2015-01-28","2015-01-21","2015-01-19","2015-01-15","2015-01-08","2014-12-27","2014-12-23","2014-12-16","2014-12-15","2014-12-09","2014-12-04","2014-12-01","2014-11-30","2014-11-25","2014-11-24","2014-11-20","2014-11-19","2014-11-18","2014-11-17","2014-11-14","2014-11-13","2014-11-12","2014-11-11","2014-11-10","2014-11-05","2014-11-03","2014-10-31","2014-10-30","2014-10-29","2014-10-28","2014-10-27","2014-10-24","2014-10-23","2014-10-22","2014-10-21","2014-10-20","2014-10-17","2014-10-16","2014-10-15","2014-10-14","2014-10-09","2014-10-08","2014-10-06","2014-10-03","2014-10-02","2014-10-01","2014-09-30","2014-09-25","2014-09-24","2014-09-22","2014-09-19","2014-09-18","2014-09-17","2014-09-16","2014-09-09","2014-09-08","2014-09-05","2014-09-03","2014-08-29","2014-08-27","2014-08-26","2014-08-11","2014-08-07","2014-08-06","2014-08-04","2014-08-03","2014-08-01","2014-07-30","2014-07-26","2014-07-23","2014-07-20","2014-07-18","2014-07-16","2014-07-15","2014-07-09","2014-07-07","2014-07-03","2014-07-02","2014-06-27","2014-06-25","2014-06-23","2014-06-22","2014-06-20","2014-06-18","2014-06-11","2014-06-04","2014-05-28","2014-05-21","2014-05-14","2014-05-07"],"name":"Tai Chi"},"Brazilian Jiu Jitsu":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":true,"other":false},"dates":["2019-01-02","2018-12-21","2018-12-07","2018-12-05","2018-11-30","2018-11-19","2018-11-15","2018-11-14","2018-11-09","2018-11-07","2018-10-27","2018-10-18","2018-10-17","2018-10-12","2018-10-10","2018-10-05","2018-09-25","2018-09-21","2018-09-17","2018-08-10","2018-08-03","2018-07-27","2018-07-20","2018-07-06","2018-02-13","2017-12-08","2017-12-01","2017-11-28","2017-11-20","2017-11-09","2017-11-07","2017-11-01","2017-10-24","2017-10-20","2017-10-18","2017-10-12","2017-10-11","2017-10-06","2017-09-06","2017-08-23","2017-08-21","2017-08-18","2017-08-14","2017-08-07","2017-08-04","2017-06-16","2017-06-14","2017-06-09","2017-06-07","2017-06-02","2017-05-26","2017-05-24","2017-05-22","2017-05-19","2017-05-17","2017-05-12","2017-05-10","2017-05-05","2017-05-01","2017-04-12","2017-04-10","2017-04-07","2017-04-05","2017-04-01","2017-03-31","2017-03-22","2017-03-20","2017-03-17","2017-03-15","2017-02-24","2017-02-22","2017-02-17","2017-02-08","2017-02-03","2017-01-27","2017-01-25","2017-01-18","2017-01-16","2016-12-22","2016-12-19","2016-12-16","2016-12-13","2016-11-28","2016-11-11","2016-10-24","2016-05-02","2016-04-29","2016-04-25","2016-04-22","2016-04-18","2016-04-15","2016-03-28","2016-03-11","2016-03-09","2016-03-04","2016-03-02","2016-02-29","2016-02-24","2016-02-22","2016-02-19","2016-02-17","2016-02-12","2016-02-05","2016-02-03","2016-02-01","2016-01-30","2016-01-25","2016-01-18","2016-01-15","2016-01-04","2015-12-30","2015-12-21","2015-12-18","2015-12-11","2015-12-09","2015-12-04","2015-11-30","2015-09-21","2015-09-18","2015-09-14","2015-08-31","2015-08-28","2015-08-26","2015-08-19","2015-08-17","2015-08-14","2015-08-12","2015-08-10","2015-08-07","2015-08-05","2015-07-29","2015-07-27","2015-07-20","2015-07-13","2015-07-10","2015-07-08","2015-07-06","2015-07-03","2015-07-01","2015-06-29","2015-06-25","2015-06-22","2015-06-19","2015-06-17","2015-06-15","2015-06-08","2015-06-05","2015-06-03","2015-06-01","2015-05-28","2015-05-21","2015-05-19","2015-05-15","2015-05-13","2015-05-11","2015-05-07","2015-05-05","2015-05-01","2015-04-29","2015-04-27","2015-04-24","2015-04-22","2015-04-20","2015-04-16","2015-04-13","2015-04-09","2015-04-07","2015-04-03","2015-04-01","2015-03-30","2015-03-25","2015-03-19","2015-02-19","2015-02-17","2015-02-13","2015-02-10","2015-02-06","2015-02-04","2015-01-30","2015-01-27","2015-01-22","2015-01-20","2015-01-16","2015-01-14","2015-01-09","2015-01-07","2014-12-23","2014-12-16","2014-12-02","2014-11-24","2014-11-18","2014-11-13","2014-11-05","2014-10-30","2014-10-23","2014-09-29","2014-09-17","2014-09-10","2014-09-04"],"name":"Brazilian Jiu Jitsu"},"r/BodyWeightFitness Recommended Routine":{"attributes":{"lower":false,"core":true,"back":false,"upper":true,"cardio":false,"martial":false,"other":false},"dates":["2018-07-09","2018-05-25","2018-03-28","2018-02-08","2017-11-09","2017-10-08","2017-09-03","2017-08-17","2017-07-09","2017-05-27","2017-04-26","2017-04-09","2017-03-27","2017-02-28","2017-02-03","2016-12-21","2016-11-17","2016-10-27","2016-09-29","2016-08-28","2016-08-06","2016-07-17","2016-06-24","2016-05-31","2016-04-30","2016-04-14","2016-03-31","2016-03-18","2016-03-05"],"name":"r/BodyWeightFitness Recommended Routine"},"RushFit - Fight Conditioning":{"attributes":{"lower":true,"core":true,"back":false,"upper":false,"cardio":true,"martial":true,"other":false},"dates":["2020-07-04","2020-06-08","2020-05-04","2020-03-30","2020-03-13","2019-12-06","2019-11-21","2019-10-21","2019-09-27","2019-08-17","2019-07-24","2019-06-23","2019-04-08","2019-03-04","2019-01-19","2018-12-20","2018-11-26","2018-10-30","2018-09-14","2018-06-27","2018-05-30","2018-04-28","2018-04-05","2018-02-06","2018-01-09","2017-12-07","2017-10-31","2017-09-27","2017-09-05","2017-07-26","2017-07-07","2017-05-24","2017-04-21","2017-03-16","2017-02-02","2017-01-11","2016-12-13","2016-11-15","2016-10-19","2016-10-04","2016-09-19","2016-09-06","2016-08-25","2016-07-27","2016-07-21","2016-07-11","2016-07-06","2016-06-29","2016-06-23","2016-06-17","2016-06-14","2016-06-07","2016-06-03","2016-05-30","2016-05-24","2016-05-13","2016-05-10","2016-05-07"],"name":"RushFit - Fight Conditioning"},"RushFit - Strength and Endurance":{"attributes":{"lower":true,"core":true,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"dates":["2020-06-09","2020-05-19","2020-03-23","2019-11-09","2019-07-31","2019-04-17","2019-03-11","2018-12-18","2018-10-31","2018-08-14","2018-06-30","2018-05-21","2018-04-16","2018-02-13","2017-11-20","2017-10-11","2017-09-15","2017-08-07","2017-06-15","2017-05-19","2017-04-12","2017-02-23","2017-01-25","2016-12-12","2016-11-14","2016-10-17","2016-09-23","2016-09-05","2016-08-05","2016-07-20","2016-06-15","2016-06-10","2016-05-25","2016-05-17"],"name":"RushFit - Strength and Endurance"},"RushFit - Full Body Strength and Conditioning":{"attributes":{"lower":true,"core":true,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"dates":["2020-07-06","2020-05-31","2020-04-06","2019-12-11","2019-09-04","2019-06-11","2019-03-26","2018-12-30","2018-09-21","2018-07-26","2018-06-19","2018-04-30","2017-12-11","2017-11-01","2017-09-29","2017-08-30","2017-07-19","2017-06-05","2017-05-03","2017-04-05","2017-02-10","2017-01-02","2016-11-22","2016-10-20","2016-10-05","2016-09-14","2016-08-26","2016-07-28","2016-07-13","2016-06-30","2016-06-06","2016-05-19"],"name":"RushFit - Full Body Strength and Conditioning"},"RushFit - Explosive Powertraining":{"attributes":{"lower":true,"core":true,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"dates":["2020-07-02","2020-04-27","2019-11-26","2019-09-10","2019-07-01","2019-04-09","2019-03-06","2018-12-04","2018-10-16","2018-09-07","2018-07-13","2018-06-12","2018-05-10","2018-01-10","2017-11-17","2017-10-23","2017-09-18","2017-08-14","2017-07-06","2017-05-22","2017-04-20","2017-03-15","2017-02-15","2017-01-16","2016-11-29","2016-11-02","2016-10-14","2016-09-21","2016-08-29","2016-08-01","2016-07-15","2016-07-01","2016-06-21","2016-06-08","2016-05-23"],"name":"RushFit - Explosive Powertraining"},"Rushfit - Balance and Agility":{"attributes":{"lower":true,"core":false,"back":false,"upper":true,"cardio":true,"martial":false,"other":false},"dates":["2020-07-09","2020-05-28","2019-12-17","2019-09-26","2019-06-20","2019-03-14","2019-01-07","2018-11-21","2018-10-12","2018-09-25","2018-07-05","2018-05-16","2018-04-13","2018-01-31","2017-12-29","2017-11-05","2017-09-26","2017-08-23","2017-07-16","2017-06-14","2017-05-08","2017-04-03","2017-02-08","2017-01-24","2016-12-07","2016-11-18","2016-10-28","2016-10-06","2016-09-07","2016-08-23","2016-07-18","2016-06-28","2016-06-01"],"name":"Rushfit - Balance and Agility"},"Rushfit - Stretching for Flexibility":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"dates":["2020-07-18","2020-07-13","2020-07-08","2020-07-03","2020-06-29","2020-06-25","2020-06-17","2020-06-09","2020-05-29","2020-05-26","2020-05-20","2020-04-30","2020-04-05","2020-03-29","2020-02-13","2020-02-03","2020-01-14","2020-01-11","2019-12-17","2019-12-08","2019-12-04","2019-12-02","2019-11-30","2019-11-24","2019-11-20","2019-11-15","2019-11-12","2019-11-06","2019-10-22","2019-10-12","2019-10-09","2019-10-07","2019-10-02","2019-09-27","2019-09-25","2019-09-15","2019-09-01","2019-08-30","2019-08-20","2019-08-15","2019-08-12","2019-08-08","2019-08-06","2019-07-30","2019-07-25","2019-07-18","2019-07-16","2019-07-14","2019-07-10","2019-07-01","2019-06-27","2019-06-25","2019-06-21","2019-06-19","2019-06-17","2019-06-10","2019-06-07","2019-06-05","2019-05-07","2019-05-05","2019-05-03","2019-04-23","2019-04-19","2019-04-15","2019-04-08","2019-04-04","2019-04-01","2019-03-11","2019-03-07","2019-03-04","2019-01-01","2018-12-09","2018-12-05","2018-12-01","2018-11-28","2018-11-25","2018-11-19","2018-11-15","2018-11-13","2018-11-07","2018-11-01","2018-10-29","2018-10-17","2018-10-13","2018-10-04","2018-09-19","2018-09-14","2018-09-11","2018-09-07","2018-09-05","2018-08-03","2018-07-30","2018-07-23","2018-07-18","2018-07-13","2018-07-06","2018-06-29","2018-06-21","2018-05-19","2018-04-10","2018-04-04","2018-03-26","2018-03-15","2018-02-20","2018-02-18","2018-02-15","2018-02-08","2018-02-03","2018-02-01","2018-01-30","2018-01-27","2018-01-16","2018-01-13","2018-01-10","2018-01-04","2018-01-01","2017-12-31","2017-12-28","2017-12-21","2017-12-17","2017-12-10","2017-12-06","2017-11-29","2017-11-15","2017-11-13","2017-11-10","2017-10-25","2017-10-10","2017-10-05","2017-10-02","2017-09-28","2017-09-26","2017-09-21","2017-09-19","2017-09-15","2017-09-12","2017-09-10","2017-09-02","2017-08-27","2017-08-24","2017-08-17","2017-08-08","2017-08-02","2017-07-31","2017-07-24","2017-07-21","2017-07-16","2017-07-13","2017-07-07","2017-07-03","2017-06-28","2017-06-24","2017-06-20","2017-06-17","2017-06-12","2017-06-08","2017-05-31","2017-05-27","2017-05-25","2017-05-18","2017-05-15","2017-05-10","2017-05-02","2017-04-29","2017-04-26","2017-04-23","2017-04-20","2017-04-18","2017-04-13","2017-04-10","2017-04-06","2017-03-30","2017-03-28","2017-03-23","2017-03-21","2017-03-13","2017-02-28","2017-02-23","2017-02-16","2017-02-07","2017-02-02","2017-01-31","2017-01-26","2017-01-19","2017-01-14","2017-01-05","2017-01-03","2016-12-28","2016-12-20","2016-12-09","2016-12-06","2016-12-01","2016-11-29","2016-11-26","2016-11-19","2016-11-14","2016-11-08","2016-11-04","2016-10-27","2016-10-20","2016-10-15","2016-10-13","2016-10-10","2016-10-06","2016-10-04","2016-10-01","2016-09-28","2016-09-26","2016-09-21","2016-09-14","2016-09-12","2016-09-09","2016-09-06","2016-09-01","2016-08-29","2016-08-25","2016-08-22","2016-08-19","2016-08-15","2016-08-04","2016-08-02","2016-07-30","2016-07-28","2016-07-26","2016-07-20","2016-07-18","2016-07-16","2016-07-15","2016-07-13","2016-07-05","2016-06-30","2016-06-28","2016-06-23","2016-06-21","2016-06-15","2016-06-13","2016-06-09","2016-06-07","2016-06-02","2016-05-31"],"name":"Rushfit - Stretching for Flexibility"},"Rushfit - Abdominal Strength and Core Conditioning":{"attributes":{"lower":false,"core":true,"back":false,"upper":false,"cardio":false,"martial":false,"other":false},"dates":["2020-07-14","2020-04-12","2020-01-21","2019-12-07","2019-11-07","2019-09-18","2019-07-29","2019-06-07","2019-03-01","2019-01-21","2018-12-07","2018-10-26","2018-09-05","2018-08-04","2018-06-06","2018-04-20","2018-01-03","2017-10-20","2017-08-24","2017-08-04","2017-06-02","2017-04-30","2017-03-30","2017-02-20","2017-01-10","2016-12-16","2016-11-08","2016-10-10","2016-09-12","2016-08-24","2016-08-03","2016-07-19","2016-06-22","2016-06-16","2016-06-02"],"name":"Rushfit - Abdominal Strength and Core Conditioning"},"Wim Hof Method Week 1":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"dates":["2020-07-11","2020-07-04","2020-06-13","2020-05-29","2020-05-24","2020-04-13","2020-04-08","2020-04-01","2019-11-13","2019-03-25","2019-03-24","2019-01-21","2018-12-27","2018-11-19","2018-11-15","2018-11-13","2018-11-12","2018-10-17","2018-10-12","2018-10-11","2018-10-10","2018-10-08","2018-09-27","2018-09-25","2018-09-24","2018-09-23","2018-09-22","2018-09-21","2018-09-20","2018-09-19","2018-09-18","2018-09-17","2018-09-16","2018-09-14","2018-09-13","2018-09-11","2018-09-10","2018-09-09","2018-07-26","2018-07-11","2018-06-12","2018-06-11","2018-02-07","2018-01-18","2018-01-12","2018-01-11","2018-01-07","2018-01-04","2018-01-03","2018-01-02","2018-01-01","2017-12-30","2017-12-29","2017-12-28","2017-12-20","2017-12-13","2017-11-07","2017-10-26","2017-10-25","2017-10-14","2017-10-12","2017-09-30","2017-09-27","2017-09-23","2017-09-18","2017-04-30","2016-11-19","2016-11-15","2016-11-14","2016-11-13","2016-11-12","2016-11-11","2016-11-09"],"name":"Wim Hof Method Week 1"},"Wim Hof Method Week 2":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"dates":["2017-10-16","2017-10-10","2017-09-28","2017-09-22","2017-09-19","2016-12-01","2016-11-30","2016-11-26","2016-11-23","2016-11-22","2016-11-21"],"name":"Wim Hof Method Week 2"},"Wim Hof Method Week 3":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"dates":["2017-09-25","2016-12-07","2016-12-06","2016-12-05","2016-12-03"],"name":"Wim Hof Method Week 3"},"Simple and Sinister":{"attributes":{"lower":true,"core":true,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"dates":["2020-07-17","2020-06-24","2020-05-27","2020-05-15","2020-04-17","2020-03-31","2020-03-11","2020-02-17","2020-01-05","2019-12-13","2019-12-05","2019-11-25","2019-11-17","2019-10-22","2019-10-13","2019-10-06","2019-10-02","2019-09-20","2019-09-06","2019-08-22","2019-08-15","2019-08-05","2019-07-23","2019-07-16","2019-07-08","2019-07-02","2019-06-28","2019-06-22","2019-06-17","2019-06-14","2019-06-04","2019-04-25","2019-04-13","2019-04-06","2019-03-09","2019-02-24","2019-02-11","2019-01-29","2019-01-23","2019-01-15","2019-01-01","2018-12-27","2018-12-16","2018-12-05","2018-11-27","2018-11-19","2018-11-12","2018-11-05","2018-10-29","2018-10-24","2018-10-18","2018-10-09","2018-10-05","2018-09-17","2018-09-13","2018-09-09","2018-08-12","2018-08-06","2018-07-24","2018-07-19","2018-07-11","2018-07-03","2018-06-26","2018-06-14","2018-06-04","2018-05-29","2018-05-17","2018-05-08","2018-04-27","2018-04-24","2018-02-16","2018-02-09","2018-02-02","2018-01-28","2018-01-25","2018-01-24","2018-01-18","2018-01-12","2018-01-07","2017-12-31","2017-12-28","2017-12-25","2017-10-14"],"name":"Simple and Sinister"},"Vapassana Meditation":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"dates":["2018-10-10","2018-10-09","2018-07-30","2018-07-19","2018-07-18","2018-05-13","2018-05-10","2018-02-19"],"name":"Vapassana Meditation"},"Pull Ups + Burpees":{"attributes":{"lower":true,"core":false,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"dates":["2020-06-16","2020-05-08","2020-04-22","2020-01-07","2019-12-09","2019-11-29","2019-11-05","2019-10-10","2019-09-08","2019-08-19","2019-07-12","2019-06-24","2019-06-06","2019-04-01","2019-03-19","2019-02-26","2019-02-13","2019-01-16","2018-12-21","2018-11-28","2018-11-13","2018-10-25","2018-10-11","2018-09-29","2018-09-24","2018-09-11","2018-09-04","2018-08-08","2018-08-01","2018-07-22","2018-06-28","2018-06-07","2018-04-21"],"name":"Pull Ups + Burpees"},"Heavy Bag":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":true,"martial":true,"other":false},"dates":["2020-04-29","2020-04-19","2019-10-18","2019-08-03","2019-04-20","2018-12-28","2018-12-09","2018-09-06","2018-08-19","2018-07-29"],"name":"Heavy Bag"},"Interval Run":{"attributes":{"lower":true,"core":false,"back":true,"upper":false,"cardio":true,"martial":false,"other":false},"dates":["2020-06-28","2020-05-23","2019-12-03","2019-09-11","2019-05-07","2019-03-27","2018-12-06","2018-11-01","2018-09-18","2018-08-13"],"name":"Interval Run"},"Exercise Bike":{"attributes":{"lower":true,"core":false,"back":false,"upper":false,"cardio":true,"martial":false,"other":false},"dates":["2020-01-07","2019-12-09","2019-11-10","2019-10-27","2019-10-14","2019-08-18","2019-07-12","2019-06-27","2019-05-03","2019-04-15","2019-04-10","2019-04-03","2019-03-15","2019-03-07","2019-02-14","2019-01-20"],"name":"Exercise Bike"},"Generic - Legs + Back":{"attributes":{"lower":true,"core":false,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"dates":["2020-01-11","2019-11-15","2019-03-22","2019-02-28","2019-02-25","2019-01-22","2019-01-20"],"name":"Generic - Legs + Back"},"Generic - Chest + Back + Tris":{"attributes":{"lower":false,"core":false,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"dates":["2019-12-19","2019-10-27","2019-07-25","2019-02-19","2019-01-28"],"name":"Generic - Chest + Back + Tris"},"Elliptical":{"attributes":{"lower":true,"core":true,"back":false,"upper":false,"cardio":true,"martial":false,"other":false},"dates":["2019-10-27","2019-08-09","2019-04-04","2019-02-16","2019-01-31"],"name":"Elliptical"},"Swimming":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":false},"dates":["2019-11-10","2019-04-26","2019-04-11"],"name":"Swimming"},"Stairs":{"attributes":{"lower":true,"core":false,"back":false,"upper":false,"cardio":true,"martial":false,"other":false},"dates":["2019-11-15","2019-10-09"],"name":"Stairs"},"P90X3 - Dynamix":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"dates":["2020-07-20","2020-07-14","2020-07-09","2020-07-04","2020-07-01","2020-06-27","2020-06-12","2020-05-25","2020-04-23","2020-04-06","2020-03-31","2020-02-19","2020-02-12","2020-02-03","2020-02-01"],"name":"P90X3 - Dynamix"},"P90X3 - Eccentric Lower":{"attributes":{"lower":true,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":false},"dates":["2020-07-08","2020-05-14","2020-03-14","2020-02-12","2020-02-02"],"name":"P90X3 - Eccentric Lower"},"Hard Corps - Core 1":{"attributes":{"lower":false,"core":true,"back":false,"upper":false,"cardio":false,"martial":false,"other":false},"dates":["2020-06-29","2020-04-23","2020-02-03"],"name":"Hard Corps - Core 1"},"P90X3 - Pilates X":{"attributes":{"lower":false,"core":true,"back":false,"upper":false,"cardio":false,"martial":false,"other":false},"dates":["2020-07-10","2020-06-03","2020-03-27","2020-02-08"],"name":"P90X3 - Pilates X"},"P90X3 - Isometrix":{"attributes":{"lower":false,"core":true,"back":false,"upper":true,"cardio":false,"martial":false,"other":true},"dates":["2020-06-27","2020-05-13","2020-02-09"],"name":"P90X3 - Isometrix"},"P90X3 - MMX":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":true,"martial":true,"other":false},"dates":["2020-06-30","2020-06-06","2020-05-12","2020-04-15","2020-03-18","2020-02-16","2020-02-10"],"name":"P90X3 - MMX"},"Hard Corps - Resistance 3":{"attributes":{"lower":true,"core":true,"back":false,"upper":true,"cardio":false,"martial":false,"other":false},"dates":["2020-06-29","2020-06-07","2020-05-18","2020-02-13"],"name":"Hard Corps - Resistance 3"},"P90X3 - Eccentric Upper":{"attributes":{"lower":false,"core":false,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"dates":["2020-02-14"],"name":"P90X3 - Eccentric Upper"},"P90X3 - Yoga":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"dates":["2020-07-12","2020-06-02","2020-05-11","2020-04-11","2020-03-12","2020-02-18"],"name":"P90X3 - Yoga"},"Hard Corps - Core 2":{"attributes":{"lower":false,"core":true,"back":false,"upper":false,"cardio":false,"martial":false,"other":false},"dates":["2020-05-18","2020-02-19"],"name":"Hard Corps - Core 2"},"P90X3 - The Warrior":{"attributes":{"lower":true,"core":true,"back":false,"upper":true,"cardio":true,"martial":true,"other":false},"dates":["2020-07-20","2020-06-23","2020-05-26","2020-03-21"],"name":"P90X3 - The Warrior"},"P90X3 - CVX":{"attributes":{"lower":true,"core":false,"back":false,"upper":true,"cardio":true,"martial":false,"other":false},"dates":["2020-07-13","2020-05-30","2020-03-26"],"name":"P90X3 - CVX"},"P90X3 - Accelerator":{"attributes":{"lower":true,"core":false,"back":false,"upper":false,"cardio":true,"martial":false,"other":false},"dates":["2020-04-04"],"name":"P90X3 - Accelerator"},"Hard Corps - Resistance 1":{"attributes":{"lower":true,"core":true,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"dates":["2020-06-22","2020-05-01"],"name":"Hard Corps - Resistance 1"},"P90X3 - Agility":{"attributes":{"lower":true,"core":false,"back":false,"upper":false,"cardio":true,"martial":false,"other":false},"dates":["2020-04-30"],"name":"P90X3 - Agility"},"Hard Corps - Resistance 2":{"attributes":{"lower":false,"core":true,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"dates":["2020-05-05"],"name":"Hard Corps - Resistance 2"},"Hard Corps - Cardio 1":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":true,"martial":false,"other":false},"dates":["2020-05-03"],"name":"Hard Corps - Cardio 1"},"Hard Corps - Cardio 2":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":false},"dates":["2020-05-06"],"name":"Hard Corps - Cardio 2"}} \ No newline at end of file diff --git a/gui/workouts.json.old b/gui/workouts.json.old new file mode 100644 index 0000000..c5ab958 --- /dev/null +++ b/gui/workouts.json.old @@ -0,0 +1 @@ +{"P90X - Ab Ripper":{"attributes":{"lower":false,"core":true,"back":false,"upper":false,"cardio":false,"martial":false,"other":false},"dates":["2020-03-20","2019-11-29","2019-10-12","2019-09-08","2019-08-09","2019-06-18","2019-04-19","2019-03-15","2019-03-07","2019-02-14","2019-01-31","2018-11-14","2018-10-04","2018-07-23","2018-05-17","2018-03-07","2017-12-18","2017-09-25","2017-08-29","2017-06-27","2017-03-21","2017-02-14","2017-01-27","2016-11-11","2016-09-04","2016-04-29","2016-03-11","2016-02-05","2016-01-20","2015-12-04","2015-09-18","2015-08-14","2015-06-25","2015-05-04","2015-04-01","2015-03-19","2015-02-19","2015-01-22","2014-12-26","2014-11-25","2014-10-30","2014-06-28","2014-06-16","2014-05-25"],"name":"P90X - Ab Ripper"},"P90X - Back + Biceps":{"attributes":{"lower":false,"core":false,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"dates":[],"name":"P90X - Back + Biceps"},"P90X - Cardio X":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":true,"martial":true,"other":false},"dates":["2020-07-07","2020-06-14","2020-05-17","2020-03-10","2020-01-06","2019-10-25","2019-10-05","2019-09-07","2019-08-10","2019-06-29","2019-05-08","2019-04-28","2019-04-16","2019-03-21","2018-12-26","2018-12-14","2018-11-07","2018-10-10","2018-07-10","2018-06-05","2018-05-09","2018-04-24","2018-04-03","2018-01-27","2018-01-01","2017-11-14","2017-10-18","2017-09-17","2017-08-21","2017-07-03","2017-05-31","2017-04-27","2017-03-31","2017-03-13","2017-02-13","2017-01-30","2016-12-19","2016-11-28","2016-11-04","2016-10-21","2016-09-27","2016-09-09","2016-08-22","2016-07-29","2016-06-27","2016-06-04","2016-05-04","2016-04-16","2016-04-08","2016-03-21","2016-03-02","2016-02-22","2016-02-08","2016-02-03","2016-01-12","2015-12-28","2015-12-09","2015-11-05","2015-10-12","2015-08-26","2015-08-10","2015-07-20","2015-06-29","2015-06-11","2015-06-08","2015-05-28","2015-04-02","2015-03-09","2015-02-17","2015-01-26","2015-01-09","2014-12-26","2014-12-17","2014-12-16","2014-12-09","2014-11-21","2014-10-27","2014-10-13","2014-10-05","2014-09-13","2014-07-07","2014-06-23","2014-05-28","2014-05-14"],"name":"P90X - Cardio X"},"P90X - Chest + Back":{"attributes":{"lower":false,"core":false,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"dates":[],"name":"P90X - Chest + Back"},"P90X - Chest + Shoulders + Triceps":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":false},"dates":["2017-06-17","2017-02-17","2016-09-01"],"name":"P90X - Chest + Shoulders + Triceps"},"P90X - Core Synergistics":{"attributes":{"lower":false,"core":true,"back":false,"upper":true,"cardio":false,"martial":false,"other":false},"dates":["2020-06-12","2020-04-02","2019-11-19","2019-07-21","2019-03-29","2018-10-15","2018-06-21","2018-04-26","2017-10-02","2017-05-12","2017-02-07","2016-10-25","2016-07-25","2016-04-27","2016-03-23","2016-02-18","2016-01-21","2015-12-15","2015-10-31","2015-08-25","2015-08-05","2015-06-30","2015-04-30","2015-03-23","2015-02-11","2015-01-23","2014-12-30","2014-11-19","2014-10-01","2014-07-31","2014-06-26"],"name":"P90X - Core Synergistics"},"P90X+ - Interval X+":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":true,"martial":false,"other":false},"dates":["2020-07-18","2020-06-11","2020-04-03","2019-10-03","2019-08-07","2019-04-18","2018-12-17","2018-10-17","2018-07-18","2018-06-09","2018-05-01","2018-02-14","2017-11-21","2017-10-12","2017-08-08","2017-06-06","2017-05-02","2017-03-20","2017-01-20","2016-11-30","2016-10-24","2016-09-22","2016-08-02","2016-06-09","2016-04-28","2016-03-24","2016-02-29","2016-01-18","2015-12-16","2015-10-28","2015-09-21","2015-08-07","2015-07-08","2015-06-03","2015-04-17","2015-03-16","2015-02-12","2015-01-16","2014-12-22","2014-11-13","2014-10-17","2014-10-02","2014-09-03","2014-07-28","2014-07-09","2014-06-25","2014-06-03","2014-05-12"],"name":"P90X+ - Interval X+"},"P90X+ - Kenpo Cardio X+":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":true,"martial":true,"other":false},"dates":["2020-06-25","2020-06-01","2020-04-24","2020-03-24","2019-12-01","2019-10-15","2019-08-27","2019-07-15","2019-06-08","2019-03-28","2019-02-15","2019-01-02","2018-11-29","2018-10-22","2018-08-07","2018-06-22","2018-05-18","2018-04-19","2018-01-16","2017-12-26","2017-12-05","2017-10-24","2017-09-20","2017-08-27","2017-07-21","2017-06-28","2017-05-18","2017-04-14","2017-02-22","2017-01-01","2016-12-08","2016-11-10","2016-10-13","2016-09-15","2016-08-30","2016-08-04","2016-07-03","2016-05-18","2016-04-25","2016-03-27","2016-03-09","2016-02-24","2016-01-27","2016-01-13","2015-12-21","2015-11-23","2015-10-23","2015-10-13","2015-09-11","2015-08-31","2015-08-12","2015-07-31","2015-07-06","2015-06-17","2015-06-01","2015-04-21","2015-03-24","2015-03-13","2015-02-10","2015-01-14","2014-11-18","2014-10-21","2014-09-18","2014-07-22","2014-06-10"],"name":"P90X+ - Kenpo Cardio X+"},"P90X - Kenpo X":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":true,"martial":true,"other":false},"dates":["2020-07-15","2020-06-17","2020-05-21","2020-04-07","2020-01-10","2019-11-13","2019-10-11","2019-09-17","2019-07-20","2019-06-19","2019-06-13","2019-03-12","2019-01-24","2018-11-17","2018-07-25","2018-06-15","2018-05-12","2018-01-04","2017-11-18","2017-09-30","2017-09-14","2017-08-02","2017-07-12","2017-06-11","2017-05-05","2017-04-06","2017-02-16","2017-01-26","2016-12-02","2016-11-01","2016-10-07","2016-09-13","2016-08-15","2016-07-14","2016-05-20","2016-05-02","2016-04-13","2016-03-17","2016-02-17","2016-01-22","2015-12-30","2015-12-08","2015-11-04","2015-10-16","2015-08-19","2015-07-27","2015-06-24","2015-05-29","2015-05-08","2015-04-06","2015-02-26","2015-01-21","2015-01-05","2014-12-02","2014-11-10","2014-10-07","2014-09-26","2014-08-28","2014-08-01","2014-07-18","2014-06-30","2014-06-17","2014-06-05","2014-05-22","2014-05-09"],"name":"P90X - Kenpo X"},"P90X - Legs + Back":{"attributes":{"lower":true,"core":false,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"dates":["2017-05-16","2017-03-21","2016-12-15","2016-09-11","2016-05-12"],"name":"P90X - Legs + Back"},"P90X - Plyometrics":{"attributes":{"lower":true,"core":false,"back":false,"upper":false,"cardio":true,"martial":false,"other":false},"dates":["2020-04-20","2019-08-14","2019-03-25","2018-09-10","2018-05-24","2017-12-01","2017-10-09","2017-07-10","2017-06-03","2017-04-18","2017-02-24","2017-01-03","2016-09-26","2016-09-02","2016-05-16","2016-04-18","2016-03-15","2016-02-10","2015-12-29","2015-11-02","2015-10-14","2015-09-15","2015-07-14","2015-06-22","2015-05-06","2015-03-26","2015-02-18","2015-01-29","2015-01-07","2014-11-20","2014-10-28","2014-10-15","2014-09-19","2014-08-05","2014-06-16"],"name":"P90X - Plyometrics"},"P90X - Shoulders + Arms":{"attributes":{"lower":false,"core":false,"back":false,"upper":true,"cardio":false,"martial":false,"other":false},"dates":["2019-03-13","2017-05-15"],"name":"P90X - Shoulders + Arms"},"P90X - X Stretch":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"dates":["2020-07-17","2020-07-11","2020-07-07","2020-07-02","2020-06-28","2020-06-16","2020-06-08","2020-05-31","2020-05-27","2020-05-18","2020-05-01","2020-04-16","2020-04-08","2020-04-04","2020-03-30","2020-03-25","2020-03-20","2020-02-08","2020-01-16","2020-01-06","2019-12-16","2019-12-15","2019-12-09","2019-12-07","2019-12-03","2019-11-27","2019-11-21","2019-11-19","2019-11-14","2019-11-09","2019-11-05","2019-10-10","2019-10-08","2019-10-04","2019-09-30","2019-09-26","2019-09-24","2019-09-16","2019-09-10","2019-09-05","2019-08-31","2019-08-29","2019-08-26","2019-08-19","2019-08-13","2019-08-07","2019-07-29","2019-07-26","2019-07-23","2019-07-17","2019-07-15","2019-07-11","2019-07-08","2019-06-26","2019-06-24","2019-06-20","2019-06-11","2019-06-09","2019-06-06","2019-06-04","2019-05-08","2019-05-06","2019-05-04","2019-04-29","2019-04-17","2019-04-16","2019-04-07","2019-04-03","2019-03-31","2019-03-29","2019-03-26","2019-03-24","2019-03-18","2019-03-12","2019-03-06","2019-02-14","2019-01-01","2018-12-07","2018-12-03","2018-11-29","2018-11-14","2018-11-06","2018-10-22","2018-10-15","2018-10-06","2018-10-03","2018-10-01","2018-09-27","2018-09-18","2018-09-13","2018-09-08","2018-09-04","2018-08-16","2018-08-09","2018-07-25","2018-07-17","2018-07-07","2018-06-27","2018-06-19","2018-06-13","2018-06-10","2018-06-04","2018-05-23","2018-05-15","2018-04-25","2018-04-18","2018-04-06","2018-03-20","2018-02-19","2018-02-17","2018-02-12","2018-02-07","2018-02-02","2018-01-31","2018-01-29","2018-01-23","2018-01-18","2018-01-12","2018-01-08","2018-01-03","2017-12-30","2017-12-27","2017-12-19","2017-12-12","2017-11-30","2017-11-27","2017-11-18","2017-11-14","2017-11-12","2017-10-30","2017-10-08","2017-10-03","2017-09-29","2017-09-27","2017-09-22","2017-09-20","2017-09-18","2017-09-14","2017-09-11","2017-09-07","2017-08-28","2017-08-25","2017-08-22","2017-08-15","2017-08-06","2017-07-22","2017-07-20","2017-07-19","2017-07-15","2017-07-12","2017-07-09","2017-07-06","2017-06-30","2017-06-22","2017-06-19","2017-06-15","2017-06-11","2017-06-07","2017-05-28","2017-05-26","2017-05-23","2017-05-16","2017-05-11","2017-05-09","2017-05-01","2017-04-27","2017-04-24","2017-04-21","2017-04-19","2017-04-17","2017-04-11","2017-04-07","2017-04-04","2017-03-29","2017-03-27","2017-03-22","2017-03-17","2017-02-27","2017-02-21","2017-02-09","2017-01-23","2017-01-17","2017-01-12","2017-01-04","2016-12-31","2016-12-13","2016-12-08","2016-12-05","2016-11-30","2016-11-23","2016-11-15","2016-11-10","2016-11-07","2016-11-02","2016-10-25","2016-10-19","2016-10-14","2016-10-12","2016-10-07","2016-10-05","2016-10-03","2016-09-29","2016-09-27","2016-09-22","2016-09-20","2016-09-15","2016-09-13","2016-09-07","2016-09-02","2016-08-30","2016-08-26","2016-08-23","2016-08-16","2016-08-05","2016-08-03","2016-08-01","2016-07-29","2016-07-27","2016-07-25","2016-07-19","2016-07-14","2016-07-11","2016-07-01","2016-06-29","2016-06-24","2016-06-22","2016-06-20","2016-06-17","2016-06-14","2016-06-10","2016-06-08","2016-06-06","2016-06-03","2016-06-01","2016-05-24","2016-05-23","2016-05-21","2016-05-18","2016-05-17","2016-05-16","2016-05-13","2016-05-12","2016-05-10","2016-05-09","2016-05-05","2016-05-04","2016-04-28","2016-04-26","2016-04-21","2016-04-14","2016-04-12","2016-04-11","2016-04-06","2016-03-31","2016-03-29","2016-03-23","2016-03-22","2016-03-21","2016-03-17","2016-03-16","2016-03-15","2016-03-14","2016-03-10","2016-03-03","2016-03-01","2016-02-28","2016-02-25","2016-02-23","2016-02-18","2016-02-11","2016-02-10","2016-02-02","2016-01-28","2016-01-26","2016-01-21","2016-01-20","2016-01-19","2016-01-14","2016-01-13","2016-01-12","2016-01-08","2016-01-05","2015-12-29","2015-12-23","2015-12-22","2015-12-17","2015-12-16","2015-12-15","2015-12-10","2015-12-08","2015-12-03","2015-12-02","2015-11-28","2015-11-23","2015-11-05","2015-11-04","2015-11-02","2015-10-21","2015-10-20","2015-10-19","2015-10-15","2015-10-14","2015-10-13","2015-10-06","2015-10-05","2015-10-02","2015-09-16","2015-09-10","2015-08-30","2015-08-27","2015-08-25","2015-08-20","2015-08-18","2015-08-14","2015-08-11","2015-08-09","2015-08-04","2015-07-30","2015-07-28","2015-07-25","2015-07-14","2015-07-12","2015-07-09","2015-07-07","2015-07-02","2015-06-30","2015-06-27","2015-06-23","2015-06-20","2015-06-18","2015-06-16","2015-06-12","2015-06-10","2015-06-04","2015-06-02","2015-05-31","2015-05-29","2015-05-20","2015-05-18","2015-05-15","2015-05-13","2015-05-11","2015-05-08","2015-05-06","2015-05-05","2015-05-01","2015-04-30","2015-04-29","2015-04-27","2015-04-24","2015-04-23","2015-04-22","2015-04-21","2015-04-20","2015-04-17","2015-04-16","2015-04-15","2015-04-14","2015-04-13","2015-04-10","2015-04-09","2015-04-08","2015-04-07","2015-04-06","2015-04-05","2015-04-03","2015-04-02","2015-04-01","2015-03-31","2015-03-28","2015-03-26","2015-03-25","2015-03-17","2015-03-16","2015-03-15","2015-03-12","2015-03-11","2015-03-05","2015-03-01","2015-02-18","2015-02-16","2015-02-12","2015-02-11","2015-02-05","2015-02-04","2015-01-29","2015-01-28","2015-01-26","2015-01-21","2015-01-20","2015-01-15","2015-01-13","2015-01-10","2015-01-08","2015-01-06","2014-12-31","2014-12-24","2014-12-22","2014-12-17","2014-12-15","2014-12-09","2014-12-04","2014-12-03","2014-12-01","2014-11-25","2014-11-21","2014-11-20","2014-11-19","2014-11-17","2014-11-15","2014-11-14","2014-11-12","2014-11-10","2014-11-06","2014-11-04","2014-11-01","2014-10-29","2014-10-27","2014-10-22","2014-10-21","2014-10-16","2014-10-14","2014-10-09","2014-10-07","2014-10-02","2014-09-29","2014-09-28","2014-09-24","2014-09-17","2014-09-16","2014-09-11","2014-09-06","2014-09-02","2014-08-28","2014-08-26","2014-08-19","2014-08-12","2014-08-08","2014-08-05","2014-07-31","2014-07-29","2014-07-25","2014-07-22","2014-07-17","2014-07-10","2014-07-08","2014-07-04","2014-07-01","2014-06-26","2014-06-24","2014-06-19","2014-06-17","2014-06-10","2014-06-05","2014-06-02","2014-05-29","2014-05-26","2014-05-22","2014-05-13","2014-05-08","2014-05-06"],"name":"P90X - X Stretch"},"P90X - Yoga X":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"dates":["2020-06-10","2020-04-14","2020-01-20","2019-11-23","2019-10-07","2019-09-24","2019-07-27","2019-04-22","2019-02-21","2018-10-18","2018-04-17","2018-03-16","2017-11-11","2017-09-09","2017-08-05","2017-05-30","2017-05-06","2017-03-28","2017-02-06","2016-12-27","2016-11-21","2016-11-09","2016-10-18","2016-08-18"],"name":"P90X - Yoga X"},"P90X2 - Base and Back":{"attributes":{"lower":true,"core":false,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"dates":["2019-11-22","2019-08-06","2019-02-01","2018-11-06","2018-01-30","2017-10-26","2017-07-24","2017-04-29","2017-02-09","2016-11-07","2016-07-26","2016-04-26","2016-03-22","2016-02-04","2015-11-03","2015-08-24","2015-07-09","2015-05-14","2015-03-31","2015-02-03","2015-01-01","2014-11-12","2014-10-16","2014-09-07","2014-08-11","2014-07-03","2014-06-12"],"name":"P90X2 - Base and Back"},"P90X2 - Chest Back Balance":{"attributes":{"lower":false,"core":true,"back":true,"upper":false,"cardio":false,"martial":false,"other":false},"dates":[],"name":"P90X2 - Chest Back Balance"},"P90X2 - P.A.P. Lower":{"attributes":{"lower":true,"core":false,"back":false,"upper":false,"cardio":true,"martial":false,"other":false},"dates":["2020-01-13","2019-07-17","2019-02-20","2018-07-12","2017-08-15","2017-05-28","2017-04-11","2017-01-17","2016-10-11","2016-06-13","2016-04-11","2016-03-01","2016-01-26","2015-12-02","2015-10-20","2015-09-17","2015-07-21","2015-06-16","2015-04-28","2015-03-12","2015-02-05","2015-01-08","2014-12-04","2014-11-03","2014-10-03","2014-08-29","2014-06-24"],"name":"P90X2 - P.A.P. Lower"},"P90X2 - P.A.P. Upper":{"attributes":{"lower":false,"core":false,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"dates":["2019-09-25","2019-04-23","2018-02-05","2017-09-11","2017-04-17","2017-01-12","2016-12-05","2016-10-12","2016-09-20","2016-05-09","2016-04-12","2016-03-03","2016-01-28","2015-12-10","2015-10-21","2015-08-13","2015-06-23","2015-04-15","2015-03-17","2015-01-28","2014-12-15","2014-10-29","2014-10-09","2014-07-24","2014-06-18","2014-05-07"],"name":"P90X2 - P.A.P. Upper"},"P90X2 - Plyocide":{"attributes":{"lower":true,"core":false,"back":true,"upper":false,"cardio":true,"martial":false,"other":false},"dates":["2020-06-15","2020-03-28","2019-12-10","2019-11-18","2019-08-26","2019-04-29","2019-03-08","2018-12-03","2018-09-20","2018-06-25","2018-05-13","2018-02-17","2017-11-28","2017-10-03","2017-09-08","2017-06-09","2017-05-11","2017-04-24","2017-03-23","2017-02-01","2016-12-20","2016-10-26","2016-09-30","2016-07-24","2016-05-06","2016-04-21","2016-03-29","2016-03-10","2016-02-15","2016-01-06","2015-12-17","2015-11-25","2015-10-15","2015-09-10","2015-08-27","2015-08-11","2015-07-29","2015-06-26","2015-06-04","2015-05-20","2015-04-14","2015-03-10","2015-02-25","2015-02-09","2015-01-12","2014-12-19","2014-11-24","2014-11-14","2014-10-22","2014-10-08","2014-09-30","2014-09-16","2014-08-26","2014-08-07","2014-07-30","2014-07-15","2014-06-20","2014-05-21","2014-05-08"],"name":"P90X2 - Plyocide"},"P90X2 - X2 Ab Ripper":{"attributes":{"lower":false,"core":true,"back":false,"upper":false,"cardio":false,"martial":false,"other":false},"dates":["2020-06-16","2020-05-02","2020-01-15","2019-10-23","2019-08-19","2019-07-12","2019-06-30","2019-05-05","2019-04-10","2018-10-13","2018-08-09","2018-07-07","2018-03-15","2017-11-07","2017-09-12","2017-07-18","2017-04-20","2016-12-06","2016-05-15","2016-04-22","2016-03-04","2016-01-29","2015-12-18","2015-11-05","2015-08-28","2015-07-10","2015-05-14","2015-05-09","2015-04-12","2015-03-29","2015-02-08","2015-01-05","2014-11-15","2014-10-20","2014-09-25","2014-09-14","2014-09-07","2014-08-11","2014-07-28","2014-06-23","2014-06-08","2014-05-20"],"name":"P90X2 - X2 Ab Ripper"},"P90X2 - X2 Balance and Power":{"attributes":{"lower":true,"core":true,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"dates":["2020-07-19","2020-05-22","2020-03-19","2019-09-16","2019-04-05","2018-11-18","2018-07-17","2018-05-31","2017-11-29","2017-09-21","2017-05-25","2017-02-21","2016-12-01","2016-08-31","2016-05-03","2016-03-25","2016-02-25","2016-01-19","2015-12-07","2015-10-27","2015-08-18","2015-07-07","2015-06-09","2015-04-08","2015-02-16","2015-01-19","2014-11-17","2014-10-06","2014-09-02","2014-07-17","2014-06-09"],"name":"P90X2 - X2 Balance and Power"},"P90X2 - X2 Core":{"attributes":{"lower":false,"core":true,"back":false,"upper":true,"cardio":false,"martial":false,"other":false},"dates":["2020-07-03","2020-04-09","2020-01-09","2019-11-14","2019-06-25","2019-03-23","2018-11-30","2018-09-19","2018-06-11","2018-02-19","2017-10-05","2017-06-08","2017-04-23","2017-01-31","2016-11-03","2016-07-31","2016-05-05","2016-03-30","2016-03-14","2016-02-02","2016-01-14","2015-12-22","2015-11-24","2015-10-19","2015-09-09","2015-08-20","2015-07-30","2015-07-02","2015-06-02","2015-05-12","2015-03-27","2015-03-02","2015-02-02","2015-01-13","2014-12-18","2014-11-29","2014-11-11","2014-11-05","2014-10-23","2014-10-15","2014-09-28","2014-09-15","2014-08-27","2014-08-17","2014-08-06","2014-07-21","2014-07-02","2014-06-13","2014-06-06","2014-05-23","2014-05-06"],"name":"P90X2 - X2 Core"},"P90X2 - X2 Recovery + Mobility/Foam Rolling Sessio":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"dates":["2020-07-15","2020-07-10","2020-07-06","2020-06-30","2020-06-26","2020-06-13","2020-06-01","2020-05-28","2020-05-14","2020-04-13","2020-04-02","2020-01-08","2019-12-11","2019-11-13","2019-08-28","2019-08-16","2019-06-12","2019-03-28","2019-03-05","2019-02-21","2018-11-01","2018-09-10","2018-07-28","2018-07-26","2018-02-20","2018-02-14","2018-02-04","2018-01-11","2018-01-07","2018-01-02","2017-12-18","2017-10-13","2017-10-07","2017-10-04","2017-09-13","2017-08-09","2017-08-01","2017-07-17","2017-07-14","2017-07-10","2017-07-05","2017-06-27","2017-06-16","2017-06-06","2017-06-01","2017-05-23","2017-05-17","2017-05-07","2017-04-28","2017-04-22","2017-04-16","2017-04-03","2017-03-18","2017-02-18","2017-02-04","2017-01-28","2016-12-12","2016-11-01","2016-10-17","2016-10-11","2016-09-23","2016-08-21","2016-06-16","2016-06-05"],"name":"P90X2 - X2 Recovery + Mobility/Foam Rolling Sessio"},"P90X2 - X2 Shoulders and Arms":{"attributes":{"lower":false,"core":false,"back":false,"upper":true,"cardio":false,"martial":false,"other":false},"dates":["2018-03-20"],"name":"P90X2 - X2 Shoulders and Arms"},"P90X2 - X2 Total Body":{"attributes":{"lower":false,"core":true,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"dates":["2019-12-02","2019-08-13","2019-03-20","2018-05-15","2017-11-15","2017-09-06","2017-07-13","2017-05-09","2017-01-19","2016-10-03","2016-07-05","2016-04-20","2016-03-16","2016-02-11","2016-01-04","2015-12-03","2015-09-16","2015-07-28","2015-06-18","2015-04-23","2015-03-11","2015-01-06","2014-12-01","2014-10-20","2014-09-17","2014-08-04","2014-07-08","2014-05-27"],"name":"P90X2 - X2 Total Body"},"P90X2 - X2 Yoga":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"dates":["2020-07-05","2020-05-24","2020-03-17","2020-01-14","2019-11-11","2019-10-01","2019-09-14","2019-08-11","2019-07-09","2019-06-16","2019-04-12","2019-04-02","2019-03-05","2019-01-18","2019-01-06","2018-11-20","2018-11-03","2018-09-12","2018-08-18","2018-06-01","2018-03-27","2018-01-15","2017-12-08","2017-11-08","2017-10-17","2017-09-23","2017-08-29","2017-07-18","2017-07-01","2017-05-21","2017-04-15","2017-04-08","2017-03-14","2017-01-18","2017-01-09","2016-12-14","2016-11-16","2016-10-31","2016-09-28","2016-09-08","2016-08-16","2016-08-07","2016-07-12","2016-06-20","2016-05-11","2016-04-19","2016-04-07","2016-03-28","2016-03-08","2016-02-23","2016-02-16","2016-02-01","2016-01-11","2016-01-05","2015-12-14","2015-11-30","2015-10-22","2015-09-08","2015-08-17","2015-08-06","2015-07-05","2015-05-30","2015-05-17","2015-04-19","2015-03-18","2015-03-03","2015-02-24","2015-02-06","2015-01-15","2014-12-29","2014-12-11","2014-12-10","2014-12-03","2014-11-22","2014-11-16","2014-11-11","2014-11-02","2014-10-24","2014-09-25","2014-08-24","2014-07-29","2014-06-29","2014-06-12","2014-05-30","2014-05-20"],"name":"P90X2 - X2 Yoga"},"Long Run + Roll":{"attributes":{"lower":true,"core":false,"back":true,"upper":false,"cardio":true,"martial":false,"other":false},"dates":["2020-07-11","2020-04-10","2020-03-15","2019-12-14","2019-11-28","2019-11-06","2019-10-23","2019-10-16","2019-09-29","2019-09-21","2019-09-02","2019-08-21","2019-07-28","2019-07-19","2019-07-13","2019-06-03","2019-04-24","2019-03-30","2019-02-23","2019-01-22","2019-01-17","2018-12-19","2018-12-12","2018-12-01","2018-11-22","2018-10-21","2018-10-14","2018-10-08","2018-09-27","2018-09-23","2018-09-11","2018-09-04","2018-08-01","2018-07-16","2018-07-08","2018-06-18","2018-02-20","2018-02-03","2018-01-13","2017-12-15","2017-11-24","2017-11-12","2017-11-06","2017-10-06","2017-09-12","2017-08-26","2017-08-18","2017-08-01","2017-07-22","2017-07-04","2017-06-26","2017-06-18","2016-07-04","2016-01-31","2015-07-04","2015-05-03","2015-04-11","2014-11-06","2014-07-12","2014-06-27","2014-06-04","2014-05-05"],"name":"Long Run + Roll"},"Short Run + Roll":{"attributes":{"lower":true,"core":false,"back":true,"upper":false,"cardio":true,"martial":false,"other":false},"dates":["2020-04-28","2019-07-11","2019-06-12","2019-03-22","2019-02-18","2019-02-13","2019-01-30","2019-01-14","2018-06-28","2015-07-01","2015-03-22","2015-01-30","2015-01-22","2014-12-25","2014-11-27","2014-10-25","2014-10-18","2014-10-11","2014-09-20","2014-08-19","2014-08-12","2014-08-10","2014-08-02","2014-07-24","2014-07-21","2014-07-19","2014-07-16","2014-07-07","2014-07-04","2014-06-30","2014-06-24","2014-06-22","2014-06-21","2014-06-18","2014-06-14","2014-06-13","2014-06-09","2014-06-07","2014-06-03","2014-05-31","2014-05-30","2014-05-29","2014-05-27","2014-05-24","2014-05-23","2014-05-12"],"name":"Short Run + Roll"},"Tai Chi":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"dates":["2020-07-19","2020-07-18","2020-07-17","2020-07-15","2020-07-14","2020-07-13","2020-07-10","2020-07-09","2020-07-08","2020-07-07","2020-07-06","2020-07-04","2020-07-03","2020-07-02","2020-06-30","2020-06-29","2020-06-27","2020-06-25","2020-06-24","2020-06-23","2020-06-22","2020-06-17","2020-06-15","2020-06-14","2020-06-12","2020-06-11","2020-06-10","2020-06-09","2020-06-08","2020-06-07","2020-06-03","2020-06-01","2020-05-31","2020-05-30","2020-05-28","2020-05-27","2020-05-26","2020-05-24","2020-05-22","2020-05-21","2020-05-19","2020-05-18","2020-05-15","2020-05-14","2020-05-13","2020-05-12","2020-05-06","2020-05-05","2020-05-04","2020-05-01","2020-04-30","2020-04-29","2020-04-27","2020-04-24","2020-04-23","2020-04-22","2020-04-20","2020-04-17","2020-04-15","2020-04-14","2020-04-13","2020-04-12","2020-04-11","2020-04-10","2020-04-09","2020-04-08","2020-04-07","2020-04-04","2020-04-03","2020-04-02","2020-04-01","2020-03-31","2020-03-30","2020-03-29","2020-03-28","2020-03-27","2020-03-26","2020-03-25","2020-03-24","2020-03-23","2020-03-22","2020-03-21","2020-03-19","2020-03-18","2020-03-15","2020-03-14","2020-03-12","2020-02-19","2020-02-18","2020-02-17","2020-02-16","2020-02-14","2020-02-13","2020-02-03","2020-01-21","2020-01-20","2020-01-16","2020-01-15","2020-01-13","2020-01-11","2020-01-10","2020-01-09","2020-01-08","2020-01-07","2019-12-17","2019-12-14","2019-12-13","2019-12-12","2019-12-11","2019-12-10","2019-12-09","2019-12-08","2019-12-07","2019-12-06","2019-12-05","2019-12-04","2019-12-03","2019-12-02","2019-12-01","2019-11-30","2019-11-29","2019-11-28","2019-11-27","2019-11-26","2019-11-25","2019-11-24","2019-11-23","2019-11-22","2019-11-21","2019-11-20","2019-11-19","2019-11-18","2019-11-17","2019-11-15","2019-11-14","2019-11-13","2019-11-12","2019-11-11","2019-11-10","2019-11-09","2019-11-07","2019-11-06","2019-11-05","2019-10-28","2019-10-27","2019-10-25","2019-10-22","2019-10-21","2019-10-16","2019-10-15","2019-10-14","2019-10-13","2019-10-12","2019-10-10","2019-10-09","2019-10-08","2019-10-07","2019-10-06","2019-10-05","2019-10-04","2019-10-03","2019-10-02","2019-10-01","2019-09-29","2019-09-28","2019-09-27","2019-09-26","2019-09-25","2019-09-20","2019-09-18","2019-09-17","2019-09-16","2019-09-15","2019-09-14","2019-09-12","2019-09-11","2019-09-10","2019-09-08","2019-09-07","2019-09-06","2019-09-05","2019-09-01","2019-08-31","2019-08-26","2019-08-23","2019-08-22","2019-08-21","2019-08-20","2019-08-19","2019-08-18","2019-08-17","2019-08-16","2019-08-15","2019-08-14","2019-08-12","2019-08-10","2019-08-09","2019-08-07","2019-08-06","2019-08-05","2019-08-03","2019-07-31","2019-07-30","2019-07-29","2019-07-28","2019-07-27","2019-07-26","2019-07-25","2019-07-24","2019-07-23","2019-07-22","2019-07-21","2019-07-20","2019-07-19","2019-07-18","2019-07-17","2019-07-16","2019-07-15","2019-07-14","2019-07-13","2019-07-12","2019-07-11","2019-07-09","2019-07-08","2019-07-01","2019-06-30","2019-06-29","2019-06-27","2019-06-26","2019-06-25","2019-06-24","2019-06-23","2019-06-22","2019-06-21","2019-06-20","2019-06-19","2019-06-17","2019-06-14","2019-06-13","2019-06-10","2019-06-09","2019-06-07","2019-06-06","2019-06-05","2019-06-04","2019-06-03","2019-05-08","2019-05-07","2019-05-06","2019-05-05","2019-05-04","2019-05-03","2019-04-29","2019-04-28","2019-04-25","2019-04-23","2019-04-20","2019-04-19","2019-04-18","2019-04-17","2019-04-16","2019-04-15","2019-04-10","2019-04-09","2019-04-08","2019-04-07","2019-04-05","2019-04-04","2019-04-03","2019-04-01","2019-03-30","2019-03-29","2019-03-28","2019-03-27","2019-03-26","2019-03-25","2019-03-23","2019-03-21","2019-03-20","2019-03-19","2019-03-18","2019-03-15","2019-03-14","2019-03-13","2019-03-12","2019-03-11","2019-03-08","2019-03-07","2019-03-04","2019-03-01","2019-02-28","2019-02-27","2019-02-26","2019-02-25","2019-02-24","2019-02-20","2019-02-19","2019-02-17","2019-02-16","2019-02-15","2019-02-14","2019-02-13","2019-02-12","2019-01-25","2019-01-22","2019-01-21","2019-01-18","2019-01-02","2018-12-28","2018-12-21","2018-12-20","2018-12-19","2018-12-09","2018-12-07","2018-12-06","2018-12-05","2018-12-04","2018-12-03","2018-11-30","2018-11-29","2018-11-28","2018-11-27","2018-11-26","2018-11-25","2018-11-19","2018-11-18","2018-11-14","2018-11-13","2018-11-12","2018-11-09","2018-11-08","2018-11-07","2018-11-06","2018-11-05","2018-11-02","2018-11-01","2018-10-31","2018-10-30","2018-10-29","2018-10-26","2018-10-22","2018-10-17","2018-10-15","2018-10-12","2018-10-11","2018-10-10","2018-10-09","2018-10-08","2018-10-04","2018-09-27","2018-09-23","2018-09-20","2018-09-19","2018-09-18","2018-09-14","2018-09-13","2018-09-10","2018-09-05","2018-08-19","2018-08-09","2018-08-04","2018-08-03","2018-07-31","2018-07-30","2018-07-28","2018-07-27","2018-07-26","2018-07-25","2018-07-24","2018-07-23","2018-07-19","2018-07-18","2018-07-17","2018-07-16","2018-07-13","2018-07-12","2018-07-06","2018-06-29","2018-06-10","2018-05-22","2018-05-20","2018-05-16","2018-05-15","2018-05-13","2018-05-10","2018-05-09","2018-04-30","2018-04-27","2018-04-26","2018-04-21","2018-04-19","2018-04-16","2018-04-10","2018-04-06","2018-04-04","2018-04-03","2018-03-28","2018-03-27","2018-03-26","2018-03-20","2018-03-19","2018-03-16","2018-03-15","2018-03-14","2018-03-09","2018-02-20","2018-02-19","2018-02-18","2018-02-17","2018-02-16","2018-02-15","2018-02-14","2018-02-13","2018-02-09","2018-02-08","2018-02-07","2018-02-06","2018-02-05","2018-02-03","2018-02-02","2018-02-01","2018-01-31","2018-01-30","2018-01-29","2018-01-28","2018-01-27","2018-01-25","2018-01-24","2018-01-18","2018-01-17","2018-01-16","2018-01-14","2018-01-13","2018-01-12","2018-01-11","2018-01-10","2018-01-08","2018-01-07","2018-01-06","2018-01-05","2018-01-04","2018-01-03","2018-01-02","2018-01-01","2017-12-31","2017-12-30","2017-12-29","2017-12-28","2017-12-27","2017-12-21","2017-12-20","2017-12-19","2017-12-18","2017-12-17","2017-12-15","2017-12-14","2017-12-12","2017-12-11","2017-12-10","2017-12-09","2017-12-08","2017-12-06","2017-12-05","2017-12-04","2017-12-03","2017-12-01","2017-11-29","2017-11-28","2017-11-20","2017-11-18","2017-11-17","2017-11-16","2017-11-15","2017-11-14","2017-11-13","2017-11-12","2017-11-11","2017-11-10","2017-11-09","2017-11-08","2017-11-07","2017-11-06","2017-11-01","2017-10-31","2017-10-30","2017-10-26","2017-10-25","2017-10-24","2017-10-20","2017-10-19","2017-10-18","2017-10-17","2017-10-16","2017-10-14","2017-10-13","2017-10-12","2017-10-11","2017-10-10","2017-10-09","2017-10-08","2017-10-07","2017-10-05","2017-10-04","2017-10-03","2017-10-02","2017-09-30","2017-09-29","2017-09-28","2017-09-27","2017-09-26","2017-09-25","2017-09-23","2017-09-22","2017-09-21","2017-09-20","2017-09-19","2017-09-18","2017-09-17","2017-09-16","2017-09-15","2017-09-14","2017-09-13","2017-09-12","2017-09-11","2017-09-10","2017-09-09","2017-09-08","2017-09-07","2017-09-06","2017-09-05","2017-09-02","2017-08-31","2017-08-30","2017-08-29","2017-08-28","2017-08-27","2017-08-26","2017-08-25","2017-08-24","2017-08-23","2017-08-22","2017-08-21","2017-08-20","2017-08-18","2017-08-17","2017-08-16","2017-08-15","2017-08-14","2017-08-13","2017-08-09","2017-08-08","2017-08-07","2017-08-06","2017-08-05","2017-08-04","2017-08-03","2017-08-02","2017-08-01","2017-07-31","2017-07-24","2017-07-23","2017-07-22","2017-07-21","2017-07-20","2017-07-19","2017-07-18","2017-07-17","2017-07-16","2017-07-15","2017-07-14","2017-07-13","2017-07-12","2017-07-11","2017-07-10","2017-07-09","2017-07-07","2017-07-06","2017-07-05","2017-07-03","2017-07-02","2017-07-01","2017-06-30","2017-06-29","2017-06-28","2017-06-27","2017-06-25","2017-06-24","2017-06-23","2017-06-22","2017-06-21","2017-06-20","2017-06-19","2017-06-18","2017-06-17","2017-06-16","2017-06-15","2017-06-14","2017-06-12","2017-06-11","2017-06-10","2017-06-09","2017-06-08","2017-06-07","2017-06-06","2017-06-03","2017-06-02","2017-06-01","2017-05-31","2017-05-29","2017-05-28","2017-05-27","2017-05-26","2017-05-24","2017-05-22","2017-05-20","2017-05-19","2017-05-18","2017-05-17","2017-05-16","2017-05-15","2017-05-14","2017-05-13","2017-05-12","2017-05-11","2017-05-10","2017-05-09","2017-05-08","2017-05-05","2017-05-03","2017-05-02","2017-05-01","2017-04-30","2017-04-29","2017-04-28","2017-04-27","2017-04-26","2017-04-25","2017-04-24","2017-04-23","2017-04-22","2017-04-21","2017-04-20","2017-04-19","2017-04-18","2017-04-17","2017-04-16","2017-04-14","2017-04-13","2017-04-12","2017-04-11","2017-04-10","2017-04-09","2017-04-08","2017-04-07","2017-04-06","2017-04-05","2017-04-04","2017-04-03","2017-03-31","2017-03-30","2017-03-28","2017-03-27","2017-03-24","2017-03-23","2017-03-22","2017-03-21","2017-03-20","2017-03-19","2017-03-18","2017-03-17","2017-03-16","2017-03-15","2017-03-14","2017-02-23","2017-02-21","2017-02-20","2017-02-16","2017-02-14","2017-02-09","2017-02-07","2017-02-02","2017-02-01","2017-01-27","2017-01-19","2017-01-17","2017-01-16","2017-01-12","2017-01-10","2017-01-04","2016-12-20","2016-12-12","2016-12-08","2016-12-06","2016-11-29","2016-11-15","2016-11-14","2016-11-10","2016-11-08","2016-11-07","2016-11-04","2016-11-01","2016-10-26","2016-10-25","2016-10-24","2016-10-21","2016-10-20","2016-10-19","2016-10-17","2016-10-14","2016-10-13","2016-10-12","2016-10-11","2016-10-07","2016-10-06","2016-10-05","2016-10-04","2016-10-03","2016-09-30","2016-09-29","2016-09-27","2016-09-26","2016-09-23","2016-09-22","2016-09-21","2016-09-20","2016-09-14","2016-09-13","2016-09-12","2016-09-09","2016-09-06","2016-09-05","2016-09-01","2016-08-30","2016-08-29","2016-08-26","2016-08-25","2016-08-23","2016-08-15","2016-08-05","2016-08-04","2016-08-03","2016-08-02","2016-08-01","2016-07-29","2016-07-28","2016-07-27","2016-07-26","2016-07-25","2016-07-24","2016-07-22","2016-07-21","2016-07-20","2016-07-19","2016-07-18","2016-07-15","2016-07-14","2016-07-13","2016-07-11","2016-07-05","2016-07-01","2016-06-30","2016-06-29","2016-06-28","2016-06-24","2016-06-23","2016-06-22","2016-06-21","2016-06-17","2016-06-16","2016-06-15","2016-06-14","2016-06-13","2016-06-10","2016-06-09","2016-06-08","2016-06-07","2016-06-03","2016-06-02","2016-05-31","2016-05-24","2016-05-22","2016-05-21","2016-05-17","2016-05-16","2016-05-15","2016-05-13","2016-05-12","2016-05-10","2016-05-09","2016-05-08","2016-05-05","2016-05-04","2016-05-03","2016-04-29","2016-04-22","2016-04-15","2016-04-13","2016-04-09","2016-03-25","2016-03-18","2016-03-16","2016-03-11","2016-03-07","2016-03-04","2016-02-26","2016-02-19","2016-02-12","2016-02-10","2016-02-05","2016-01-29","2016-01-20","2016-01-15","2016-01-14","2016-01-06","2016-01-02","2015-12-28","2015-12-18","2015-12-17","2015-12-16","2015-12-15","2015-12-11","2015-12-07","2015-12-04","2015-11-29","2015-11-05","2015-11-04","2015-11-02","2015-10-31","2015-10-24","2015-10-21","2015-10-20","2015-10-19","2015-10-15","2015-10-14","2015-10-13","2015-10-12","2015-10-06","2015-10-05","2015-10-02","2015-10-01","2015-09-30","2015-09-27","2015-09-25","2015-09-18","2015-09-15","2015-09-14","2015-09-10","2015-09-09","2015-08-28","2015-08-21","2015-08-13","2015-08-11","2015-08-05","2015-07-30","2015-07-24","2015-07-22","2015-07-13","2015-07-07","2015-07-03","2015-06-30","2015-06-23","2015-06-04","2015-05-29","2015-05-20","2015-05-18","2015-05-12","2015-05-06","2015-05-04","2015-04-30","2015-04-26","2015-04-17","2015-04-15","2015-04-14","2015-04-10","2015-04-08","2015-04-02","2015-03-31","2015-03-18","2015-03-10","2015-02-25","2015-02-03","2015-01-29","2015-01-28","2015-01-21","2015-01-19","2015-01-15","2015-01-08","2014-12-27","2014-12-23","2014-12-16","2014-12-15","2014-12-09","2014-12-04","2014-12-01","2014-11-30","2014-11-25","2014-11-24","2014-11-20","2014-11-19","2014-11-18","2014-11-17","2014-11-14","2014-11-13","2014-11-12","2014-11-11","2014-11-10","2014-11-05","2014-11-03","2014-10-31","2014-10-30","2014-10-29","2014-10-28","2014-10-27","2014-10-24","2014-10-23","2014-10-22","2014-10-21","2014-10-20","2014-10-17","2014-10-16","2014-10-15","2014-10-14","2014-10-09","2014-10-08","2014-10-06","2014-10-03","2014-10-02","2014-10-01","2014-09-30","2014-09-25","2014-09-24","2014-09-22","2014-09-19","2014-09-18","2014-09-17","2014-09-16","2014-09-09","2014-09-08","2014-09-05","2014-09-03","2014-08-29","2014-08-27","2014-08-26","2014-08-11","2014-08-07","2014-08-06","2014-08-04","2014-08-03","2014-08-01","2014-07-30","2014-07-26","2014-07-23","2014-07-20","2014-07-18","2014-07-16","2014-07-15","2014-07-09","2014-07-07","2014-07-03","2014-07-02","2014-06-27","2014-06-25","2014-06-23","2014-06-22","2014-06-20","2014-06-18","2014-06-11","2014-06-04","2014-05-28","2014-05-21","2014-05-14","2014-05-07"],"name":"Tai Chi"},"Brazilian Jiu Jitsu":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":true,"other":false},"dates":["2019-01-02","2018-12-21","2018-12-07","2018-12-05","2018-11-30","2018-11-19","2018-11-15","2018-11-14","2018-11-09","2018-11-07","2018-10-27","2018-10-18","2018-10-17","2018-10-12","2018-10-10","2018-10-05","2018-09-25","2018-09-21","2018-09-17","2018-08-10","2018-08-03","2018-07-27","2018-07-20","2018-07-06","2018-02-13","2017-12-08","2017-12-01","2017-11-28","2017-11-20","2017-11-09","2017-11-07","2017-11-01","2017-10-24","2017-10-20","2017-10-18","2017-10-12","2017-10-11","2017-10-06","2017-09-06","2017-08-23","2017-08-21","2017-08-18","2017-08-14","2017-08-07","2017-08-04","2017-06-16","2017-06-14","2017-06-09","2017-06-07","2017-06-02","2017-05-26","2017-05-24","2017-05-22","2017-05-19","2017-05-17","2017-05-12","2017-05-10","2017-05-05","2017-05-01","2017-04-12","2017-04-10","2017-04-07","2017-04-05","2017-04-01","2017-03-31","2017-03-22","2017-03-20","2017-03-17","2017-03-15","2017-02-24","2017-02-22","2017-02-17","2017-02-08","2017-02-03","2017-01-27","2017-01-25","2017-01-18","2017-01-16","2016-12-22","2016-12-19","2016-12-16","2016-12-13","2016-11-28","2016-11-11","2016-10-24","2016-05-02","2016-04-29","2016-04-25","2016-04-22","2016-04-18","2016-04-15","2016-03-28","2016-03-11","2016-03-09","2016-03-04","2016-03-02","2016-02-29","2016-02-24","2016-02-22","2016-02-19","2016-02-17","2016-02-12","2016-02-05","2016-02-03","2016-02-01","2016-01-30","2016-01-25","2016-01-18","2016-01-15","2016-01-04","2015-12-30","2015-12-21","2015-12-18","2015-12-11","2015-12-09","2015-12-04","2015-11-30","2015-09-21","2015-09-18","2015-09-14","2015-08-31","2015-08-28","2015-08-26","2015-08-19","2015-08-17","2015-08-14","2015-08-12","2015-08-10","2015-08-07","2015-08-05","2015-07-29","2015-07-27","2015-07-20","2015-07-13","2015-07-10","2015-07-08","2015-07-06","2015-07-03","2015-07-01","2015-06-29","2015-06-25","2015-06-22","2015-06-19","2015-06-17","2015-06-15","2015-06-08","2015-06-05","2015-06-03","2015-06-01","2015-05-28","2015-05-21","2015-05-19","2015-05-15","2015-05-13","2015-05-11","2015-05-07","2015-05-05","2015-05-01","2015-04-29","2015-04-27","2015-04-24","2015-04-22","2015-04-20","2015-04-16","2015-04-13","2015-04-09","2015-04-07","2015-04-03","2015-04-01","2015-03-30","2015-03-25","2015-03-19","2015-02-19","2015-02-17","2015-02-13","2015-02-10","2015-02-06","2015-02-04","2015-01-30","2015-01-27","2015-01-22","2015-01-20","2015-01-16","2015-01-14","2015-01-09","2015-01-07","2014-12-23","2014-12-16","2014-12-02","2014-11-24","2014-11-18","2014-11-13","2014-11-05","2014-10-30","2014-10-23","2014-09-29","2014-09-17","2014-09-10","2014-09-04"],"name":"Brazilian Jiu Jitsu"},"r/BodyWeightFitness Recommended Routine":{"attributes":{"lower":false,"core":true,"back":false,"upper":true,"cardio":false,"martial":false,"other":false},"dates":["2018-07-09","2018-05-25","2018-03-28","2018-02-08","2017-11-09","2017-10-08","2017-09-03","2017-08-17","2017-07-09","2017-05-27","2017-04-26","2017-04-09","2017-03-27","2017-02-28","2017-02-03","2016-12-21","2016-11-17","2016-10-27","2016-09-29","2016-08-28","2016-08-06","2016-07-17","2016-06-24","2016-05-31","2016-04-30","2016-04-14","2016-03-31","2016-03-18","2016-03-05"],"name":"r/BodyWeightFitness Recommended Routine"},"RushFit - Fight Conditioning":{"attributes":{"lower":true,"core":true,"back":false,"upper":false,"cardio":true,"martial":true,"other":false},"dates":["2020-07-04","2020-06-08","2020-05-04","2020-03-30","2020-03-13","2019-12-06","2019-11-21","2019-10-21","2019-09-27","2019-08-17","2019-07-24","2019-06-23","2019-04-08","2019-03-04","2019-01-19","2018-12-20","2018-11-26","2018-10-30","2018-09-14","2018-06-27","2018-05-30","2018-04-28","2018-04-05","2018-02-06","2018-01-09","2017-12-07","2017-10-31","2017-09-27","2017-09-05","2017-07-26","2017-07-07","2017-05-24","2017-04-21","2017-03-16","2017-02-02","2017-01-11","2016-12-13","2016-11-15","2016-10-19","2016-10-04","2016-09-19","2016-09-06","2016-08-25","2016-07-27","2016-07-21","2016-07-11","2016-07-06","2016-06-29","2016-06-23","2016-06-17","2016-06-14","2016-06-07","2016-06-03","2016-05-30","2016-05-24","2016-05-13","2016-05-10","2016-05-07"],"name":"RushFit - Fight Conditioning"},"RushFit - Strength and Endurance":{"attributes":{"lower":true,"core":true,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"dates":["2020-06-09","2020-05-19","2020-03-23","2019-11-09","2019-07-31","2019-04-17","2019-03-11","2018-12-18","2018-10-31","2018-08-14","2018-06-30","2018-05-21","2018-04-16","2018-02-13","2017-11-20","2017-10-11","2017-09-15","2017-08-07","2017-06-15","2017-05-19","2017-04-12","2017-02-23","2017-01-25","2016-12-12","2016-11-14","2016-10-17","2016-09-23","2016-09-05","2016-08-05","2016-07-20","2016-06-15","2016-06-10","2016-05-25","2016-05-17"],"name":"RushFit - Strength and Endurance"},"RushFit - Full Body Strength and Conditioning":{"attributes":{"lower":true,"core":true,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"dates":["2020-07-06","2020-05-31","2020-04-06","2019-12-11","2019-09-04","2019-06-11","2019-03-26","2018-12-30","2018-09-21","2018-07-26","2018-06-19","2018-04-30","2017-12-11","2017-11-01","2017-09-29","2017-08-30","2017-07-19","2017-06-05","2017-05-03","2017-04-05","2017-02-10","2017-01-02","2016-11-22","2016-10-20","2016-10-05","2016-09-14","2016-08-26","2016-07-28","2016-07-13","2016-06-30","2016-06-06","2016-05-19"],"name":"RushFit - Full Body Strength and Conditioning"},"RushFit - Explosive Powertraining":{"attributes":{"lower":true,"core":true,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"dates":["2020-07-02","2020-04-27","2019-11-26","2019-09-10","2019-07-01","2019-04-09","2019-03-06","2018-12-04","2018-10-16","2018-09-07","2018-07-13","2018-06-12","2018-05-10","2018-01-10","2017-11-17","2017-10-23","2017-09-18","2017-08-14","2017-07-06","2017-05-22","2017-04-20","2017-03-15","2017-02-15","2017-01-16","2016-11-29","2016-11-02","2016-10-14","2016-09-21","2016-08-29","2016-08-01","2016-07-15","2016-07-01","2016-06-21","2016-06-08","2016-05-23"],"name":"RushFit - Explosive Powertraining"},"Rushfit - Balance and Agility":{"attributes":{"lower":true,"core":false,"back":false,"upper":true,"cardio":true,"martial":false,"other":false},"dates":["2020-07-09","2020-05-28","2019-12-17","2019-09-26","2019-06-20","2019-03-14","2019-01-07","2018-11-21","2018-10-12","2018-09-25","2018-07-05","2018-05-16","2018-04-13","2018-01-31","2017-12-29","2017-11-05","2017-09-26","2017-08-23","2017-07-16","2017-06-14","2017-05-08","2017-04-03","2017-02-08","2017-01-24","2016-12-07","2016-11-18","2016-10-28","2016-10-06","2016-09-07","2016-08-23","2016-07-18","2016-06-28","2016-06-01"],"name":"Rushfit - Balance and Agility"},"Rushfit - Stretching for Flexibility":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"dates":["2020-07-18","2020-07-13","2020-07-08","2020-07-03","2020-06-29","2020-06-25","2020-06-17","2020-06-09","2020-05-29","2020-05-26","2020-05-20","2020-04-30","2020-04-05","2020-03-29","2020-02-13","2020-02-03","2020-01-14","2020-01-11","2019-12-17","2019-12-08","2019-12-04","2019-12-02","2019-11-30","2019-11-24","2019-11-20","2019-11-15","2019-11-12","2019-11-06","2019-10-22","2019-10-12","2019-10-09","2019-10-07","2019-10-02","2019-09-27","2019-09-25","2019-09-15","2019-09-01","2019-08-30","2019-08-20","2019-08-15","2019-08-12","2019-08-08","2019-08-06","2019-07-30","2019-07-25","2019-07-18","2019-07-16","2019-07-14","2019-07-10","2019-07-01","2019-06-27","2019-06-25","2019-06-21","2019-06-19","2019-06-17","2019-06-10","2019-06-07","2019-06-05","2019-05-07","2019-05-05","2019-05-03","2019-04-23","2019-04-19","2019-04-15","2019-04-08","2019-04-04","2019-04-01","2019-03-11","2019-03-07","2019-03-04","2019-01-01","2018-12-09","2018-12-05","2018-12-01","2018-11-28","2018-11-25","2018-11-19","2018-11-15","2018-11-13","2018-11-07","2018-11-01","2018-10-29","2018-10-17","2018-10-13","2018-10-04","2018-09-19","2018-09-14","2018-09-11","2018-09-07","2018-09-05","2018-08-03","2018-07-30","2018-07-23","2018-07-18","2018-07-13","2018-07-06","2018-06-29","2018-06-21","2018-05-19","2018-04-10","2018-04-04","2018-03-26","2018-03-15","2018-02-20","2018-02-18","2018-02-15","2018-02-08","2018-02-03","2018-02-01","2018-01-30","2018-01-27","2018-01-16","2018-01-13","2018-01-10","2018-01-04","2018-01-01","2017-12-31","2017-12-28","2017-12-21","2017-12-17","2017-12-10","2017-12-06","2017-11-29","2017-11-15","2017-11-13","2017-11-10","2017-10-25","2017-10-10","2017-10-05","2017-10-02","2017-09-28","2017-09-26","2017-09-21","2017-09-19","2017-09-15","2017-09-12","2017-09-10","2017-09-02","2017-08-27","2017-08-24","2017-08-17","2017-08-08","2017-08-02","2017-07-31","2017-07-24","2017-07-21","2017-07-16","2017-07-13","2017-07-07","2017-07-03","2017-06-28","2017-06-24","2017-06-20","2017-06-17","2017-06-12","2017-06-08","2017-05-31","2017-05-27","2017-05-25","2017-05-18","2017-05-15","2017-05-10","2017-05-02","2017-04-29","2017-04-26","2017-04-23","2017-04-20","2017-04-18","2017-04-13","2017-04-10","2017-04-06","2017-03-30","2017-03-28","2017-03-23","2017-03-21","2017-03-13","2017-02-28","2017-02-23","2017-02-16","2017-02-07","2017-02-02","2017-01-31","2017-01-26","2017-01-19","2017-01-14","2017-01-05","2017-01-03","2016-12-28","2016-12-20","2016-12-09","2016-12-06","2016-12-01","2016-11-29","2016-11-26","2016-11-19","2016-11-14","2016-11-08","2016-11-04","2016-10-27","2016-10-20","2016-10-15","2016-10-13","2016-10-10","2016-10-06","2016-10-04","2016-10-01","2016-09-28","2016-09-26","2016-09-21","2016-09-14","2016-09-12","2016-09-09","2016-09-06","2016-09-01","2016-08-29","2016-08-25","2016-08-22","2016-08-19","2016-08-15","2016-08-04","2016-08-02","2016-07-30","2016-07-28","2016-07-26","2016-07-20","2016-07-18","2016-07-16","2016-07-15","2016-07-13","2016-07-05","2016-06-30","2016-06-28","2016-06-23","2016-06-21","2016-06-15","2016-06-13","2016-06-09","2016-06-07","2016-06-02","2016-05-31"],"name":"Rushfit - Stretching for Flexibility"},"Rushfit - Abdominal Strength and Core Conditioning":{"attributes":{"lower":false,"core":true,"back":false,"upper":false,"cardio":false,"martial":false,"other":false},"dates":["2020-07-14","2020-04-12","2020-01-21","2019-12-07","2019-11-07","2019-09-18","2019-07-29","2019-06-07","2019-03-01","2019-01-21","2018-12-07","2018-10-26","2018-09-05","2018-08-04","2018-06-06","2018-04-20","2018-01-03","2017-10-20","2017-08-24","2017-08-04","2017-06-02","2017-04-30","2017-03-30","2017-02-20","2017-01-10","2016-12-16","2016-11-08","2016-10-10","2016-09-12","2016-08-24","2016-08-03","2016-07-19","2016-06-22","2016-06-16","2016-06-02"],"name":"Rushfit - Abdominal Strength and Core Conditioning"},"Wim Hof Method Week 1":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"dates":["2020-07-11","2020-07-04","2020-06-13","2020-05-29","2020-05-24","2020-04-13","2020-04-08","2020-04-01","2019-11-13","2019-03-25","2019-03-24","2019-01-21","2018-12-27","2018-11-19","2018-11-15","2018-11-13","2018-11-12","2018-10-17","2018-10-12","2018-10-11","2018-10-10","2018-10-08","2018-09-27","2018-09-25","2018-09-24","2018-09-23","2018-09-22","2018-09-21","2018-09-20","2018-09-19","2018-09-18","2018-09-17","2018-09-16","2018-09-14","2018-09-13","2018-09-11","2018-09-10","2018-09-09","2018-07-26","2018-07-11","2018-06-12","2018-06-11","2018-02-07","2018-01-18","2018-01-12","2018-01-11","2018-01-07","2018-01-04","2018-01-03","2018-01-02","2018-01-01","2017-12-30","2017-12-29","2017-12-28","2017-12-20","2017-12-13","2017-11-07","2017-10-26","2017-10-25","2017-10-14","2017-10-12","2017-09-30","2017-09-27","2017-09-23","2017-09-18","2017-04-30","2016-11-19","2016-11-15","2016-11-14","2016-11-13","2016-11-12","2016-11-11","2016-11-09"],"name":"Wim Hof Method Week 1"},"Wim Hof Method Week 2":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"dates":["2017-10-16","2017-10-10","2017-09-28","2017-09-22","2017-09-19","2016-12-01","2016-11-30","2016-11-26","2016-11-23","2016-11-22","2016-11-21"],"name":"Wim Hof Method Week 2"},"Wim Hof Method Week 3":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"dates":["2017-09-25","2016-12-07","2016-12-06","2016-12-05","2016-12-03"],"name":"Wim Hof Method Week 3"},"Simple and Sinister":{"attributes":{"lower":true,"core":true,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"dates":["2020-07-17","2020-06-24","2020-05-27","2020-05-15","2020-04-17","2020-03-31","2020-03-11","2020-02-17","2020-01-05","2019-12-13","2019-12-05","2019-11-25","2019-11-17","2019-10-22","2019-10-13","2019-10-06","2019-10-02","2019-09-20","2019-09-06","2019-08-22","2019-08-15","2019-08-05","2019-07-23","2019-07-16","2019-07-08","2019-07-02","2019-06-28","2019-06-22","2019-06-17","2019-06-14","2019-06-04","2019-04-25","2019-04-13","2019-04-06","2019-03-09","2019-02-24","2019-02-11","2019-01-29","2019-01-23","2019-01-15","2019-01-01","2018-12-27","2018-12-16","2018-12-05","2018-11-27","2018-11-19","2018-11-12","2018-11-05","2018-10-29","2018-10-24","2018-10-18","2018-10-09","2018-10-05","2018-09-17","2018-09-13","2018-09-09","2018-08-12","2018-08-06","2018-07-24","2018-07-19","2018-07-11","2018-07-03","2018-06-26","2018-06-14","2018-06-04","2018-05-29","2018-05-17","2018-05-08","2018-04-27","2018-04-24","2018-02-16","2018-02-09","2018-02-02","2018-01-28","2018-01-25","2018-01-24","2018-01-18","2018-01-12","2018-01-07","2017-12-31","2017-12-28","2017-12-25","2017-10-14"],"name":"Simple and Sinister"},"Vapassana Meditation":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"dates":["2018-10-10","2018-10-09","2018-07-30","2018-07-19","2018-07-18","2018-05-13","2018-05-10","2018-02-19"],"name":"Vapassana Meditation"},"Pull Ups + Burpees":{"attributes":{"lower":true,"core":false,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"dates":["2020-06-16","2020-05-08","2020-04-22","2020-01-07","2019-12-09","2019-11-29","2019-11-05","2019-10-10","2019-09-08","2019-08-19","2019-07-12","2019-06-24","2019-06-06","2019-04-01","2019-03-19","2019-02-26","2019-02-13","2019-01-16","2018-12-21","2018-11-28","2018-11-13","2018-10-25","2018-10-11","2018-09-29","2018-09-24","2018-09-11","2018-09-04","2018-08-08","2018-08-01","2018-07-22","2018-06-28","2018-06-07","2018-04-21"],"name":"Pull Ups + Burpees"},"Heavy Bag":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":true,"martial":true,"other":false},"dates":["2020-04-29","2020-04-19","2019-10-18","2019-08-03","2019-04-20","2018-12-28","2018-12-09","2018-09-06","2018-08-19","2018-07-29"],"name":"Heavy Bag"},"Interval Run":{"attributes":{"lower":true,"core":false,"back":true,"upper":false,"cardio":true,"martial":false,"other":false},"dates":["2020-06-28","2020-05-23","2019-12-03","2019-09-11","2019-05-07","2019-03-27","2018-12-06","2018-11-01","2018-09-18","2018-08-13"],"name":"Interval Run"},"Exercise Bike":{"attributes":{"lower":true,"core":false,"back":false,"upper":false,"cardio":true,"martial":false,"other":false},"dates":["2020-01-07","2019-12-09","2019-11-10","2019-10-27","2019-10-14","2019-08-18","2019-07-12","2019-06-27","2019-05-03","2019-04-15","2019-04-10","2019-04-03","2019-03-15","2019-03-07","2019-02-14","2019-01-20"],"name":"Exercise Bike"},"Generic - Legs + Back":{"attributes":{"lower":true,"core":false,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"dates":["2020-01-11","2019-11-15","2019-03-22","2019-02-28","2019-02-25","2019-01-22","2019-01-20"],"name":"Generic - Legs + Back"},"Generic - Chest + Back + Tris":{"attributes":{"lower":false,"core":false,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"dates":["2019-12-19","2019-10-27","2019-07-25","2019-02-19","2019-01-28"],"name":"Generic - Chest + Back + Tris"},"Elliptical":{"attributes":{"lower":true,"core":true,"back":false,"upper":false,"cardio":true,"martial":false,"other":false},"dates":["2019-10-27","2019-08-09","2019-04-04","2019-02-16","2019-01-31"],"name":"Elliptical"},"Swimming":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":false},"dates":["2019-11-10","2019-04-26","2019-04-11"],"name":"Swimming"},"Stairs":{"attributes":{"lower":true,"core":false,"back":false,"upper":false,"cardio":true,"martial":false,"other":false},"dates":["2019-11-15","2019-10-09"],"name":"Stairs"},"P90X3 - Dynamix":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"dates":["2020-07-20","2020-07-14","2020-07-09","2020-07-04","2020-07-01","2020-06-27","2020-06-12","2020-05-25","2020-04-23","2020-04-06","2020-03-31","2020-02-19","2020-02-12","2020-02-03","2020-02-01"],"name":"P90X3 - Dynamix"},"P90X3 - Eccentric Lower":{"attributes":{"lower":true,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":false},"dates":["2020-07-08","2020-05-14","2020-03-14","2020-02-12","2020-02-02"],"name":"P90X3 - Eccentric Lower"},"Hard Corps - Core 1":{"attributes":{"lower":false,"core":true,"back":false,"upper":false,"cardio":false,"martial":false,"other":false},"dates":["2020-06-29","2020-04-23","2020-02-03"],"name":"Hard Corps - Core 1"},"P90X3 - Pilates X":{"attributes":{"lower":false,"core":true,"back":false,"upper":false,"cardio":false,"martial":false,"other":false},"dates":["2020-07-10","2020-06-03","2020-03-27","2020-02-08"],"name":"P90X3 - Pilates X"},"P90X3 - Isometrix":{"attributes":{"lower":false,"core":true,"back":false,"upper":true,"cardio":false,"martial":false,"other":true},"dates":["2020-06-27","2020-05-13","2020-02-09"],"name":"P90X3 - Isometrix"},"P90X3 - MMX":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":true,"martial":true,"other":false},"dates":["2020-06-30","2020-06-06","2020-05-12","2020-04-15","2020-03-18","2020-02-16","2020-02-10"],"name":"P90X3 - MMX"},"Hard Corps - Resistance 3":{"attributes":{"lower":true,"core":true,"back":false,"upper":true,"cardio":false,"martial":false,"other":false},"dates":["2020-06-29","2020-06-07","2020-05-18","2020-02-13"],"name":"Hard Corps - Resistance 3"},"P90X3 - Eccentric Upper":{"attributes":{"lower":false,"core":false,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"dates":["2020-02-14"],"name":"P90X3 - Eccentric Upper"},"P90X3 - Yoga":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"dates":["2020-07-12","2020-06-02","2020-05-11","2020-04-11","2020-03-12","2020-02-18"],"name":"P90X3 - Yoga"},"Hard Corps - Core 2":{"attributes":{"lower":false,"core":true,"back":false,"upper":false,"cardio":false,"martial":false,"other":false},"dates":["2020-05-18","2020-02-19"],"name":"Hard Corps - Core 2"},"P90X3 - The Warrior":{"attributes":{"lower":true,"core":true,"back":false,"upper":true,"cardio":true,"martial":true,"other":false},"dates":["2020-06-23","2020-05-26","2020-03-21"],"name":"P90X3 - The Warrior"},"P90X3 - CVX":{"attributes":{"lower":true,"core":false,"back":false,"upper":true,"cardio":true,"martial":false,"other":false},"dates":["2020-07-13","2020-05-30","2020-03-26"],"name":"P90X3 - CVX"},"P90X3 - Accelerator":{"attributes":{"lower":true,"core":false,"back":false,"upper":false,"cardio":true,"martial":false,"other":false},"dates":["2020-04-04"],"name":"P90X3 - Accelerator"},"Hard Corps - Resistance 1":{"attributes":{"lower":true,"core":true,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"dates":["2020-06-22","2020-05-01"],"name":"Hard Corps - Resistance 1"},"P90X3 - Agility":{"attributes":{"lower":true,"core":false,"back":false,"upper":false,"cardio":true,"martial":false,"other":false},"dates":["2020-04-30"],"name":"P90X3 - Agility"},"Hard Corps - Resistance 2":{"attributes":{"lower":false,"core":true,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"dates":["2020-05-05"],"name":"Hard Corps - Resistance 2"},"Hard Corps - Cardio 1":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":true,"martial":false,"other":false},"dates":["2020-05-03"],"name":"Hard Corps - Cardio 1"},"Hard Corps - Cardio 2":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":false},"dates":["2020-05-06"],"name":"Hard Corps - Cardio 2"}} \ No newline at end of file diff --git a/include/add.h b/include/add.h new file mode 100644 index 0000000..f120771 --- /dev/null +++ b/include/add.h @@ -0,0 +1,13 @@ +#ifndef __ADD_H_ +#define __ADD_H_ + +#include +#include +#include + +#include +#include + +int add(int,int,char**); + +#endif \ No newline at end of file diff --git a/include/attr.h b/include/attr.h new file mode 100644 index 0000000..1a47e0d --- /dev/null +++ b/include/attr.h @@ -0,0 +1,16 @@ +#ifndef __ATTR_H_ +#define __ATTR_H_ + +#include +#include +#include + +#include +#include + +int attr(int,int,char**); +int attr_add(char*); +int attr_ls(); +void print_attr(const unsigned char*); + +#endif \ No newline at end of file diff --git a/include/data.h b/include/data.h new file mode 100644 index 0000000..b04a134 --- /dev/null +++ b/include/data.h @@ -0,0 +1,81 @@ +#ifndef __DATA_H_ +#define __DATA_H_ + +#include + +#include + +#include + +#define EMPTY_STRING "" + +// attributes +#define ATTRIBUTE_TABLE_NAME_SQL "attributes" +#define ATTRIBUTE_CREATE_TABLE_SQL \ + "CREATE TABLE IF NOT EXISTS `" ATTRIBUTE_TABLE_NAME_SQL "` ( " \ + "`name` TEXT NOT NULL PRIMARY KEY, " \ + "`order` INT DEFAULT 0" \ + ");" + +#define ATTRIBUTE_COUNT_SQL "SELECT COUNT(*) FROM " ATTRIBUTE_TABLE_NAME_SQL ";" +int attribute_count(); + +#define ATTRIBUTE_GET_SQL "SELECT `name` FROM " ATTRIBUTE_TABLE_NAME_SQL " WHERE 1 ORDER BY `order` ASC;" +int attribute_get(void (*)(const unsigned char*)); +int attribute_index(char*); +void attribute_index_helper(const unsigned char*); + +#define ATTRIBUTE_INSERT_SQL "INSERT INTO " ATTRIBUTE_TABLE_NAME_SQL " (`name`,`order`) VALUES (?,(SELECT MAX(`order`)+1 FROM `" ATTRIBUTE_TABLE_NAME_SQL "`));" +int attribute_insert(char*); +int attribute_parse(char*,int*,int*); + +// recent +#define RECENT_TABLE_NAME_SQL "recent" +#define RECENT_CREATE_TABLE_SQL \ + "CREATE TABLE IF NOT EXISTS `" RECENT_TABLE_NAME_SQL "` ( " \ + "`name` TEXT NOT NULL, " \ + "`date` TEXT NOT NULL, " \ + "PRIMARY KEY(`name`,`date`), "\ + "FOREIGN KEY(`name`) REFERENCES `workouts`(`name`)" \ + ");" + +#define RECENT_GET_SQL "SELECT name, date FROM `" RECENT_TABLE_NAME_SQL "` ORDER BY date(`date`) DESC,`name` ASC LIMIT ?;" +int recent_get(int,void(*)(const unsigned char*,const unsigned char*)); + +#define RECENT_INSERT_SQL "INSERT INTO " RECENT_TABLE_NAME_SQL " (name,date) VALUES (?,?);" +int recent_insert(char*,char*); + +// workouts +#define WORKOUT_TABLE_NAME_SQL "workouts" +#define WORKOUT_CREATE_TABLE_SQL \ + "CREATE TABLE IF NOT EXISTS `" WORKOUT_TABLE_NAME_SQL "` ( " \ + "`name` TEXT NOT NULL PRIMARY KEY, " \ + "`attributes` INT DEFAULT 0" \ + ");" + +#define WORKOUT_GET_BASE_SQL "SELECT " \ + "`" WORKOUT_TABLE_NAME_SQL "`.name, " \ + "`" WORKOUT_TABLE_NAME_SQL "`.attributes, " \ + "`" RECENT_TABLE_NAME_SQL "`.date as last " \ + "FROM `" WORKOUT_TABLE_NAME_SQL "` LEFT JOIN "\ + "(SELECT name,date FROM `" RECENT_TABLE_NAME_SQL "` GROUP BY `name` HAVING MAX(date(`date`))) as `" RECENT_TABLE_NAME_SQL "`" \ + " ON `" WORKOUT_TABLE_NAME_SQL "`.name = `" RECENT_TABLE_NAME_SQL "`.name" + +#define WORKOUT_GET_SQL WORKOUT_GET_BASE_SQL " WHERE (attributes & ?1) = ?1 AND (~attributes & ?2) = ?2 ORDER BY `last` DESC, `" WORKOUT_TABLE_NAME_SQL "`.name ASC LIMIT ?;" +#define WORKOUT_GET_SEARCH_SQL WORKOUT_GET_BASE_SQL " WHERE `" WORKOUT_TABLE_NAME_SQL "`.name LIKE ('%' || ? || '%') AND (attributes & ?2) = ?2 AND (~attributes & ?3) = ?3 ORDER BY `last` DESC, `" WORKOUT_TABLE_NAME_SQL "`.name ASC LIMIT ?;" +int workout_get(char*,char*,int,void (*)(const unsigned char*,int,const unsigned char*)); + +#define WORKOUT_INSERT_SQL "INSERT INTO " WORKOUT_TABLE_NAME_SQL " (name,attributes) VALUES (?,?);" +int workout_insert(char*, unsigned int); + +int workout_toggle(char*,char*); +void workout_toggle_helper(const unsigned char*,int,const unsigned char*); + +#define WORKOUT_UPDATE_SQL "UPDATE `" WORKOUT_TABLE_NAME_SQL "` SET name = ?, attributes = ? WHERE name = ?;" +int workout_update(char*,char*,int); + +#define CREATE_SCHEMA_SQL ATTRIBUTE_CREATE_TABLE_SQL RECENT_CREATE_TABLE_SQL WORKOUT_CREATE_TABLE_SQL + +int setup(); + +#endif \ No newline at end of file diff --git a/include/default.h b/include/default.h new file mode 100644 index 0000000..7706e2e --- /dev/null +++ b/include/default.h @@ -0,0 +1,11 @@ +#ifndef __DEFAULT_H_ +#define __DEFAULT_H_ + +#include +#include + +#include + +int defaults(); + +#endif \ No newline at end of file diff --git a/include/ls.h b/include/ls.h new file mode 100644 index 0000000..d87e3ef --- /dev/null +++ b/include/ls.h @@ -0,0 +1,15 @@ +#ifndef __LS_H_ +#define __LS_H_ + +#include +#include +#include + +#include +#include + +int ls(int,int,char**); +void print_header(const unsigned char*); +void print_workout(const unsigned char*,int,const unsigned char*); + +#endif \ No newline at end of file diff --git a/include/main.h b/include/main.h new file mode 100644 index 0000000..7d60911 --- /dev/null +++ b/include/main.h @@ -0,0 +1,27 @@ +#ifndef __MAIN_H_ +#define __MAIN_H_ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define UTIL_ADD "add" +#define UTIL_ATTR "attr" +#define UTIL_LS "ls" +#define UTIL_NEW "new" +#define UTIL_RECENT "recent" +#define UTIL_TOGGLE "toggle" +#define UTIL_VERSION "version" + +int main(int,char**); + +#endif \ No newline at end of file diff --git a/include/new.h b/include/new.h new file mode 100644 index 0000000..4040060 --- /dev/null +++ b/include/new.h @@ -0,0 +1,13 @@ +#ifndef __NEW_H_ +#define __NEW_H_ + +#include +#include + +#include +#include +#include + +int new_workout(int,int,char**); + +#endif \ No newline at end of file diff --git a/include/opt.h b/include/opt.h new file mode 100644 index 0000000..980d45f --- /dev/null +++ b/include/opt.h @@ -0,0 +1,38 @@ +#ifndef __OPT_H_ +#define __OPT_H_ + +#include +#include +#include +#include +#include + +// global options +struct options { + char *db_location; + char *homedir; + int rows; + unsigned char verbose; +}; + +extern struct options global_opts; + +enum option_code { + OPTION_ERROR, + OPTION_EXIT, + OPTION_HELP, + OPTION_INVALID, + OPTION_NO_MORE, + OPTION_SUCCESS +}; + +int option(char*); +int long_option(char*); +int short_option(char*); + +// specific option setters +int set_homedir(char*); +void set_rows(int); +void set_verbose(unsigned char); + +#endif \ No newline at end of file diff --git a/include/recent.h b/include/recent.h new file mode 100644 index 0000000..fe5337b --- /dev/null +++ b/include/recent.h @@ -0,0 +1,11 @@ +#ifndef __RECENT_H_ +#define __RECENT_H_ + +#include + +#include + +void print_recent(const unsigned char*,const unsigned char*); +int recent(int,int,char**); + +#endif \ No newline at end of file diff --git a/include/toggle.h b/include/toggle.h new file mode 100644 index 0000000..8e7cce8 --- /dev/null +++ b/include/toggle.h @@ -0,0 +1,12 @@ +#ifndef __TOGGLE_H_ +#define __TOGGLE_H_ + +#include +#include + +#include +#include + +int toggle(int,int,char**); + +#endif \ No newline at end of file diff --git a/include/usage.h b/include/usage.h new file mode 100644 index 0000000..70ae527 --- /dev/null +++ b/include/usage.h @@ -0,0 +1,8 @@ +#ifndef __USAGE_H_ +#define __USAGE_H_ + +#include + +void usage(); + +#endif \ No newline at end of file diff --git a/server/Makefile.am b/server/Makefile.am new file mode 100644 index 0000000..9f424b7 --- /dev/null +++ b/server/Makefile.am @@ -0,0 +1,2 @@ +bin_PROGRAMS = workouts-server +workouts_server_SOURCES = server.c server.h \ No newline at end of file diff --git a/server/Makefile.old b/server/Makefile.old new file mode 100644 index 0000000..a154a22 --- /dev/null +++ b/server/Makefile.old @@ -0,0 +1,19 @@ +.DEFAULT: compile + +# compilation section +CC=gcc +CFLAGS=-g3 -Wall -Werror +TARGET=server + +compile: server.o + $(CC) -o $(TARGET) server.o $(CFLAGS) + +%.o: %.c + $(CC) -c $^ -o $@ $(CFLAGS) + +start: + ./$(TARGET) + +clean: + rm -f $(TARGET) + find . -type f -name "*.o" -delete \ No newline at end of file diff --git a/server/configure.ac b/server/configure.ac new file mode 100644 index 0000000..a64fe09 --- /dev/null +++ b/server/configure.ac @@ -0,0 +1,29 @@ +AC_PREREQ([2.69]) +AC_INIT([workouts-server], [0.0.1]) + +# Store build files not in main directory +AC_CONFIG_AUX_DIR([build-aux]) + +AM_INIT_AUTOMAKE([foreign -Wall -Werror]) + +AC_CONFIG_SRCDIR([server.c]) +AC_CONFIG_HEADERS([config.h]) + +# Checks for programs. +AC_PROG_CC + +# Checks for libraries. + +# Checks for header files. +AC_CHECK_HEADERS([netdb.h netinet/in.h stdlib.h string.h sys/socket.h unistd.h]) + +# Checks for typedefs, structures, and compiler characteristics. +AC_TYPE_OFF_T + +# Checks for library functions. +AC_FUNC_FORK +AC_CHECK_FUNCS([memset socket]) + +AC_CONFIG_FILES([Makefile]) + +AC_OUTPUT diff --git a/server/server.c b/server/server.c new file mode 100644 index 0000000..eba2b4f --- /dev/null +++ b/server/server.c @@ -0,0 +1,273 @@ +#include +#include + +#define PORT "8080" +#define BACKLOG 10 + +int main(int argc, char **argv) { + struct addrinfo hints, *res; + memset(&hints, 0, sizeof hints); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + hints.ai_flags = AI_PASSIVE; + + getaddrinfo(NULL, PORT, &hints, &res); + + int sockfd; + if((sockfd=socket(PF_INET,SOCK_STREAM,0))==-1) { return EXIT_FAILURE; } + + int yes = 1; + if (setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int))==-1) { return EXIT_FAILURE; } + + if (bind(sockfd,res->ai_addr,res->ai_addrlen)==-1) { return EXIT_FAILURE; } + if (listen(sockfd, BACKLOG) == -1) { return EXIT_FAILURE; } + + struct sigaction sa; + sa.sa_handler = sigchld_handler; // reap all dead processes + sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_RESTART; + if(sigaction(SIGCHLD,&sa,NULL)==-1) { return EXIT_FAILURE; } + + printf("server started on port %s\nwaiting for connections...\n",PORT); + + while(1) { // main accept() loop + int new_fd; + if((new_fd=accept(sockfd,NULL,NULL))==-1) { continue; } + + if(!fork()) { // this is the child process + close(sockfd); // child doesn't need the listener + + request(new_fd); + close(new_fd); + + exit(EXIT_SUCCESS); + } + close(new_fd); // parent doesn't need this + } + + return EXIT_SUCCESS; +} + +void request(int sock) { + char buf[1024]; + FILE *fp = NULL; + + if(recv(sock,buf,1024,0)==-1) { perror("recv"); } + + if(memcmp(buf,"GET / HTTP/1.1\r\n",16)==0) { + fp = fopen("index.html","r"); + } else if(memcmp(buf,"GET /workouts.js HTTP/1.1\r\n",16)==0) { + fp = fopen("workouts.js","r"); + } else if(memcmp(buf,"POST ",5)==0) { + char *body_p; + int body_len = body(buf,1024,&body_p); + if(body_len>0) { + passthru(sock,body_p,body_len); + return; + } else { + http_error(sock); + return; + } + } else { + http_not_found(sock); + return; + } + + if(NULL==fp) { + perror("fopen"); + http_not_found(sock); + return; + } + + struct stat stats; + int fd = fileno(fp); + if(fstat(fd,&stats)==-1) { + perror("fstat"); + http_error(sock); + return; + } + + if(header(sock,stats.st_size)<0) { + http_error(sock); + return; + } + + off_t offset = 0; + if(sendfile(sock,fileno(fp),&offset,stats.st_size)==-1) { perror("sendfile"); } + + if(fclose(fp)!=0) { perror("fclose"); } +} + +int header(int sock, long int size) { + char buf[1024]; + int len; + if(size>=0) { + len = sprintf(buf,HTTP_RESPONSE_HEADER_CONTENT_LENGTH,size); + if(len<0) { return -1; } + } + + if(send(sock,HTTP_RESPONSE_OK,HTTP_RESPONSE_OK_LENGTH,0)==-1) { perror("send"); } + if(send(sock,HTTP_RESPONSE_HEADER_SERVER,HTTP_RESPONSE_HEADER_SERVER_LENGTH,0)==-1) { perror("send"); } + + if(size<0) { // transfer encoding + if(send( + sock, + HTTP_RESPONSE_HEADER_TRANSFER_ENCODING, + HTTP_RESPONSE_HEADER_TRANSFER_ENCODING_LENGTH, + 0 + )==-1) { perror("send"); } + } else { // Content-Length + if(send(sock,buf,len,0)==-1) { perror("send"); } + } + + if(send( + sock, + HTTP_RESPONSE_HEADER_CONTENT_TYPE, + HTTP_RESPONSE_HEADER_CONTENT_TYPE_LENGTH, + 0 + )==-1) { perror("send"); } + if(send( + sock, + HTTP_RESPONSE_HEADER_DONE, + HTTP_RESPONSE_HEADER_DONE_LENGTH, + 0 + )==-1) { perror("send"); } + + return 1; +} + +void http_not_found(int sock) { + if(send(sock,HTTP_RESPONSE_NOT_FOUND,HTTP_RESPONSE_NOT_FOUND_LENGTH,0)==-1) { perror("send"); } + if(send(sock,HTTP_RESPONSE_HEADER_DONE,HTTP_RESPONSE_HEADER_DONE_LENGTH,0)==-1) { perror("send"); } +} + +void http_error(int sock) { + if(send(sock,HTTP_RESPONSE_INTERNAL_SERVER_ERROR,HTTP_RESPONSE_INTERNAL_SERVER_ERROR_LENGTH,0)==-1) { perror("send"); } + if(send(sock,HTTP_RESPONSE_HEADER_DONE,HTTP_RESPONSE_HEADER_DONE_LENGTH,0)==-1) { perror("send"); } +} + +void sigchld_handler(int s) { + // waitpid() might overwrite errno, so we save and restore it: + int saved_errno = errno; + while(waitpid(-1, NULL, WNOHANG) > 0); + errno = saved_errno; +} + +int body(char *buf, int buf_len, char **body_p) { + int body_len = -1; + int pos = 0; + while(pos +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define HTTP_SEPARATOR "\r\n" +#define HTTP_SEPARATOR_LENGTH 2 + +#define HTTP_RESPONSE_OK "HTTP/1.1 200 OK\r\n" +#define HTTP_RESPONSE_OK_LENGTH 17 +#define HTTP_RESPONSE_NOT_FOUND "HTTP/1.1 404 Not Found\r\n" +#define HTTP_RESPONSE_NOT_FOUND_LENGTH 24 +#define HTTP_RESPONSE_INTERNAL_SERVER_ERROR "HTTP/1.1 500 Internal Server Error\r\n" +#define HTTP_RESPONSE_INTERNAL_SERVER_ERROR_LENGTH 36 +#define HTTP_RESPONSE_BAD_REQUEST "HTTP/1.1 400 Bad Request\r\n" +#define HTTP_RESPONSE_BAD_REQUEST_LENGTH 26 +#define HTTP_RESPONSE_HEADER_SERVER "Server: workouts\r\n" +#define HTTP_RESPONSE_HEADER_SERVER_LENGTH 18 +#define HTTP_RESPONSE_HEADER_CONTENT_LENGTH "Content-Length: %ld\r\n" +#define HTTP_RESPONSE_HEADER_CONTENT_TYPE "Content-Type: text/html; charset=UTF-8\r\n" +#define HTTP_RESPONSE_HEADER_CONTENT_TYPE_LENGTH 40 +#define HTTP_RESPONSE_HEADER_TRANSFER_ENCODING "Transfer-Encoding: chunked\r\n" +#define HTTP_RESPONSE_HEADER_TRANSFER_ENCODING_LENGTH 28 +#define HTTP_RESPONSE_HEADER_TRANSFER_CHUNK "%x" HTTP_SEPARATOR +#define HTTP_RESPONSE_HEADER_DONE HTTP_SEPARATOR +#define HTTP_RESPONSE_HEADER_DONE_LENGTH HTTP_SEPARATOR_LENGTH + +#define HTTP_REQUEST_HEADER_CONTENT_LENGTH "Content-Length: " +#define HTTP_REQUEST_HEADER_CONTENT_LENGTH_LENGTH 16 + +int main(int,char**); +int header(int,long int); +void http_not_found(int); +void http_error(int); +void request(int); +void sigchld_handler(int); +int body(char*,int,char**); +void passthru(int,char*,int); + +#endif \ No newline at end of file diff --git a/src/add.c b/src/add.c new file mode 100644 index 0000000..bbad5b1 --- /dev/null +++ b/src/add.c @@ -0,0 +1,39 @@ +#include + +int add(int i, int argc, char **argv) { + if(i==argc) { + printf("`workouts add` requires at least 1 argument\n"); + usage(); + return EXIT_FAILURE; + } + + + char buf[11]; + if(i+1==argc) { // no date given + time_t t = time(NULL); + struct tm now = *localtime(&t); + if(strftime(buf,11,"%Y-%m-%d",&now)==0) { return EXIT_FAILURE; } + } else { + int YY, MM, DD; + struct tm when = {0}; + + if(sscanf(argv[i+1],"%d-%d-%d", &YY, &MM, &DD)!=3) { + printf("invalid date given\n"); + return EXIT_FAILURE; + } + + when.tm_year = YY - 1900; + when.tm_mon = MM - 1; + when.tm_mday = DD; + if(strftime(buf,11,"%Y-%m-%d",&when)==0) { return EXIT_FAILURE; } + } + + if(recent_insert(argv[i],buf)<0) { + printf("add failed\n"); + return EXIT_FAILURE; + } + + printf("added workout %s on %s\n",argv[i],buf); + + return EXIT_SUCCESS; +} \ No newline at end of file diff --git a/src/attr.c b/src/attr.c new file mode 100644 index 0000000..227f57b --- /dev/null +++ b/src/attr.c @@ -0,0 +1,48 @@ +#include + +int attr(int i, int argc, char **argv) { + if(i>argc) { return EXIT_FAILURE; } + + if(i==argc) { return attr_ls(); } + + if(0==memcmp(argv[i],"add",3)) { + if(i+2!=argc) { + printf("wrong number of arguments for attr add\n"); + usage(); + return EXIT_FAILURE; + } + + return attr_add(argv[i+1]); + } + + if(i+1!=argc) { + printf("unknown command attr \"%s\"\n",argv[i+1]); + usage(); + return EXIT_FAILURE; + } + + return attr_ls(); +} + +int attr_add(char *name) { + if(attribute_insert(name)<0) { + printf("attribute insert failed\n"); + return EXIT_FAILURE; + } + + printf("New attribute added: %s\n",name); + return EXIT_SUCCESS; +} + +int attr_ls() { + if(attribute_get(&print_attr)<0) { + printf("command failed\n"); + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} + +void print_attr(const unsigned char *name) { + printf("%s\n",name); +} \ No newline at end of file diff --git a/src/classes/workout.js b/src/classes/workout.js deleted file mode 100644 index 66e2412..0000000 --- a/src/classes/workout.js +++ /dev/null @@ -1,113 +0,0 @@ -import {constants} from '../constants.js'; -const {DEFAULT_ATTRIBUTES} = constants; - -export default class workout { - constructor(toClone) { - if((toClone !== void(0))&&(toClone instanceof workout)) { - this.attributes = {...toClone.attributes}; - this.datesDone = [...toClone.datesDone]; - this.name = toClone.name; - this.description = toClone.description; - } else { - this.attributes = {...DEFAULT_ATTRIBUTES}; - this.datesDone = []; - this.name = "New Workout"; - this.description = ""; - if(typeof toClone == "object") { - if(toClone.attributes !== void(0)) { - for(let i in toClone.attributes) { - if(toClone.attributes[i] === true) { - try { - this.toggleAttribute(i); - } catch(err) { - - } - } - } - } - if(toClone.datesDone !== void(0)) { - try { - this.add(toClone.datesDone); - } catch(err) { - - } - } - if(toClone.name !== void(0)) { - try { - this.setName(toClone.name); - } catch(err) { - - } - } - if(toClone.description !== void(0)) { - try { - this.changeDescription(toClone.description); - } catch(err) { - - } - } - } - } - } - add(dates) { // add new workout to datesDone - if(!(dates instanceof Array)) { - throw new TypeError('Workout::add(dates) expects parameter `dates` to be an array of dates'); - } - dates = dates.map((date) => Date.parse(date)); - if(!(dates.every((x) => !isNaN(x)))) { - throw new TypeError('Workout::add(dates) expects parameter `dates` to be an array of dates'); - } - this.datesDone = [ - ...new Set([ - ...this.datesDone, - ...dates.map((date) => { - return new Date(date) - .toISOString() - .split("T")[0]; - }) - ]) - ]; - this.datesDone.sort((a,b) => { - return a { - const {workouts} = state; - return { - workouts - }; -} - -const mapStateToProps = (state) => { - const {view} = state.view; - return { - view - }; -}; - -const mapDispatchToProps = (dispatch,ownProps) => { - return { - switchView:(view) => { - dispatch({ - type:CHANGE_VIEW, - workouts:ownProps.workouts, - view - }); - dispatch({ - type:SORT_VIEW, - key:(view=="manage")?"last_done":"date", - order:(view==="manage")?"asc":"desc", - shift:false - }); - } - }; -}; - - -export const main = connect( - mapStateToParentProps -)(connect( - mapStateToProps, - mapDispatchToProps -)(Main)); \ No newline at end of file diff --git a/src/components/manage/manage.js b/src/components/manage/manage.js deleted file mode 100644 index 5d8f196..0000000 --- a/src/components/manage/manage.js +++ /dev/null @@ -1,66 +0,0 @@ -import {connect} from 'react-redux'; - -import Manage from './manage.component.js'; - -import {constants} from '../../constants.js'; -const {ADD_WORKOUT,CHANGE_ATTRIBUTE,CHANGE_WORKOUT_DESCRIPTION,CHANGE_WORKOUT_NAME,NEW_WORKOUT,SORT_VIEW} = constants; - -const mapStateToProps = (state) => { - return { - workouts:state.view.data - }; -}; - -const mapDispatchToProps = (dispatch) => { - return { - changeDescription:(name,val) => { - dispatch({ - type:CHANGE_WORKOUT_DESCRIPTION, - workout:name, - description:val - }); - }, - changeName:(name,val) => { - dispatch({ - type:CHANGE_WORKOUT_NAME, - workout:name, - name:val - }); - }, - completeWorkout:(workout) => { - const now = new Date(); - dispatch({ - type:ADD_WORKOUT, - name:workout, - toAdd:[new Date(now.getTime() - (now.getTimezoneOffset() * 60000 )) - .toISOString() - .split("T")[0] - ] - }); - }, - newWorkout:() => { - dispatch({ - type:NEW_WORKOUT - }); - }, - sort:(key,shift) => { - dispatch({ - type:SORT_VIEW, - key, - shift - }); - }, - toggleAttribute:(name,attr) => { - dispatch({ - type:CHANGE_ATTRIBUTE, - workout:name, - attribute:attr - }); - } - } -}; - -export const manage = connect( - mapStateToProps, - mapDispatchToProps -)(Manage); \ No newline at end of file diff --git a/src/components/recent/recent.js b/src/components/recent/recent.js deleted file mode 100644 index 1ce502a..0000000 --- a/src/components/recent/recent.js +++ /dev/null @@ -1,37 +0,0 @@ -import {connect} from 'react-redux'; - -import Recent from './recent.component.js'; - -import {constants} from '../../constants.js'; -const {CHANGE_WORKOUT_DATE,SORT_VIEW} = constants; - -const mapStateToProps = (state) => { - return { - data:state.view.data.slice(0,100) - }; -} - -const mapDispatchToProps = (dispatch) => { - return { - handleDateChange:(workout,old,date) => { - dispatch({ - type:CHANGE_WORKOUT_DATE, - workout, - old, - new:date - }); - }, - handleSort:(key) => { - dispatch({ - type:SORT_VIEW, - key, - shift:false - }); - } - }; -} - -export const recent = connect( - mapStateToProps, - mapDispatchToProps -)(Recent); \ No newline at end of file diff --git a/src/data/attr.c b/src/data/attr.c new file mode 100644 index 0000000..daf9636 --- /dev/null +++ b/src/data/attr.c @@ -0,0 +1,131 @@ +#include + +int attribute_count() { + int count = 0; + + sqlite3 *db_p = NULL; + sqlite3_stmt *stmt_p = NULL; + + if(sqlite3_open_v2(global_opts.db_location,&db_p,SQLITE_OPEN_READWRITE,NULL)!=SQLITE_OK) { goto cleanup; } + + if(sqlite3_prepare_v2(db_p,ATTRIBUTE_COUNT_SQL,-1,&stmt_p,NULL)!=SQLITE_OK) { goto cleanup; } + + if(sqlite3_step(stmt_p)!=SQLITE_ROW) { goto cleanup; } + + count = sqlite3_column_int(stmt_p,0); + + if(sqlite3_finalize(stmt_p)!=SQLITE_OK) { goto cleanup; } + stmt_p = NULL; + + if(sqlite3_close_v2(db_p)!=SQLITE_OK) { goto cleanup; } + + return count; + cleanup: + if(stmt_p!=NULL) { sqlite3_finalize(stmt_p); } + if(db_p!=NULL) { sqlite3_close_v2(db_p); } + return -1; +} + +int attribute_get(void (*print)(const unsigned char*)) { + sqlite3 *db_p = NULL; + sqlite3_stmt *stmt_p = NULL; + + if(sqlite3_open_v2(global_opts.db_location,&db_p,SQLITE_OPEN_READWRITE,NULL)!=SQLITE_OK) { goto cleanup; } + + if(sqlite3_prepare_v2(db_p,ATTRIBUTE_GET_SQL,-1,&stmt_p,NULL)!=SQLITE_OK) { goto cleanup; } + + int ret; + while((ret = sqlite3_step(stmt_p))==SQLITE_ROW) { + const unsigned char *name = sqlite3_column_text(stmt_p,0); + print(name); + } + + if(ret!=SQLITE_DONE) { goto cleanup; } + + if(sqlite3_finalize(stmt_p)!=SQLITE_OK) { goto cleanup; } + stmt_p = NULL; + + if(sqlite3_close_v2(db_p)!=SQLITE_OK) { goto cleanup; } + + return 1; + cleanup: + if(stmt_p!=NULL) { sqlite3_finalize(stmt_p); } + if(db_p!=NULL) { sqlite3_close_v2(db_p); } + return -1; +} + +struct attribute_indexer { + int i; + int index; + char *name; +}; + +struct attribute_indexer indexer = { + 0, + 0, + NULL, +}; + +int attribute_index(char *name) { + indexer.i = 0; + indexer.index = -1; + indexer.name = name; + + if(attribute_get(&attribute_index_helper)<0) { return -1; } + + return indexer.index; +} + +void attribute_index_helper(const unsigned char *name) { + if(strcmp(indexer.name,(const char*) name)==0) { + indexer.index = indexer.i; + } + indexer.i++; +} + +int attribute_insert(char *name) { + sqlite3 *db_p = NULL; + sqlite3_stmt *stmt_p = NULL; + + if(sqlite3_open_v2(global_opts.db_location,&db_p,SQLITE_OPEN_READWRITE,NULL)!=SQLITE_OK) { goto cleanup; } + + if(sqlite3_prepare_v2(db_p,ATTRIBUTE_INSERT_SQL,-1,&stmt_p,NULL)!=SQLITE_OK) { goto cleanup; } + if(sqlite3_bind_text(stmt_p,1,name,-1,SQLITE_STATIC)!=SQLITE_OK) { goto cleanup; } + + if(sqlite3_step(stmt_p)!=SQLITE_DONE) { goto cleanup; } + if(sqlite3_finalize(stmt_p)!=SQLITE_OK) { goto cleanup; } + stmt_p = NULL; + + if(sqlite3_close_v2(db_p)!=SQLITE_OK) { goto cleanup; } + + return 1; + cleanup: + if(stmt_p!=NULL) { sqlite3_finalize(stmt_p); } + if(db_p!=NULL) { sqlite3_close_v2(db_p); } + return -1; +} + +int attribute_parse(char *str, int *required, int *exclude) { + if(NULL==str) { return -1; } + if(NULL==required) { return -1; } + + int len = strlen(str); + for(int i=0;i + +int recent_get(int limit,void (*f)(const unsigned char*,const unsigned char*)) { + sqlite3 *db_p = NULL; + sqlite3_stmt *stmt_p = NULL; + + if(sqlite3_open_v2(global_opts.db_location,&db_p,SQLITE_OPEN_READWRITE,NULL)!=SQLITE_OK) { goto cleanup; } + + if(sqlite3_prepare_v2(db_p,RECENT_GET_SQL,-1,&stmt_p,NULL)!=SQLITE_OK) { goto cleanup; } + if(sqlite3_bind_int(stmt_p,1,limit)!=SQLITE_OK) { goto cleanup; } + + int ret; + while((ret = sqlite3_step(stmt_p))==SQLITE_ROW) { + const unsigned char *name_p = sqlite3_column_text(stmt_p,0); + const unsigned char *date_p = sqlite3_column_text(stmt_p,1); + f(name_p,date_p); + } + + if(ret!=SQLITE_DONE) { goto cleanup; } + + if(sqlite3_finalize(stmt_p)!=SQLITE_OK) { goto cleanup; } + stmt_p = NULL; + + if(sqlite3_close_v2(db_p)!=SQLITE_OK) { goto cleanup; } + + return 1; + cleanup: + if(stmt_p!=NULL) { sqlite3_finalize(stmt_p); } + if(db_p!=NULL) { sqlite3_close_v2(db_p); } + return -1; +} + +int recent_insert(char *workout, char *date) { + sqlite3 *db_p = NULL; + sqlite3_stmt *stmt_p = NULL; + + if(sqlite3_open_v2(global_opts.db_location,&db_p,SQLITE_OPEN_READWRITE,NULL)!=SQLITE_OK) { goto cleanup; } + + if(sqlite3_exec(db_p,"PRAGMA foreign_keys = ON;",NULL,NULL,NULL)!=SQLITE_OK) { goto cleanup; } + + if(sqlite3_prepare_v2(db_p,RECENT_INSERT_SQL,-1,&stmt_p,NULL)!=SQLITE_OK) { goto cleanup; } + if(sqlite3_bind_text(stmt_p,1,workout,-1,SQLITE_STATIC)!=SQLITE_OK) { goto cleanup; } + if(sqlite3_bind_text(stmt_p,2,date,-1,SQLITE_STATIC)!=SQLITE_OK) { goto cleanup; } + + if(sqlite3_step(stmt_p)!=SQLITE_DONE) { goto cleanup; } + if(sqlite3_finalize(stmt_p)!=SQLITE_OK) { goto cleanup; } + stmt_p = NULL; + + if(sqlite3_close_v2(db_p)!=SQLITE_OK) { goto cleanup; } + + return 1; + cleanup: + if(stmt_p!=NULL) { sqlite3_finalize(stmt_p); } + if(db_p!=NULL) { sqlite3_close_v2(db_p); } + return -1; +} \ No newline at end of file diff --git a/src/data/setup.c b/src/data/setup.c new file mode 100644 index 0000000..5d96a32 --- /dev/null +++ b/src/data/setup.c @@ -0,0 +1,16 @@ +#include + +int setup() { + sqlite3 *db_p = NULL; + + if(sqlite3_open_v2(global_opts.db_location,&db_p,SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,NULL)!=SQLITE_OK) { goto cleanup; } + + if(sqlite3_exec(db_p,CREATE_SCHEMA_SQL,NULL,NULL,NULL)!=SQLITE_OK) { goto cleanup; } + + if(sqlite3_close_v2(db_p)!=SQLITE_OK) { goto cleanup; } + + return 1; + cleanup: + if(db_p!=NULL) { sqlite3_close_v2(db_p); } + return -1; +} \ No newline at end of file diff --git a/src/data/workout.c b/src/data/workout.c new file mode 100644 index 0000000..a7e3472 --- /dev/null +++ b/src/data/workout.c @@ -0,0 +1,137 @@ +#include + +int workout_get(char *term, char *filter, int limit, void (*print_row)(const unsigned char*,int,const unsigned char*)) { + sqlite3 *db_p = NULL; + sqlite3_stmt *stmt_p = NULL; + + int required = 0; + int exclude = 0; + if(NULL!=filter) { + if(attribute_parse(filter,&required,&exclude)<0) { return -1; } + } + + if(sqlite3_open_v2(global_opts.db_location,&db_p,SQLITE_OPEN_READWRITE,NULL)!=SQLITE_OK) { goto cleanup; } + + if(NULL==term) { + if(sqlite3_prepare_v2(db_p,WORKOUT_GET_SQL,-1,&stmt_p,NULL)!=SQLITE_OK) { goto cleanup; } + if(sqlite3_bind_int(stmt_p,1,required)!=SQLITE_OK) { goto cleanup; } + if(sqlite3_bind_int(stmt_p,2,exclude)!=SQLITE_OK) { goto cleanup; } + if(sqlite3_bind_int(stmt_p,3,limit)!=SQLITE_OK) { goto cleanup; } + } else { + if(sqlite3_prepare_v2(db_p,WORKOUT_GET_SEARCH_SQL,-1,&stmt_p,NULL)!=SQLITE_OK) { goto cleanup; } + if(sqlite3_bind_text(stmt_p,1,term,-1,SQLITE_STATIC)!=SQLITE_OK) { goto cleanup; } + if(sqlite3_bind_int(stmt_p,2,required)!=SQLITE_OK) { goto cleanup; } + if(sqlite3_bind_int(stmt_p,3,exclude)!=SQLITE_OK) { goto cleanup; } + if(sqlite3_bind_int(stmt_p,4,limit)!=SQLITE_OK) { goto cleanup; } + } + + int ret; + while((ret = sqlite3_step(stmt_p))==SQLITE_ROW) { + const unsigned char *name_p = sqlite3_column_text(stmt_p,0); + const unsigned char *last_p = sqlite3_column_text(stmt_p,2); + print_row(name_p,sqlite3_column_int(stmt_p,1),last_p); + } + + if(ret!=SQLITE_DONE) { goto cleanup; } + + if(sqlite3_finalize(stmt_p)!=SQLITE_OK) { goto cleanup; } + stmt_p = NULL; + + if(sqlite3_close_v2(db_p)!=SQLITE_OK) { goto cleanup; } + + return 1; + cleanup: + if(stmt_p!=NULL) { sqlite3_finalize(stmt_p); } + if(db_p!=NULL) { sqlite3_close_v2(db_p); } + return -1; +} + +int workout_insert(char *name, unsigned int flags) { + sqlite3 *db_p = NULL; + sqlite3_stmt *stmt_p = NULL; + + if(sqlite3_open_v2(global_opts.db_location,&db_p,SQLITE_OPEN_READWRITE,NULL)!=SQLITE_OK) { goto cleanup; } + + if(sqlite3_prepare_v2(db_p,WORKOUT_INSERT_SQL,-1,&stmt_p,NULL)!=SQLITE_OK) { goto cleanup; } + if(sqlite3_bind_text(stmt_p,1,name,-1,SQLITE_STATIC)!=SQLITE_OK) { goto cleanup; } + if(sqlite3_bind_int(stmt_p,2,flags)!=SQLITE_OK) { goto cleanup; } + + if(sqlite3_step(stmt_p)!=SQLITE_DONE) { goto cleanup; } + if(sqlite3_finalize(stmt_p)!=SQLITE_OK) { goto cleanup; } + stmt_p = NULL; + + if(sqlite3_close_v2(db_p)!=SQLITE_OK) { goto cleanup; } + + return 1; + cleanup: + if(stmt_p!=NULL) { sqlite3_finalize(stmt_p); } + if(db_p!=NULL) { sqlite3_close_v2(db_p); } + return -1; +} + +struct workout_toggler { + char *name; + int attributes; +}; + +struct workout_toggler toggler = { + NULL, + 0 +}; + +int workout_toggle(char *name, char *attribute) { + int index = attribute_index(attribute); + if(index<0) { return -1; } + + toggler.name = name; + toggler.attributes = 0; + + if(workout_get( + name, /* term */ + NULL, /* filter */ + -1, /* limit */ + &workout_toggle_helper /* print function */ + )<0) { return -1; } + + if(toggler.name!=NULL) { return -1; } + + toggler.attributes ^= 1< + +int defaults() { + char *p; + + // homedir + p = getenv("WORKOUTS_HOME"); + if(p==NULL) { + p = getenv("HOME"); + if(NULL==p) { + printf("HOME or WORKOUTS_HOME env variable must be defined\n"); + return -1; + } + } + + if(set_homedir(p)<0) { + printf("HOME or WORKOUTS_HOME env value invalid\n"); + return -1; + } + + set_rows(-1); + + set_verbose(0); + + return 0; +} \ No newline at end of file diff --git a/src/index.js b/src/index.js deleted file mode 100644 index b40b47e..0000000 --- a/src/index.js +++ /dev/null @@ -1,49 +0,0 @@ -import {render} from 'react-dom'; - -import {createStore} from 'redux'; - -import {Provider} from 'react-redux'; - -import reducers from 'reducers/combined.js'; - -import {main} from 'components/main/main.js'; - -import workout from 'classes/workout.js'; - -import data from '../workouts.json'; - -const defaultSaveFunction = (data) => { - const content = JSON.stringify(data); - var a = document.createElement('a'); - var blob = new Blob([content], {'type':'application/octet-stream'}); - a.href = window.URL.createObjectURL(blob); - a.download = 'workouts.json'; - document.body.appendChild(a); - a.click(); - setTimeout(() => { - document.body.removeChild(a); - window.URL.revokeObjectURL(blob); - }, 0); -}; - -window.workoutsInit = (anchor,saveCb) => { - if(!(anchor instanceof HTMLElement)) { - throw new Error("Invalid anchor"); - } - // Import data into store - if((data !== void(0))&&(typeof data =="object")) { - for(let i in data) { - data[i] = new workout(data[i]); - } - } - const store = createStore(reducers,{workouts:data}); - if(typeof saveCb != "function") { - saveCb = defaultSaveFunction; - } - render( - createElement(Provider,{store}, - createElement(main,{save:saveCb}) - ), - anchor - ); -}; \ No newline at end of file diff --git a/src/ls.c b/src/ls.c new file mode 100644 index 0000000..2ed755e --- /dev/null +++ b/src/ls.c @@ -0,0 +1,75 @@ +#include + +struct ls_helper { + int i; + int attr_count; +}; + +struct ls_helper helper = { + 0, + 0 +}; + +int ls(int i, int argc, char **argv) { + char *filter_p = NULL; + /* + Cases: + -filter by attribute value: workouts --filter 011xx100 + -search by name: workouts P90X + + All together: workouts --filter 01xx1001 P90X + + 0: must not have attribute + 1: must have attribute + x: can have attribute + */ + + helper.attr_count = attribute_count(); + if(attribute_get(&print_header)<0) { return -1; } + + if(i+10)&&(helper.i==0)) { + printf("Attributes:\t"); + } + printf("%s\t",name); + helper.i++; + if(helper.i==helper.attr_count) { + printf("\n"); + } +} + +#define PRINT_WORKOUT_FORMAT "%s [%d] [Last done: %s]\n" +#define PRINT_WORKOUT_FORMAT_LAST_NULL "%s [%d] [Last done: N/A]\n" + +void print_workout(const unsigned char *name, int attr_flags, const unsigned char *last) { + printf((NULL==last)?PRINT_WORKOUT_FORMAT_LAST_NULL:PRINT_WORKOUT_FORMAT,name,attr_flags,last); +} \ No newline at end of file diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..ddfbce9 --- /dev/null +++ b/src/main.c @@ -0,0 +1,61 @@ +#include +#include + +int main(int argc, char **argv) { + int i,ret; + + if(defaults()<0) { return EXIT_FAILURE; } + + i = 1; + do { + ret = option(argv[i]); + switch(ret) { + case OPTION_NO_MORE: + goto exit_options; + case OPTION_HELP: + usage(); + return EXIT_SUCCESS; + case OPTION_INVALID: + printf("invalid option: %s\n\n",argv[i]); + usage(); + return EXIT_FAILURE; + case OPTION_ERROR: + printf("unknown error occured\n"); + return EXIT_FAILURE; + case OPTION_EXIT: + return EXIT_FAILURE; + default: + i++; + break; + } + } while(ret>0); + + exit_options: + if(setup()<0) { return EXIT_FAILURE; } + char *cmd = argv[i]; + + if(NULL!=cmd) { + i++; + if(strcmp(cmd,UTIL_ADD)==0) { + return add(i,argc,argv); + } else if(strcmp(cmd,UTIL_ATTR)==0) { + return attr(i,argc,argv); + } else if(strcmp(cmd,UTIL_LS)==0) { + return ls(i,argc,argv); + } else if(strcmp(cmd,UTIL_NEW)==0) { + return new_workout(i,argc,argv); + } else if(strcmp(cmd,UTIL_RECENT)==0) { + return recent(i,argc,argv); + } else if(strcmp(cmd,UTIL_TOGGLE)==0) { + return toggle(i,argc,argv); + } else if(strcmp(cmd,UTIL_VERSION)==0) { + printf("Version: 0.0.0\n"); + return EXIT_SUCCESS; + } else { + // decrement to allow for args to ls + i--; + } + } + + return ls(i,argc,argv); +} \ No newline at end of file diff --git a/src/new.c b/src/new.c new file mode 100644 index 0000000..5ea4ecd --- /dev/null +++ b/src/new.c @@ -0,0 +1,38 @@ +#include + +int new_workout(int i, int argc, char **argv) { + if(i>=argc) { + printf("not enough arguments for new\n"); + usage(); + return EXIT_FAILURE; + } + + // check if attribute template provided + unsigned int attr_flags = 0; + if(i+1=0;j--) { + attr_flags <<= 1; + if(attr_p[j]=='1') { + attr_flags += 1; + } + } + } + + if(workout_insert(argv[i],attr_flags)<0) { + printf("workout insert failed\n"); + return EXIT_FAILURE; + } + + printf("New workout added: %s\n",argv[i]); + + return EXIT_SUCCESS; +} \ No newline at end of file diff --git a/src/opt.c b/src/opt.c new file mode 100644 index 0000000..d4905a0 --- /dev/null +++ b/src/opt.c @@ -0,0 +1,74 @@ +#include + +struct options global_opts = { + NULL, + NULL, + -1, + 0 +}; + +int option(char *str) { + int len; + + if(NULL==str) { return OPTION_NO_MORE; } + len = strlen(str); + if(len<2) { return OPTION_NO_MORE; } + + if('-'==str[0]) { + if('-'==str[1]) { + return long_option(&(str[2])); + } else { + return short_option(&(str[1])); + } + } + + return OPTION_NO_MORE; +} + +#define LONG_OPTION_HELP "help" +#define LONG_OPTION_HELP_LENGTH 4 +#define LONG_OPTION_HOMEDIR "homedir" +#define LONG_OPTION_HOMEDIR_LENGTH 7 +#define LONG_OPTION_ROWS "rows" +#define LONG_OPTION_ROWS_LENGTH 4 +#define LONG_OPTION_VERBOSE "verbose" +#define LONG_OPTION_VERBOSE_LENGTH 7 + +int long_option(char *str) { + if(memcmp(str,LONG_OPTION_HELP,LONG_OPTION_HELP_LENGTH)==0) { + return OPTION_HELP; + } else if(memcmp(str,LONG_OPTION_VERBOSE,LONG_OPTION_VERBOSE_LENGTH)==0) { + set_verbose(1); + return OPTION_SUCCESS; + } else if(memcmp(str,LONG_OPTION_HOMEDIR,LONG_OPTION_HOMEDIR_LENGTH)==0) { + int len = strlen(str); + len -= (LONG_OPTION_HOMEDIR_LENGTH+1); + if(len<1) { return OPTION_INVALID; } + + if(set_homedir(&(str[LONG_OPTION_HOMEDIR_LENGTH+1]))<0) { + printf("unable to set home directory: %s\nCheck directory exists and has correct permissions\n",&(str[LONG_OPTION_HOMEDIR_LENGTH+1])); + return OPTION_EXIT; + } + return OPTION_SUCCESS; + } else if(memcmp(str,LONG_OPTION_ROWS,LONG_OPTION_ROWS_LENGTH)==0) { + char *end_p; + set_rows(strtoul(&(str[LONG_OPTION_ROWS_LENGTH+1]),&end_p,10)); + return OPTION_SUCCESS; + } else { + return OPTION_INVALID; + } +} + +#define SHORT_OPTION_HELP 'h' +#define SHORT_OPTION_VERBOSE 'v' + +int short_option(char *str) { + if(SHORT_OPTION_HELP==str[0]) { + return OPTION_HELP; + } else if(SHORT_OPTION_VERBOSE==str[0]) { + set_verbose(1); + return OPTION_SUCCESS; + } else { + return OPTION_INVALID; + } +} \ No newline at end of file diff --git a/src/opt/homedir.c b/src/opt/homedir.c new file mode 100644 index 0000000..f79d628 --- /dev/null +++ b/src/opt/homedir.c @@ -0,0 +1,37 @@ +#include + +#define DB_FILENAME "workouts.db" +#define DB_FILENAME_LENGTH 11 + +int set_homedir(char *to_set) { + int len = strlen(to_set); + if(len<1) { return -1; } + + global_opts.homedir = malloc(sizeof(char)*(len+1)); + if(NULL==global_opts.homedir) { return -1; } + + global_opts.db_location = malloc(sizeof(char)*(len+DB_FILENAME_LENGTH+2)); + if(NULL==global_opts.db_location) { return -1; } + + strcpy(global_opts.homedir,to_set); + strcpy(global_opts.db_location,global_opts.homedir); + + for(int i=0;;i++) { + if(global_opts.db_location[i]=='\0') { + if(global_opts.db_location[i-1]!='/') { + strcat(global_opts.db_location,"/"); + } + break; + } + } + + strcat(global_opts.db_location,DB_FILENAME); + + DIR *dir = opendir(global_opts.homedir); + if(NULL==dir) { + return -1; + } + closedir(dir); + + return 1; +} \ No newline at end of file diff --git a/src/opt/rows.c b/src/opt/rows.c new file mode 100644 index 0000000..b65a674 --- /dev/null +++ b/src/opt/rows.c @@ -0,0 +1,5 @@ +#include + +void set_rows(int to_set) { + global_opts.rows = to_set; +} \ No newline at end of file diff --git a/src/opt/verbose.c b/src/opt/verbose.c new file mode 100644 index 0000000..934eb9e --- /dev/null +++ b/src/opt/verbose.c @@ -0,0 +1,9 @@ +#include + +void set_verbose(unsigned char val) { + if(val>0) { + global_opts.verbose = 1; + } else { + global_opts.verbose = 0; + } +} \ No newline at end of file diff --git a/src/recent.c b/src/recent.c new file mode 100644 index 0000000..c5eaf80 --- /dev/null +++ b/src/recent.c @@ -0,0 +1,19 @@ +#include + +void print_recent(const unsigned char *workout, const unsigned char *date) { + printf("%s\t%s\n",workout,date); +} + +int recent(int i, int argc, char **argv) { + if(i!=argc) { + printf("wrong number of arguments for recent\n"); + return EXIT_FAILURE; + } + + if(recent_get(global_opts.rows,&print_recent)<0) { + printf("command failed\n"); + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} diff --git a/src/reducers/workouts.js b/src/reducers/workouts.js deleted file mode 100644 index f74f1ff..0000000 --- a/src/reducers/workouts.js +++ /dev/null @@ -1,130 +0,0 @@ -import workout from '../classes/workout.js'; - -import {constants} from '../constants.js'; - -export default function workouts(state = {},action) { - const {ADD_WORKOUT,CHANGE_ATTRIBUTE,CHANGE_WORKOUT_DATE,CHANGE_WORKOUT_DESCRIPTION,CHANGE_WORKOUT_NAME,DEFAULT_ATTRIBUTES,DELETE_WORKOUT,NEW_WORKOUT,REMOVE_WORKOUT} = constants; - if(typeof action != "object") { - return state; - } - switch(action.type) { - case ADD_WORKOUT: - if(action.name === void(0)) { - return state; - } - if(!(state[action.name] instanceof workout)) { - return state; - } - const newStateAfterAdd = {...state}; - try { - newStateAfterAdd[action.name].add(action.toAdd); - return newStateAfterAdd; - } catch(err) { - return state; - } - case CHANGE_ATTRIBUTE: - if((action.workout === void(0))||(action.attribute === void(0))) { - return state; - } - if(state[action.workout] === void(0)) { - return state; - } - try { - const newStateAfterChangeAttribute = {...state}; - newStateAfterChangeAttribute[action.workout].toggleAttribute(action.attribute); - return newStateAfterChangeAttribute; - } catch(err) { - return state; - } - case CHANGE_WORKOUT_DATE: - if(action.workout === void(0)) { - return state; - } - if((action.old === void(0))||(action.new === void(0))) { - return state; - } - if(action.old === action.new) { - return state; - } - const newStateAfterWorkoutDateChange = {...state}; - try { - newStateAfterWorkoutDateChange[action.workout].remove(action.old); - newStateAfterWorkoutDateChange[action.workout].add([action.new]); - return newStateAfterWorkoutDateChange; - } catch(err) { - console.error(err); - return state; - } - case CHANGE_WORKOUT_DESCRIPTION: - if(action.workout === void(0)) { - return state; - } - if(state[action.workout] === void(0)) { - return state; - } - try { - const newStateAfterDescriptionChange = {...state}; - newStateAfterDescriptionChange[action.workout].changeDescription(action.description); - return newStateAfterDescriptionChange; - } catch(err) { - console.error(err); - return state; - } - case CHANGE_WORKOUT_NAME: - if(action.workout === void(0)) { - return state; - } - if(state[action.workout] === void(0)) { - return state; - } - if(state[action.name] !== void(0)) { - return state; - } - try { - const newStateAfterNameChange = { - ...state - }; - const toAdd = new workout(newStateAfterNameChange[action.workout]); - toAdd.setName(action.name) - delete(newStateAfterNameChange[action.workout]); - newStateAfterNameChange[action.name] = toAdd; - return newStateAfterNameChange; - } catch(err) { - return state; - } - case DELETE_WORKOUT: - if(action.name === void(0)) { - return state; - } - if(!(state[action.name] instanceof workout)) { - return state; - } - try { - const newStateAfterDelete = {...state}; - newStateAfterDelete[action.workout].remove(toDel); - return newStateAfterDelete; - } catch(err) { - return state; - } - case NEW_WORKOUT: - if(state["New Workout"] !== void(0)) { - return state; - } - const newStateAfterNew = {...state}; - const newWorkout = new workout(); - newStateAfterNew[newWorkout.name] = newWorkout; - return newStateAfterNew; - case REMOVE_WORKOUT: - if(action.toRemove === void(0)) { - return state; - } - if(state[action.toRemove] === void(0)) { - return state; - } - const newStateAfterRemove = {...state}; - delete(newStateAfterRemove[action.toRemove]); - return newStateAfterRemove; - default: - return state; - } -} \ No newline at end of file diff --git a/src/toggle.c b/src/toggle.c new file mode 100644 index 0000000..f485fea --- /dev/null +++ b/src/toggle.c @@ -0,0 +1,18 @@ +#include + +int toggle(int i, int argc, char **argv) { + if(i+2!=argc) { + printf("wrong number of arguments for toggle\n"); + usage(); + return EXIT_FAILURE; + } + + if(workout_toggle(argv[i],argv[i+1])<0) { + printf("unable to toggle attribute %s for workout %s\n",argv[i+1],argv[i]); + return EXIT_FAILURE; + } + + printf("Successfully toggled %s attribute for workout %s\n",argv[i+1],argv[i]); + + return EXIT_SUCCESS; +} \ No newline at end of file diff --git a/src/usage.c b/src/usage.c new file mode 100644 index 0000000..bac721c --- /dev/null +++ b/src/usage.c @@ -0,0 +1,21 @@ +#include + +void usage() { + printf("Usage:\n"); + printf("\tworkouts [options] [ls] [--filter {attribute filter}] [search term]\n"); + printf("\tworkouts [options] add [!name] [date]\n"); + printf("\tworkouts [options] new [!name] [attributes]\n"); + printf("\tworkouts [options] attr [ls]\n"); + printf("\tworkouts [options] attr add [!name]\n"); + printf("\tworkouts [options] toggle [!workout name] [!attr]\n"); + printf("\tworkouts [options] recent\n"); + printf("\n"); + printf("Options:\n"); + printf("\t--help,-h\n"); + printf("\t--homedir=\n"); + printf("\t--rows=\n"); + printf("\t--verbose,-v\n"); + printf("\n"); + printf("{attribute filter} refers to string in bit flags corresponding to active attributes.\n\n"); + printf("The character '!' in front of a variable name means required.\n"); +} \ No newline at end of file diff --git a/test/integration/Makefile.am b/test/integration/Makefile.am new file mode 100644 index 0000000..0f90bd9 --- /dev/null +++ b/test/integration/Makefile.am @@ -0,0 +1,12 @@ +EXTRA_DIST = \ + index.js \ + Makefile.am \ + package.json \ + package-lock.json \ + test/add.integration.test.js \ + test/attr.integration.test.js \ + test/basic.test.js \ + test/ls.integration.test.js \ + test/new.integration.test.js \ + test/recent.integration.test.js \ + test/toggle.integration.test.js \ No newline at end of file diff --git a/test/integration/index.js b/test/integration/index.js new file mode 100644 index 0000000..a14ab47 --- /dev/null +++ b/test/integration/index.js @@ -0,0 +1 @@ +console.log("Run `npm run test` to run integration tests"); \ No newline at end of file diff --git a/test/integration/package-lock.json b/test/integration/package-lock.json new file mode 100644 index 0000000..757a05a --- /dev/null +++ b/test/integration/package-lock.json @@ -0,0 +1,2071 @@ +{ + "name": "workouts-integration-tests", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/core": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.4.tgz", + "integrity": "sha512-3A0tS0HWpy4XujGc7QtOIHTeNwUgWaZc/WuS5YQrfhU67jnVmsD6OGPc1AKHH0LJHQICGncy3+YUjIhVlfDdcA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.4", + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helpers": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.4.tgz", + "integrity": "sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.4.tgz", + "integrity": "sha512-m5j85pK/KZhuSdM/8cHUABQTAslV47OjfIB9Cc7P+PvlAoBzdb79BGNfw8RhT5Mq3p+xGd0ZfAKixbrUZx0C7A==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-module-imports": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-module-transforms": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.4.tgz", + "integrity": "sha512-Er2FQX0oa3nV7eM1o0tNCTx7izmQtwAQsIiaLRWtavAAEcskb0XJ5OjJbVrYXWOTr8om921Scabn4/tzlx7j1Q==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4", + "lodash": "^4.17.13" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-replace-supers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", + "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-simple-access": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", + "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", + "dev": true, + "requires": { + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", + "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/helpers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", + "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", + "dev": true, + "requires": { + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz", + "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==", + "dev": true + }, + "@babel/runtime-corejs3": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.10.4.tgz", + "integrity": "sha512-BFlgP2SoLO9HJX9WBwN67gHWMBhDX/eDz64Jajd6mR/UAUzqrNMm99d4qHnVaKscAElZoFiPv+JpR/Siud5lXw==", + "dev": true, + "requires": { + "core-js-pure": "^3.0.0", + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.4.tgz", + "integrity": "sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + } + }, + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, + "aggregate-error": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", + "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "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" + } + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "requires": { + "default-require-extensions": "^3.0.0" + } + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array.prototype.map": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.2.tgz", + "integrity": "sha512-Az3OYxgsa1g7xDYp86l0nnN4bcmuEITGe1rbdEBVkrqkzMgDcbdQ2R7r41pNzti+4NMces3H8gMmuioZUilLgw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.4" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "requires": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chokidar": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", + "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.3.0" + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.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 + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "core-js-pure": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.5.tgz", + "integrity": "sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "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=", + "dev": true + }, + "default-require-extensions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", + "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", + "dev": true, + "requires": { + "strip-bom": "^4.0.0" + } + }, + "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" + } + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "es-get-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.0.tgz", + "integrity": "sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ==", + "dev": true, + "requires": { + "es-abstract": "^1.17.4", + "has-symbols": "^1.0.1", + "is-arguments": "^1.0.4", + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-string": "^1.0.5", + "isarray": "^2.0.5" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "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 + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "flat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", + "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", + "dev": true, + "requires": { + "is-buffer": "~2.0.3" + } + }, + "foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + } + }, + "fromentries": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.2.0.tgz", + "integrity": "sha512-33X7H/wdfO99GdRLLgkjUrD4geAFdq/Uv0kl3HD4da6HDixd2GUg8Mw7dahLCV9r/EARkmtYBB6Tch4EEokFTQ==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "hasha": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.0.tgz", + "integrity": "sha512-2W+jKdQbAdSIrggA8Q35Br8qKadTrqCTC8+XZvBWepKDK6m9XkX6Iz1a2yh2KP01kzAR/dpuMeUnocoLYDcskw==", + "dev": true, + "requires": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-buffer": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", + "dev": true + }, + "is-callable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "dev": true + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.1.tgz", + "integrity": "sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", + "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-set": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.1.tgz", + "integrity": "sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA==", + "dev": true + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "requires": { + "append-transform": "^2.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + } + }, + "istanbul-lib-processinfo": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", + "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", + "dev": true, + "requires": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.0", + "istanbul-lib-coverage": "^3.0.0-alpha.1", + "make-dir": "^3.0.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^3.3.3" + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.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 + } + } + }, + "istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "iterate-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.1.tgz", + "integrity": "sha512-3Q6tudGN05kbkDQDI4CqjaBf4qf85w6W6GnuZDtUVYwKgtC1q8yxYX7CZed7N+tLzQqS6roujWvszf13T+n9aw==", + "dev": true + }, + "iterate-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", + "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", + "dev": true, + "requires": { + "es-get-iterator": "^1.0.2", + "iterate-iterator": "^1.0.1" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "dev": true + }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, + "log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mocha": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.0.1.tgz", + "integrity": "sha512-vefaXfdYI8+Yo8nPZQQi0QO2o+5q9UIMX1jZ1XMmK3+4+CQjc7+B0hPdUeglXiTlr8IHMVRo63IhO9Mzt6fxOg==", + "dev": true, + "requires": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.3.1", + "debug": "3.2.6", + "diff": "4.0.2", + "escape-string-regexp": "1.0.5", + "find-up": "4.1.0", + "glob": "7.1.6", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "3.0.0", + "minimatch": "3.0.4", + "ms": "2.1.2", + "object.assign": "4.1.0", + "promise.allsettled": "1.0.2", + "serialize-javascript": "3.0.0", + "strip-json-comments": "3.0.1", + "supports-color": "7.1.0", + "which": "2.0.2", + "wide-align": "1.1.3", + "workerpool": "6.0.0", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "1.6.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "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" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "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 + }, + "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" + } + }, + "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-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" + } + }, + "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": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + }, + "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" + } + } + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "requires": { + "process-on-spawn": "^1.0.0" + } + }, + "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 + }, + "nyc": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "dev": true, + "requires": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + } + }, + "object-inspect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "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 + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "requires": { + "fromentries": "^1.2.0" + } + }, + "promise.allsettled": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.2.tgz", + "integrity": "sha512-UpcYW5S1RaNKT6pd+s9jp9K9rlQge1UXKskec0j6Mmuq7UJCvlS2J2/s/yuPN8ehftf9HXMxWlKiPbGGUzpoRg==", + "dev": true, + "requires": { + "array.prototype.map": "^1.0.1", + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "iterate-value": "^1.0.0" + } + }, + "readdirp": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", + "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", + "dev": true, + "requires": { + "picomatch": "^2.0.7" + } + }, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", + "dev": true + }, + "release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "dev": true, + "requires": { + "es6-error": "^4.0.1" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "serialize-javascript": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.0.0.tgz", + "integrity": "sha512-skZcHYw2vEX4bw90nAr2iTTsz6x2SrHEnfxgKYmZlvJYBEZrvbKtobJWlQ20zczKb3bsHHXXTYt48zBA7ni9cw==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "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 + }, + "spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "requires": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "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-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.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 + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 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 + }, + "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" + } + } + } + }, + "workerpool": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.0.tgz", + "integrity": "sha512-fU2OcNA/GVAJLLyKUoHkAgIhKb0JoCpSjLC/G2vYKxUjVmQwGbRVeoPJ1a8U4pnVofz4AQV5Y/NEw8oKqxEBtA==", + "dev": true + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "xregexp": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.3.0.tgz", + "integrity": "sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g==", + "dev": true, + "requires": { + "@babel/runtime-corejs3": "^7.8.3" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yargs": { + "version": "15.4.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.0.tgz", + "integrity": "sha512-D3fRFnZwLWp8jVAAhPZBsmeIHY8tTsb8ItV9KaAaopmC6wde2u6Yw29JBIZHXw14kgkRnYmDgmQU4FVMDlIsWw==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^3.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "dependencies": { + "decamelize": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-3.2.0.tgz", + "integrity": "sha512-4TgkVUsmmu7oCSyGBm5FvfMoACuoh9EOidm7V5/J2X2djAwwt57qb3F2KMP2ITqODTCSwb+YRV+0Zqrv18k/hw==", + "dev": true, + "requires": { + "xregexp": "^4.2.4" + } + } + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yargs-unparser": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", + "dev": true, + "requires": { + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "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" + } + }, + "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 + }, + "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-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" + } + }, + "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": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + } + } +} diff --git a/test/integration/package.json b/test/integration/package.json new file mode 100644 index 0000000..a08047b --- /dev/null +++ b/test/integration/package.json @@ -0,0 +1,14 @@ +{ + "name": "workouts-integration-tests", + "version": "0.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "mocha" + }, + "author": "", + "license": "UNLICENSED", + "devDependencies": { + "mocha": "^8.0.1" + } +} diff --git a/test/integration/test/add.integration.test.js b/test/integration/test/add.integration.test.js new file mode 100644 index 0000000..5a2265d --- /dev/null +++ b/test/integration/test/add.integration.test.js @@ -0,0 +1,76 @@ +const assert = require('assert'); +const util = require('util'); + +const exec = util.promisify(require('child_process').exec); +const unlink = util.promisify(require('fs').unlink); + +describe('add integration tests', () => { + + beforeEach(async() => { + await assert.doesNotReject(async() => await exec('./workouts attr add lower')); + await assert.doesNotReject(async() => await exec('./workouts attr add upper')); + + await assert.doesNotReject(async() => await exec('./workouts new workout1 01')); + await assert.doesNotReject(async() => await exec('./workouts new workout2 10')); + await assert.doesNotReject(async() => await exec('./workouts new test 00')); + await assert.doesNotReject(async() => await exec('./workouts new apple 11')); + }); + + afterEach(async() => { + await unlink('workouts.db'); + }); + + it('should succeed when adding a new workout', async() => { + await assert.doesNotReject(async() => await exec('./workouts add test')); + }); + + it('should succeed when adding a new workout and reflect that upon ls', async() => { + await assert.doesNotReject(async() => { + const {stdout,stderr} = await exec('./workouts add workout1 2020-07-10'); + + assert.strictEqual(stdout,`added workout workout1 on 2020-07-10\n`); + }); + + await assert.doesNotReject(async() => { + const {stdout,stderr} = await exec('./workouts add apple 2020-06-10'); + + assert.strictEqual(stdout,`added workout apple on 2020-06-10\n`); + }); + + await assert.doesNotReject(async() => { + const {stdout,stderr} = await exec('./workouts'); + + let expected = `Attributes:\tlower\tupper\t\n`; + expected += `workout1 [2] [Last done: 2020-07-10]\n`; + expected += `apple [3] [Last done: 2020-06-10]\n`; + expected += `test [0] [Last done: N/A]\n`; + expected += `workout2 [1] [Last done: N/A]\n`; + + assert.strictEqual(stdout,expected); + }); + }); + + it('should successfully get last done', async() => { + await assert.doesNotReject(async() => await exec('./workouts add workout1 2020-07-10')); + await assert.doesNotReject(async() => await exec('./workouts add workout1 2020-06-10')); + + await assert.doesNotReject(async() => { + const {stdout,stderr} = await exec('./workouts workout1'); + + let expected = `Attributes:\tlower\tupper\t\n`; + expected += `workout1 [2] [Last done: 2020-07-10]\n`; + + assert.strictEqual(stdout,expected); + }); + }); + + it('should reject when not given a valid workout', async() => { + await assert.rejects(async() => await exec('./workouts add hahahahahah 2020-07-10')); + }); + + it('should reject when not given a valid date', async() => { + await assert.rejects(async() => await exec('./workouts add hahahahahah 2020-07-10123123123123123')); + await assert.rejects(async() => await exec('./workouts add hahahahahah "kasdflasj lkssdasdf lkdaNOT_A_DATE"')); + }); + +}); \ No newline at end of file diff --git a/test/integration/test/attr.integration.test.js b/test/integration/test/attr.integration.test.js new file mode 100644 index 0000000..d560e1c --- /dev/null +++ b/test/integration/test/attr.integration.test.js @@ -0,0 +1,76 @@ +const assert = require('assert'); +const util = require('util'); + +const exec = util.promisify(require('child_process').exec); +const unlink = util.promisify(require('fs').unlink); + +describe('attr integration tests', () => { + + const attributes = [ + 'lower', + 'upper', + 'core', + 'back', + 'cardio', + 'martial', + 'other' + ]; + + describe('attr add', () => { + + it('should successfully add', async() => { + for(const attr of attributes) { + await assert.doesNotReject(async() => { + const {stdout,stderr} = await exec(`./workouts attr add ${attr}`); + + assert.strictEqual(stdout,`New attribute added: ${attr}\n`); + }); + } + }); + + it('should fail to add an attribute with the same name', async() => { + await assert.rejects(async() => await exec('./workouts attr add other')); + await assert.doesNotReject(async() => await exec('./workouts attr add Other')); + }); + + it('should fail when not given a name to add', async() => { + await assert.rejects(async() => await exec('./workouts attr add')); + }); + + }); + + describe('attr ls', () => { + + it('should successfully list all attributes in order they were added', async() => { + attributes.push('Other'); + + await assert.doesNotReject(async() => { + const {stdout,stderr} = await exec(`./workouts attr`); + + let expected = ""; + for(const attr of attributes) { + expected += `${attr}\n`; + } + + assert.strictEqual(stdout,expected); + }); + + await assert.doesNotReject(async() => { + const {stdout,stderr} = await exec(`./workouts attr ls`); + + let expected = ""; + for(const attr of attributes) { + expected += `${attr}\n`; + } + + assert.strictEqual(stdout,expected); + }); + }); + + }); + + after(async() => { + await unlink('workouts.db'); + }); + +}); \ No newline at end of file diff --git a/test/integration/test/basic.test.js b/test/integration/test/basic.test.js new file mode 100644 index 0000000..7bcfa69 --- /dev/null +++ b/test/integration/test/basic.test.js @@ -0,0 +1,48 @@ +const assert = require('assert'); +const util = require('util'); + +const exec = util.promisify(require('child_process').exec); +const access = util.promisify(require('fs').access); +const unlink = util.promisify(require('fs').unlink); + +describe('basic tests', () => { + + it('should create workouts.db when run with no arguments', async() => { + const {stdout,stderr} = await exec('./workouts'); + assert.strictEqual(stdout,''); + await assert.doesNotReject(async() => await access('workouts.db')); + }); + + it('should print usage options when run with --help option', async() => { + const {stdout,stderr} = await exec('./workouts --help'); + let usage = `Usage:\n`; + usage += `\tworkouts [options] [ls] [--filter {attribute filter}] [search term]\n`; + usage += `\tworkouts [options] add [!name] [date]\n`; + usage += `\tworkouts [options] new [!name] [attributes]\n`; + usage += `\tworkouts [options] attr [ls]\n`; + usage += `\tworkouts [options] attr add [!name]\n`; + usage += `\tworkouts [options] toggle [!workout name] [!attr]\n`; + usage += `\tworkouts [options] recent\n`; + usage += `\n`; + usage += `Options:\n`; + usage += `\t--help,-h\n`; + usage += `\t--homedir=\n`; + usage += `\t--rows=\n`; + usage += `\t--verbose,-v\n`; + usage += `\n`; + usage += `{attribute filter} refers to string in bit flags corresponding to active attributes.\n\n`; + usage += `The character '!' in front of a variable name means required.\n`; + assert.strictEqual(stdout,usage); + }); + + it(`should throw when given option --homedir which doesn't exist`, async() => { + await assert.rejects(async() => await exec('./workouts --homedir=`pwd`/doesnt_exist')); + }); + + after(async() => { + await unlink('workouts.db'); + }); + +}); + + diff --git a/test/integration/test/ls.integration.test.js b/test/integration/test/ls.integration.test.js new file mode 100644 index 0000000..8755ce0 --- /dev/null +++ b/test/integration/test/ls.integration.test.js @@ -0,0 +1,104 @@ +const assert = require('assert'); +const util = require('util'); + +const exec = util.promisify(require('child_process').exec); +const unlink = util.promisify(require('fs').unlink); + +describe('ls integration tests', () => { + + beforeEach(async() => { + await assert.doesNotReject(async() => await exec('./workouts attr add lower')); + await assert.doesNotReject(async() => await exec('./workouts attr add upper')); + + await assert.doesNotReject(async() => await exec('./workouts new workout1 01')); + await assert.doesNotReject(async() => await exec('./workouts new workout2 10')); + await assert.doesNotReject(async() => await exec('./workouts new test 00')); + await assert.doesNotReject(async() => await exec('./workouts new apple 11')); + }); + + afterEach(async() => { + await unlink('workouts.db'); + }); + + it('should succeed when no workouts are present', async() => { + await assert.doesNotReject(async() => { + const {stdout,stderr} = await exec('./workouts'); + + let expected = `Attributes:\tlower\tupper\t\n`; + expected += `apple [3] [Last done: N/A]\n`; + expected += `test [0] [Last done: N/A]\n`; + expected += `workout1 [2] [Last done: N/A]\n`; + expected += `workout2 [1] [Last done: N/A]\n`; + + assert.strictEqual(stdout,expected); + }); + }); + + it('should successfully limit rows grabbed', async() => { + await assert.doesNotReject(async() => { + const {stdout,stderr} = await exec('./workouts --rows=1'); + + let expected = `Attributes:\tlower\tupper\t\n`; + expected += `apple [3] [Last done: N/A]\n`; + assert.strictEqual(stdout,expected); + }); + }); + + it('should successfully search for workouts', async() => { + await assert.doesNotReject(async() => { + const {stdout,stderr} = await exec('./workouts workout'); + + let expected = `Attributes:\tlower\tupper\t\n`; + expected += `workout1 [2] [Last done: N/A]\n`; + expected += `workout2 [1] [Last done: N/A]\n`; + + assert.strictEqual(stdout,expected); + }); + }); + + it('should reject when `ls` term is not given and attempting to filter', async() => { + await assert.rejects(async() => { + await exec('./workouts --filter 01'); + }); + }); + + it('should successfully filter workouts by attribute', async() => { + await assert.doesNotReject(async() => { + const {stdout,stderr} = await exec('./workouts ls --filter 01'); + + let expected = `Attributes:\tlower\tupper\t\n`; + expected += `workout2 [1] [Last done: N/A]\n`; + + assert.strictEqual(stdout,expected); + }); + + await assert.doesNotReject(async() => { + const {stdout,stderr} = await exec('./workouts ls --filter 10'); + + let expected = `Attributes:\tlower\tupper\t\n`; + expected += `workout1 [2] [Last done: N/A]\n`; + + assert.strictEqual(stdout,expected); + }); + + await assert.doesNotReject(async() => { + const {stdout,stderr} = await exec('./workouts ls --filter x1'); + + let expected = `Attributes:\tlower\tupper\t\n`; + expected += `apple [3] [Last done: N/A]\n`; + expected += `workout2 [1] [Last done: N/A]\n`; + + assert.strictEqual(stdout,expected); + }); + + await assert.doesNotReject(async() => { + const {stdout,stderr} = await exec('./workouts ls --filter 00'); + + let expected = `Attributes:\tlower\tupper\t\n`; + expected += `test [0] [Last done: N/A]\n`; + + assert.strictEqual(stdout,expected); + }); + }); + +}); \ No newline at end of file diff --git a/test/integration/test/new.integration.test.js b/test/integration/test/new.integration.test.js new file mode 100644 index 0000000..c084c2b --- /dev/null +++ b/test/integration/test/new.integration.test.js @@ -0,0 +1,31 @@ +const assert = require('assert'); +const util = require('util'); + +const exec = util.promisify(require('child_process').exec); +const unlink = util.promisify(require('fs').unlink); + +describe('new integration tests', () => { + + beforeEach(async() => { + await assert.doesNotReject(async() => await exec('./workouts attr add lower')); + await assert.doesNotReject(async() => await exec('./workouts attr add upper')); + }); + + afterEach(async() => { + await unlink('workouts.db'); + }); + + it('should success creating a new workout', async() => { + await assert.doesNotReject(async() => { + const {stdout,stderr} = await exec('./workouts new workout1'); + + assert.strictEqual(stdout,`New workout added: workout1\n`); + }); + }); + + it('should fail to create a workout when given the wrong number of attributes', async() => { + await assert.rejects(async() => await exec('./workouts new workout1 0')); + await assert.rejects(async() => await exec('./workouts new workout1 110')); + }); + +}); \ No newline at end of file diff --git a/test/integration/test/recent.integration.test.js b/test/integration/test/recent.integration.test.js new file mode 100644 index 0000000..c178093 --- /dev/null +++ b/test/integration/test/recent.integration.test.js @@ -0,0 +1,45 @@ +const assert = require('assert'); +const util = require('util'); + +const exec = util.promisify(require('child_process').exec); +const unlink = util.promisify(require('fs').unlink); + +describe('recent integration tests', () => { + + const recent = [ + {name:"workout1",date:"2020-07-10"}, + {name:"apple",date:"2020-07-09"}, + {name:"test",date:"2020-07-09"}, + {name:"workout2",date:"2020-07-09"} + ]; + + beforeEach(async() => { + await assert.doesNotReject(async() => await exec('./workouts attr add lower')); + await assert.doesNotReject(async() => await exec('./workouts attr add upper')); + + await assert.doesNotReject(async() => await exec('./workouts new workout1 01')); + await assert.doesNotReject(async() => await exec('./workouts new workout2 10')); + await assert.doesNotReject(async() => await exec('./workouts new test 00')); + await assert.doesNotReject(async() => await exec('./workouts new apple 11')); + + for(const i of recent) { + await assert.doesNotReject(async() => await exec(`./workouts add ${i.name} ${i.date}`)); + } + }); + + afterEach(async() => { + await unlink('workouts.db'); + }); + + it('should successfully print recent workouts', async() => { + const {stdout,stderr} = await exec('./workouts recent'); + + let expected = ""; + for(const i of recent) { + expected += `${i.name}\t${i.date}\n`; + } + + assert.strictEqual(stdout,expected); + }); + +}); \ No newline at end of file diff --git a/test/integration/test/toggle.integration.test.js b/test/integration/test/toggle.integration.test.js new file mode 100644 index 0000000..7c9d7c7 --- /dev/null +++ b/test/integration/test/toggle.integration.test.js @@ -0,0 +1,63 @@ +const assert = require('assert'); +const util = require('util'); + +const exec = util.promisify(require('child_process').exec); +const unlink = util.promisify(require('fs').unlink); + +describe('toggle integration tests', () => { + + beforeEach(async() => { + await assert.doesNotReject(async() => await exec('./workouts attr add lower')); + await assert.doesNotReject(async() => await exec('./workouts attr add upper')); + + await assert.doesNotReject(async() => await exec('./workouts new workout1 01')); + await assert.doesNotReject(async() => await exec('./workouts new workout2 10')); + await assert.doesNotReject(async() => await exec('./workouts new test 00')); + await assert.doesNotReject(async() => await exec('./workouts new apple 11')); + }); + + afterEach(async() => { + await unlink('workouts.db'); + }); + + it('should fail when given an invalid workout', async() => { + await assert.rejects(async() => await exec('./workouts toggle not lower')); + }); + + it('should fail when given an invalid attribute', async() => { + await assert.rejects(async() => await exec('./workouts toggle not not_an_attribute')); + }); + + it('should successfully toggle a workout', async() => { + await assert.doesNotReject(async() => { + const {stdout,stderr} = await exec('./workouts toggle workout1 lower'); + + assert.strictEqual(stdout,`Successfully toggled lower attribute for workout workout1\n`); + }); + + await assert.doesNotReject(async() => { + const {stdout,stderr} = await exec('./workouts workout1'); + + let expected = `Attributes:\tlower\tupper\t\n`; + expected += `workout1 [3] [Last done: N/A]\n`; + + assert.strictEqual(stdout,expected); + }); + + await assert.doesNotReject(async() => { + const {stdout,stderr} = await exec('./workouts toggle workout1 lower'); + + assert.strictEqual(stdout,`Successfully toggled lower attribute for workout workout1\n`); + }); + + await assert.doesNotReject(async() => { + const {stdout,stderr} = await exec('./workouts workout1'); + + let expected = `Attributes:\tlower\tupper\t\n`; + expected += `workout1 [2] [Last done: N/A]\n`; + + assert.strictEqual(stdout,expected); + }); + }); + +}); \ No newline at end of file diff --git a/test/unit/Makefile.am b/test/unit/Makefile.am new file mode 100644 index 0000000..9786277 --- /dev/null +++ b/test/unit/Makefile.am @@ -0,0 +1,36 @@ +AM_CPPFLAGS = \ + -I$(top_builddir)/include/ \ + -I$(top_builddir)/test/unit/ \ + -I$(top_srcdir)/include/ \ + -I$(top_srcdir)/test/unit/ + +EXTRA_DIST = \ + test_utils.h \ + workout.tests.h \ + recent.tests.h \ + attr.tests.h + +check_PROGRAMS = attr.tests recent.tests workout.tests +TESTS = $(check_PROGRAMS) + +common_SOURCES = test_utils.c + +TEST_SRC_DIR = $(top_srcdir)/src + +common_SOURCES += $(TEST_SRC_DIR)/default.c $(TEST_SRC_DIR)/opt.c +common_SOURCES += $(TEST_SRC_DIR)/data/setup.c +common_SOURCES += $(TEST_SRC_DIR)/opt/homedir.c $(TEST_SRC_DIR)/opt/rows.c $(TEST_SRC_DIR)/opt/verbose.c + +attr_tests_SOURCES = attr.tests.c $(TEST_SRC_DIR)/data/attr.c $(common_SOURCES) +recent_tests_SOURCES = recent.tests.c $(TEST_SRC_DIR)/data/recent.c $(TEST_SRC_DIR)/data/workout.c $(TEST_SRC_DIR)/data/attr.c $(common_SOURCES) +workout_tests_SOURCES = workout.tests.c $(TEST_SRC_DIR)/data/workout.c $(TEST_SRC_DIR)/data/attr.c $(TEST_SRC_DIR)/data/recent.c $(common_SOURCES) + +if ENABLE_MEMCHECK +memcheck: + -valgrind --leak-check=full ./attr.tests + -valgrind --leak-check=full ./recent.tests + -valgrind --leak-check=full ./workout.tests +else +memcheck: + @echo "memcheck not enabled" +endif \ No newline at end of file diff --git a/test/unit/attr.tests.c b/test/unit/attr.tests.c new file mode 100644 index 0000000..dbb0e48 --- /dev/null +++ b/test/unit/attr.tests.c @@ -0,0 +1,89 @@ +#include + +int main() { + setup_env(); + + attribute_count_test(); + attribute_get_test(); + attribute_index_test(); + attribute_insert_test(); + attribute_parse_test(); + + clean(); + + return EXIT_SUCCESS; +} + +void attribute_count_test() { + assert(attribute_count()==0); + + assert(attribute_insert("test")==1); + assert(attribute_count()==1); + + assert(attribute_insert("test2")==1); + assert(attribute_count()==2); + + reset_env(); +} + +int i; + +void attribute_get_test() { + i = 0; + assert(attribute_get(&attribute_get_test_helper)==1); + assert(i==0); + + assert(attribute_insert("test")==1); + assert(attribute_get(&attribute_get_test_helper)==1); + assert(i==1); + + reset_env(); +} + +void attribute_get_test_helper(const unsigned char *attr) { + i++; +} + +void attribute_index_test() { + assert(attribute_index("test")<0); + + assert(attribute_insert("test")==1); + assert(attribute_index("test")==0); + assert(attribute_index("test2")<0); + + assert(attribute_insert("test2")==1); + assert(attribute_index("test")==0); + assert(attribute_index("test2")==1); + + assert(attribute_insert("hello")==1); + assert(attribute_index("test")==0); + assert(attribute_index("test2")==1); + assert(attribute_index("hello")==2); + + reset_env(); +} + +void attribute_insert_test() { + assert(attribute_insert("test")==1); + + reset_env(); +} + +void attribute_parse_test() { + int required = 0; + int exclude = 0; + + assert(attribute_parse("311",&required,&exclude)<0); + + required = 0; + exclude = 0; + assert(attribute_parse("011",&required,&exclude)==1); + assert(required==3); + assert(exclude==4); + + required = 0; + exclude = 0; + assert(attribute_parse("x01",&required,&exclude)==1); + assert(required==1); + assert(exclude==2); +} \ No newline at end of file diff --git a/test/unit/attr.tests.h b/test/unit/attr.tests.h new file mode 100644 index 0000000..ee0abac --- /dev/null +++ b/test/unit/attr.tests.h @@ -0,0 +1,14 @@ +#ifndef __ATTR_TESTS_H_ +#define __ATTR_TESTS_H_ + +#include + +int main(); +void attribute_count_test(); +void attribute_get_test(); +void attribute_get_test_helper(const unsigned char*); +void attribute_index_test(); +void attribute_insert_test(); +void attribute_parse_test(); + +#endif \ No newline at end of file diff --git a/test/unit/recent.tests.c b/test/unit/recent.tests.c new file mode 100644 index 0000000..c976677 --- /dev/null +++ b/test/unit/recent.tests.c @@ -0,0 +1,50 @@ +#include + +int main() { + setup_env(); + + recent_get_test(); + recent_insert_test(); + + clean(); + + return EXIT_SUCCESS; +} + +int i; + +void recent_get_test() { + i = 0; + assert(recent_get(-1,&recent_get_test_helper)==1); + assert(i==0); + + assert(workout_insert("test",0)==1); + assert(workout_insert("test2",0)==1); + + assert(recent_insert("test","2020-07-04")==1); + assert(recent_insert("test2","2020-07-04")==1); + + assert(recent_get(-1,&recent_get_test_helper)==1); + assert(i==2); + + i = 0; + assert(recent_get(1,&recent_get_test_helper)==1); + assert(i==1); + + reset_env(); +} + +void recent_get_test_helper(const unsigned char *name, const unsigned char *date) { + i++; +} + +void recent_insert_test() { + assert(workout_insert("test",0)==1); + assert(workout_insert("test2",0)==1); + + assert(recent_insert("test","2020-07-04")==1); + assert(recent_insert("test2","2020-07-04")==1); + assert(recent_insert("test2","2020-07-04")==-1); + + reset_env(); +} \ No newline at end of file diff --git a/test/unit/recent.tests.h b/test/unit/recent.tests.h new file mode 100644 index 0000000..ffb2f70 --- /dev/null +++ b/test/unit/recent.tests.h @@ -0,0 +1,12 @@ +#ifndef __RECENT_TESTS_H_ +#define __RECENT_TESTS_H_ + +#include + +int main(); +void recent_get_test(); +void recent_get_test_helper(const unsigned char*,const unsigned char*); +void recent_insert_test(); + + +#endif \ No newline at end of file diff --git a/test/unit/test_utils.c b/test/unit/test_utils.c new file mode 100644 index 0000000..61b8fca --- /dev/null +++ b/test/unit/test_utils.c @@ -0,0 +1,16 @@ +#include + +void clean() { + free(global_opts.db_location); + free(global_opts.homedir); +} + +void reset_env() { + assert(remove(global_opts.db_location)==0); + assert(setup()==1); +} + +void setup_env() { + assert(defaults()==0); + assert(setup()==1); +} \ No newline at end of file diff --git a/test/unit/test_utils.h b/test/unit/test_utils.h new file mode 100644 index 0000000..5172929 --- /dev/null +++ b/test/unit/test_utils.h @@ -0,0 +1,15 @@ +#ifndef __TEST_UTILS_H_ +#define __TEST_UTILS_H_ + +#include +#include +#include + +#include +#include + +void clean(); +void setup_env(); +void reset_env(); + +#endif \ No newline at end of file diff --git a/test/unit/workout.tests.c b/test/unit/workout.tests.c new file mode 100644 index 0000000..6276e42 --- /dev/null +++ b/test/unit/workout.tests.c @@ -0,0 +1,94 @@ +#include + +int main() { + setup_env(); + + workout_get_test(); + workout_insert_test(); + workout_toggle_test(); + workout_update_test(); + + clean(); + + return EXIT_SUCCESS; +} + +int i; + +void workout_get_test() { + i = 0; + + assert(workout_get(NULL,NULL,-1,&workout_get_test_helper)==1); + assert(i==0); + + assert(workout_insert("test",0)==1); + assert(workout_insert("test2",3)==1); + assert(workout_insert("hello3",4)==1); + assert(workout_insert("apple",5)==1); + + assert(workout_get(NULL,NULL,-1,&workout_get_test_helper)==1); + assert(i==4); + + i = 0; + assert(workout_get("test",NULL,-1,&workout_get_test_helper)==1); + assert(i==2); + + i = 0; + assert(workout_get("test",NULL,1,&workout_get_test_helper)==1); + assert(i==1); + + i = 0; + assert(workout_get("apple",NULL,-1,&workout_get_test_helper)==1); + assert(i==1); + + i = 0; + assert(workout_get("test","x1",-1,&workout_get_test_helper)==1); + assert(i==1); + + i = 0; + assert(workout_get(NULL,"10x",-1,&workout_get_test_helper)==1); + assert(i==2); + + reset_env(); +} + +void workout_get_test_helper(const unsigned char *name, int flags, const unsigned char *date) { + i++; +} + +void workout_insert_test() { + assert(workout_insert("test",0)==1); + assert(workout_insert("test",1)<0); + + reset_env(); +} + +void workout_toggle_test() { + assert(attribute_insert("lower")==1); + assert(attribute_insert("upper")==1); + + assert(workout_insert("test",0)==1); + assert(workout_insert("test2",3)==1); + + assert(workout_toggle("test3","lower")==-1); + assert(workout_toggle("test","lower")==1); + + reset_env(); +} + +void workout_update_test() { + assert(attribute_insert("lower")==1); + assert(attribute_insert("upper")==1); + + assert(workout_insert("test",0)==1); + assert(workout_insert("test2",3)==1); + + assert(recent_insert("test","2020-07-04")==1); + + assert(workout_update("test","test3",0)<0); + assert(workout_update("test","test",1)==1); + + assert(workout_update("test2","test5",8)==1); + + reset_env(); +} \ No newline at end of file diff --git a/test/unit/workout.tests.h b/test/unit/workout.tests.h new file mode 100644 index 0000000..267ba68 --- /dev/null +++ b/test/unit/workout.tests.h @@ -0,0 +1,13 @@ +#ifndef __WORKOUT_TESTS_H_ +#define __WORKOUT_TESTS_H_ + +#include + +int main(); +void workout_get_test(); +void workout_get_test_helper(); +void workout_insert_test(); +void workout_toggle_test(); +void workout_update_test(); + +#endif \ No newline at end of file diff --git a/test/view.reducer.tests.js b/test/view.reducer.tests.js deleted file mode 100644 index 9749ba0..0000000 --- a/test/view.reducer.tests.js +++ /dev/null @@ -1,38 +0,0 @@ -import assert from 'assert'; - -import view from '../src/reducers/view.js'; - -import {constants} from '../src/constants.js'; -const {CHANGE_VIEW,SORT_VIEW} = constants; - -describe('view reducers',() => { - - describe(CHANGE_VIEW,() => { - - it('should not change the state when an invalid action is given',() => { - assert.fail('Not implemented'); - }); - - it('should successfully change the state to the `manage` view',() => { - assert.fail('Not implemented'); - }); - - it('should successfully change the state to the `recent` view',() => { - assert.fail('Not implemented'); - }); - - }); - - describe(SORT_VIEW,() => { - - it('should not change the state when an invalid action is given',() => { - assert.fail('Not implemented'); - }); - - it('should successfully sort the view',() => { - assert.fail('Not implemented'); - }); - - }); - -}); \ No newline at end of file diff --git a/test/workout.tests.js b/test/workout.tests.js deleted file mode 100644 index 4640e24..0000000 --- a/test/workout.tests.js +++ /dev/null @@ -1,39 +0,0 @@ -import assert from 'assert'; - -import workout from '../src/classes/workout.js'; - -describe('workout object tests', () => { - - it('should successfully create', () => { - assert.fail('Not implemented'); - }); - - it('should successfully add dates', () => { - assert.fail('Not implemented'); - }); - - it('should successfully change description',() => { - assert.fail('Not implemented'); - }); - - it('should successfully export', () => { - assert.fail('Not implemented'); - }); - - it('should successfully output the last time the workout was completed',() => { - assert.fail('Not implemented'); - }); - - it('should successfully remove dates', () => { - assert.fail('Not implemented'); - }); - - it('should successfully change the name', () => { - assert.fail('Not implemented'); - }); - - it('should successfully change an attribute', () => { - assert.fail('Not implemented'); - }); - -}); \ No newline at end of file diff --git a/test/workouts.reducer.tests.js b/test/workouts.reducer.tests.js deleted file mode 100644 index 581c84a..0000000 --- a/test/workouts.reducer.tests.js +++ /dev/null @@ -1,117 +0,0 @@ -import assert from 'assert'; - -import workouts from '../src/reducers/workouts.js'; - -import {constants} from '../src/constants.js'; -const {ADD_WORKOUT,CHANGE_ATTRIBUTE,CHANGE_WORKOUT_NAME,DELETE_WORKOUT,NEW_WORKOUT,REMOVE_WORKOUT} = constants; - -describe('workouts reducer',() => { - - describe(ADD_WORKOUT,() => { - - it('should not change the state when invalid action is given',() => { - assert.fail('Not implemented'); - }); - - it('should successfully add a workout to an already existing workout',() => { - assert.fail('Not implemented'); - }); - - }); - - describe(CHANGE_ATTRIBUTE,() => { - - it('should not change the state when an invalid action is given',() => { - assert.fail('Not implemented'); - }); - - it('should not change the state when trying to change an attribute for a nonexistent workout',() => { - assert.fail('Not implemented'); - }); - - it('should successfully change the attribute of an already existing workout',() => { - assert.fail('Not implemented'); - }); - - }); - - describe(CHANGE_WORKOUT_NAME,() => { - - it('should not change the state when an invalid action is given',() => { - assert.fail('Not implemented'); - }); - - it('should not change the state when trying to change the name for a nonexistent workout',() => { - assert.fail('Not implemented'); - }); - - it('should successfully change the name of an already existing workout',() => { - assert.fail('Not implemented'); - }); - - }); - - describe(CHANGE_WORKOUT_DESCRIPTION,() => { - - it('should not change the state when an invalid action is given',() => { - assert.fail('Not implemented'); - }); - - it('should not change the state when trying to change the description for a nonexistent workout',() => { - assert.fail('Not implemented'); - }); - - it('should successfully change the description of an already existing workout',() => { - assert.fail('Not implemented'); - }); - - }); - - describe(DELETE_WORKOUT,() => { - - it('should not change the state when an invalid action is given',() => { - assert.fail('Not implemented'); - }); - - it('should not change the state when action.name refers to a nonexistent workout',() => { - assert.fail('Not implemented'); - }); - - it('should successfully delete a workout from an existent workout',() => { - assert.fail('Not implemented'); - }); - - }); - - describe(NEW_WORKOUT,() => { - - it('should not change the state when an invalid action is given',() => { - assert.fail('Not implemented'); - }); - - it('should not change the state when "New Workout" workout already exists',() => { - assert.fail('Not implemented'); - }); - - it('should successfully add a new workout',() => { - assert.fail('Not implemented'); - }); - }); - - describe(REMOVE_WORKOUT,() => { - - it('should not change the state when an invalid action is given',() => { - assert.fail('Not implemented'); - }); - - it('should fail when action.toRemove refers to a nonexistent workout',() => { - assert.fail('Not implemented'); - }); - - it('should successfully remove a workout',() => { - assert.fail('Not implemented'); - }); - - }); - -}); \ No newline at end of file diff --git a/webpack.prod.config.js b/webpack.prod.config.js deleted file mode 100644 index d349514..0000000 --- a/webpack.prod.config.js +++ /dev/null @@ -1,11 +0,0 @@ -const path = require('path'); -const merge = require('webpack-merge'); -const baseConfig = require('./webpack.config.js'); - -module.exports = merge(baseConfig,{ - mode:'production', - output: { - filename: 'workouts.min.js', - path: path.resolve(__dirname,'./') - } -}); \ No newline at end of file diff --git a/workouts.json b/workouts.json deleted file mode 100644 index 46529f8..0000000 --- a/workouts.json +++ /dev/null @@ -1 +0,0 @@ -{"P90X - Ab Ripper":{"attributes":{"lower":false,"core":true,"back":false,"upper":false,"cardio":false,"martial":false,"other":false},"datesDone":["2020-03-20","2019-11-29","2019-10-12","2019-09-08","2019-08-09","2019-06-18","2019-04-19","2019-03-15","2019-03-07","2019-02-14","2019-01-31","2018-11-14","2018-10-04","2018-07-23","2018-05-17","2018-03-07","2017-12-18","2017-09-25","2017-08-29","2017-06-27","2017-03-21","2017-02-14","2017-01-27","2016-11-11","2016-09-04","2016-04-29","2016-03-11","2016-02-05","2016-01-20","2015-12-04","2015-09-18","2015-08-14","2015-06-25","2015-05-04","2015-04-01","2015-03-19","2015-02-19","2015-01-22","2014-12-26","2014-11-25","2014-10-30","2014-06-28","2014-06-16","2014-05-25"],"name":"P90X - Ab Ripper","description":""},"P90X - Back + Biceps":{"attributes":{"lower":false,"core":false,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"datesDone":[],"name":"P90X - Back + Biceps","description":""},"P90X - Cardio X":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":true,"martial":true,"other":false},"datesDone":["2020-03-10","2020-01-06","2019-10-25","2019-10-05","2019-09-07","2019-08-10","2019-06-29","2019-05-08","2019-04-28","2019-04-16","2019-03-21","2018-12-26","2018-12-14","2018-11-07","2018-10-10","2018-07-10","2018-06-05","2018-05-09","2018-04-24","2018-04-03","2018-01-27","2018-01-01","2017-11-14","2017-10-18","2017-09-17","2017-08-21","2017-07-03","2017-05-31","2017-04-27","2017-03-31","2017-03-13","2017-02-13","2017-01-30","2016-12-19","2016-11-28","2016-11-04","2016-10-21","2016-09-27","2016-09-09","2016-08-22","2016-07-29","2016-06-27","2016-06-04","2016-05-04","2016-04-16","2016-04-08","2016-03-21","2016-03-02","2016-02-22","2016-02-08","2016-02-03","2016-01-12","2015-12-28","2015-12-09","2015-11-05","2015-10-12","2015-08-26","2015-08-10","2015-07-20","2015-06-29","2015-06-11","2015-06-08","2015-05-28","2015-04-02","2015-03-09","2015-02-17","2015-01-26","2015-01-09","2014-12-26","2014-12-17","2014-12-16","2014-12-09","2014-11-21","2014-10-27","2014-10-13","2014-10-05","2014-09-13","2014-07-07","2014-06-23","2014-05-28","2014-05-14"],"name":"P90X - Cardio X","description":""},"P90X - Chest + Back":{"attributes":{"lower":false,"core":false,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"datesDone":[],"name":"P90X - Chest + Back","description":""},"P90X - Chest + Shoulders + Triceps":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":false},"datesDone":["2017-06-17","2017-02-17","2016-09-01"],"name":"P90X - Chest + Shoulders + Triceps","description":""},"P90X - Core Synergistics":{"attributes":{"lower":false,"core":true,"back":false,"upper":true,"cardio":false,"martial":false,"other":false},"datesDone":["2020-04-02","2019-11-19","2019-07-21","2019-03-29","2018-10-15","2018-06-21","2018-04-26","2017-10-02","2017-05-12","2017-02-07","2016-10-25","2016-07-25","2016-04-27","2016-03-23","2016-02-18","2016-01-21","2015-12-15","2015-10-31","2015-08-25","2015-08-05","2015-06-30","2015-04-30","2015-03-23","2015-02-11","2015-01-23","2014-12-30","2014-11-19","2014-10-01","2014-07-31","2014-06-26"],"name":"P90X - Core Synergistics","description":""},"P90X+ - Interval X+":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":true,"martial":false,"other":false},"datesDone":["2020-04-03","2019-10-03","2019-08-07","2019-04-18","2018-12-17","2018-10-17","2018-07-18","2018-06-09","2018-05-01","2018-02-14","2017-11-21","2017-10-12","2017-08-08","2017-06-06","2017-05-02","2017-03-20","2017-01-20","2016-11-30","2016-10-24","2016-09-22","2016-08-02","2016-06-09","2016-04-28","2016-03-24","2016-02-29","2016-01-18","2015-12-16","2015-10-28","2015-09-21","2015-08-07","2015-07-08","2015-06-03","2015-04-17","2015-03-16","2015-02-12","2015-01-16","2014-12-22","2014-11-13","2014-10-17","2014-10-02","2014-09-03","2014-07-28","2014-07-09","2014-06-25","2014-06-03","2014-05-12"],"name":"P90X+ - Interval X+","description":""},"P90X+ - Kenpo Cardio X+":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":true,"martial":true,"other":false},"datesDone":["2020-03-24","2019-12-01","2019-10-15","2019-08-27","2019-07-15","2019-06-08","2019-03-28","2019-02-15","2019-01-02","2018-11-29","2018-10-22","2018-08-07","2018-06-22","2018-05-18","2018-04-19","2018-01-16","2017-12-26","2017-12-05","2017-10-24","2017-09-20","2017-08-27","2017-07-21","2017-06-28","2017-05-18","2017-04-14","2017-02-22","2017-01-01","2016-12-08","2016-11-10","2016-10-13","2016-09-15","2016-08-30","2016-08-04","2016-07-03","2016-05-18","2016-04-25","2016-03-27","2016-03-09","2016-02-24","2016-01-27","2016-01-13","2015-12-21","2015-11-23","2015-10-23","2015-10-13","2015-09-11","2015-08-31","2015-08-12","2015-07-31","2015-07-06","2015-06-17","2015-06-01","2015-04-21","2015-03-24","2015-03-13","2015-02-10","2015-01-14","2014-11-18","2014-10-21","2014-09-18","2014-07-22","2014-06-10"],"name":"P90X+ - Kenpo Cardio X+","description":""},"P90X - Kenpo X":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":true,"martial":true,"other":false},"datesDone":["2020-04-07","2020-01-10","2019-11-13","2019-10-11","2019-09-17","2019-07-20","2019-06-19","2019-06-13","2019-03-12","2019-01-24","2018-11-17","2018-07-25","2018-06-15","2018-05-12","2018-01-04","2017-11-18","2017-09-30","2017-09-14","2017-08-02","2017-07-12","2017-06-11","2017-05-05","2017-04-06","2017-02-16","2017-01-26","2016-12-02","2016-11-01","2016-10-07","2016-09-13","2016-08-15","2016-07-14","2016-05-20","2016-05-02","2016-04-13","2016-03-17","2016-02-17","2016-01-22","2015-12-30","2015-12-08","2015-11-04","2015-10-16","2015-08-19","2015-07-27","2015-06-24","2015-05-29","2015-05-08","2015-04-06","2015-02-26","2015-01-21","2015-01-05","2014-12-02","2014-11-10","2014-10-07","2014-09-26","2014-08-28","2014-08-01","2014-07-18","2014-06-30","2014-06-17","2014-06-05","2014-05-22","2014-05-09"],"name":"P90X - Kenpo X","description":""},"P90X - Legs + Back":{"attributes":{"lower":true,"core":false,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"datesDone":["2017-05-16","2017-03-21","2016-12-15","2016-09-11","2016-05-12"],"name":"P90X - Legs + Back","description":""},"P90X - Plyometrics":{"attributes":{"lower":true,"core":false,"back":false,"upper":false,"cardio":true,"martial":false,"other":false},"datesDone":["2019-08-14","2019-03-25","2018-09-10","2018-05-24","2017-12-01","2017-10-09","2017-07-10","2017-06-03","2017-04-18","2017-02-24","2017-01-03","2016-09-26","2016-09-02","2016-05-16","2016-04-18","2016-03-15","2016-02-10","2015-12-29","2015-11-02","2015-10-14","2015-09-15","2015-07-14","2015-06-22","2015-05-06","2015-03-26","2015-02-18","2015-01-29","2015-01-07","2014-11-20","2014-10-28","2014-10-15","2014-09-19","2014-08-05","2014-06-16"],"name":"P90X - Plyometrics","description":""},"P90X - Shoulders + Arms":{"attributes":{"lower":false,"core":false,"back":false,"upper":true,"cardio":false,"martial":false,"other":false},"datesDone":["2019-03-13","2017-05-15"],"name":"P90X - Shoulders + Arms","description":""},"P90X - X Stretch":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"datesDone":["2020-04-08","2020-04-04","2020-03-30","2020-03-25","2020-03-20","2020-02-08","2020-01-16","2020-01-06","2019-12-16","2019-12-15","2019-12-09","2019-12-07","2019-12-03","2019-11-27","2019-11-21","2019-11-19","2019-11-14","2019-11-09","2019-11-05","2019-10-10","2019-10-08","2019-10-04","2019-09-30","2019-09-26","2019-09-24","2019-09-16","2019-09-10","2019-09-05","2019-08-31","2019-08-29","2019-08-26","2019-08-19","2019-08-13","2019-08-07","2019-07-29","2019-07-26","2019-07-23","2019-07-17","2019-07-15","2019-07-11","2019-07-08","2019-06-26","2019-06-24","2019-06-20","2019-06-11","2019-06-09","2019-06-06","2019-06-04","2019-05-08","2019-05-06","2019-05-04","2019-04-29","2019-04-17","2019-04-16","2019-04-07","2019-04-03","2019-03-31","2019-03-29","2019-03-26","2019-03-24","2019-03-18","2019-03-12","2019-03-06","2019-02-14","2019-01-01","2018-12-07","2018-12-03","2018-11-29","2018-11-14","2018-11-06","2018-10-22","2018-10-15","2018-10-06","2018-10-03","2018-10-01","2018-09-27","2018-09-18","2018-09-13","2018-09-08","2018-09-04","2018-08-16","2018-08-09","2018-07-25","2018-07-17","2018-07-07","2018-06-27","2018-06-19","2018-06-13","2018-06-10","2018-06-04","2018-05-23","2018-05-15","2018-04-25","2018-04-18","2018-04-06","2018-03-20","2018-02-19","2018-02-17","2018-02-12","2018-02-07","2018-02-02","2018-01-31","2018-01-29","2018-01-23","2018-01-18","2018-01-12","2018-01-08","2018-01-03","2017-12-30","2017-12-27","2017-12-19","2017-12-12","2017-11-30","2017-11-27","2017-11-18","2017-11-14","2017-11-12","2017-10-30","2017-10-08","2017-10-03","2017-09-29","2017-09-27","2017-09-22","2017-09-20","2017-09-18","2017-09-14","2017-09-11","2017-09-07","2017-08-28","2017-08-25","2017-08-22","2017-08-15","2017-08-06","2017-07-22","2017-07-20","2017-07-19","2017-07-15","2017-07-12","2017-07-09","2017-07-06","2017-06-30","2017-06-22","2017-06-19","2017-06-15","2017-06-11","2017-06-07","2017-05-28","2017-05-26","2017-05-23","2017-05-16","2017-05-11","2017-05-09","2017-05-01","2017-04-27","2017-04-24","2017-04-21","2017-04-19","2017-04-17","2017-04-11","2017-04-07","2017-04-04","2017-03-29","2017-03-27","2017-03-22","2017-03-17","2017-02-27","2017-02-21","2017-02-09","2017-01-23","2017-01-17","2017-01-12","2017-01-04","2016-12-31","2016-12-13","2016-12-08","2016-12-05","2016-11-30","2016-11-23","2016-11-15","2016-11-10","2016-11-07","2016-11-02","2016-10-25","2016-10-19","2016-10-14","2016-10-12","2016-10-07","2016-10-05","2016-10-03","2016-09-29","2016-09-27","2016-09-22","2016-09-20","2016-09-15","2016-09-13","2016-09-07","2016-09-02","2016-08-30","2016-08-26","2016-08-23","2016-08-16","2016-08-05","2016-08-03","2016-08-01","2016-07-29","2016-07-27","2016-07-25","2016-07-19","2016-07-14","2016-07-11","2016-07-01","2016-06-29","2016-06-24","2016-06-22","2016-06-20","2016-06-17","2016-06-14","2016-06-10","2016-06-08","2016-06-06","2016-06-03","2016-06-01","2016-05-24","2016-05-23","2016-05-21","2016-05-18","2016-05-17","2016-05-16","2016-05-13","2016-05-12","2016-05-10","2016-05-09","2016-05-05","2016-05-04","2016-04-28","2016-04-26","2016-04-21","2016-04-14","2016-04-12","2016-04-11","2016-04-06","2016-03-31","2016-03-29","2016-03-23","2016-03-22","2016-03-21","2016-03-17","2016-03-16","2016-03-15","2016-03-14","2016-03-10","2016-03-03","2016-03-01","2016-02-28","2016-02-25","2016-02-23","2016-02-18","2016-02-11","2016-02-10","2016-02-02","2016-01-28","2016-01-26","2016-01-21","2016-01-20","2016-01-19","2016-01-14","2016-01-13","2016-01-12","2016-01-08","2016-01-05","2015-12-29","2015-12-23","2015-12-22","2015-12-17","2015-12-16","2015-12-15","2015-12-10","2015-12-08","2015-12-03","2015-12-02","2015-11-28","2015-11-23","2015-11-05","2015-11-04","2015-11-02","2015-10-21","2015-10-20","2015-10-19","2015-10-15","2015-10-14","2015-10-13","2015-10-06","2015-10-05","2015-10-02","2015-09-16","2015-09-10","2015-08-30","2015-08-27","2015-08-25","2015-08-20","2015-08-18","2015-08-14","2015-08-11","2015-08-09","2015-08-04","2015-07-30","2015-07-28","2015-07-25","2015-07-14","2015-07-12","2015-07-09","2015-07-07","2015-07-02","2015-06-30","2015-06-27","2015-06-23","2015-06-20","2015-06-18","2015-06-16","2015-06-12","2015-06-10","2015-06-04","2015-06-02","2015-05-31","2015-05-29","2015-05-20","2015-05-18","2015-05-15","2015-05-13","2015-05-11","2015-05-08","2015-05-06","2015-05-05","2015-05-01","2015-04-30","2015-04-29","2015-04-27","2015-04-24","2015-04-23","2015-04-22","2015-04-21","2015-04-20","2015-04-17","2015-04-16","2015-04-15","2015-04-14","2015-04-13","2015-04-10","2015-04-09","2015-04-08","2015-04-07","2015-04-06","2015-04-05","2015-04-03","2015-04-02","2015-04-01","2015-03-31","2015-03-28","2015-03-26","2015-03-25","2015-03-17","2015-03-16","2015-03-15","2015-03-12","2015-03-11","2015-03-05","2015-03-01","2015-02-18","2015-02-16","2015-02-12","2015-02-11","2015-02-05","2015-02-04","2015-01-29","2015-01-28","2015-01-26","2015-01-21","2015-01-20","2015-01-15","2015-01-13","2015-01-10","2015-01-08","2015-01-06","2014-12-31","2014-12-24","2014-12-22","2014-12-17","2014-12-15","2014-12-09","2014-12-04","2014-12-03","2014-12-01","2014-11-25","2014-11-21","2014-11-20","2014-11-19","2014-11-17","2014-11-15","2014-11-14","2014-11-12","2014-11-10","2014-11-06","2014-11-04","2014-11-01","2014-10-29","2014-10-27","2014-10-22","2014-10-21","2014-10-16","2014-10-14","2014-10-09","2014-10-07","2014-10-02","2014-09-29","2014-09-28","2014-09-24","2014-09-17","2014-09-16","2014-09-11","2014-09-06","2014-09-02","2014-08-28","2014-08-26","2014-08-19","2014-08-12","2014-08-08","2014-08-05","2014-07-31","2014-07-29","2014-07-25","2014-07-22","2014-07-17","2014-07-10","2014-07-08","2014-07-04","2014-07-01","2014-06-26","2014-06-24","2014-06-19","2014-06-17","2014-06-10","2014-06-05","2014-06-02","2014-05-29","2014-05-26","2014-05-22","2014-05-13","2014-05-08","2014-05-06"],"name":"P90X - X Stretch","description":""},"P90X - Yoga X":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"datesDone":["2020-01-20","2019-11-23","2019-10-07","2019-09-24","2019-07-27","2019-04-22","2019-02-21","2018-10-18","2018-04-17","2018-03-16","2017-11-11","2017-09-09","2017-08-05","2017-05-30","2017-05-06","2017-03-28","2017-02-06","2016-12-27","2016-11-21","2016-11-09","2016-10-18","2016-08-18"],"name":"P90X - Yoga X","description":""},"P90X2 - Base and Back":{"attributes":{"lower":true,"core":false,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"datesDone":["2019-11-22","2019-08-06","2019-02-01","2018-11-06","2018-01-30","2017-10-26","2017-07-24","2017-04-29","2017-02-09","2016-11-07","2016-07-26","2016-04-26","2016-03-22","2016-02-04","2015-11-03","2015-08-24","2015-07-09","2015-05-14","2015-03-31","2015-02-03","2015-01-01","2014-11-12","2014-10-16","2014-09-07","2014-08-11","2014-07-03","2014-06-12"],"name":"P90X2 - Base and Back","description":""},"P90X2 - Chest Back Balance":{"attributes":{"lower":false,"core":true,"back":true,"upper":false,"cardio":false,"martial":false,"other":false},"datesDone":[],"name":"P90X2 - Chest Back Balance","description":""},"P90X2 - P.A.P. Lower":{"attributes":{"lower":true,"core":false,"back":false,"upper":false,"cardio":true,"martial":false,"other":false},"datesDone":["2020-01-13","2019-07-17","2019-02-20","2018-07-12","2017-08-15","2017-05-28","2017-04-11","2017-01-17","2016-10-11","2016-06-13","2016-04-11","2016-03-01","2016-01-26","2015-12-02","2015-10-20","2015-09-17","2015-07-21","2015-06-16","2015-04-28","2015-03-12","2015-02-05","2015-01-08","2014-12-04","2014-11-03","2014-10-03","2014-08-29","2014-06-24"],"name":"P90X2 - P.A.P. Lower","description":""},"P90X2 - P.A.P. Upper":{"attributes":{"lower":false,"core":false,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"datesDone":["2019-09-25","2019-04-23","2018-02-05","2017-09-11","2017-04-17","2017-01-12","2016-12-05","2016-10-12","2016-09-20","2016-05-09","2016-04-12","2016-03-03","2016-01-28","2015-12-10","2015-10-21","2015-08-13","2015-06-23","2015-04-15","2015-03-17","2015-01-28","2014-12-15","2014-10-29","2014-10-09","2014-07-24","2014-06-18","2014-05-07"],"name":"P90X2 - P.A.P. Upper","description":""},"P90X2 - Plyocide":{"attributes":{"lower":true,"core":false,"back":true,"upper":false,"cardio":true,"martial":false,"other":false},"datesDone":["2020-03-28","2019-12-10","2019-11-18","2019-08-26","2019-04-29","2019-03-08","2018-12-03","2018-09-20","2018-06-25","2018-05-13","2018-02-17","2017-11-28","2017-10-03","2017-09-08","2017-06-09","2017-05-11","2017-04-24","2017-03-23","2017-02-01","2016-12-20","2016-10-26","2016-09-30","2016-07-24","2016-05-06","2016-04-21","2016-03-29","2016-03-10","2016-02-15","2016-01-06","2015-12-17","2015-11-25","2015-10-15","2015-09-10","2015-08-27","2015-08-11","2015-07-29","2015-06-26","2015-06-04","2015-05-20","2015-04-14","2015-03-10","2015-02-25","2015-02-09","2015-01-12","2014-12-19","2014-11-24","2014-11-14","2014-10-22","2014-10-08","2014-09-30","2014-09-16","2014-08-26","2014-08-07","2014-07-30","2014-07-15","2014-06-20","2014-05-21","2014-05-08"],"name":"P90X2 - Plyocide","description":""},"P90X2 - X2 Ab Ripper":{"attributes":{"lower":false,"core":true,"back":false,"upper":false,"cardio":false,"martial":false,"other":false},"datesDone":["2020-01-15","2019-10-23","2019-08-19","2019-07-12","2019-06-30","2019-05-05","2019-04-10","2018-10-13","2018-08-09","2018-07-07","2018-03-15","2017-11-07","2017-09-12","2017-07-18","2017-04-20","2016-12-06","2016-05-15","2016-04-22","2016-03-04","2016-01-29","2015-12-18","2015-11-05","2015-08-28","2015-07-10","2015-05-14","2015-05-09","2015-04-12","2015-03-29","2015-02-08","2015-01-05","2014-11-15","2014-10-20","2014-09-25","2014-09-14","2014-09-07","2014-08-11","2014-07-28","2014-06-23","2014-06-08","2014-05-20"],"name":"P90X2 - X2 Ab Ripper","description":""},"P90X2 - X2 Balance and Power":{"attributes":{"lower":true,"core":true,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"datesDone":["2020-03-19","2019-09-16","2019-04-05","2018-11-18","2018-07-17","2018-05-31","2017-11-29","2017-09-21","2017-05-25","2017-02-21","2016-12-01","2016-08-31","2016-05-03","2016-03-25","2016-02-25","2016-01-19","2015-12-07","2015-10-27","2015-08-18","2015-07-07","2015-06-09","2015-04-08","2015-02-16","2015-01-19","2014-11-17","2014-10-06","2014-09-02","2014-07-17","2014-06-09"],"name":"P90X2 - X2 Balance and Power","description":""},"P90X2 - X2 Core":{"attributes":{"lower":false,"core":true,"back":false,"upper":true,"cardio":false,"martial":false,"other":false},"datesDone":["2020-04-09","2020-01-09","2019-11-14","2019-06-25","2019-03-23","2018-11-30","2018-09-19","2018-06-11","2018-02-19","2017-10-05","2017-06-08","2017-04-23","2017-01-31","2016-11-03","2016-07-31","2016-05-05","2016-03-30","2016-03-14","2016-02-02","2016-01-14","2015-12-22","2015-11-24","2015-10-19","2015-09-09","2015-08-20","2015-07-30","2015-07-02","2015-06-02","2015-05-12","2015-03-27","2015-03-02","2015-02-02","2015-01-13","2014-12-18","2014-11-29","2014-11-11","2014-11-05","2014-10-23","2014-10-15","2014-09-28","2014-09-15","2014-08-27","2014-08-17","2014-08-06","2014-07-21","2014-07-02","2014-06-13","2014-06-06","2014-05-23","2014-05-06"],"name":"P90X2 - X2 Core","description":""},"P90X2 - X2 Recovery + Mobility/Foam Rolling Sessio":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"datesDone":["2020-04-02","2020-01-08","2019-12-11","2019-11-13","2019-08-28","2019-08-16","2019-06-12","2019-03-28","2019-03-05","2019-02-21","2018-11-01","2018-09-10","2018-07-28","2018-07-26","2018-02-20","2018-02-14","2018-02-04","2018-01-11","2018-01-07","2018-01-02","2017-12-18","2017-10-13","2017-10-07","2017-10-04","2017-09-13","2017-08-09","2017-08-01","2017-07-17","2017-07-14","2017-07-10","2017-07-05","2017-06-27","2017-06-16","2017-06-06","2017-06-01","2017-05-23","2017-05-17","2017-05-07","2017-04-28","2017-04-22","2017-04-16","2017-04-03","2017-03-18","2017-02-18","2017-02-04","2017-01-28","2016-12-12","2016-11-01","2016-10-17","2016-10-11","2016-09-23","2016-08-21","2016-06-16","2016-06-05"],"name":"P90X2 - X2 Recovery + Mobility/Foam Rolling Sessio","description":""},"P90X2 - X2 Shoulders and Arms":{"attributes":{"lower":false,"core":false,"back":false,"upper":true,"cardio":false,"martial":false,"other":false},"datesDone":["2018-03-20"],"name":"P90X2 - X2 Shoulders and Arms","description":""},"P90X2 - X2 Total Body":{"attributes":{"lower":false,"core":true,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"datesDone":["2019-12-02","2019-08-13","2019-03-20","2018-05-15","2017-11-15","2017-09-06","2017-07-13","2017-05-09","2017-01-19","2016-10-03","2016-07-05","2016-04-20","2016-03-16","2016-02-11","2016-01-04","2015-12-03","2015-09-16","2015-07-28","2015-06-18","2015-04-23","2015-03-11","2015-01-06","2014-12-01","2014-10-20","2014-09-17","2014-08-04","2014-07-08","2014-05-27"],"name":"P90X2 - X2 Total Body","description":""},"P90X2 - X2 Yoga":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"datesDone":["2020-03-17","2020-01-14","2019-11-11","2019-10-01","2019-09-14","2019-08-11","2019-07-09","2019-06-16","2019-04-12","2019-04-02","2019-03-05","2019-01-18","2019-01-06","2018-11-20","2018-11-03","2018-09-12","2018-08-18","2018-06-01","2018-03-27","2018-01-15","2017-12-08","2017-11-08","2017-10-17","2017-09-23","2017-08-29","2017-07-18","2017-07-01","2017-05-21","2017-04-15","2017-04-08","2017-03-14","2017-01-18","2017-01-09","2016-12-14","2016-11-16","2016-10-31","2016-09-28","2016-09-08","2016-08-16","2016-08-07","2016-07-12","2016-06-20","2016-05-11","2016-04-19","2016-04-07","2016-03-28","2016-03-08","2016-02-23","2016-02-16","2016-02-01","2016-01-11","2016-01-05","2015-12-14","2015-11-30","2015-10-22","2015-09-08","2015-08-17","2015-08-06","2015-07-05","2015-05-30","2015-05-17","2015-04-19","2015-03-18","2015-03-03","2015-02-24","2015-02-06","2015-01-15","2014-12-29","2014-12-11","2014-12-10","2014-12-03","2014-11-22","2014-11-16","2014-11-11","2014-11-02","2014-10-24","2014-09-25","2014-08-24","2014-07-29","2014-06-29","2014-06-12","2014-05-30","2014-05-20"],"name":"P90X2 - X2 Yoga","description":""},"Long Run + Roll":{"attributes":{"lower":true,"core":false,"back":true,"upper":false,"cardio":true,"martial":true,"other":false},"datesDone":["2020-03-15","2019-12-14","2019-11-28","2019-11-06","2019-10-23","2019-10-16","2019-09-29","2019-09-21","2019-09-02","2019-08-21","2019-07-28","2019-07-19","2019-07-13","2019-06-03","2019-04-24","2019-03-30","2019-02-23","2019-01-22","2019-01-17","2018-12-19","2018-12-12","2018-12-01","2018-11-22","2018-10-21","2018-10-14","2018-10-08","2018-09-27","2018-09-23","2018-09-11","2018-09-04","2018-08-01","2018-07-16","2018-07-08","2018-06-18","2018-02-20","2018-02-03","2018-01-13","2017-12-15","2017-11-24","2017-11-12","2017-11-06","2017-10-06","2017-09-12","2017-08-26","2017-08-18","2017-08-01","2017-07-22","2017-07-04","2017-06-26","2017-06-18","2016-07-04","2016-01-31","2015-07-04","2015-05-03","2015-04-11","2014-11-06","2014-07-12","2014-06-27","2014-06-04","2014-05-05"],"name":"Long Run + Roll","description":""},"Short Run + Roll":{"attributes":{"lower":true,"core":false,"back":true,"upper":false,"cardio":true,"martial":false,"other":false},"datesDone":["2019-07-11","2019-06-12","2019-03-22","2019-02-18","2019-02-13","2019-01-30","2019-01-14","2018-06-28","2015-07-01","2015-03-22","2015-01-30","2015-01-22","2014-12-25","2014-11-27","2014-10-25","2014-10-18","2014-10-11","2014-09-20","2014-08-19","2014-08-12","2014-08-10","2014-08-02","2014-07-24","2014-07-21","2014-07-19","2014-07-16","2014-07-07","2014-07-04","2014-06-30","2014-06-24","2014-06-22","2014-06-21","2014-06-18","2014-06-14","2014-06-13","2014-06-09","2014-06-07","2014-06-03","2014-05-31","2014-05-30","2014-05-29","2014-05-27","2014-05-24","2014-05-23","2014-05-12"],"name":"Short Run + Roll","description":""},"Tai Chi":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"datesDone":["2020-04-09","2020-04-08","2020-04-07","2020-04-04","2020-04-03","2020-04-02","2020-04-01","2020-03-31","2020-03-30","2020-03-29","2020-03-28","2020-03-27","2020-03-26","2020-03-25","2020-03-24","2020-03-23","2020-03-22","2020-03-21","2020-03-19","2020-03-18","2020-03-15","2020-03-14","2020-03-12","2020-02-19","2020-02-18","2020-02-17","2020-02-16","2020-02-14","2020-02-13","2020-02-03","2020-01-21","2020-01-20","2020-01-16","2020-01-15","2020-01-13","2020-01-11","2020-01-10","2020-01-09","2020-01-08","2020-01-07","2019-12-17","2019-12-14","2019-12-13","2019-12-12","2019-12-11","2019-12-10","2019-12-09","2019-12-08","2019-12-07","2019-12-06","2019-12-05","2019-12-04","2019-12-03","2019-12-02","2019-12-01","2019-11-30","2019-11-29","2019-11-28","2019-11-27","2019-11-26","2019-11-25","2019-11-24","2019-11-23","2019-11-22","2019-11-21","2019-11-20","2019-11-19","2019-11-18","2019-11-17","2019-11-15","2019-11-14","2019-11-13","2019-11-12","2019-11-11","2019-11-10","2019-11-09","2019-11-07","2019-11-06","2019-11-05","2019-10-28","2019-10-27","2019-10-25","2019-10-22","2019-10-21","2019-10-16","2019-10-15","2019-10-14","2019-10-13","2019-10-12","2019-10-10","2019-10-09","2019-10-08","2019-10-07","2019-10-06","2019-10-05","2019-10-04","2019-10-03","2019-10-02","2019-10-01","2019-09-29","2019-09-28","2019-09-27","2019-09-26","2019-09-25","2019-09-20","2019-09-18","2019-09-17","2019-09-16","2019-09-15","2019-09-14","2019-09-12","2019-09-11","2019-09-10","2019-09-08","2019-09-07","2019-09-06","2019-09-05","2019-09-01","2019-08-31","2019-08-26","2019-08-23","2019-08-22","2019-08-21","2019-08-20","2019-08-19","2019-08-18","2019-08-17","2019-08-16","2019-08-15","2019-08-14","2019-08-12","2019-08-10","2019-08-09","2019-08-07","2019-08-06","2019-08-05","2019-08-03","2019-07-31","2019-07-30","2019-07-29","2019-07-28","2019-07-27","2019-07-26","2019-07-25","2019-07-24","2019-07-23","2019-07-22","2019-07-21","2019-07-20","2019-07-19","2019-07-18","2019-07-17","2019-07-16","2019-07-15","2019-07-14","2019-07-13","2019-07-12","2019-07-11","2019-07-09","2019-07-08","2019-07-01","2019-06-30","2019-06-29","2019-06-27","2019-06-26","2019-06-25","2019-06-24","2019-06-23","2019-06-22","2019-06-21","2019-06-20","2019-06-19","2019-06-17","2019-06-14","2019-06-13","2019-06-10","2019-06-09","2019-06-07","2019-06-06","2019-06-05","2019-06-04","2019-06-03","2019-05-08","2019-05-07","2019-05-06","2019-05-05","2019-05-04","2019-05-03","2019-04-29","2019-04-28","2019-04-25","2019-04-23","2019-04-20","2019-04-19","2019-04-18","2019-04-17","2019-04-16","2019-04-15","2019-04-10","2019-04-09","2019-04-08","2019-04-07","2019-04-05","2019-04-04","2019-04-03","2019-04-01","2019-03-30","2019-03-29","2019-03-28","2019-03-27","2019-03-26","2019-03-25","2019-03-23","2019-03-21","2019-03-20","2019-03-19","2019-03-18","2019-03-15","2019-03-14","2019-03-13","2019-03-12","2019-03-11","2019-03-08","2019-03-07","2019-03-04","2019-03-01","2019-02-28","2019-02-27","2019-02-26","2019-02-25","2019-02-24","2019-02-20","2019-02-19","2019-02-17","2019-02-16","2019-02-15","2019-02-14","2019-02-13","2019-02-12","2019-01-25","2019-01-22","2019-01-21","2019-01-18","2019-01-02","2018-12-28","2018-12-21","2018-12-20","2018-12-19","2018-12-09","2018-12-07","2018-12-06","2018-12-05","2018-12-04","2018-12-03","2018-11-30","2018-11-29","2018-11-28","2018-11-27","2018-11-26","2018-11-25","2018-11-19","2018-11-18","2018-11-14","2018-11-13","2018-11-12","2018-11-09","2018-11-08","2018-11-07","2018-11-06","2018-11-05","2018-11-02","2018-11-01","2018-10-31","2018-10-30","2018-10-29","2018-10-26","2018-10-22","2018-10-17","2018-10-15","2018-10-12","2018-10-11","2018-10-10","2018-10-09","2018-10-08","2018-10-04","2018-09-27","2018-09-23","2018-09-20","2018-09-19","2018-09-18","2018-09-14","2018-09-13","2018-09-10","2018-09-05","2018-08-19","2018-08-09","2018-08-04","2018-08-03","2018-07-31","2018-07-30","2018-07-28","2018-07-27","2018-07-26","2018-07-25","2018-07-24","2018-07-23","2018-07-19","2018-07-18","2018-07-17","2018-07-16","2018-07-13","2018-07-12","2018-07-06","2018-06-29","2018-06-10","2018-05-22","2018-05-20","2018-05-16","2018-05-15","2018-05-13","2018-05-10","2018-05-09","2018-04-30","2018-04-27","2018-04-26","2018-04-21","2018-04-19","2018-04-16","2018-04-10","2018-04-06","2018-04-04","2018-04-03","2018-03-28","2018-03-27","2018-03-26","2018-03-20","2018-03-19","2018-03-16","2018-03-15","2018-03-14","2018-03-09","2018-02-20","2018-02-19","2018-02-18","2018-02-17","2018-02-16","2018-02-15","2018-02-14","2018-02-13","2018-02-09","2018-02-08","2018-02-07","2018-02-06","2018-02-05","2018-02-03","2018-02-02","2018-02-01","2018-01-31","2018-01-30","2018-01-29","2018-01-28","2018-01-27","2018-01-25","2018-01-24","2018-01-18","2018-01-17","2018-01-16","2018-01-14","2018-01-13","2018-01-12","2018-01-11","2018-01-10","2018-01-08","2018-01-07","2018-01-06","2018-01-05","2018-01-04","2018-01-03","2018-01-02","2018-01-01","2017-12-31","2017-12-30","2017-12-29","2017-12-28","2017-12-27","2017-12-21","2017-12-20","2017-12-19","2017-12-18","2017-12-17","2017-12-15","2017-12-14","2017-12-12","2017-12-11","2017-12-10","2017-12-09","2017-12-08","2017-12-06","2017-12-05","2017-12-04","2017-12-03","2017-12-01","2017-11-29","2017-11-28","2017-11-20","2017-11-18","2017-11-17","2017-11-16","2017-11-15","2017-11-14","2017-11-13","2017-11-12","2017-11-11","2017-11-10","2017-11-09","2017-11-08","2017-11-07","2017-11-06","2017-11-01","2017-10-31","2017-10-30","2017-10-26","2017-10-25","2017-10-24","2017-10-20","2017-10-19","2017-10-18","2017-10-17","2017-10-16","2017-10-14","2017-10-13","2017-10-12","2017-10-11","2017-10-10","2017-10-09","2017-10-08","2017-10-07","2017-10-05","2017-10-04","2017-10-03","2017-10-02","2017-09-30","2017-09-29","2017-09-28","2017-09-27","2017-09-26","2017-09-25","2017-09-23","2017-09-22","2017-09-21","2017-09-20","2017-09-19","2017-09-18","2017-09-17","2017-09-16","2017-09-15","2017-09-14","2017-09-13","2017-09-12","2017-09-11","2017-09-10","2017-09-09","2017-09-08","2017-09-07","2017-09-06","2017-09-05","2017-09-02","2017-08-31","2017-08-30","2017-08-29","2017-08-28","2017-08-27","2017-08-26","2017-08-25","2017-08-24","2017-08-23","2017-08-22","2017-08-21","2017-08-20","2017-08-18","2017-08-17","2017-08-16","2017-08-15","2017-08-14","2017-08-13","2017-08-09","2017-08-08","2017-08-07","2017-08-06","2017-08-05","2017-08-04","2017-08-03","2017-08-02","2017-08-01","2017-07-31","2017-07-24","2017-07-23","2017-07-22","2017-07-21","2017-07-20","2017-07-19","2017-07-18","2017-07-17","2017-07-16","2017-07-15","2017-07-14","2017-07-13","2017-07-12","2017-07-11","2017-07-10","2017-07-09","2017-07-07","2017-07-06","2017-07-05","2017-07-03","2017-07-02","2017-07-01","2017-06-30","2017-06-29","2017-06-28","2017-06-27","2017-06-25","2017-06-24","2017-06-23","2017-06-22","2017-06-21","2017-06-20","2017-06-19","2017-06-18","2017-06-17","2017-06-16","2017-06-15","2017-06-14","2017-06-12","2017-06-11","2017-06-10","2017-06-09","2017-06-08","2017-06-07","2017-06-06","2017-06-03","2017-06-02","2017-06-01","2017-05-31","2017-05-29","2017-05-28","2017-05-27","2017-05-26","2017-05-24","2017-05-22","2017-05-20","2017-05-19","2017-05-18","2017-05-17","2017-05-16","2017-05-15","2017-05-14","2017-05-13","2017-05-12","2017-05-11","2017-05-10","2017-05-09","2017-05-08","2017-05-05","2017-05-03","2017-05-02","2017-05-01","2017-04-30","2017-04-29","2017-04-28","2017-04-27","2017-04-26","2017-04-25","2017-04-24","2017-04-23","2017-04-22","2017-04-21","2017-04-20","2017-04-19","2017-04-18","2017-04-17","2017-04-16","2017-04-14","2017-04-13","2017-04-12","2017-04-11","2017-04-10","2017-04-09","2017-04-08","2017-04-07","2017-04-06","2017-04-05","2017-04-04","2017-04-03","2017-03-31","2017-03-30","2017-03-28","2017-03-27","2017-03-24","2017-03-23","2017-03-22","2017-03-21","2017-03-20","2017-03-19","2017-03-18","2017-03-17","2017-03-16","2017-03-15","2017-03-14","2017-02-23","2017-02-21","2017-02-20","2017-02-16","2017-02-14","2017-02-09","2017-02-07","2017-02-02","2017-02-01","2017-01-27","2017-01-19","2017-01-17","2017-01-16","2017-01-12","2017-01-10","2017-01-04","2016-12-20","2016-12-12","2016-12-08","2016-12-06","2016-11-29","2016-11-15","2016-11-14","2016-11-10","2016-11-08","2016-11-07","2016-11-04","2016-11-01","2016-10-26","2016-10-25","2016-10-24","2016-10-21","2016-10-20","2016-10-19","2016-10-17","2016-10-14","2016-10-13","2016-10-12","2016-10-11","2016-10-07","2016-10-06","2016-10-05","2016-10-04","2016-10-03","2016-09-30","2016-09-29","2016-09-27","2016-09-26","2016-09-23","2016-09-22","2016-09-21","2016-09-20","2016-09-14","2016-09-13","2016-09-12","2016-09-09","2016-09-06","2016-09-05","2016-09-01","2016-08-30","2016-08-29","2016-08-26","2016-08-25","2016-08-23","2016-08-15","2016-08-05","2016-08-04","2016-08-03","2016-08-02","2016-08-01","2016-07-29","2016-07-28","2016-07-27","2016-07-26","2016-07-25","2016-07-24","2016-07-22","2016-07-21","2016-07-20","2016-07-19","2016-07-18","2016-07-15","2016-07-14","2016-07-13","2016-07-11","2016-07-05","2016-07-01","2016-06-30","2016-06-29","2016-06-28","2016-06-24","2016-06-23","2016-06-22","2016-06-21","2016-06-17","2016-06-16","2016-06-15","2016-06-14","2016-06-13","2016-06-10","2016-06-09","2016-06-08","2016-06-07","2016-06-03","2016-06-02","2016-05-31","2016-05-24","2016-05-22","2016-05-21","2016-05-17","2016-05-16","2016-05-15","2016-05-13","2016-05-12","2016-05-10","2016-05-09","2016-05-08","2016-05-05","2016-05-04","2016-05-03","2016-04-29","2016-04-22","2016-04-15","2016-04-13","2016-04-09","2016-03-25","2016-03-18","2016-03-16","2016-03-11","2016-03-07","2016-03-04","2016-02-26","2016-02-19","2016-02-12","2016-02-10","2016-02-05","2016-01-29","2016-01-20","2016-01-15","2016-01-14","2016-01-06","2016-01-02","2015-12-28","2015-12-18","2015-12-17","2015-12-16","2015-12-15","2015-12-11","2015-12-07","2015-12-04","2015-11-29","2015-11-05","2015-11-04","2015-11-02","2015-10-31","2015-10-24","2015-10-21","2015-10-20","2015-10-19","2015-10-15","2015-10-14","2015-10-13","2015-10-12","2015-10-06","2015-10-05","2015-10-02","2015-10-01","2015-09-30","2015-09-27","2015-09-25","2015-09-18","2015-09-15","2015-09-14","2015-09-10","2015-09-09","2015-08-28","2015-08-21","2015-08-13","2015-08-11","2015-08-05","2015-07-30","2015-07-24","2015-07-22","2015-07-13","2015-07-07","2015-07-03","2015-06-30","2015-06-23","2015-06-04","2015-05-29","2015-05-20","2015-05-18","2015-05-12","2015-05-06","2015-05-04","2015-04-30","2015-04-26","2015-04-17","2015-04-15","2015-04-14","2015-04-10","2015-04-08","2015-04-02","2015-03-31","2015-03-18","2015-03-10","2015-02-25","2015-02-03","2015-01-29","2015-01-28","2015-01-21","2015-01-19","2015-01-15","2015-01-08","2014-12-27","2014-12-23","2014-12-16","2014-12-15","2014-12-09","2014-12-04","2014-12-01","2014-11-30","2014-11-25","2014-11-24","2014-11-20","2014-11-19","2014-11-18","2014-11-17","2014-11-14","2014-11-13","2014-11-12","2014-11-11","2014-11-10","2014-11-05","2014-11-03","2014-10-31","2014-10-30","2014-10-29","2014-10-28","2014-10-27","2014-10-24","2014-10-23","2014-10-22","2014-10-21","2014-10-20","2014-10-17","2014-10-16","2014-10-15","2014-10-14","2014-10-09","2014-10-08","2014-10-06","2014-10-03","2014-10-02","2014-10-01","2014-09-30","2014-09-25","2014-09-24","2014-09-22","2014-09-19","2014-09-18","2014-09-17","2014-09-16","2014-09-09","2014-09-08","2014-09-05","2014-09-03","2014-08-29","2014-08-27","2014-08-26","2014-08-11","2014-08-07","2014-08-06","2014-08-04","2014-08-03","2014-08-01","2014-07-30","2014-07-26","2014-07-23","2014-07-20","2014-07-18","2014-07-16","2014-07-15","2014-07-09","2014-07-07","2014-07-03","2014-07-02","2014-06-27","2014-06-25","2014-06-23","2014-06-22","2014-06-20","2014-06-18","2014-06-11","2014-06-04","2014-05-28","2014-05-21","2014-05-14","2014-05-07"],"name":"Tai Chi","description":""},"Brazilian Jiu Jitsu":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":true,"other":false},"datesDone":["2019-01-02","2018-12-21","2018-12-07","2018-12-05","2018-11-30","2018-11-19","2018-11-15","2018-11-14","2018-11-09","2018-11-07","2018-10-27","2018-10-18","2018-10-17","2018-10-12","2018-10-10","2018-10-05","2018-09-25","2018-09-21","2018-09-17","2018-08-10","2018-08-03","2018-07-27","2018-07-20","2018-07-06","2018-02-13","2017-12-08","2017-12-01","2017-11-28","2017-11-20","2017-11-09","2017-11-07","2017-11-01","2017-10-24","2017-10-20","2017-10-18","2017-10-12","2017-10-11","2017-10-06","2017-09-06","2017-08-23","2017-08-21","2017-08-18","2017-08-14","2017-08-07","2017-08-04","2017-06-16","2017-06-14","2017-06-09","2017-06-07","2017-06-02","2017-05-26","2017-05-24","2017-05-22","2017-05-19","2017-05-17","2017-05-12","2017-05-10","2017-05-05","2017-05-01","2017-04-12","2017-04-10","2017-04-07","2017-04-05","2017-04-01","2017-03-31","2017-03-22","2017-03-20","2017-03-17","2017-03-15","2017-02-24","2017-02-22","2017-02-17","2017-02-08","2017-02-03","2017-01-27","2017-01-25","2017-01-18","2017-01-16","2016-12-22","2016-12-19","2016-12-16","2016-12-13","2016-11-28","2016-11-11","2016-10-24","2016-05-02","2016-04-29","2016-04-25","2016-04-22","2016-04-18","2016-04-15","2016-03-28","2016-03-11","2016-03-09","2016-03-04","2016-03-02","2016-02-29","2016-02-24","2016-02-22","2016-02-19","2016-02-17","2016-02-12","2016-02-05","2016-02-03","2016-02-01","2016-01-30","2016-01-25","2016-01-18","2016-01-15","2016-01-04","2015-12-30","2015-12-21","2015-12-18","2015-12-11","2015-12-09","2015-12-04","2015-11-30","2015-09-21","2015-09-18","2015-09-14","2015-08-31","2015-08-28","2015-08-26","2015-08-19","2015-08-17","2015-08-14","2015-08-12","2015-08-10","2015-08-07","2015-08-05","2015-07-29","2015-07-27","2015-07-20","2015-07-13","2015-07-10","2015-07-08","2015-07-06","2015-07-03","2015-07-01","2015-06-29","2015-06-25","2015-06-22","2015-06-19","2015-06-17","2015-06-15","2015-06-08","2015-06-05","2015-06-03","2015-06-01","2015-05-28","2015-05-21","2015-05-19","2015-05-15","2015-05-13","2015-05-11","2015-05-07","2015-05-05","2015-05-01","2015-04-29","2015-04-27","2015-04-24","2015-04-22","2015-04-20","2015-04-16","2015-04-13","2015-04-09","2015-04-07","2015-04-03","2015-04-01","2015-03-30","2015-03-25","2015-03-19","2015-02-19","2015-02-17","2015-02-13","2015-02-10","2015-02-06","2015-02-04","2015-01-30","2015-01-27","2015-01-22","2015-01-20","2015-01-16","2015-01-14","2015-01-09","2015-01-07","2014-12-23","2014-12-16","2014-12-02","2014-11-24","2014-11-18","2014-11-13","2014-11-05","2014-10-30","2014-10-23","2014-09-29","2014-09-17","2014-09-10","2014-09-04"],"name":"Brazilian Jiu Jitsu","description":""},"r/BodyWeightFitness Recommended Routine":{"attributes":{"lower":false,"core":true,"back":false,"upper":true,"cardio":false,"martial":false,"other":false},"datesDone":["2018-07-09","2018-05-25","2018-03-28","2018-02-08","2017-11-09","2017-10-08","2017-09-03","2017-08-17","2017-07-09","2017-05-27","2017-04-26","2017-04-09","2017-03-27","2017-02-28","2017-02-03","2016-12-21","2016-11-17","2016-10-27","2016-09-29","2016-08-28","2016-08-06","2016-07-17","2016-06-24","2016-05-31","2016-04-30","2016-04-14","2016-03-31","2016-03-18","2016-03-05"],"name":"r/BodyWeightFitness Recommended Routine","description":""},"RushFit - Fight Conditioning":{"attributes":{"lower":true,"core":true,"back":false,"upper":false,"cardio":true,"martial":true,"other":false},"datesDone":["2020-03-30","2020-03-13","2019-12-06","2019-11-21","2019-10-21","2019-09-27","2019-08-17","2019-07-24","2019-06-23","2019-04-08","2019-03-04","2019-01-19","2018-12-20","2018-11-26","2018-10-30","2018-09-14","2018-06-27","2018-05-30","2018-04-28","2018-04-05","2018-02-06","2018-01-09","2017-12-07","2017-10-31","2017-09-27","2017-09-05","2017-07-26","2017-07-07","2017-05-24","2017-04-21","2017-03-16","2017-02-02","2017-01-11","2016-12-13","2016-11-15","2016-10-19","2016-10-04","2016-09-19","2016-09-06","2016-08-25","2016-07-27","2016-07-21","2016-07-11","2016-07-06","2016-06-29","2016-06-23","2016-06-17","2016-06-14","2016-06-07","2016-06-03","2016-05-30","2016-05-24","2016-05-13","2016-05-10","2016-05-07"],"name":"RushFit - Fight Conditioning","description":""},"RushFit - Strength and Endurance":{"attributes":{"lower":true,"core":true,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"datesDone":["2020-03-23","2019-11-09","2019-07-31","2019-04-17","2019-03-11","2018-12-18","2018-10-31","2018-08-14","2018-06-30","2018-05-21","2018-04-16","2018-02-13","2017-11-20","2017-10-11","2017-09-15","2017-08-07","2017-06-15","2017-05-19","2017-04-12","2017-02-23","2017-01-25","2016-12-12","2016-11-14","2016-10-17","2016-09-23","2016-09-05","2016-08-05","2016-07-20","2016-06-15","2016-06-10","2016-05-25","2016-05-17"],"name":"RushFit - Strength and Endurance","description":""},"RushFit - Full Body Strength and Conditioning":{"attributes":{"lower":true,"core":true,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"datesDone":["2020-04-06","2019-12-11","2019-09-04","2019-06-11","2019-03-26","2018-12-30","2018-09-21","2018-07-26","2018-06-19","2018-04-30","2017-12-11","2017-11-01","2017-09-29","2017-08-30","2017-07-19","2017-06-05","2017-05-03","2017-04-05","2017-02-10","2017-01-02","2016-11-22","2016-10-20","2016-10-05","2016-09-14","2016-08-26","2016-07-28","2016-07-13","2016-06-30","2016-06-06","2016-05-19"],"name":"RushFit - Full Body Strength and Conditioning","description":""},"RushFit - Explosive Powertraining":{"attributes":{"lower":true,"core":true,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"datesDone":["2019-11-26","2019-09-10","2019-07-01","2019-04-09","2019-03-06","2018-12-04","2018-10-16","2018-09-07","2018-07-13","2018-06-12","2018-05-10","2018-01-10","2017-11-17","2017-10-23","2017-09-18","2017-08-14","2017-07-06","2017-05-22","2017-04-20","2017-03-15","2017-02-15","2017-01-16","2016-11-29","2016-11-02","2016-10-14","2016-09-21","2016-08-29","2016-08-01","2016-07-15","2016-07-01","2016-06-21","2016-06-08","2016-05-23"],"name":"RushFit - Explosive Powertraining","description":""},"Rushfit - Balance and Agility":{"attributes":{"lower":true,"core":false,"back":false,"upper":true,"cardio":true,"martial":false,"other":false},"datesDone":["2019-12-17","2019-09-26","2019-06-20","2019-03-14","2019-01-07","2018-11-21","2018-10-12","2018-09-25","2018-07-05","2018-05-16","2018-04-13","2018-01-31","2017-12-29","2017-11-05","2017-09-26","2017-08-23","2017-07-16","2017-06-14","2017-05-08","2017-04-03","2017-02-08","2017-01-24","2016-12-07","2016-11-18","2016-10-28","2016-10-06","2016-09-07","2016-08-23","2016-07-18","2016-06-28","2016-06-01"],"name":"Rushfit - Balance and Agility","description":""},"Rushfit - Stretching for Flexibility":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"datesDone":["2020-04-05","2020-03-29","2020-02-13","2020-02-03","2020-01-14","2020-01-11","2019-12-17","2019-12-08","2019-12-04","2019-12-02","2019-11-30","2019-11-24","2019-11-20","2019-11-15","2019-11-12","2019-11-06","2019-10-22","2019-10-12","2019-10-09","2019-10-07","2019-10-02","2019-09-27","2019-09-25","2019-09-15","2019-09-01","2019-08-30","2019-08-20","2019-08-15","2019-08-12","2019-08-08","2019-08-06","2019-07-30","2019-07-25","2019-07-18","2019-07-16","2019-07-14","2019-07-10","2019-07-01","2019-06-27","2019-06-25","2019-06-21","2019-06-19","2019-06-17","2019-06-10","2019-06-07","2019-06-05","2019-05-07","2019-05-05","2019-05-03","2019-04-23","2019-04-19","2019-04-15","2019-04-08","2019-04-04","2019-04-01","2019-03-11","2019-03-07","2019-03-04","2019-01-01","2018-12-09","2018-12-05","2018-12-01","2018-11-28","2018-11-25","2018-11-19","2018-11-15","2018-11-13","2018-11-07","2018-11-01","2018-10-29","2018-10-17","2018-10-13","2018-10-04","2018-09-19","2018-09-14","2018-09-11","2018-09-07","2018-09-05","2018-08-03","2018-07-30","2018-07-23","2018-07-18","2018-07-13","2018-07-06","2018-06-29","2018-06-21","2018-05-19","2018-04-10","2018-04-04","2018-03-26","2018-03-15","2018-02-20","2018-02-18","2018-02-15","2018-02-08","2018-02-03","2018-02-01","2018-01-30","2018-01-27","2018-01-16","2018-01-13","2018-01-10","2018-01-04","2018-01-01","2017-12-31","2017-12-28","2017-12-21","2017-12-17","2017-12-10","2017-12-06","2017-11-29","2017-11-15","2017-11-13","2017-11-10","2017-10-25","2017-10-10","2017-10-05","2017-10-02","2017-09-28","2017-09-26","2017-09-21","2017-09-19","2017-09-15","2017-09-12","2017-09-10","2017-09-02","2017-08-27","2017-08-24","2017-08-17","2017-08-08","2017-08-02","2017-07-31","2017-07-24","2017-07-21","2017-07-16","2017-07-13","2017-07-07","2017-07-03","2017-06-28","2017-06-24","2017-06-20","2017-06-17","2017-06-12","2017-06-08","2017-05-31","2017-05-27","2017-05-25","2017-05-18","2017-05-15","2017-05-10","2017-05-02","2017-04-29","2017-04-26","2017-04-23","2017-04-20","2017-04-18","2017-04-13","2017-04-10","2017-04-06","2017-03-30","2017-03-28","2017-03-23","2017-03-21","2017-03-13","2017-02-28","2017-02-23","2017-02-16","2017-02-07","2017-02-02","2017-01-31","2017-01-26","2017-01-19","2017-01-14","2017-01-05","2017-01-03","2016-12-28","2016-12-20","2016-12-09","2016-12-06","2016-12-01","2016-11-29","2016-11-26","2016-11-19","2016-11-14","2016-11-08","2016-11-04","2016-10-27","2016-10-20","2016-10-15","2016-10-13","2016-10-10","2016-10-06","2016-10-04","2016-10-01","2016-09-28","2016-09-26","2016-09-21","2016-09-14","2016-09-12","2016-09-09","2016-09-06","2016-09-01","2016-08-29","2016-08-25","2016-08-22","2016-08-19","2016-08-15","2016-08-04","2016-08-02","2016-07-30","2016-07-28","2016-07-26","2016-07-20","2016-07-18","2016-07-16","2016-07-15","2016-07-13","2016-07-05","2016-06-30","2016-06-28","2016-06-23","2016-06-21","2016-06-15","2016-06-13","2016-06-09","2016-06-07","2016-06-02","2016-05-31"],"name":"Rushfit - Stretching for Flexibility","description":""},"Rushfit - Abdominal Strength and Core Conditioning":{"attributes":{"lower":false,"core":true,"back":false,"upper":false,"cardio":false,"martial":false,"other":false},"datesDone":["2020-01-21","2019-12-07","2019-11-07","2019-09-18","2019-07-29","2019-06-07","2019-03-01","2019-01-21","2018-12-07","2018-10-26","2018-09-05","2018-08-04","2018-06-06","2018-04-20","2018-01-03","2017-10-20","2017-08-24","2017-08-04","2017-06-02","2017-04-30","2017-03-30","2017-02-20","2017-01-10","2016-12-16","2016-11-08","2016-10-10","2016-09-12","2016-08-24","2016-08-03","2016-07-19","2016-06-22","2016-06-16","2016-06-02"],"name":"Rushfit - Abdominal Strength and Core Conditioning","description":""},"Wim Hof Method Week 1":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"datesDone":["2020-04-08","2020-04-01","2019-11-13","2019-03-25","2019-03-24","2019-01-21","2018-12-27","2018-11-19","2018-11-15","2018-11-13","2018-11-12","2018-10-17","2018-10-12","2018-10-11","2018-10-10","2018-10-08","2018-09-27","2018-09-25","2018-09-24","2018-09-23","2018-09-22","2018-09-21","2018-09-20","2018-09-19","2018-09-18","2018-09-17","2018-09-16","2018-09-14","2018-09-13","2018-09-11","2018-09-10","2018-09-09","2018-07-26","2018-07-11","2018-06-12","2018-06-11","2018-02-07","2018-01-18","2018-01-12","2018-01-11","2018-01-07","2018-01-04","2018-01-03","2018-01-02","2018-01-01","2017-12-30","2017-12-29","2017-12-28","2017-12-20","2017-12-13","2017-11-07","2017-10-26","2017-10-25","2017-10-14","2017-10-12","2017-09-30","2017-09-27","2017-09-23","2017-09-18","2017-04-30","2016-11-19","2016-11-15","2016-11-14","2016-11-13","2016-11-12","2016-11-11","2016-11-09"],"name":"Wim Hof Method Week 1","description":""},"Wim Hof Method Week 2":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"datesDone":["2017-10-16","2017-10-10","2017-09-28","2017-09-22","2017-09-19","2016-12-01","2016-11-30","2016-11-26","2016-11-23","2016-11-22","2016-11-21"],"name":"Wim Hof Method Week 2","description":""},"Wim Hof Method Week 3":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"datesDone":["2017-09-25","2016-12-07","2016-12-06","2016-12-05","2016-12-03"],"name":"Wim Hof Method Week 3","description":""},"Simple and Sinister":{"attributes":{"lower":true,"core":true,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"datesDone":["2020-03-31","2020-03-11","2020-02-17","2020-01-05","2019-12-13","2019-12-05","2019-11-25","2019-11-17","2019-10-22","2019-10-13","2019-10-06","2019-10-02","2019-09-20","2019-09-06","2019-08-22","2019-08-15","2019-08-05","2019-07-23","2019-07-16","2019-07-08","2019-07-02","2019-06-28","2019-06-22","2019-06-17","2019-06-14","2019-06-04","2019-04-25","2019-04-13","2019-04-06","2019-03-09","2019-02-24","2019-02-11","2019-01-29","2019-01-23","2019-01-15","2019-01-01","2018-12-27","2018-12-16","2018-12-05","2018-11-27","2018-11-19","2018-11-12","2018-11-05","2018-10-29","2018-10-24","2018-10-18","2018-10-09","2018-10-05","2018-09-17","2018-09-13","2018-09-09","2018-08-12","2018-08-06","2018-07-24","2018-07-19","2018-07-11","2018-07-03","2018-06-26","2018-06-14","2018-06-04","2018-05-29","2018-05-17","2018-05-08","2018-04-27","2018-04-24","2018-02-16","2018-02-09","2018-02-02","2018-01-28","2018-01-25","2018-01-24","2018-01-18","2018-01-12","2018-01-07","2017-12-31","2017-12-28","2017-12-25","2017-10-14"],"name":"Simple and Sinister","description":""},"Vapassana Meditation":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"datesDone":["2018-10-10","2018-10-09","2018-07-30","2018-07-19","2018-07-18","2018-05-13","2018-05-10","2018-02-19"],"name":"Vapassana Meditation","description":""},"Pull Ups + Burpees":{"attributes":{"lower":true,"core":false,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"datesDone":["2020-01-07","2019-12-09","2019-11-29","2019-11-05","2019-10-10","2019-09-08","2019-08-19","2019-07-12","2019-06-24","2019-06-06","2019-04-01","2019-03-19","2019-02-26","2019-02-13","2019-01-16","2018-12-21","2018-11-28","2018-11-13","2018-10-25","2018-10-11","2018-09-29","2018-09-24","2018-09-11","2018-09-04","2018-08-08","2018-08-01","2018-07-22","2018-06-28","2018-06-07","2018-04-21"],"name":"Pull Ups + Burpees","description":""},"Heavy Bag":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":true,"martial":true,"other":false},"datesDone":["2019-10-18","2019-08-03","2019-04-20","2018-12-28","2018-12-09","2018-09-06","2018-08-19","2018-07-29"],"name":"Heavy Bag","description":""},"Interval Run":{"attributes":{"lower":true,"core":false,"back":true,"upper":false,"cardio":true,"martial":false,"other":false},"datesDone":["2019-12-03","2019-09-11","2019-05-07","2019-03-27","2018-12-06","2018-11-01","2018-09-18","2018-08-13"],"name":"Interval Run","description":""},"Exercise Bike":{"attributes":{"lower":true,"core":false,"back":false,"upper":false,"cardio":true,"martial":false,"other":false},"datesDone":["2020-01-07","2019-12-09","2019-11-10","2019-10-27","2019-10-14","2019-08-18","2019-07-12","2019-06-27","2019-05-03","2019-04-15","2019-04-10","2019-04-03","2019-03-15","2019-03-07","2019-02-14","2019-01-20"],"name":"Exercise Bike","description":""},"Generic - Legs + Back":{"attributes":{"lower":true,"core":false,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"datesDone":["2020-01-11","2019-11-15","2019-03-22","2019-02-28","2019-02-25","2019-01-22","2019-01-20"],"name":"Generic - Legs + Back","description":""},"Generic - Chest + Back + Tris":{"attributes":{"lower":false,"core":false,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"datesDone":["2019-12-19","2019-10-27","2019-07-25","2019-02-19","2019-01-28"],"name":"Generic - Chest + Back + Tris","description":""},"Elliptical":{"attributes":{"lower":true,"core":true,"back":false,"upper":false,"cardio":true,"martial":false,"other":false},"datesDone":["2019-10-27","2019-08-09","2019-04-04","2019-02-16","2019-01-31"],"name":"Elliptical","description":""},"Swimming":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":false},"datesDone":["2019-11-10","2019-04-26","2019-04-11"],"name":"Swimming","description":""},"Stairs":{"attributes":{"lower":true,"core":false,"back":false,"upper":false,"cardio":true,"martial":false,"other":false},"datesDone":["2019-11-15","2019-10-09"],"name":"Stairs","description":""},"P90X3 - Dynamix":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"datesDone":["2020-04-06","2020-03-31","2020-02-19","2020-02-12","2020-02-03","2020-02-01"],"name":"P90X3 - Dynamix","description":""},"P90X3 - Eccentric Lower":{"attributes":{"lower":true,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":false},"datesDone":["2020-03-14","2020-02-12","2020-02-02"],"name":"P90X3 - Eccentric Lower","description":""},"Hard Corps - Core 1":{"attributes":{"lower":false,"core":true,"back":false,"upper":false,"cardio":false,"martial":false,"other":false},"datesDone":["2020-02-03"],"name":"Hard Corps - Core 1","description":""},"P90X3 - Pilates X":{"attributes":{"lower":false,"core":true,"back":false,"upper":false,"cardio":false,"martial":false,"other":false},"datesDone":["2020-03-27","2020-02-08"],"name":"P90X3 - Pilates X","description":""},"P90X3 - Isometrix":{"attributes":{"lower":false,"core":true,"back":false,"upper":true,"cardio":false,"martial":false,"other":true},"datesDone":["2020-02-09"],"name":"P90X3 - Isometrix","description":""},"P90X3 - MMX":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":true,"martial":true,"other":false},"datesDone":["2020-03-18","2020-02-16","2020-02-10"],"name":"P90X3 - MMX","description":""},"Hard Corps - Resistance 3":{"attributes":{"lower":true,"core":true,"back":false,"upper":true,"cardio":false,"martial":false,"other":false},"datesDone":["2020-02-13"],"name":"Hard Corps - Resistance 3","description":""},"P90X3 - Eccentric Upper":{"attributes":{"lower":false,"core":false,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"datesDone":["2020-02-14"],"name":"P90X3 - Eccentric Upper","description":""},"P90X3 - Yoga":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"datesDone":["2020-03-12","2020-02-18"],"name":"P90X3 - Yoga","description":""},"Hard Corps - Core 2":{"attributes":{"lower":false,"core":true,"back":false,"upper":false,"cardio":false,"martial":false,"other":false},"datesDone":["2020-02-19"],"name":"Hard Corps - Core 2","description":""},"P90X3 - The Warrior":{"attributes":{"lower":true,"core":true,"back":false,"upper":true,"cardio":true,"martial":true,"other":false},"datesDone":["2020-03-21"],"name":"P90X3 - The Warrior","description":""},"P90X3 - CVX":{"attributes":{"lower":true,"core":false,"back":false,"upper":true,"cardio":true,"martial":false,"other":false},"datesDone":["2020-03-26"],"name":"P90X3 - CVX","description":""},"P90X3 - Accelerator":{"attributes":{"lower":true,"core":false,"back":false,"upper":false,"cardio":true,"martial":false,"other":false},"datesDone":["2020-04-04"],"name":"P90X3 - Accelerator","description":""}} \ No newline at end of file diff --git a/workouts.json.old b/workouts.json.old deleted file mode 100644 index 8e3a52f..0000000 --- a/workouts.json.old +++ /dev/null @@ -1 +0,0 @@ -{"P90X - Ab Ripper":{"attributes":{"lower":false,"core":true,"back":false,"upper":false,"cardio":false,"martial":false,"other":false},"datesDone":["2020-03-20","2019-11-29","2019-10-12","2019-09-08","2019-08-09","2019-06-18","2019-04-19","2019-03-15","2019-03-07","2019-02-14","2019-01-31","2018-11-14","2018-10-04","2018-07-23","2018-05-17","2018-03-07","2017-12-18","2017-09-25","2017-08-29","2017-06-27","2017-03-21","2017-02-14","2017-01-27","2016-11-11","2016-09-04","2016-04-29","2016-03-11","2016-02-05","2016-01-20","2015-12-04","2015-09-18","2015-08-14","2015-06-25","2015-05-04","2015-04-01","2015-03-19","2015-02-19","2015-01-22","2014-12-26","2014-11-25","2014-10-30","2014-06-28","2014-06-16","2014-05-25"],"name":"P90X - Ab Ripper","description":""},"P90X - Back + Biceps":{"attributes":{"lower":false,"core":false,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"datesDone":[],"name":"P90X - Back + Biceps","description":""},"P90X - Cardio X":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":true,"martial":true,"other":false},"datesDone":["2020-03-10","2020-01-06","2019-10-25","2019-10-05","2019-09-07","2019-08-10","2019-06-29","2019-05-08","2019-04-28","2019-04-16","2019-03-21","2018-12-26","2018-12-14","2018-11-07","2018-10-10","2018-07-10","2018-06-05","2018-05-09","2018-04-24","2018-04-03","2018-01-27","2018-01-01","2017-11-14","2017-10-18","2017-09-17","2017-08-21","2017-07-03","2017-05-31","2017-04-27","2017-03-31","2017-03-13","2017-02-13","2017-01-30","2016-12-19","2016-11-28","2016-11-04","2016-10-21","2016-09-27","2016-09-09","2016-08-22","2016-07-29","2016-06-27","2016-06-04","2016-05-04","2016-04-16","2016-04-08","2016-03-21","2016-03-02","2016-02-22","2016-02-08","2016-02-03","2016-01-12","2015-12-28","2015-12-09","2015-11-05","2015-10-12","2015-08-26","2015-08-10","2015-07-20","2015-06-29","2015-06-11","2015-06-08","2015-05-28","2015-04-02","2015-03-09","2015-02-17","2015-01-26","2015-01-09","2014-12-26","2014-12-17","2014-12-16","2014-12-09","2014-11-21","2014-10-27","2014-10-13","2014-10-05","2014-09-13","2014-07-07","2014-06-23","2014-05-28","2014-05-14"],"name":"P90X - Cardio X","description":""},"P90X - Chest + Back":{"attributes":{"lower":false,"core":false,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"datesDone":[],"name":"P90X - Chest + Back","description":""},"P90X - Chest + Shoulders + Triceps":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":false},"datesDone":["2017-06-17","2017-02-17","2016-09-01"],"name":"P90X - Chest + Shoulders + Triceps","description":""},"P90X - Core Synergistics":{"attributes":{"lower":false,"core":true,"back":false,"upper":true,"cardio":false,"martial":false,"other":false},"datesDone":["2020-04-02","2019-11-19","2019-07-21","2019-03-29","2018-10-15","2018-06-21","2018-04-26","2017-10-02","2017-05-12","2017-02-07","2016-10-25","2016-07-25","2016-04-27","2016-03-23","2016-02-18","2016-01-21","2015-12-15","2015-10-31","2015-08-25","2015-08-05","2015-06-30","2015-04-30","2015-03-23","2015-02-11","2015-01-23","2014-12-30","2014-11-19","2014-10-01","2014-07-31","2014-06-26"],"name":"P90X - Core Synergistics","description":""},"P90X+ - Interval X+":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":true,"martial":false,"other":false},"datesDone":["2020-04-03","2019-10-03","2019-08-07","2019-04-18","2018-12-17","2018-10-17","2018-07-18","2018-06-09","2018-05-01","2018-02-14","2017-11-21","2017-10-12","2017-08-08","2017-06-06","2017-05-02","2017-03-20","2017-01-20","2016-11-30","2016-10-24","2016-09-22","2016-08-02","2016-06-09","2016-04-28","2016-03-24","2016-02-29","2016-01-18","2015-12-16","2015-10-28","2015-09-21","2015-08-07","2015-07-08","2015-06-03","2015-04-17","2015-03-16","2015-02-12","2015-01-16","2014-12-22","2014-11-13","2014-10-17","2014-10-02","2014-09-03","2014-07-28","2014-07-09","2014-06-25","2014-06-03","2014-05-12"],"name":"P90X+ - Interval X+","description":""},"P90X+ - Kenpo Cardio X+":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":true,"martial":true,"other":false},"datesDone":["2020-03-24","2019-12-01","2019-10-15","2019-08-27","2019-07-15","2019-06-08","2019-03-28","2019-02-15","2019-01-02","2018-11-29","2018-10-22","2018-08-07","2018-06-22","2018-05-18","2018-04-19","2018-01-16","2017-12-26","2017-12-05","2017-10-24","2017-09-20","2017-08-27","2017-07-21","2017-06-28","2017-05-18","2017-04-14","2017-02-22","2017-01-01","2016-12-08","2016-11-10","2016-10-13","2016-09-15","2016-08-30","2016-08-04","2016-07-03","2016-05-18","2016-04-25","2016-03-27","2016-03-09","2016-02-24","2016-01-27","2016-01-13","2015-12-21","2015-11-23","2015-10-23","2015-10-13","2015-09-11","2015-08-31","2015-08-12","2015-07-31","2015-07-06","2015-06-17","2015-06-01","2015-04-21","2015-03-24","2015-03-13","2015-02-10","2015-01-14","2014-11-18","2014-10-21","2014-09-18","2014-07-22","2014-06-10"],"name":"P90X+ - Kenpo Cardio X+","description":""},"P90X - Kenpo X":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":true,"martial":true,"other":false},"datesDone":["2020-04-07","2020-01-10","2019-11-13","2019-10-11","2019-09-17","2019-07-20","2019-06-19","2019-06-13","2019-03-12","2019-01-24","2018-11-17","2018-07-25","2018-06-15","2018-05-12","2018-01-04","2017-11-18","2017-09-30","2017-09-14","2017-08-02","2017-07-12","2017-06-11","2017-05-05","2017-04-06","2017-02-16","2017-01-26","2016-12-02","2016-11-01","2016-10-07","2016-09-13","2016-08-15","2016-07-14","2016-05-20","2016-05-02","2016-04-13","2016-03-17","2016-02-17","2016-01-22","2015-12-30","2015-12-08","2015-11-04","2015-10-16","2015-08-19","2015-07-27","2015-06-24","2015-05-29","2015-05-08","2015-04-06","2015-02-26","2015-01-21","2015-01-05","2014-12-02","2014-11-10","2014-10-07","2014-09-26","2014-08-28","2014-08-01","2014-07-18","2014-06-30","2014-06-17","2014-06-05","2014-05-22","2014-05-09"],"name":"P90X - Kenpo X","description":""},"P90X - Legs + Back":{"attributes":{"lower":true,"core":false,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"datesDone":["2017-05-16","2017-03-21","2016-12-15","2016-09-11","2016-05-12"],"name":"P90X - Legs + Back","description":""},"P90X - Plyometrics":{"attributes":{"lower":true,"core":false,"back":false,"upper":false,"cardio":true,"martial":false,"other":false},"datesDone":["2019-08-14","2019-03-25","2018-09-10","2018-05-24","2017-12-01","2017-10-09","2017-07-10","2017-06-03","2017-04-18","2017-02-24","2017-01-03","2016-09-26","2016-09-02","2016-05-16","2016-04-18","2016-03-15","2016-02-10","2015-12-29","2015-11-02","2015-10-14","2015-09-15","2015-07-14","2015-06-22","2015-05-06","2015-03-26","2015-02-18","2015-01-29","2015-01-07","2014-11-20","2014-10-28","2014-10-15","2014-09-19","2014-08-05","2014-06-16"],"name":"P90X - Plyometrics","description":""},"P90X - Shoulders + Arms":{"attributes":{"lower":false,"core":false,"back":false,"upper":true,"cardio":false,"martial":false,"other":false},"datesDone":["2019-03-13","2017-05-15"],"name":"P90X - Shoulders + Arms","description":""},"P90X - X Stretch":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"datesDone":["2020-04-08","2020-04-04","2020-03-30","2020-03-25","2020-03-20","2020-02-08","2020-01-16","2020-01-06","2019-12-16","2019-12-15","2019-12-09","2019-12-07","2019-12-03","2019-11-27","2019-11-21","2019-11-19","2019-11-14","2019-11-09","2019-11-05","2019-10-10","2019-10-08","2019-10-04","2019-09-30","2019-09-26","2019-09-24","2019-09-16","2019-09-10","2019-09-05","2019-08-31","2019-08-29","2019-08-26","2019-08-19","2019-08-13","2019-08-07","2019-07-29","2019-07-26","2019-07-23","2019-07-17","2019-07-15","2019-07-11","2019-07-08","2019-06-26","2019-06-24","2019-06-20","2019-06-11","2019-06-09","2019-06-06","2019-06-04","2019-05-08","2019-05-06","2019-05-04","2019-04-29","2019-04-17","2019-04-16","2019-04-07","2019-04-03","2019-03-31","2019-03-29","2019-03-26","2019-03-24","2019-03-18","2019-03-12","2019-03-06","2019-02-14","2019-01-01","2018-12-07","2018-12-03","2018-11-29","2018-11-14","2018-11-06","2018-10-22","2018-10-15","2018-10-06","2018-10-03","2018-10-01","2018-09-27","2018-09-18","2018-09-13","2018-09-08","2018-09-04","2018-08-16","2018-08-09","2018-07-25","2018-07-17","2018-07-07","2018-06-27","2018-06-19","2018-06-13","2018-06-10","2018-06-04","2018-05-23","2018-05-15","2018-04-25","2018-04-18","2018-04-06","2018-03-20","2018-02-19","2018-02-17","2018-02-12","2018-02-07","2018-02-02","2018-01-31","2018-01-29","2018-01-23","2018-01-18","2018-01-12","2018-01-08","2018-01-03","2017-12-30","2017-12-27","2017-12-19","2017-12-12","2017-11-30","2017-11-27","2017-11-18","2017-11-14","2017-11-12","2017-10-30","2017-10-08","2017-10-03","2017-09-29","2017-09-27","2017-09-22","2017-09-20","2017-09-18","2017-09-14","2017-09-11","2017-09-07","2017-08-28","2017-08-25","2017-08-22","2017-08-15","2017-08-06","2017-07-22","2017-07-20","2017-07-19","2017-07-15","2017-07-12","2017-07-09","2017-07-06","2017-06-30","2017-06-22","2017-06-19","2017-06-15","2017-06-11","2017-06-07","2017-05-28","2017-05-26","2017-05-23","2017-05-16","2017-05-11","2017-05-09","2017-05-01","2017-04-27","2017-04-24","2017-04-21","2017-04-19","2017-04-17","2017-04-11","2017-04-07","2017-04-04","2017-03-29","2017-03-27","2017-03-22","2017-03-17","2017-02-27","2017-02-21","2017-02-09","2017-01-23","2017-01-17","2017-01-12","2017-01-04","2016-12-31","2016-12-13","2016-12-08","2016-12-05","2016-11-30","2016-11-23","2016-11-15","2016-11-10","2016-11-07","2016-11-02","2016-10-25","2016-10-19","2016-10-14","2016-10-12","2016-10-07","2016-10-05","2016-10-03","2016-09-29","2016-09-27","2016-09-22","2016-09-20","2016-09-15","2016-09-13","2016-09-07","2016-09-02","2016-08-30","2016-08-26","2016-08-23","2016-08-16","2016-08-05","2016-08-03","2016-08-01","2016-07-29","2016-07-27","2016-07-25","2016-07-19","2016-07-14","2016-07-11","2016-07-01","2016-06-29","2016-06-24","2016-06-22","2016-06-20","2016-06-17","2016-06-14","2016-06-10","2016-06-08","2016-06-06","2016-06-03","2016-06-01","2016-05-24","2016-05-23","2016-05-21","2016-05-18","2016-05-17","2016-05-16","2016-05-13","2016-05-12","2016-05-10","2016-05-09","2016-05-05","2016-05-04","2016-04-28","2016-04-26","2016-04-21","2016-04-14","2016-04-12","2016-04-11","2016-04-06","2016-03-31","2016-03-29","2016-03-23","2016-03-22","2016-03-21","2016-03-17","2016-03-16","2016-03-15","2016-03-14","2016-03-10","2016-03-03","2016-03-01","2016-02-28","2016-02-25","2016-02-23","2016-02-18","2016-02-11","2016-02-10","2016-02-02","2016-01-28","2016-01-26","2016-01-21","2016-01-20","2016-01-19","2016-01-14","2016-01-13","2016-01-12","2016-01-08","2016-01-05","2015-12-29","2015-12-23","2015-12-22","2015-12-17","2015-12-16","2015-12-15","2015-12-10","2015-12-08","2015-12-03","2015-12-02","2015-11-28","2015-11-23","2015-11-05","2015-11-04","2015-11-02","2015-10-21","2015-10-20","2015-10-19","2015-10-15","2015-10-14","2015-10-13","2015-10-06","2015-10-05","2015-10-02","2015-09-16","2015-09-10","2015-08-30","2015-08-27","2015-08-25","2015-08-20","2015-08-18","2015-08-14","2015-08-11","2015-08-09","2015-08-04","2015-07-30","2015-07-28","2015-07-25","2015-07-14","2015-07-12","2015-07-09","2015-07-07","2015-07-02","2015-06-30","2015-06-27","2015-06-23","2015-06-20","2015-06-18","2015-06-16","2015-06-12","2015-06-10","2015-06-04","2015-06-02","2015-05-31","2015-05-29","2015-05-20","2015-05-18","2015-05-15","2015-05-13","2015-05-11","2015-05-08","2015-05-06","2015-05-05","2015-05-01","2015-04-30","2015-04-29","2015-04-27","2015-04-24","2015-04-23","2015-04-22","2015-04-21","2015-04-20","2015-04-17","2015-04-16","2015-04-15","2015-04-14","2015-04-13","2015-04-10","2015-04-09","2015-04-08","2015-04-07","2015-04-06","2015-04-05","2015-04-03","2015-04-02","2015-04-01","2015-03-31","2015-03-28","2015-03-26","2015-03-25","2015-03-17","2015-03-16","2015-03-15","2015-03-12","2015-03-11","2015-03-05","2015-03-01","2015-02-18","2015-02-16","2015-02-12","2015-02-11","2015-02-05","2015-02-04","2015-01-29","2015-01-28","2015-01-26","2015-01-21","2015-01-20","2015-01-15","2015-01-13","2015-01-10","2015-01-08","2015-01-06","2014-12-31","2014-12-24","2014-12-22","2014-12-17","2014-12-15","2014-12-09","2014-12-04","2014-12-03","2014-12-01","2014-11-25","2014-11-21","2014-11-20","2014-11-19","2014-11-17","2014-11-15","2014-11-14","2014-11-12","2014-11-10","2014-11-06","2014-11-04","2014-11-01","2014-10-29","2014-10-27","2014-10-22","2014-10-21","2014-10-16","2014-10-14","2014-10-09","2014-10-07","2014-10-02","2014-09-29","2014-09-28","2014-09-24","2014-09-17","2014-09-16","2014-09-11","2014-09-06","2014-09-02","2014-08-28","2014-08-26","2014-08-19","2014-08-12","2014-08-08","2014-08-05","2014-07-31","2014-07-29","2014-07-25","2014-07-22","2014-07-17","2014-07-10","2014-07-08","2014-07-04","2014-07-01","2014-06-26","2014-06-24","2014-06-19","2014-06-17","2014-06-10","2014-06-05","2014-06-02","2014-05-29","2014-05-26","2014-05-22","2014-05-13","2014-05-08","2014-05-06"],"name":"P90X - X Stretch","description":""},"P90X - Yoga X":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"datesDone":["2020-01-20","2019-11-23","2019-10-07","2019-09-24","2019-07-27","2019-04-22","2019-02-21","2018-10-18","2018-04-17","2018-03-16","2017-11-11","2017-09-09","2017-08-05","2017-05-30","2017-05-06","2017-03-28","2017-02-06","2016-12-27","2016-11-21","2016-11-09","2016-10-18","2016-08-18"],"name":"P90X - Yoga X","description":""},"P90X2 - Base and Back":{"attributes":{"lower":true,"core":false,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"datesDone":["2019-11-22","2019-08-06","2019-02-01","2018-11-06","2018-01-30","2017-10-26","2017-07-24","2017-04-29","2017-02-09","2016-11-07","2016-07-26","2016-04-26","2016-03-22","2016-02-04","2015-11-03","2015-08-24","2015-07-09","2015-05-14","2015-03-31","2015-02-03","2015-01-01","2014-11-12","2014-10-16","2014-09-07","2014-08-11","2014-07-03","2014-06-12"],"name":"P90X2 - Base and Back","description":""},"P90X2 - Chest Back Balance":{"attributes":{"lower":false,"core":true,"back":true,"upper":false,"cardio":false,"martial":false,"other":false},"datesDone":[],"name":"P90X2 - Chest Back Balance","description":""},"P90X2 - P.A.P. Lower":{"attributes":{"lower":true,"core":false,"back":false,"upper":false,"cardio":true,"martial":false,"other":false},"datesDone":["2020-01-13","2019-07-17","2019-02-20","2018-07-12","2017-08-15","2017-05-28","2017-04-11","2017-01-17","2016-10-11","2016-06-13","2016-04-11","2016-03-01","2016-01-26","2015-12-02","2015-10-20","2015-09-17","2015-07-21","2015-06-16","2015-04-28","2015-03-12","2015-02-05","2015-01-08","2014-12-04","2014-11-03","2014-10-03","2014-08-29","2014-06-24"],"name":"P90X2 - P.A.P. Lower","description":""},"P90X2 - P.A.P. Upper":{"attributes":{"lower":false,"core":false,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"datesDone":["2019-09-25","2019-04-23","2018-02-05","2017-09-11","2017-04-17","2017-01-12","2016-12-05","2016-10-12","2016-09-20","2016-05-09","2016-04-12","2016-03-03","2016-01-28","2015-12-10","2015-10-21","2015-08-13","2015-06-23","2015-04-15","2015-03-17","2015-01-28","2014-12-15","2014-10-29","2014-10-09","2014-07-24","2014-06-18","2014-05-07"],"name":"P90X2 - P.A.P. Upper","description":""},"P90X2 - Plyocide":{"attributes":{"lower":true,"core":false,"back":true,"upper":false,"cardio":true,"martial":false,"other":false},"datesDone":["2020-03-28","2019-12-10","2019-11-18","2019-08-26","2019-04-29","2019-03-08","2018-12-03","2018-09-20","2018-06-25","2018-05-13","2018-02-17","2017-11-28","2017-10-03","2017-09-08","2017-06-09","2017-05-11","2017-04-24","2017-03-23","2017-02-01","2016-12-20","2016-10-26","2016-09-30","2016-07-24","2016-05-06","2016-04-21","2016-03-29","2016-03-10","2016-02-15","2016-01-06","2015-12-17","2015-11-25","2015-10-15","2015-09-10","2015-08-27","2015-08-11","2015-07-29","2015-06-26","2015-06-04","2015-05-20","2015-04-14","2015-03-10","2015-02-25","2015-02-09","2015-01-12","2014-12-19","2014-11-24","2014-11-14","2014-10-22","2014-10-08","2014-09-30","2014-09-16","2014-08-26","2014-08-07","2014-07-30","2014-07-15","2014-06-20","2014-05-21","2014-05-08"],"name":"P90X2 - Plyocide","description":""},"P90X2 - X2 Ab Ripper":{"attributes":{"lower":false,"core":true,"back":false,"upper":false,"cardio":false,"martial":false,"other":false},"datesDone":["2020-01-15","2019-10-23","2019-08-19","2019-07-12","2019-06-30","2019-05-05","2019-04-10","2018-10-13","2018-08-09","2018-07-07","2018-03-15","2017-11-07","2017-09-12","2017-07-18","2017-04-20","2016-12-06","2016-05-15","2016-04-22","2016-03-04","2016-01-29","2015-12-18","2015-11-05","2015-08-28","2015-07-10","2015-05-14","2015-05-09","2015-04-12","2015-03-29","2015-02-08","2015-01-05","2014-11-15","2014-10-20","2014-09-25","2014-09-14","2014-09-07","2014-08-11","2014-07-28","2014-06-23","2014-06-08","2014-05-20"],"name":"P90X2 - X2 Ab Ripper","description":""},"P90X2 - X2 Balance and Power":{"attributes":{"lower":true,"core":true,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"datesDone":["2020-03-19","2019-09-16","2019-04-05","2018-11-18","2018-07-17","2018-05-31","2017-11-29","2017-09-21","2017-05-25","2017-02-21","2016-12-01","2016-08-31","2016-05-03","2016-03-25","2016-02-25","2016-01-19","2015-12-07","2015-10-27","2015-08-18","2015-07-07","2015-06-09","2015-04-08","2015-02-16","2015-01-19","2014-11-17","2014-10-06","2014-09-02","2014-07-17","2014-06-09"],"name":"P90X2 - X2 Balance and Power","description":""},"P90X2 - X2 Core":{"attributes":{"lower":false,"core":true,"back":false,"upper":true,"cardio":false,"martial":false,"other":false},"datesDone":["2020-01-09","2019-11-14","2019-06-25","2019-03-23","2018-11-30","2018-09-19","2018-06-11","2018-02-19","2017-10-05","2017-06-08","2017-04-23","2017-01-31","2016-11-03","2016-07-31","2016-05-05","2016-03-30","2016-03-14","2016-02-02","2016-01-14","2015-12-22","2015-11-24","2015-10-19","2015-09-09","2015-08-20","2015-07-30","2015-07-02","2015-06-02","2015-05-12","2015-03-27","2015-03-02","2015-02-02","2015-01-13","2014-12-18","2014-11-29","2014-11-11","2014-11-05","2014-10-23","2014-10-15","2014-09-28","2014-09-15","2014-08-27","2014-08-17","2014-08-06","2014-07-21","2014-07-02","2014-06-13","2014-06-06","2014-05-23","2014-05-06"],"name":"P90X2 - X2 Core","description":""},"P90X2 - X2 Recovery + Mobility/Foam Rolling Sessio":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"datesDone":["2020-04-02","2020-01-08","2019-12-11","2019-11-13","2019-08-28","2019-08-16","2019-06-12","2019-03-28","2019-03-05","2019-02-21","2018-11-01","2018-09-10","2018-07-28","2018-07-26","2018-02-20","2018-02-14","2018-02-04","2018-01-11","2018-01-07","2018-01-02","2017-12-18","2017-10-13","2017-10-07","2017-10-04","2017-09-13","2017-08-09","2017-08-01","2017-07-17","2017-07-14","2017-07-10","2017-07-05","2017-06-27","2017-06-16","2017-06-06","2017-06-01","2017-05-23","2017-05-17","2017-05-07","2017-04-28","2017-04-22","2017-04-16","2017-04-03","2017-03-18","2017-02-18","2017-02-04","2017-01-28","2016-12-12","2016-11-01","2016-10-17","2016-10-11","2016-09-23","2016-08-21","2016-06-16","2016-06-05"],"name":"P90X2 - X2 Recovery + Mobility/Foam Rolling Sessio","description":""},"P90X2 - X2 Shoulders and Arms":{"attributes":{"lower":false,"core":false,"back":false,"upper":true,"cardio":false,"martial":false,"other":false},"datesDone":["2018-03-20"],"name":"P90X2 - X2 Shoulders and Arms","description":""},"P90X2 - X2 Total Body":{"attributes":{"lower":false,"core":true,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"datesDone":["2019-12-02","2019-08-13","2019-03-20","2018-05-15","2017-11-15","2017-09-06","2017-07-13","2017-05-09","2017-01-19","2016-10-03","2016-07-05","2016-04-20","2016-03-16","2016-02-11","2016-01-04","2015-12-03","2015-09-16","2015-07-28","2015-06-18","2015-04-23","2015-03-11","2015-01-06","2014-12-01","2014-10-20","2014-09-17","2014-08-04","2014-07-08","2014-05-27"],"name":"P90X2 - X2 Total Body","description":""},"P90X2 - X2 Yoga":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"datesDone":["2020-03-17","2020-01-14","2019-11-11","2019-10-01","2019-09-14","2019-08-11","2019-07-09","2019-06-16","2019-04-12","2019-04-02","2019-03-05","2019-01-18","2019-01-06","2018-11-20","2018-11-03","2018-09-12","2018-08-18","2018-06-01","2018-03-27","2018-01-15","2017-12-08","2017-11-08","2017-10-17","2017-09-23","2017-08-29","2017-07-18","2017-07-01","2017-05-21","2017-04-15","2017-04-08","2017-03-14","2017-01-18","2017-01-09","2016-12-14","2016-11-16","2016-10-31","2016-09-28","2016-09-08","2016-08-16","2016-08-07","2016-07-12","2016-06-20","2016-05-11","2016-04-19","2016-04-07","2016-03-28","2016-03-08","2016-02-23","2016-02-16","2016-02-01","2016-01-11","2016-01-05","2015-12-14","2015-11-30","2015-10-22","2015-09-08","2015-08-17","2015-08-06","2015-07-05","2015-05-30","2015-05-17","2015-04-19","2015-03-18","2015-03-03","2015-02-24","2015-02-06","2015-01-15","2014-12-29","2014-12-11","2014-12-10","2014-12-03","2014-11-22","2014-11-16","2014-11-11","2014-11-02","2014-10-24","2014-09-25","2014-08-24","2014-07-29","2014-06-29","2014-06-12","2014-05-30","2014-05-20"],"name":"P90X2 - X2 Yoga","description":""},"Long Run + Roll":{"attributes":{"lower":true,"core":false,"back":true,"upper":false,"cardio":true,"martial":true,"other":false},"datesDone":["2020-03-15","2019-12-14","2019-11-28","2019-11-06","2019-10-23","2019-10-16","2019-09-29","2019-09-21","2019-09-02","2019-08-21","2019-07-28","2019-07-19","2019-07-13","2019-06-03","2019-04-24","2019-03-30","2019-02-23","2019-01-22","2019-01-17","2018-12-19","2018-12-12","2018-12-01","2018-11-22","2018-10-21","2018-10-14","2018-10-08","2018-09-27","2018-09-23","2018-09-11","2018-09-04","2018-08-01","2018-07-16","2018-07-08","2018-06-18","2018-02-20","2018-02-03","2018-01-13","2017-12-15","2017-11-24","2017-11-12","2017-11-06","2017-10-06","2017-09-12","2017-08-26","2017-08-18","2017-08-01","2017-07-22","2017-07-04","2017-06-26","2017-06-18","2016-07-04","2016-01-31","2015-07-04","2015-05-03","2015-04-11","2014-11-06","2014-07-12","2014-06-27","2014-06-04","2014-05-05"],"name":"Long Run + Roll","description":""},"Short Run + Roll":{"attributes":{"lower":true,"core":false,"back":true,"upper":false,"cardio":true,"martial":false,"other":false},"datesDone":["2019-07-11","2019-06-12","2019-03-22","2019-02-18","2019-02-13","2019-01-30","2019-01-14","2018-06-28","2015-07-01","2015-03-22","2015-01-30","2015-01-22","2014-12-25","2014-11-27","2014-10-25","2014-10-18","2014-10-11","2014-09-20","2014-08-19","2014-08-12","2014-08-10","2014-08-02","2014-07-24","2014-07-21","2014-07-19","2014-07-16","2014-07-07","2014-07-04","2014-06-30","2014-06-24","2014-06-22","2014-06-21","2014-06-18","2014-06-14","2014-06-13","2014-06-09","2014-06-07","2014-06-03","2014-05-31","2014-05-30","2014-05-29","2014-05-27","2014-05-24","2014-05-23","2014-05-12"],"name":"Short Run + Roll","description":""},"Tai Chi":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"datesDone":["2020-04-08","2020-04-07","2020-04-04","2020-04-03","2020-04-02","2020-04-01","2020-03-31","2020-03-30","2020-03-29","2020-03-28","2020-03-27","2020-03-26","2020-03-25","2020-03-24","2020-03-23","2020-03-22","2020-03-21","2020-03-19","2020-03-18","2020-03-15","2020-03-14","2020-03-12","2020-02-19","2020-02-18","2020-02-17","2020-02-16","2020-02-14","2020-02-13","2020-02-03","2020-01-21","2020-01-20","2020-01-16","2020-01-15","2020-01-13","2020-01-11","2020-01-10","2020-01-09","2020-01-08","2020-01-07","2019-12-17","2019-12-14","2019-12-13","2019-12-12","2019-12-11","2019-12-10","2019-12-09","2019-12-08","2019-12-07","2019-12-06","2019-12-05","2019-12-04","2019-12-03","2019-12-02","2019-12-01","2019-11-30","2019-11-29","2019-11-28","2019-11-27","2019-11-26","2019-11-25","2019-11-24","2019-11-23","2019-11-22","2019-11-21","2019-11-20","2019-11-19","2019-11-18","2019-11-17","2019-11-15","2019-11-14","2019-11-13","2019-11-12","2019-11-11","2019-11-10","2019-11-09","2019-11-07","2019-11-06","2019-11-05","2019-10-28","2019-10-27","2019-10-25","2019-10-22","2019-10-21","2019-10-16","2019-10-15","2019-10-14","2019-10-13","2019-10-12","2019-10-10","2019-10-09","2019-10-08","2019-10-07","2019-10-06","2019-10-05","2019-10-04","2019-10-03","2019-10-02","2019-10-01","2019-09-29","2019-09-28","2019-09-27","2019-09-26","2019-09-25","2019-09-20","2019-09-18","2019-09-17","2019-09-16","2019-09-15","2019-09-14","2019-09-12","2019-09-11","2019-09-10","2019-09-08","2019-09-07","2019-09-06","2019-09-05","2019-09-01","2019-08-31","2019-08-26","2019-08-23","2019-08-22","2019-08-21","2019-08-20","2019-08-19","2019-08-18","2019-08-17","2019-08-16","2019-08-15","2019-08-14","2019-08-12","2019-08-10","2019-08-09","2019-08-07","2019-08-06","2019-08-05","2019-08-03","2019-07-31","2019-07-30","2019-07-29","2019-07-28","2019-07-27","2019-07-26","2019-07-25","2019-07-24","2019-07-23","2019-07-22","2019-07-21","2019-07-20","2019-07-19","2019-07-18","2019-07-17","2019-07-16","2019-07-15","2019-07-14","2019-07-13","2019-07-12","2019-07-11","2019-07-09","2019-07-08","2019-07-01","2019-06-30","2019-06-29","2019-06-27","2019-06-26","2019-06-25","2019-06-24","2019-06-23","2019-06-22","2019-06-21","2019-06-20","2019-06-19","2019-06-17","2019-06-14","2019-06-13","2019-06-10","2019-06-09","2019-06-07","2019-06-06","2019-06-05","2019-06-04","2019-06-03","2019-05-08","2019-05-07","2019-05-06","2019-05-05","2019-05-04","2019-05-03","2019-04-29","2019-04-28","2019-04-25","2019-04-23","2019-04-20","2019-04-19","2019-04-18","2019-04-17","2019-04-16","2019-04-15","2019-04-10","2019-04-09","2019-04-08","2019-04-07","2019-04-05","2019-04-04","2019-04-03","2019-04-01","2019-03-30","2019-03-29","2019-03-28","2019-03-27","2019-03-26","2019-03-25","2019-03-23","2019-03-21","2019-03-20","2019-03-19","2019-03-18","2019-03-15","2019-03-14","2019-03-13","2019-03-12","2019-03-11","2019-03-08","2019-03-07","2019-03-04","2019-03-01","2019-02-28","2019-02-27","2019-02-26","2019-02-25","2019-02-24","2019-02-20","2019-02-19","2019-02-17","2019-02-16","2019-02-15","2019-02-14","2019-02-13","2019-02-12","2019-01-25","2019-01-22","2019-01-21","2019-01-18","2019-01-02","2018-12-28","2018-12-21","2018-12-20","2018-12-19","2018-12-09","2018-12-07","2018-12-06","2018-12-05","2018-12-04","2018-12-03","2018-11-30","2018-11-29","2018-11-28","2018-11-27","2018-11-26","2018-11-25","2018-11-19","2018-11-18","2018-11-14","2018-11-13","2018-11-12","2018-11-09","2018-11-08","2018-11-07","2018-11-06","2018-11-05","2018-11-02","2018-11-01","2018-10-31","2018-10-30","2018-10-29","2018-10-26","2018-10-22","2018-10-17","2018-10-15","2018-10-12","2018-10-11","2018-10-10","2018-10-09","2018-10-08","2018-10-04","2018-09-27","2018-09-23","2018-09-20","2018-09-19","2018-09-18","2018-09-14","2018-09-13","2018-09-10","2018-09-05","2018-08-19","2018-08-09","2018-08-04","2018-08-03","2018-07-31","2018-07-30","2018-07-28","2018-07-27","2018-07-26","2018-07-25","2018-07-24","2018-07-23","2018-07-19","2018-07-18","2018-07-17","2018-07-16","2018-07-13","2018-07-12","2018-07-06","2018-06-29","2018-06-10","2018-05-22","2018-05-20","2018-05-16","2018-05-15","2018-05-13","2018-05-10","2018-05-09","2018-04-30","2018-04-27","2018-04-26","2018-04-21","2018-04-19","2018-04-16","2018-04-10","2018-04-06","2018-04-04","2018-04-03","2018-03-28","2018-03-27","2018-03-26","2018-03-20","2018-03-19","2018-03-16","2018-03-15","2018-03-14","2018-03-09","2018-02-20","2018-02-19","2018-02-18","2018-02-17","2018-02-16","2018-02-15","2018-02-14","2018-02-13","2018-02-09","2018-02-08","2018-02-07","2018-02-06","2018-02-05","2018-02-03","2018-02-02","2018-02-01","2018-01-31","2018-01-30","2018-01-29","2018-01-28","2018-01-27","2018-01-25","2018-01-24","2018-01-18","2018-01-17","2018-01-16","2018-01-14","2018-01-13","2018-01-12","2018-01-11","2018-01-10","2018-01-08","2018-01-07","2018-01-06","2018-01-05","2018-01-04","2018-01-03","2018-01-02","2018-01-01","2017-12-31","2017-12-30","2017-12-29","2017-12-28","2017-12-27","2017-12-21","2017-12-20","2017-12-19","2017-12-18","2017-12-17","2017-12-15","2017-12-14","2017-12-12","2017-12-11","2017-12-10","2017-12-09","2017-12-08","2017-12-06","2017-12-05","2017-12-04","2017-12-03","2017-12-01","2017-11-29","2017-11-28","2017-11-20","2017-11-18","2017-11-17","2017-11-16","2017-11-15","2017-11-14","2017-11-13","2017-11-12","2017-11-11","2017-11-10","2017-11-09","2017-11-08","2017-11-07","2017-11-06","2017-11-01","2017-10-31","2017-10-30","2017-10-26","2017-10-25","2017-10-24","2017-10-20","2017-10-19","2017-10-18","2017-10-17","2017-10-16","2017-10-14","2017-10-13","2017-10-12","2017-10-11","2017-10-10","2017-10-09","2017-10-08","2017-10-07","2017-10-05","2017-10-04","2017-10-03","2017-10-02","2017-09-30","2017-09-29","2017-09-28","2017-09-27","2017-09-26","2017-09-25","2017-09-23","2017-09-22","2017-09-21","2017-09-20","2017-09-19","2017-09-18","2017-09-17","2017-09-16","2017-09-15","2017-09-14","2017-09-13","2017-09-12","2017-09-11","2017-09-10","2017-09-09","2017-09-08","2017-09-07","2017-09-06","2017-09-05","2017-09-02","2017-08-31","2017-08-30","2017-08-29","2017-08-28","2017-08-27","2017-08-26","2017-08-25","2017-08-24","2017-08-23","2017-08-22","2017-08-21","2017-08-20","2017-08-18","2017-08-17","2017-08-16","2017-08-15","2017-08-14","2017-08-13","2017-08-09","2017-08-08","2017-08-07","2017-08-06","2017-08-05","2017-08-04","2017-08-03","2017-08-02","2017-08-01","2017-07-31","2017-07-24","2017-07-23","2017-07-22","2017-07-21","2017-07-20","2017-07-19","2017-07-18","2017-07-17","2017-07-16","2017-07-15","2017-07-14","2017-07-13","2017-07-12","2017-07-11","2017-07-10","2017-07-09","2017-07-07","2017-07-06","2017-07-05","2017-07-03","2017-07-02","2017-07-01","2017-06-30","2017-06-29","2017-06-28","2017-06-27","2017-06-25","2017-06-24","2017-06-23","2017-06-22","2017-06-21","2017-06-20","2017-06-19","2017-06-18","2017-06-17","2017-06-16","2017-06-15","2017-06-14","2017-06-12","2017-06-11","2017-06-10","2017-06-09","2017-06-08","2017-06-07","2017-06-06","2017-06-03","2017-06-02","2017-06-01","2017-05-31","2017-05-29","2017-05-28","2017-05-27","2017-05-26","2017-05-24","2017-05-22","2017-05-20","2017-05-19","2017-05-18","2017-05-17","2017-05-16","2017-05-15","2017-05-14","2017-05-13","2017-05-12","2017-05-11","2017-05-10","2017-05-09","2017-05-08","2017-05-05","2017-05-03","2017-05-02","2017-05-01","2017-04-30","2017-04-29","2017-04-28","2017-04-27","2017-04-26","2017-04-25","2017-04-24","2017-04-23","2017-04-22","2017-04-21","2017-04-20","2017-04-19","2017-04-18","2017-04-17","2017-04-16","2017-04-14","2017-04-13","2017-04-12","2017-04-11","2017-04-10","2017-04-09","2017-04-08","2017-04-07","2017-04-06","2017-04-05","2017-04-04","2017-04-03","2017-03-31","2017-03-30","2017-03-28","2017-03-27","2017-03-24","2017-03-23","2017-03-22","2017-03-21","2017-03-20","2017-03-19","2017-03-18","2017-03-17","2017-03-16","2017-03-15","2017-03-14","2017-02-23","2017-02-21","2017-02-20","2017-02-16","2017-02-14","2017-02-09","2017-02-07","2017-02-02","2017-02-01","2017-01-27","2017-01-19","2017-01-17","2017-01-16","2017-01-12","2017-01-10","2017-01-04","2016-12-20","2016-12-12","2016-12-08","2016-12-06","2016-11-29","2016-11-15","2016-11-14","2016-11-10","2016-11-08","2016-11-07","2016-11-04","2016-11-01","2016-10-26","2016-10-25","2016-10-24","2016-10-21","2016-10-20","2016-10-19","2016-10-17","2016-10-14","2016-10-13","2016-10-12","2016-10-11","2016-10-07","2016-10-06","2016-10-05","2016-10-04","2016-10-03","2016-09-30","2016-09-29","2016-09-27","2016-09-26","2016-09-23","2016-09-22","2016-09-21","2016-09-20","2016-09-14","2016-09-13","2016-09-12","2016-09-09","2016-09-06","2016-09-05","2016-09-01","2016-08-30","2016-08-29","2016-08-26","2016-08-25","2016-08-23","2016-08-15","2016-08-05","2016-08-04","2016-08-03","2016-08-02","2016-08-01","2016-07-29","2016-07-28","2016-07-27","2016-07-26","2016-07-25","2016-07-24","2016-07-22","2016-07-21","2016-07-20","2016-07-19","2016-07-18","2016-07-15","2016-07-14","2016-07-13","2016-07-11","2016-07-05","2016-07-01","2016-06-30","2016-06-29","2016-06-28","2016-06-24","2016-06-23","2016-06-22","2016-06-21","2016-06-17","2016-06-16","2016-06-15","2016-06-14","2016-06-13","2016-06-10","2016-06-09","2016-06-08","2016-06-07","2016-06-03","2016-06-02","2016-05-31","2016-05-24","2016-05-22","2016-05-21","2016-05-17","2016-05-16","2016-05-15","2016-05-13","2016-05-12","2016-05-10","2016-05-09","2016-05-08","2016-05-05","2016-05-04","2016-05-03","2016-04-29","2016-04-22","2016-04-15","2016-04-13","2016-04-09","2016-03-25","2016-03-18","2016-03-16","2016-03-11","2016-03-07","2016-03-04","2016-02-26","2016-02-19","2016-02-12","2016-02-10","2016-02-05","2016-01-29","2016-01-20","2016-01-15","2016-01-14","2016-01-06","2016-01-02","2015-12-28","2015-12-18","2015-12-17","2015-12-16","2015-12-15","2015-12-11","2015-12-07","2015-12-04","2015-11-29","2015-11-05","2015-11-04","2015-11-02","2015-10-31","2015-10-24","2015-10-21","2015-10-20","2015-10-19","2015-10-15","2015-10-14","2015-10-13","2015-10-12","2015-10-06","2015-10-05","2015-10-02","2015-10-01","2015-09-30","2015-09-27","2015-09-25","2015-09-18","2015-09-15","2015-09-14","2015-09-10","2015-09-09","2015-08-28","2015-08-21","2015-08-13","2015-08-11","2015-08-05","2015-07-30","2015-07-24","2015-07-22","2015-07-13","2015-07-07","2015-07-03","2015-06-30","2015-06-23","2015-06-04","2015-05-29","2015-05-20","2015-05-18","2015-05-12","2015-05-06","2015-05-04","2015-04-30","2015-04-26","2015-04-17","2015-04-15","2015-04-14","2015-04-10","2015-04-08","2015-04-02","2015-03-31","2015-03-18","2015-03-10","2015-02-25","2015-02-03","2015-01-29","2015-01-28","2015-01-21","2015-01-19","2015-01-15","2015-01-08","2014-12-27","2014-12-23","2014-12-16","2014-12-15","2014-12-09","2014-12-04","2014-12-01","2014-11-30","2014-11-25","2014-11-24","2014-11-20","2014-11-19","2014-11-18","2014-11-17","2014-11-14","2014-11-13","2014-11-12","2014-11-11","2014-11-10","2014-11-05","2014-11-03","2014-10-31","2014-10-30","2014-10-29","2014-10-28","2014-10-27","2014-10-24","2014-10-23","2014-10-22","2014-10-21","2014-10-20","2014-10-17","2014-10-16","2014-10-15","2014-10-14","2014-10-09","2014-10-08","2014-10-06","2014-10-03","2014-10-02","2014-10-01","2014-09-30","2014-09-25","2014-09-24","2014-09-22","2014-09-19","2014-09-18","2014-09-17","2014-09-16","2014-09-09","2014-09-08","2014-09-05","2014-09-03","2014-08-29","2014-08-27","2014-08-26","2014-08-11","2014-08-07","2014-08-06","2014-08-04","2014-08-03","2014-08-01","2014-07-30","2014-07-26","2014-07-23","2014-07-20","2014-07-18","2014-07-16","2014-07-15","2014-07-09","2014-07-07","2014-07-03","2014-07-02","2014-06-27","2014-06-25","2014-06-23","2014-06-22","2014-06-20","2014-06-18","2014-06-11","2014-06-04","2014-05-28","2014-05-21","2014-05-14","2014-05-07"],"name":"Tai Chi","description":""},"Brazilian Jiu Jitsu":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":true,"other":false},"datesDone":["2019-01-02","2018-12-21","2018-12-07","2018-12-05","2018-11-30","2018-11-19","2018-11-15","2018-11-14","2018-11-09","2018-11-07","2018-10-27","2018-10-18","2018-10-17","2018-10-12","2018-10-10","2018-10-05","2018-09-25","2018-09-21","2018-09-17","2018-08-10","2018-08-03","2018-07-27","2018-07-20","2018-07-06","2018-02-13","2017-12-08","2017-12-01","2017-11-28","2017-11-20","2017-11-09","2017-11-07","2017-11-01","2017-10-24","2017-10-20","2017-10-18","2017-10-12","2017-10-11","2017-10-06","2017-09-06","2017-08-23","2017-08-21","2017-08-18","2017-08-14","2017-08-07","2017-08-04","2017-06-16","2017-06-14","2017-06-09","2017-06-07","2017-06-02","2017-05-26","2017-05-24","2017-05-22","2017-05-19","2017-05-17","2017-05-12","2017-05-10","2017-05-05","2017-05-01","2017-04-12","2017-04-10","2017-04-07","2017-04-05","2017-04-01","2017-03-31","2017-03-22","2017-03-20","2017-03-17","2017-03-15","2017-02-24","2017-02-22","2017-02-17","2017-02-08","2017-02-03","2017-01-27","2017-01-25","2017-01-18","2017-01-16","2016-12-22","2016-12-19","2016-12-16","2016-12-13","2016-11-28","2016-11-11","2016-10-24","2016-05-02","2016-04-29","2016-04-25","2016-04-22","2016-04-18","2016-04-15","2016-03-28","2016-03-11","2016-03-09","2016-03-04","2016-03-02","2016-02-29","2016-02-24","2016-02-22","2016-02-19","2016-02-17","2016-02-12","2016-02-05","2016-02-03","2016-02-01","2016-01-30","2016-01-25","2016-01-18","2016-01-15","2016-01-04","2015-12-30","2015-12-21","2015-12-18","2015-12-11","2015-12-09","2015-12-04","2015-11-30","2015-09-21","2015-09-18","2015-09-14","2015-08-31","2015-08-28","2015-08-26","2015-08-19","2015-08-17","2015-08-14","2015-08-12","2015-08-10","2015-08-07","2015-08-05","2015-07-29","2015-07-27","2015-07-20","2015-07-13","2015-07-10","2015-07-08","2015-07-06","2015-07-03","2015-07-01","2015-06-29","2015-06-25","2015-06-22","2015-06-19","2015-06-17","2015-06-15","2015-06-08","2015-06-05","2015-06-03","2015-06-01","2015-05-28","2015-05-21","2015-05-19","2015-05-15","2015-05-13","2015-05-11","2015-05-07","2015-05-05","2015-05-01","2015-04-29","2015-04-27","2015-04-24","2015-04-22","2015-04-20","2015-04-16","2015-04-13","2015-04-09","2015-04-07","2015-04-03","2015-04-01","2015-03-30","2015-03-25","2015-03-19","2015-02-19","2015-02-17","2015-02-13","2015-02-10","2015-02-06","2015-02-04","2015-01-30","2015-01-27","2015-01-22","2015-01-20","2015-01-16","2015-01-14","2015-01-09","2015-01-07","2014-12-23","2014-12-16","2014-12-02","2014-11-24","2014-11-18","2014-11-13","2014-11-05","2014-10-30","2014-10-23","2014-09-29","2014-09-17","2014-09-10","2014-09-04"],"name":"Brazilian Jiu Jitsu","description":""},"r/BodyWeightFitness Recommended Routine":{"attributes":{"lower":false,"core":true,"back":false,"upper":true,"cardio":false,"martial":false,"other":false},"datesDone":["2018-07-09","2018-05-25","2018-03-28","2018-02-08","2017-11-09","2017-10-08","2017-09-03","2017-08-17","2017-07-09","2017-05-27","2017-04-26","2017-04-09","2017-03-27","2017-02-28","2017-02-03","2016-12-21","2016-11-17","2016-10-27","2016-09-29","2016-08-28","2016-08-06","2016-07-17","2016-06-24","2016-05-31","2016-04-30","2016-04-14","2016-03-31","2016-03-18","2016-03-05"],"name":"r/BodyWeightFitness Recommended Routine","description":""},"RushFit - Fight Conditioning":{"attributes":{"lower":true,"core":true,"back":false,"upper":false,"cardio":true,"martial":true,"other":false},"datesDone":["2020-03-30","2020-03-13","2019-12-06","2019-11-21","2019-10-21","2019-09-27","2019-08-17","2019-07-24","2019-06-23","2019-04-08","2019-03-04","2019-01-19","2018-12-20","2018-11-26","2018-10-30","2018-09-14","2018-06-27","2018-05-30","2018-04-28","2018-04-05","2018-02-06","2018-01-09","2017-12-07","2017-10-31","2017-09-27","2017-09-05","2017-07-26","2017-07-07","2017-05-24","2017-04-21","2017-03-16","2017-02-02","2017-01-11","2016-12-13","2016-11-15","2016-10-19","2016-10-04","2016-09-19","2016-09-06","2016-08-25","2016-07-27","2016-07-21","2016-07-11","2016-07-06","2016-06-29","2016-06-23","2016-06-17","2016-06-14","2016-06-07","2016-06-03","2016-05-30","2016-05-24","2016-05-13","2016-05-10","2016-05-07"],"name":"RushFit - Fight Conditioning","description":""},"RushFit - Strength and Endurance":{"attributes":{"lower":true,"core":true,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"datesDone":["2020-03-23","2019-11-09","2019-07-31","2019-04-17","2019-03-11","2018-12-18","2018-10-31","2018-08-14","2018-06-30","2018-05-21","2018-04-16","2018-02-13","2017-11-20","2017-10-11","2017-09-15","2017-08-07","2017-06-15","2017-05-19","2017-04-12","2017-02-23","2017-01-25","2016-12-12","2016-11-14","2016-10-17","2016-09-23","2016-09-05","2016-08-05","2016-07-20","2016-06-15","2016-06-10","2016-05-25","2016-05-17"],"name":"RushFit - Strength and Endurance","description":""},"RushFit - Full Body Strength and Conditioning":{"attributes":{"lower":true,"core":true,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"datesDone":["2020-04-06","2019-12-11","2019-09-04","2019-06-11","2019-03-26","2018-12-30","2018-09-21","2018-07-26","2018-06-19","2018-04-30","2017-12-11","2017-11-01","2017-09-29","2017-08-30","2017-07-19","2017-06-05","2017-05-03","2017-04-05","2017-02-10","2017-01-02","2016-11-22","2016-10-20","2016-10-05","2016-09-14","2016-08-26","2016-07-28","2016-07-13","2016-06-30","2016-06-06","2016-05-19"],"name":"RushFit - Full Body Strength and Conditioning","description":""},"RushFit - Explosive Powertraining":{"attributes":{"lower":true,"core":true,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"datesDone":["2019-11-26","2019-09-10","2019-07-01","2019-04-09","2019-03-06","2018-12-04","2018-10-16","2018-09-07","2018-07-13","2018-06-12","2018-05-10","2018-01-10","2017-11-17","2017-10-23","2017-09-18","2017-08-14","2017-07-06","2017-05-22","2017-04-20","2017-03-15","2017-02-15","2017-01-16","2016-11-29","2016-11-02","2016-10-14","2016-09-21","2016-08-29","2016-08-01","2016-07-15","2016-07-01","2016-06-21","2016-06-08","2016-05-23"],"name":"RushFit - Explosive Powertraining","description":""},"Rushfit - Balance and Agility":{"attributes":{"lower":true,"core":false,"back":false,"upper":true,"cardio":true,"martial":false,"other":false},"datesDone":["2019-12-17","2019-09-26","2019-06-20","2019-03-14","2019-01-07","2018-11-21","2018-10-12","2018-09-25","2018-07-05","2018-05-16","2018-04-13","2018-01-31","2017-12-29","2017-11-05","2017-09-26","2017-08-23","2017-07-16","2017-06-14","2017-05-08","2017-04-03","2017-02-08","2017-01-24","2016-12-07","2016-11-18","2016-10-28","2016-10-06","2016-09-07","2016-08-23","2016-07-18","2016-06-28","2016-06-01"],"name":"Rushfit - Balance and Agility","description":""},"Rushfit - Stretching for Flexibility":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"datesDone":["2020-04-05","2020-03-29","2020-02-13","2020-02-03","2020-01-14","2020-01-11","2019-12-17","2019-12-08","2019-12-04","2019-12-02","2019-11-30","2019-11-24","2019-11-20","2019-11-15","2019-11-12","2019-11-06","2019-10-22","2019-10-12","2019-10-09","2019-10-07","2019-10-02","2019-09-27","2019-09-25","2019-09-15","2019-09-01","2019-08-30","2019-08-20","2019-08-15","2019-08-12","2019-08-08","2019-08-06","2019-07-30","2019-07-25","2019-07-18","2019-07-16","2019-07-14","2019-07-10","2019-07-01","2019-06-27","2019-06-25","2019-06-21","2019-06-19","2019-06-17","2019-06-10","2019-06-07","2019-06-05","2019-05-07","2019-05-05","2019-05-03","2019-04-23","2019-04-19","2019-04-15","2019-04-08","2019-04-04","2019-04-01","2019-03-11","2019-03-07","2019-03-04","2019-01-01","2018-12-09","2018-12-05","2018-12-01","2018-11-28","2018-11-25","2018-11-19","2018-11-15","2018-11-13","2018-11-07","2018-11-01","2018-10-29","2018-10-17","2018-10-13","2018-10-04","2018-09-19","2018-09-14","2018-09-11","2018-09-07","2018-09-05","2018-08-03","2018-07-30","2018-07-23","2018-07-18","2018-07-13","2018-07-06","2018-06-29","2018-06-21","2018-05-19","2018-04-10","2018-04-04","2018-03-26","2018-03-15","2018-02-20","2018-02-18","2018-02-15","2018-02-08","2018-02-03","2018-02-01","2018-01-30","2018-01-27","2018-01-16","2018-01-13","2018-01-10","2018-01-04","2018-01-01","2017-12-31","2017-12-28","2017-12-21","2017-12-17","2017-12-10","2017-12-06","2017-11-29","2017-11-15","2017-11-13","2017-11-10","2017-10-25","2017-10-10","2017-10-05","2017-10-02","2017-09-28","2017-09-26","2017-09-21","2017-09-19","2017-09-15","2017-09-12","2017-09-10","2017-09-02","2017-08-27","2017-08-24","2017-08-17","2017-08-08","2017-08-02","2017-07-31","2017-07-24","2017-07-21","2017-07-16","2017-07-13","2017-07-07","2017-07-03","2017-06-28","2017-06-24","2017-06-20","2017-06-17","2017-06-12","2017-06-08","2017-05-31","2017-05-27","2017-05-25","2017-05-18","2017-05-15","2017-05-10","2017-05-02","2017-04-29","2017-04-26","2017-04-23","2017-04-20","2017-04-18","2017-04-13","2017-04-10","2017-04-06","2017-03-30","2017-03-28","2017-03-23","2017-03-21","2017-03-13","2017-02-28","2017-02-23","2017-02-16","2017-02-07","2017-02-02","2017-01-31","2017-01-26","2017-01-19","2017-01-14","2017-01-05","2017-01-03","2016-12-28","2016-12-20","2016-12-09","2016-12-06","2016-12-01","2016-11-29","2016-11-26","2016-11-19","2016-11-14","2016-11-08","2016-11-04","2016-10-27","2016-10-20","2016-10-15","2016-10-13","2016-10-10","2016-10-06","2016-10-04","2016-10-01","2016-09-28","2016-09-26","2016-09-21","2016-09-14","2016-09-12","2016-09-09","2016-09-06","2016-09-01","2016-08-29","2016-08-25","2016-08-22","2016-08-19","2016-08-15","2016-08-04","2016-08-02","2016-07-30","2016-07-28","2016-07-26","2016-07-20","2016-07-18","2016-07-16","2016-07-15","2016-07-13","2016-07-05","2016-06-30","2016-06-28","2016-06-23","2016-06-21","2016-06-15","2016-06-13","2016-06-09","2016-06-07","2016-06-02","2016-05-31"],"name":"Rushfit - Stretching for Flexibility","description":""},"Rushfit - Abdominal Strength and Core Conditioning":{"attributes":{"lower":false,"core":true,"back":false,"upper":false,"cardio":false,"martial":false,"other":false},"datesDone":["2020-01-21","2019-12-07","2019-11-07","2019-09-18","2019-07-29","2019-06-07","2019-03-01","2019-01-21","2018-12-07","2018-10-26","2018-09-05","2018-08-04","2018-06-06","2018-04-20","2018-01-03","2017-10-20","2017-08-24","2017-08-04","2017-06-02","2017-04-30","2017-03-30","2017-02-20","2017-01-10","2016-12-16","2016-11-08","2016-10-10","2016-09-12","2016-08-24","2016-08-03","2016-07-19","2016-06-22","2016-06-16","2016-06-02"],"name":"Rushfit - Abdominal Strength and Core Conditioning","description":""},"Wim Hof Method Week 1":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"datesDone":["2020-04-08","2020-04-01","2019-11-13","2019-03-25","2019-03-24","2019-01-21","2018-12-27","2018-11-19","2018-11-15","2018-11-13","2018-11-12","2018-10-17","2018-10-12","2018-10-11","2018-10-10","2018-10-08","2018-09-27","2018-09-25","2018-09-24","2018-09-23","2018-09-22","2018-09-21","2018-09-20","2018-09-19","2018-09-18","2018-09-17","2018-09-16","2018-09-14","2018-09-13","2018-09-11","2018-09-10","2018-09-09","2018-07-26","2018-07-11","2018-06-12","2018-06-11","2018-02-07","2018-01-18","2018-01-12","2018-01-11","2018-01-07","2018-01-04","2018-01-03","2018-01-02","2018-01-01","2017-12-30","2017-12-29","2017-12-28","2017-12-20","2017-12-13","2017-11-07","2017-10-26","2017-10-25","2017-10-14","2017-10-12","2017-09-30","2017-09-27","2017-09-23","2017-09-18","2017-04-30","2016-11-19","2016-11-15","2016-11-14","2016-11-13","2016-11-12","2016-11-11","2016-11-09"],"name":"Wim Hof Method Week 1","description":""},"Wim Hof Method Week 2":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"datesDone":["2017-10-16","2017-10-10","2017-09-28","2017-09-22","2017-09-19","2016-12-01","2016-11-30","2016-11-26","2016-11-23","2016-11-22","2016-11-21"],"name":"Wim Hof Method Week 2","description":""},"Wim Hof Method Week 3":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"datesDone":["2017-09-25","2016-12-07","2016-12-06","2016-12-05","2016-12-03"],"name":"Wim Hof Method Week 3","description":""},"Simple and Sinister":{"attributes":{"lower":true,"core":true,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"datesDone":["2020-03-31","2020-03-11","2020-02-17","2020-01-05","2019-12-13","2019-12-05","2019-11-25","2019-11-17","2019-10-22","2019-10-13","2019-10-06","2019-10-02","2019-09-20","2019-09-06","2019-08-22","2019-08-15","2019-08-05","2019-07-23","2019-07-16","2019-07-08","2019-07-02","2019-06-28","2019-06-22","2019-06-17","2019-06-14","2019-06-04","2019-04-25","2019-04-13","2019-04-06","2019-03-09","2019-02-24","2019-02-11","2019-01-29","2019-01-23","2019-01-15","2019-01-01","2018-12-27","2018-12-16","2018-12-05","2018-11-27","2018-11-19","2018-11-12","2018-11-05","2018-10-29","2018-10-24","2018-10-18","2018-10-09","2018-10-05","2018-09-17","2018-09-13","2018-09-09","2018-08-12","2018-08-06","2018-07-24","2018-07-19","2018-07-11","2018-07-03","2018-06-26","2018-06-14","2018-06-04","2018-05-29","2018-05-17","2018-05-08","2018-04-27","2018-04-24","2018-02-16","2018-02-09","2018-02-02","2018-01-28","2018-01-25","2018-01-24","2018-01-18","2018-01-12","2018-01-07","2017-12-31","2017-12-28","2017-12-25","2017-10-14"],"name":"Simple and Sinister","description":""},"Vapassana Meditation":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"datesDone":["2018-10-10","2018-10-09","2018-07-30","2018-07-19","2018-07-18","2018-05-13","2018-05-10","2018-02-19"],"name":"Vapassana Meditation","description":""},"Pull Ups + Burpees":{"attributes":{"lower":true,"core":false,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"datesDone":["2020-01-07","2019-12-09","2019-11-29","2019-11-05","2019-10-10","2019-09-08","2019-08-19","2019-07-12","2019-06-24","2019-06-06","2019-04-01","2019-03-19","2019-02-26","2019-02-13","2019-01-16","2018-12-21","2018-11-28","2018-11-13","2018-10-25","2018-10-11","2018-09-29","2018-09-24","2018-09-11","2018-09-04","2018-08-08","2018-08-01","2018-07-22","2018-06-28","2018-06-07","2018-04-21"],"name":"Pull Ups + Burpees","description":""},"Heavy Bag":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":true,"martial":true,"other":false},"datesDone":["2019-10-18","2019-08-03","2019-04-20","2018-12-28","2018-12-09","2018-09-06","2018-08-19","2018-07-29"],"name":"Heavy Bag","description":""},"Interval Run":{"attributes":{"lower":true,"core":false,"back":true,"upper":false,"cardio":true,"martial":false,"other":false},"datesDone":["2019-12-03","2019-09-11","2019-05-07","2019-03-27","2018-12-06","2018-11-01","2018-09-18","2018-08-13"],"name":"Interval Run","description":""},"Exercise Bike":{"attributes":{"lower":true,"core":false,"back":false,"upper":false,"cardio":true,"martial":false,"other":false},"datesDone":["2020-01-07","2019-12-09","2019-11-10","2019-10-27","2019-10-14","2019-08-18","2019-07-12","2019-06-27","2019-05-03","2019-04-15","2019-04-10","2019-04-03","2019-03-15","2019-03-07","2019-02-14","2019-01-20"],"name":"Exercise Bike","description":""},"Generic - Legs + Back":{"attributes":{"lower":true,"core":false,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"datesDone":["2020-01-11","2019-11-15","2019-03-22","2019-02-28","2019-02-25","2019-01-22","2019-01-20"],"name":"Generic - Legs + Back","description":""},"Generic - Chest + Back + Tris":{"attributes":{"lower":false,"core":false,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"datesDone":["2019-12-19","2019-10-27","2019-07-25","2019-02-19","2019-01-28"],"name":"Generic - Chest + Back + Tris","description":""},"Elliptical":{"attributes":{"lower":true,"core":true,"back":false,"upper":false,"cardio":true,"martial":false,"other":false},"datesDone":["2019-10-27","2019-08-09","2019-04-04","2019-02-16","2019-01-31"],"name":"Elliptical","description":""},"Swimming":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":false},"datesDone":["2019-11-10","2019-04-26","2019-04-11"],"name":"Swimming","description":""},"Stairs":{"attributes":{"lower":true,"core":false,"back":false,"upper":false,"cardio":true,"martial":false,"other":false},"datesDone":["2019-11-15","2019-10-09"],"name":"Stairs","description":""},"P90X3 - Dynamix":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"datesDone":["2020-04-06","2020-03-31","2020-02-19","2020-02-12","2020-02-03","2020-02-01"],"name":"P90X3 - Dynamix","description":""},"P90X3 - Eccentric Lower":{"attributes":{"lower":true,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":false},"datesDone":["2020-03-14","2020-02-12","2020-02-02"],"name":"P90X3 - Eccentric Lower","description":""},"Hard Corps - Core 1":{"attributes":{"lower":false,"core":true,"back":false,"upper":false,"cardio":false,"martial":false,"other":false},"datesDone":["2020-02-03"],"name":"Hard Corps - Core 1","description":""},"P90X3 - Pilates X":{"attributes":{"lower":false,"core":true,"back":false,"upper":false,"cardio":false,"martial":false,"other":false},"datesDone":["2020-03-27","2020-02-08"],"name":"P90X3 - Pilates X","description":""},"P90X3 - Isometrix":{"attributes":{"lower":false,"core":true,"back":false,"upper":true,"cardio":false,"martial":false,"other":true},"datesDone":["2020-02-09"],"name":"P90X3 - Isometrix","description":""},"P90X3 - MMX":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":true,"martial":true,"other":false},"datesDone":["2020-03-18","2020-02-16","2020-02-10"],"name":"P90X3 - MMX","description":""},"Hard Corps - Resistance 3":{"attributes":{"lower":true,"core":true,"back":false,"upper":true,"cardio":false,"martial":false,"other":false},"datesDone":["2020-02-13"],"name":"Hard Corps - Resistance 3","description":""},"P90X3 - Eccentric Upper":{"attributes":{"lower":false,"core":false,"back":true,"upper":true,"cardio":false,"martial":false,"other":false},"datesDone":["2020-02-14"],"name":"P90X3 - Eccentric Upper","description":""},"P90X3 - Yoga":{"attributes":{"lower":false,"core":false,"back":false,"upper":false,"cardio":false,"martial":false,"other":true},"datesDone":["2020-03-12","2020-02-18"],"name":"P90X3 - Yoga","description":""},"Hard Corps - Core 2":{"attributes":{"lower":false,"core":true,"back":false,"upper":false,"cardio":false,"martial":false,"other":false},"datesDone":["2020-02-19"],"name":"Hard Corps - Core 2","description":""},"P90X3 - The Warrior":{"attributes":{"lower":true,"core":true,"back":false,"upper":true,"cardio":true,"martial":true,"other":false},"datesDone":["2020-03-21"],"name":"P90X3 - The Warrior","description":""},"P90X3 - CVX":{"attributes":{"lower":true,"core":false,"back":false,"upper":true,"cardio":true,"martial":false,"other":false},"datesDone":["2020-03-26"],"name":"P90X3 - CVX","description":""},"P90X3 - Accelerator":{"attributes":{"lower":true,"core":false,"back":false,"upper":false,"cardio":true,"martial":false,"other":false},"datesDone":["2020-04-04"],"name":"P90X3 - Accelerator","description":""}} \ No newline at end of file