From 093cb6c7d0c16af3229a306b069f3703ffbe41ef Mon Sep 17 00:00:00 2001 From: Pinaki Date: Sun, 13 Oct 2019 11:43:18 +0530 Subject: [PATCH 1/3] First commit --- .gitignore | 34 + api/META-INF/persistence.xml | 33 + api/mvnw | 286 + api/mvnw.cmd | 161 + api/pom.xml | 93 + .../assist/api/AssistApiApplication.groovy | 13 + .../assist/api/cache/LocationsCache.groovy | 50 + .../api/configuration/SecurityConfig.groovy | 96 + .../api/configuration/WebMvcConfig.groovy | 21 + .../api/controllers/ActionsController.groovy | 56 + .../api/controllers/IndexController.groovy | 23 + .../api/controllers/LocationController.groovy | 17 + .../api/controllers/LoginController.groovy | 65 + .../OrganisationManagementController.groovy | 64 + .../StorageManagementController.groovy | 56 + .../filter/TokenAuthenticationFilter.groovy | 69 + .../assist/api/models/ActionedByModel.groovy | 65 + .../api/models/ActionedByModelPK.groovy | 50 + .../com/assist/api/models/ActionsModel.groovy | 242 + .../assist/api/models/AuthorityModel.groovy | 67 + .../com/assist/api/models/FilesModel.groovy | 75 + .../assist/api/models/LocationsModel.groovy | 108 + .../api/models/OrganisationModel.groovy | 163 + .../api/models/StorageCentreModel.groovy | 152 + .../assist/api/models/StorageItemModel.groovy | 88 + .../api/models/UserAuthorityModel.groovy | 73 + .../api/models/UserAuthorityModelPK.groovy | 50 + .../com/assist/api/models/UserModel.groovy | 151 + .../UserOrganisationMappingModel.groovy | 128 + .../UserOrganisationMappingModelPK.groovy | 51 + .../com/assist/api/pogo/dto/ActionDto.groovy | 133 + .../com/assist/api/pogo/dto/FilesDto.groovy | 32 + .../assist/api/pogo/dto/LocationDto.groovy | 53 + .../pogo/dto/OrganisationDetailsDto.groovy | 92 + .../api/pogo/dto/OrganisationDto.groovy | 63 + .../api/pogo/dto/StorageCentreDto.groovy | 85 + .../api/pogo/dto/StorageInventoryDto.groovy | 50 + .../com/assist/api/pogo/dto/UserDto.groovy | 52 + .../assist/api/pogo/enums/ActionType.groovy | 9 + .../api/pogo/request/ActionSaveRequest.groovy | 113 + .../api/pogo/request/LoginRequest.groovy | 23 + .../request/OrganisationSaveRequest.groovy | 50 + .../request/StorageCentreSaveRequest.groovy | 59 + .../StorageInventoryUpdationRequest.groovy | 41 + .../request/UserRegistrationRequest.groovy | 41 + .../api/pogo/response/GenericResponse.groovy | 32 + .../repositories/ActionedByRepository.groovy | 9 + .../api/repositories/ActionsRepository.groovy | 11 + .../api/repositories/FilesRepository.groovy | 7 + .../repositories/LocationsRepository.groovy | 7 + .../OrganisationsRepository.groovy | 9 + .../StorageCentreRepository.groovy | 11 + .../repositories/StorageItemRepository.groovy | 10 + .../UserOrganisationMappingRepository.groovy | 8 + .../api/repositories/UserRepository.groovy | 10 + .../assist/api/security/CurrentUser.groovy | 17 + .../security/CustomUserDetailsService.groovy | 33 + .../RestAuthenticationEntryPoint.groovy | 24 + .../assist/api/security/UserPrincipal.groovy | 65 + .../assist/api/services/ActionService.groovy | 44 + .../api/services/LocationService.groovy | 17 + .../api/services/OrganisationService.groovy | 35 + .../api/services/StorageCentreService.groovy | 31 + .../api/services/StorageItemService.groovy | 46 + .../assist/api/services/TokenProvider.groovy | 56 + .../UserOrganisationMappingService.groovy | 40 + .../assist/api/services/UserService.groovy | 50 + .../com/assist/api/util/ActionsUtil.groovy | 41 + .../com/assist/api/util/DateUtils.groovy | 13 + .../assist/api/util/OrganisationUtils.groovy | 34 + .../assist/api/util/StorageCentreUtils.groovy | 29 + .../assist/api/util/StorageItemUtil.groovy | 16 + .../groovy/com/assist/api/util/Utils.groovy | 17 + api/src/main/resources/application.properties | 12 + .../main/resources/db/chennai_locations.sql | 50 + api/src/main/resources/db/tables.sql | 182 + .../api/AssistApiApplicationTests.groovy | 16 + frontend/README.md | 31 + frontend/angular.json | 136 + frontend/browserslist | 12 + frontend/e2e/protractor.conf.js | 32 + frontend/e2e/src/app.e2e-spec.ts | 23 + frontend/e2e/src/app.po.ts | 11 + frontend/e2e/tsconfig.json | 13 + frontend/karma.conf.js | 32 + frontend/ngsw-config.json | 29 + frontend/package-lock.json | 13191 ++++++++++++++++ frontend/package.json | 53 + frontend/src/app/app-routing.module.ts | 35 + frontend/src/app/app.component.html | 1 + frontend/src/app/app.component.scss | 0 frontend/src/app/app.component.spec.ts | 35 + frontend/src/app/app.component.ts | 12 + frontend/src/app/app.module.ts | 29 + frontend/src/app/models/area.model.ts | 60 + frontend/src/app/services/area.service.ts | 51 + .../app/services/token-interceptor.service.ts | 62 + frontend/src/app/services/user.service.ts | 25 + .../src/app/shared/modules/material.module.ts | 45 + frontend/src/app/shared/shared.module.ts | 28 + .../action-form/action-form-routing.module.ts | 11 + .../action-form/action-form.component.html | 97 + .../action-form/action-form.component.scss | 12 + .../area/action-form/action-form.component.ts | 147 + .../area/action-form/action-form.module.ts | 11 + .../src/app/views/area/area-routing.module.ts | 53 + .../src/app/views/area/area.component.html | 67 + .../src/app/views/area/area.component.scss | 55 + frontend/src/app/views/area/area.component.ts | 77 + frontend/src/app/views/area/area.module.ts | 13 + .../area/components/user/user.component.html | 1 + .../area/components/user/user.component.scss | 0 .../area/components/user/user.component.ts | 15 + .../area/donors/donors-routing.module.ts | 11 + .../views/area/donors/donors.component.html | 48 + .../views/area/donors/donors.component.scss | 20 + .../app/views/area/donors/donors.component.ts | 39 + .../app/views/area/donors/donors.module.ts | 12 + .../request-help-routing.module.ts | 11 + .../request-help/request-help.component.html | 11 + .../request-help/request-help.component.scss | 4 + .../request-help/request-help.component.ts | 15 + .../area/request-help/request-help.module.ts | 12 + .../storage-form-routing.module.ts | 16 + .../storage-form/storage-form.component.html | 60 + .../storage-form/storage-form.component.scss | 0 .../storage-form/storage-form.component.ts | 76 + .../storage-form/storage-form.module.ts | 11 + .../area/storage/storage-routing.module.ts | 16 + .../views/area/storage/storage.component.html | 29 + .../views/area/storage/storage.component.scss | 3 + .../views/area/storage/storage.component.ts | 24 + .../app/views/area/storage/storage.module.ts | 12 + .../volunteers/volunteers-routing.module.ts | 11 + .../area/volunteers/volunteers.component.html | 48 + .../area/volunteers/volunteers.component.scss | 20 + .../area/volunteers/volunteers.component.ts | 22 + .../area/volunteers/volunteers.module.ts | 12 + .../views/homepage/homepage-routing.module.ts | 11 + .../views/homepage/homepage.component.html | 72 + .../views/homepage/homepage.component.scss | 70 + .../app/views/homepage/homepage.component.ts | 61 + .../src/app/views/homepage/homepage.module.ts | 12 + .../app/views/login/login-routing.module.ts | 16 + .../src/app/views/login/login.component.html | 50 + .../src/app/views/login/login.component.scss | 3 + .../src/app/views/login/login.component.ts | 63 + frontend/src/app/views/login/login.module.ts | 12 + .../not-found/not-found-routing.module.ts | 11 + .../views/not-found/not-found.component.html | 1 + .../views/not-found/not-found.component.scss | 0 .../views/not-found/not-found.component.ts | 15 + .../app/views/not-found/not-found.module.ts | 15 + .../views/register/register-routing.module.ts | 16 + .../views/register/register.component.html | 84 + .../views/register/register.component.scss | 3 + .../app/views/register/register.component.ts | 66 + .../src/app/views/register/register.module.ts | 11 + frontend/src/assets/.gitkeep | 0 frontend/src/assets/icons/icon-128x128.png | Bin 0 -> 1253 bytes frontend/src/assets/icons/icon-144x144.png | Bin 0 -> 1394 bytes frontend/src/assets/icons/icon-152x152.png | Bin 0 -> 1427 bytes frontend/src/assets/icons/icon-192x192.png | Bin 0 -> 1790 bytes frontend/src/assets/icons/icon-384x384.png | Bin 0 -> 3557 bytes frontend/src/assets/icons/icon-512x512.png | Bin 0 -> 5008 bytes frontend/src/assets/icons/icon-72x72.png | Bin 0 -> 792 bytes frontend/src/assets/icons/icon-96x96.png | Bin 0 -> 958 bytes .../src/assets/images/kerala-floods-8.jpg | Bin 0 -> 102793 bytes frontend/src/assets/images/logo.svg | 92 + frontend/src/environments/environment.prod.ts | 3 + frontend/src/environments/environment.ts | 17 + frontend/src/favicon.ico | Bin 0 -> 948 bytes frontend/src/index.html | 18 + frontend/src/main.ts | 13 + frontend/src/manifest.webmanifest | 51 + frontend/src/polyfills.ts | 63 + frontend/src/styles.scss | 43 + frontend/src/test.ts | 20 + frontend/tsconfig.app.json | 18 + frontend/tsconfig.json | 26 + frontend/tsconfig.spec.json | 18 + frontend/tslint.json | 91 + 182 files changed, 20591 insertions(+) create mode 100644 .gitignore create mode 100644 api/META-INF/persistence.xml create mode 100755 api/mvnw create mode 100644 api/mvnw.cmd create mode 100644 api/pom.xml create mode 100644 api/src/main/groovy/com/assist/api/AssistApiApplication.groovy create mode 100644 api/src/main/groovy/com/assist/api/cache/LocationsCache.groovy create mode 100644 api/src/main/groovy/com/assist/api/configuration/SecurityConfig.groovy create mode 100644 api/src/main/groovy/com/assist/api/configuration/WebMvcConfig.groovy create mode 100644 api/src/main/groovy/com/assist/api/controllers/ActionsController.groovy create mode 100644 api/src/main/groovy/com/assist/api/controllers/IndexController.groovy create mode 100644 api/src/main/groovy/com/assist/api/controllers/LocationController.groovy create mode 100644 api/src/main/groovy/com/assist/api/controllers/LoginController.groovy create mode 100644 api/src/main/groovy/com/assist/api/controllers/OrganisationManagementController.groovy create mode 100644 api/src/main/groovy/com/assist/api/controllers/StorageManagementController.groovy create mode 100644 api/src/main/groovy/com/assist/api/filter/TokenAuthenticationFilter.groovy create mode 100644 api/src/main/groovy/com/assist/api/models/ActionedByModel.groovy create mode 100644 api/src/main/groovy/com/assist/api/models/ActionedByModelPK.groovy create mode 100644 api/src/main/groovy/com/assist/api/models/ActionsModel.groovy create mode 100644 api/src/main/groovy/com/assist/api/models/AuthorityModel.groovy create mode 100644 api/src/main/groovy/com/assist/api/models/FilesModel.groovy create mode 100644 api/src/main/groovy/com/assist/api/models/LocationsModel.groovy create mode 100644 api/src/main/groovy/com/assist/api/models/OrganisationModel.groovy create mode 100644 api/src/main/groovy/com/assist/api/models/StorageCentreModel.groovy create mode 100644 api/src/main/groovy/com/assist/api/models/StorageItemModel.groovy create mode 100644 api/src/main/groovy/com/assist/api/models/UserAuthorityModel.groovy create mode 100644 api/src/main/groovy/com/assist/api/models/UserAuthorityModelPK.groovy create mode 100644 api/src/main/groovy/com/assist/api/models/UserModel.groovy create mode 100644 api/src/main/groovy/com/assist/api/models/UserOrganisationMappingModel.groovy create mode 100644 api/src/main/groovy/com/assist/api/models/UserOrganisationMappingModelPK.groovy create mode 100644 api/src/main/groovy/com/assist/api/pogo/dto/ActionDto.groovy create mode 100644 api/src/main/groovy/com/assist/api/pogo/dto/FilesDto.groovy create mode 100644 api/src/main/groovy/com/assist/api/pogo/dto/LocationDto.groovy create mode 100644 api/src/main/groovy/com/assist/api/pogo/dto/OrganisationDetailsDto.groovy create mode 100644 api/src/main/groovy/com/assist/api/pogo/dto/OrganisationDto.groovy create mode 100644 api/src/main/groovy/com/assist/api/pogo/dto/StorageCentreDto.groovy create mode 100644 api/src/main/groovy/com/assist/api/pogo/dto/StorageInventoryDto.groovy create mode 100644 api/src/main/groovy/com/assist/api/pogo/dto/UserDto.groovy create mode 100644 api/src/main/groovy/com/assist/api/pogo/enums/ActionType.groovy create mode 100644 api/src/main/groovy/com/assist/api/pogo/request/ActionSaveRequest.groovy create mode 100644 api/src/main/groovy/com/assist/api/pogo/request/LoginRequest.groovy create mode 100644 api/src/main/groovy/com/assist/api/pogo/request/OrganisationSaveRequest.groovy create mode 100644 api/src/main/groovy/com/assist/api/pogo/request/StorageCentreSaveRequest.groovy create mode 100644 api/src/main/groovy/com/assist/api/pogo/request/StorageInventoryUpdationRequest.groovy create mode 100644 api/src/main/groovy/com/assist/api/pogo/request/UserRegistrationRequest.groovy create mode 100644 api/src/main/groovy/com/assist/api/pogo/response/GenericResponse.groovy create mode 100644 api/src/main/groovy/com/assist/api/repositories/ActionedByRepository.groovy create mode 100644 api/src/main/groovy/com/assist/api/repositories/ActionsRepository.groovy create mode 100644 api/src/main/groovy/com/assist/api/repositories/FilesRepository.groovy create mode 100644 api/src/main/groovy/com/assist/api/repositories/LocationsRepository.groovy create mode 100644 api/src/main/groovy/com/assist/api/repositories/OrganisationsRepository.groovy create mode 100644 api/src/main/groovy/com/assist/api/repositories/StorageCentreRepository.groovy create mode 100644 api/src/main/groovy/com/assist/api/repositories/StorageItemRepository.groovy create mode 100644 api/src/main/groovy/com/assist/api/repositories/UserOrganisationMappingRepository.groovy create mode 100644 api/src/main/groovy/com/assist/api/repositories/UserRepository.groovy create mode 100644 api/src/main/groovy/com/assist/api/security/CurrentUser.groovy create mode 100644 api/src/main/groovy/com/assist/api/security/CustomUserDetailsService.groovy create mode 100644 api/src/main/groovy/com/assist/api/security/RestAuthenticationEntryPoint.groovy create mode 100644 api/src/main/groovy/com/assist/api/security/UserPrincipal.groovy create mode 100644 api/src/main/groovy/com/assist/api/services/ActionService.groovy create mode 100644 api/src/main/groovy/com/assist/api/services/LocationService.groovy create mode 100644 api/src/main/groovy/com/assist/api/services/OrganisationService.groovy create mode 100644 api/src/main/groovy/com/assist/api/services/StorageCentreService.groovy create mode 100644 api/src/main/groovy/com/assist/api/services/StorageItemService.groovy create mode 100644 api/src/main/groovy/com/assist/api/services/TokenProvider.groovy create mode 100644 api/src/main/groovy/com/assist/api/services/UserOrganisationMappingService.groovy create mode 100644 api/src/main/groovy/com/assist/api/services/UserService.groovy create mode 100644 api/src/main/groovy/com/assist/api/util/ActionsUtil.groovy create mode 100644 api/src/main/groovy/com/assist/api/util/DateUtils.groovy create mode 100644 api/src/main/groovy/com/assist/api/util/OrganisationUtils.groovy create mode 100644 api/src/main/groovy/com/assist/api/util/StorageCentreUtils.groovy create mode 100644 api/src/main/groovy/com/assist/api/util/StorageItemUtil.groovy create mode 100644 api/src/main/groovy/com/assist/api/util/Utils.groovy create mode 100644 api/src/main/resources/application.properties create mode 100644 api/src/main/resources/db/chennai_locations.sql create mode 100644 api/src/main/resources/db/tables.sql create mode 100644 api/src/test/groovy/com/assist/api/AssistApiApplicationTests.groovy create mode 100644 frontend/README.md create mode 100644 frontend/angular.json create mode 100644 frontend/browserslist create mode 100644 frontend/e2e/protractor.conf.js create mode 100644 frontend/e2e/src/app.e2e-spec.ts create mode 100644 frontend/e2e/src/app.po.ts create mode 100644 frontend/e2e/tsconfig.json create mode 100644 frontend/karma.conf.js create mode 100644 frontend/ngsw-config.json create mode 100644 frontend/package-lock.json create mode 100644 frontend/package.json create mode 100644 frontend/src/app/app-routing.module.ts create mode 100644 frontend/src/app/app.component.html create mode 100644 frontend/src/app/app.component.scss create mode 100644 frontend/src/app/app.component.spec.ts create mode 100644 frontend/src/app/app.component.ts create mode 100644 frontend/src/app/app.module.ts create mode 100644 frontend/src/app/models/area.model.ts create mode 100644 frontend/src/app/services/area.service.ts create mode 100644 frontend/src/app/services/token-interceptor.service.ts create mode 100644 frontend/src/app/services/user.service.ts create mode 100644 frontend/src/app/shared/modules/material.module.ts create mode 100644 frontend/src/app/shared/shared.module.ts create mode 100644 frontend/src/app/views/area/action-form/action-form-routing.module.ts create mode 100644 frontend/src/app/views/area/action-form/action-form.component.html create mode 100644 frontend/src/app/views/area/action-form/action-form.component.scss create mode 100644 frontend/src/app/views/area/action-form/action-form.component.ts create mode 100644 frontend/src/app/views/area/action-form/action-form.module.ts create mode 100644 frontend/src/app/views/area/area-routing.module.ts create mode 100644 frontend/src/app/views/area/area.component.html create mode 100644 frontend/src/app/views/area/area.component.scss create mode 100644 frontend/src/app/views/area/area.component.ts create mode 100644 frontend/src/app/views/area/area.module.ts create mode 100644 frontend/src/app/views/area/components/user/user.component.html create mode 100644 frontend/src/app/views/area/components/user/user.component.scss create mode 100644 frontend/src/app/views/area/components/user/user.component.ts create mode 100644 frontend/src/app/views/area/donors/donors-routing.module.ts create mode 100644 frontend/src/app/views/area/donors/donors.component.html create mode 100644 frontend/src/app/views/area/donors/donors.component.scss create mode 100644 frontend/src/app/views/area/donors/donors.component.ts create mode 100644 frontend/src/app/views/area/donors/donors.module.ts create mode 100644 frontend/src/app/views/area/request-help/request-help-routing.module.ts create mode 100644 frontend/src/app/views/area/request-help/request-help.component.html create mode 100644 frontend/src/app/views/area/request-help/request-help.component.scss create mode 100644 frontend/src/app/views/area/request-help/request-help.component.ts create mode 100644 frontend/src/app/views/area/request-help/request-help.module.ts create mode 100644 frontend/src/app/views/area/storage/storage-form/storage-form-routing.module.ts create mode 100644 frontend/src/app/views/area/storage/storage-form/storage-form.component.html create mode 100644 frontend/src/app/views/area/storage/storage-form/storage-form.component.scss create mode 100644 frontend/src/app/views/area/storage/storage-form/storage-form.component.ts create mode 100644 frontend/src/app/views/area/storage/storage-form/storage-form.module.ts create mode 100644 frontend/src/app/views/area/storage/storage-routing.module.ts create mode 100644 frontend/src/app/views/area/storage/storage.component.html create mode 100644 frontend/src/app/views/area/storage/storage.component.scss create mode 100644 frontend/src/app/views/area/storage/storage.component.ts create mode 100644 frontend/src/app/views/area/storage/storage.module.ts create mode 100644 frontend/src/app/views/area/volunteers/volunteers-routing.module.ts create mode 100644 frontend/src/app/views/area/volunteers/volunteers.component.html create mode 100644 frontend/src/app/views/area/volunteers/volunteers.component.scss create mode 100644 frontend/src/app/views/area/volunteers/volunteers.component.ts create mode 100644 frontend/src/app/views/area/volunteers/volunteers.module.ts create mode 100644 frontend/src/app/views/homepage/homepage-routing.module.ts create mode 100644 frontend/src/app/views/homepage/homepage.component.html create mode 100644 frontend/src/app/views/homepage/homepage.component.scss create mode 100644 frontend/src/app/views/homepage/homepage.component.ts create mode 100644 frontend/src/app/views/homepage/homepage.module.ts create mode 100644 frontend/src/app/views/login/login-routing.module.ts create mode 100644 frontend/src/app/views/login/login.component.html create mode 100644 frontend/src/app/views/login/login.component.scss create mode 100644 frontend/src/app/views/login/login.component.ts create mode 100644 frontend/src/app/views/login/login.module.ts create mode 100644 frontend/src/app/views/not-found/not-found-routing.module.ts create mode 100644 frontend/src/app/views/not-found/not-found.component.html create mode 100644 frontend/src/app/views/not-found/not-found.component.scss create mode 100644 frontend/src/app/views/not-found/not-found.component.ts create mode 100644 frontend/src/app/views/not-found/not-found.module.ts create mode 100644 frontend/src/app/views/register/register-routing.module.ts create mode 100644 frontend/src/app/views/register/register.component.html create mode 100644 frontend/src/app/views/register/register.component.scss create mode 100644 frontend/src/app/views/register/register.component.ts create mode 100644 frontend/src/app/views/register/register.module.ts create mode 100644 frontend/src/assets/.gitkeep create mode 100644 frontend/src/assets/icons/icon-128x128.png create mode 100644 frontend/src/assets/icons/icon-144x144.png create mode 100644 frontend/src/assets/icons/icon-152x152.png create mode 100644 frontend/src/assets/icons/icon-192x192.png create mode 100644 frontend/src/assets/icons/icon-384x384.png create mode 100644 frontend/src/assets/icons/icon-512x512.png create mode 100644 frontend/src/assets/icons/icon-72x72.png create mode 100644 frontend/src/assets/icons/icon-96x96.png create mode 100644 frontend/src/assets/images/kerala-floods-8.jpg create mode 100644 frontend/src/assets/images/logo.svg create mode 100644 frontend/src/environments/environment.prod.ts create mode 100644 frontend/src/environments/environment.ts create mode 100644 frontend/src/favicon.ico create mode 100644 frontend/src/index.html create mode 100644 frontend/src/main.ts create mode 100644 frontend/src/manifest.webmanifest create mode 100644 frontend/src/polyfills.ts create mode 100644 frontend/src/styles.scss create mode 100644 frontend/src/test.ts create mode 100644 frontend/tsconfig.app.json create mode 100644 frontend/tsconfig.json create mode 100644 frontend/tsconfig.spec.json create mode 100644 frontend/tslint.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..a851ffbb --- /dev/null +++ b/.gitignore @@ -0,0 +1,34 @@ +HELP.md +.gradle +/build/ +!gradle/wrapper/gradle-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +/out/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +lib/*.jar + +/target diff --git a/api/META-INF/persistence.xml b/api/META-INF/persistence.xml new file mode 100644 index 00000000..01f76d86 --- /dev/null +++ b/api/META-INF/persistence.xml @@ -0,0 +1,33 @@ + + + + + com.assist.api.models.old.AuthorityModel + com.assist.api.models.old.UserModel + com.assist.api.models.old.UserAuthorityModel + com.assist.api.models.ActionedByModel + com.assist.api.models.ActionsModel + com.assist.api.models.AuthorityModel + com.assist.api.models.FilesModel + com.assist.api.models.LocationsModel + com.assist.api.models.OrganisationModel + com.assist.api.models.UserModel + com.assist.api.models.UserAuthorityModel + com.assist.api.models.UserOrganisationMappingModel + com.assist.api.models.zzz.ActionedByModel + com.assist.api.models.zzz.ActionsModel + com.assist.api.models.zzz.AuthorityModel + com.assist.api.models.zzz.FilesModel + com.assist.api.models.zzz.LocationsModel + com.assist.api.models.zzz.OrganisationModel + com.assist.api.models.zzz.StorageItemModel + com.assist.api.models.zzz.StorageCentreModel + com.assist.api.models.zzz.UserAuthorityModel + com.assist.api.models.zzz.UserOrganisationMappingModel + com.assist.api.models.zzz.UsersModel + + + + + + diff --git a/api/mvnw b/api/mvnw new file mode 100755 index 00000000..8b9da3b8 --- /dev/null +++ b/api/mvnw @@ -0,0 +1,286 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven2 Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" + # TODO classpath? +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar" + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + wget "$jarUrl" -O "$wrapperJarPath" + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + curl -o "$wrapperJarPath" "$jarUrl" + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/api/mvnw.cmd b/api/mvnw.cmd new file mode 100644 index 00000000..fef5a8f7 --- /dev/null +++ b/api/mvnw.cmd @@ -0,0 +1,161 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven2 Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar" +FOR /F "tokens=1,2 delims==" %%A IN (%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties) DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + echo Found %WRAPPER_JAR% +) else ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + powershell -Command "(New-Object Net.WebClient).DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')" + echo Finished downloading %WRAPPER_JAR% +) +@REM End of extension + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/api/pom.xml b/api/pom.xml new file mode 100644 index 00000000..d1ff456d --- /dev/null +++ b/api/pom.xml @@ -0,0 +1,93 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.1.9.RELEASE + + + com.assist + api + 0.0.1-SNAPSHOT + assist-api + Rest APIs for reach + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.security + spring-security-oauth2-client + + + io.jsonwebtoken + jjwt + 0.5.1 + + + org.codehaus.groovy + groovy + + + + mysql + mysql-connector-java + runtime + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.security + spring-security-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.codehaus.gmavenplus + gmavenplus-plugin + 1.6.3 + + + + addSources + addTestSources + generateStubs + compile + generateTestStubs + compileTests + removeStubs + removeTestStubs + + + + + + + + diff --git a/api/src/main/groovy/com/assist/api/AssistApiApplication.groovy b/api/src/main/groovy/com/assist/api/AssistApiApplication.groovy new file mode 100644 index 00000000..50f8c8bf --- /dev/null +++ b/api/src/main/groovy/com/assist/api/AssistApiApplication.groovy @@ -0,0 +1,13 @@ +package com.assist.api + +import org.springframework.boot.SpringApplication +import org.springframework.boot.autoconfigure.SpringBootApplication + +@SpringBootApplication +class AssistApiApplication { + + static void main(String[] args) { + SpringApplication.run(AssistApiApplication, args) + } + +} diff --git a/api/src/main/groovy/com/assist/api/cache/LocationsCache.groovy b/api/src/main/groovy/com/assist/api/cache/LocationsCache.groovy new file mode 100644 index 00000000..66cfe30d --- /dev/null +++ b/api/src/main/groovy/com/assist/api/cache/LocationsCache.groovy @@ -0,0 +1,50 @@ +package com.assist.api.cache + +import com.assist.api.models.LocationsModel +import com.assist.api.pogo.dto.LocationDto +import com.assist.api.services.LocationService +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.stereotype.Service + +import javax.annotation.PostConstruct +import java.util.concurrent.locks.ReadWriteLock +import java.util.concurrent.locks.ReentrantReadWriteLock + +@Service +class LocationsCache { + + @Autowired + private LocationService locationService + + private static final Logger logger = LoggerFactory.getLogger(LocationsCache) + + ReadWriteLock readWriteLock = new ReentrantReadWriteLock() + private static Map locationList = [:] + + + @PostConstruct + private void loadLocations(){ + readWriteLock.writeLock().lock() + try { + List locations = locationService.allLocations + locations.each { + locationList[it.locationId] = new LocationDto(it) + } + }catch (any){ + logger.error('Error while updating locations cache',any) + }finally{ + readWriteLock.writeLock().unlock() + } + } + + static LocationDto getLocationById(Long id){ + return locationList[id] + } + + static List getAllLocations(){ + return locationList.values().collect{it} + } + +} diff --git a/api/src/main/groovy/com/assist/api/configuration/SecurityConfig.groovy b/api/src/main/groovy/com/assist/api/configuration/SecurityConfig.groovy new file mode 100644 index 00000000..b803a342 --- /dev/null +++ b/api/src/main/groovy/com/assist/api/configuration/SecurityConfig.groovy @@ -0,0 +1,96 @@ +package com.assist.api.configuration + +import com.assist.api.filter.TokenAuthenticationFilter +import com.assist.api.security.CustomUserDetailsService +import com.assist.api.security.RestAuthenticationEntryPoint +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration +import org.springframework.security.authentication.AuthenticationManager +import org.springframework.security.config.BeanIds +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity +import org.springframework.security.config.annotation.web.builders.HttpSecurity +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter +import org.springframework.security.config.http.SessionCreationPolicy +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder +import org.springframework.security.crypto.password.PasswordEncoder +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter + +@Configuration +@EnableWebSecurity +@EnableGlobalMethodSecurity( + securedEnabled = true, + jsr250Enabled = true, + prePostEnabled = true +) +class SecurityConfig extends WebSecurityConfigurerAdapter { + + @Autowired + private CustomUserDetailsService customUserDetailsService + + @Override + void configure(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception { + authenticationManagerBuilder + .userDetailsService(customUserDetailsService) + .passwordEncoder(passwordEncoder()) + } + + @Bean + PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder() + } + + @Bean + TokenAuthenticationFilter tokenAuthenticationFilter() { + return new TokenAuthenticationFilter() + } + + + @Bean(BeanIds.AUTHENTICATION_MANAGER) + @Override + AuthenticationManager authenticationManagerBean() throws Exception { + return super.authenticationManagerBean() + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + http + .cors() + .and() + .sessionManagement() + .sessionCreationPolicy(SessionCreationPolicy.STATELESS) + .and() + .csrf() + .disable() + .formLogin() + .disable() + .httpBasic() + .disable() + .exceptionHandling() + .authenticationEntryPoint(new RestAuthenticationEntryPoint()) + .and() + .authorizeRequests() + .antMatchers("/", + "/swagger-ui.html", + "/v2/api-docs", + "/error", + "/favicon.ico", + "/**/*.png", + "/**/*.gif", + "/**/*.svg", + "/**/*.jpg", + "/**/*.html", + "/**/*.css", + "/**/*.js") + .permitAll() + .antMatchers("/auth/**", "/oauth2/**") + .permitAll() + .anyRequest() + .authenticated() + + // Add our custom Token based authentication filter + http.addFilterBefore(tokenAuthenticationFilter(), UsernamePasswordAuthenticationFilter) + } +} diff --git a/api/src/main/groovy/com/assist/api/configuration/WebMvcConfig.groovy b/api/src/main/groovy/com/assist/api/configuration/WebMvcConfig.groovy new file mode 100644 index 00000000..aa7be630 --- /dev/null +++ b/api/src/main/groovy/com/assist/api/configuration/WebMvcConfig.groovy @@ -0,0 +1,21 @@ +package com.assist.api.configuration + +import org.springframework.context.annotation.Configuration +import org.springframework.web.servlet.config.annotation.CorsRegistry +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer + +@Configuration +class WebMvcConfig implements WebMvcConfigurer { + + private final long MAX_AGE_SECS = 3600 + + @Override + void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") + .allowedOrigins("*") + .allowedMethods("GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS") + .allowedHeaders("*") + .allowCredentials(true) + .maxAge(MAX_AGE_SECS) + } +} diff --git a/api/src/main/groovy/com/assist/api/controllers/ActionsController.groovy b/api/src/main/groovy/com/assist/api/controllers/ActionsController.groovy new file mode 100644 index 00000000..9f23a62e --- /dev/null +++ b/api/src/main/groovy/com/assist/api/controllers/ActionsController.groovy @@ -0,0 +1,56 @@ +package com.assist.api.controllers + +import com.assist.api.models.ActionsModel +import com.assist.api.pogo.dto.ActionDto +import com.assist.api.pogo.request.ActionSaveRequest +import com.assist.api.security.CurrentUser +import com.assist.api.security.UserPrincipal +import com.assist.api.services.ActionService +import com.assist.api.util.ActionsUtil +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.beans.factory.annotation.Value +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PathVariable +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RequestParam +import org.springframework.web.bind.annotation.RestController + +@RestController +@RequestMapping('/action') +class ActionsController { + + @Value('${actions.default.days}') + private static int DEFAULT_DAYS_TO_SHOW + + @Autowired + private ActionService actionService + + + @PostMapping('/') + ActionDto save(@RequestBody ActionSaveRequest actionSaveRequest,@CurrentUser UserPrincipal userPrincipal){ + actionSaveRequest.postedByUser = userPrincipal.userId + ActionsModel actionsModel = ActionsUtil.convertToActionsModel(actionSaveRequest) + actionsModel = actionService.save(actionsModel) + return new ActionDto(actionsModel) + } + + @GetMapping('/') + List show(@RequestParam('locationId') long locationId, @RequestParam('actionType') String actionType, + @RequestParam(value = 'noOfDays',required = false) Integer noOfDays, + @RequestParam('pageNo') int pageNumber, @RequestParam('noOfRecords') int noOfRecords, + @RequestParam(value = 'displayForUserOnly',required = false)Boolean displayForUserOnly, + @CurrentUser UserPrincipal userPrincipal){ + noOfDays = noOfDays ?: DEFAULT_DAYS_TO_SHOW + displayForUserOnly = displayForUserOnly == null ? false : displayForUserOnly + return actionService.fetch(locationId,actionType,noOfDays,pageNumber, + noOfRecords,displayForUserOnly,userPrincipal.userId).collect { new ActionDto(it)} + } + + @GetMapping('/{id}') + ActionDto view(@PathVariable('id') Long actionId){ + return new ActionDto(actionService.findById(actionId)) + } + +} diff --git a/api/src/main/groovy/com/assist/api/controllers/IndexController.groovy b/api/src/main/groovy/com/assist/api/controllers/IndexController.groovy new file mode 100644 index 00000000..d3cea1ff --- /dev/null +++ b/api/src/main/groovy/com/assist/api/controllers/IndexController.groovy @@ -0,0 +1,23 @@ +package com.assist.api.controllers + +import com.assist.api.security.UserPrincipal +import com.assist.api.pogo.dto.UserDto +import com.assist.api.security.CurrentUser +import com.assist.api.services.UserService +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController + +@RestController +@RequestMapping('/') +class IndexController { + + @Autowired + private UserService userService + + @GetMapping('/ping') + Map ping(@CurrentUser UserPrincipal userPrincipal){ + [success:true,date:new Date(),user: new UserDto(userService.findById(userPrincipal.userId))] + } +} diff --git a/api/src/main/groovy/com/assist/api/controllers/LocationController.groovy b/api/src/main/groovy/com/assist/api/controllers/LocationController.groovy new file mode 100644 index 00000000..4c4b4605 --- /dev/null +++ b/api/src/main/groovy/com/assist/api/controllers/LocationController.groovy @@ -0,0 +1,17 @@ +package com.assist.api.controllers + +import com.assist.api.cache.LocationsCache +import com.assist.api.pogo.dto.LocationDto +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController + +@RestController +@RequestMapping('/location') +class LocationController { + + @GetMapping('/') + List getAllLocations(){ + return LocationsCache.getAllLocations() + } +} diff --git a/api/src/main/groovy/com/assist/api/controllers/LoginController.groovy b/api/src/main/groovy/com/assist/api/controllers/LoginController.groovy new file mode 100644 index 00000000..b9ebf1e1 --- /dev/null +++ b/api/src/main/groovy/com/assist/api/controllers/LoginController.groovy @@ -0,0 +1,65 @@ +package com.assist.api.controllers + +import com.assist.api.models.UserModel +import com.assist.api.pogo.response.GenericResponse +import com.assist.api.pogo.request.LoginRequest +import com.assist.api.pogo.dto.UserDto +import com.assist.api.pogo.request.UserRegistrationRequest +import com.assist.api.services.TokenProvider +import com.assist.api.services.UserService +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.web.bind.annotation.* + +@RestController +@RequestMapping('/auth') +class LoginController { + + @Autowired + private UserService userService + @Autowired + private TokenProvider tokenProvider + + @GetMapping('/generate/{userId}') + Map generateToken(@PathVariable('userId') Long userId){ + [success:true,token:tokenProvider.createToken(userId)] + } + + @PostMapping('/register') + GenericResponse registerUser(@RequestBody UserRegistrationRequest userRegistrationRequest){ + GenericResponse genericResponse = new GenericResponse() + UserModel existingUserModel = userService.findUserByEmailOrMobile(userRegistrationRequest.email,userRegistrationRequest.mobile) + if(existingUserModel){ + genericResponse.message='User already exists' + }else{ + UserModel newUser = new UserModel(name:userRegistrationRequest.name, + mobile:userRegistrationRequest.mobile, + email:userRegistrationRequest.email, + password:userRegistrationRequest.password + ) + newUser = userService.save(newUser) + if(newUser){ + genericResponse.message=tokenProvider.createToken(newUser.userId) + genericResponse.status=true + genericResponse.responseObject = new UserDto(newUser) + }else{ + genericResponse.message = 'Unable to save user' + } + } + genericResponse + } + + @PostMapping('/login') + GenericResponse loginUser(@RequestBody LoginRequest loginRequest){ + GenericResponse genericResponse = new GenericResponse() + UserModel userModel = userService.authenticateUser(loginRequest.userIdentifier,loginRequest.password) + if(userModel){ + genericResponse.status = true + genericResponse.responseObject = new UserDto(userModel) + genericResponse.message = tokenProvider.createToken(userModel.userId) + }else{ + genericResponse.message = 'No user found' + } + return genericResponse + } + +} diff --git a/api/src/main/groovy/com/assist/api/controllers/OrganisationManagementController.groovy b/api/src/main/groovy/com/assist/api/controllers/OrganisationManagementController.groovy new file mode 100644 index 00000000..065f9ddc --- /dev/null +++ b/api/src/main/groovy/com/assist/api/controllers/OrganisationManagementController.groovy @@ -0,0 +1,64 @@ +package com.assist.api.controllers + +import com.assist.api.pogo.dto.OrganisationDetailsDto +import com.assist.api.pogo.dto.OrganisationDto +import com.assist.api.pogo.request.OrganisationSaveRequest +import com.assist.api.pogo.response.GenericResponse +import com.assist.api.security.CurrentUser +import com.assist.api.security.UserPrincipal +import com.assist.api.services.OrganisationService +import com.assist.api.services.UserOrganisationMappingService +import com.assist.api.util.OrganisationUtils +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PathVariable +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RequestParam +import org.springframework.web.bind.annotation.RestController + +@RestController +@RequestMapping('/organisation') +class OrganisationManagementController { + + private static final Logger logger = LoggerFactory.getLogger(OrganisationManagementController) + + @Autowired + private OrganisationService organisationService + @Autowired + private UserOrganisationMappingService userOrganisationMappingService + + @PostMapping('/') + OrganisationDetailsDto save(@RequestBody OrganisationSaveRequest organisationSaveRequest,@CurrentUser UserPrincipal userPrincipal){ + return new OrganisationDetailsDto(organisationService.save(OrganisationUtils.create(organisationSaveRequest,userPrincipal.userId))) + } + + @GetMapping('/{id}') + OrganisationDetailsDto view(@PathVariable('id')long organisationId){ + return new OrganisationDetailsDto(organisationService.findById(organisationId)) + } + + @PostMapping('/addMember') + GenericResponse addMember(@RequestParam('userIdentifier') String userIdentifier,@RequestParam('orgId') Long orgId, + @RequestParam('isAdmin') boolean isAdmin,@CurrentUser UserPrincipal userPrincipal){ + GenericResponse genericResponse = new GenericResponse() + try { + userOrganisationMappingService.addUser(userIdentifier,orgId,isAdmin,userPrincipal.userId) + genericResponse.status = true + genericResponse.message = 'User added successfully' + }catch (any){ + logger.error("Error while adding user ${userIdentifier} to org ${orgId}",any) + genericResponse.message = any.message + } + genericResponse + } + + @GetMapping('/show/{locationId}') + List list(@PathVariable('locationId')Long locationId){ + return organisationService.findAllInLocation(locationId).collect {new OrganisationDto(it)} + } + +} diff --git a/api/src/main/groovy/com/assist/api/controllers/StorageManagementController.groovy b/api/src/main/groovy/com/assist/api/controllers/StorageManagementController.groovy new file mode 100644 index 00000000..5ab7a6d0 --- /dev/null +++ b/api/src/main/groovy/com/assist/api/controllers/StorageManagementController.groovy @@ -0,0 +1,56 @@ +package com.assist.api.controllers + +import com.assist.api.models.StorageCentreModel +import com.assist.api.pogo.dto.StorageCentreDto +import com.assist.api.pogo.dto.StorageInventoryDto +import com.assist.api.pogo.request.StorageCentreSaveRequest +import com.assist.api.pogo.request.StorageInventoryUpdationRequest +import com.assist.api.security.CurrentUser +import com.assist.api.security.UserPrincipal +import com.assist.api.services.StorageCentreService +import com.assist.api.services.StorageItemService +import com.assist.api.util.StorageCentreUtils +import com.assist.api.util.StorageItemUtil +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PathVariable +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController + +@RestController +@RequestMapping('/storage') +class StorageManagementController { + + @Autowired + private StorageCentreService storageCentreService + @Autowired + private StorageItemService storageItemService + + @PostMapping('/') + StorageCentreDto save(@RequestBody StorageCentreSaveRequest storageCentreSaveRequest,@CurrentUser UserPrincipal userPrincipal){ + StorageCentreModel storageCentreModel = StorageCentreUtils.create(storageCentreSaveRequest,userPrincipal.userId) + return new StorageCentreDto(storageCentreService.save(storageCentreModel)) + } + + @GetMapping('/{id}') + StorageCentreDto view(@PathVariable('id') long storageCentreId){ + return new StorageCentreDto(storageCentreService.findById(storageCentreId)) + } + + @PostMapping('/item/save') + StorageInventoryDto updateItem(@RequestBody StorageInventoryUpdationRequest storageInventoryUpdationRequest){ + return new StorageInventoryDto(storageItemService.save(StorageItemUtil.convert(storageInventoryUpdationRequest))) + } + + @GetMapping('/item/show/{id}') + List getInventory(@PathVariable('id') long storageCentreId){ + return storageItemService.getDetails(storageCentreId).collect{new StorageInventoryDto(it)} + } + + @GetMapping('/location/{id}') + List findAllStorageInArea(@PathVariable('id') long locationId){ + return storageCentreService.findByLocation(locationId).collect{new StorageCentreDto(it)} + } +} diff --git a/api/src/main/groovy/com/assist/api/filter/TokenAuthenticationFilter.groovy b/api/src/main/groovy/com/assist/api/filter/TokenAuthenticationFilter.groovy new file mode 100644 index 00000000..1ae3a606 --- /dev/null +++ b/api/src/main/groovy/com/assist/api/filter/TokenAuthenticationFilter.groovy @@ -0,0 +1,69 @@ +package com.assist.api.filter + +import com.assist.api.security.CustomUserDetailsService +import com.assist.api.services.TokenProvider +import com.assist.api.util.Utils +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.core.env.Environment +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken +import org.springframework.security.core.context.SecurityContextHolder +import org.springframework.security.core.userdetails.UserDetails +import org.springframework.security.web.authentication.WebAuthenticationDetailsSource +import org.springframework.util.StringUtils +import org.springframework.web.filter.OncePerRequestFilter + +import javax.servlet.FilterChain +import javax.servlet.ServletException +import javax.servlet.http.HttpServletRequest +import javax.servlet.http.HttpServletResponse + +class TokenAuthenticationFilter extends OncePerRequestFilter { + + @Autowired + private TokenProvider tokenProvider + @Autowired + Environment environment + @Autowired + private CustomUserDetailsService customUserDetailsService + + private static final Logger logger = LoggerFactory.getLogger(TokenAuthenticationFilter) + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { + try { + String jwt = getJwtFromRequest(request) + + if (StringUtils.hasText(jwt) && tokenProvider.validateToken(jwt)) { + Long userId = tokenProvider.getUserIdFromToken(jwt) + updateSecurityContext(userId,request) + } + } catch (Exception ex) { + logger.error("Could not set user authentication in security context", ex) + } + + filterChain.doFilter(request, response) + } + + private String getJwtFromRequest(HttpServletRequest request) { + if(Utils.convertStringToBoolean(environment.getProperty('jwt.enabled'))){ + String bearerToken = request.getHeader("Authorization") + if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) { + return bearerToken.substring(7, bearerToken.length()) + } + }else if(environment.getProperty('jwt.dummyUserId')){ + logger.warn('Running service without authentication') + long userId = Long.parseLong(environment.getProperty('jwt.dummyUserId')) + updateSecurityContext(userId,request) + } + return null + } + + private updateSecurityContext(Long userId,HttpServletRequest request){ + UserDetails userDetails = customUserDetailsService.loadUserById(userId) + UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()) + authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)) + SecurityContextHolder.getContext().setAuthentication(authentication) + } +} diff --git a/api/src/main/groovy/com/assist/api/models/ActionedByModel.groovy b/api/src/main/groovy/com/assist/api/models/ActionedByModel.groovy new file mode 100644 index 00000000..87ead545 --- /dev/null +++ b/api/src/main/groovy/com/assist/api/models/ActionedByModel.groovy @@ -0,0 +1,65 @@ +package com.assist.api.models + +import javax.persistence.* +import java.sql.Timestamp + +@Entity +@Table(name = "actioned_by", schema = "assist") +@IdClass(ActionedByModelPK.class) +class ActionedByModel { + private Long actionId + private Long userId + private Timestamp actionedOn + + @Id + @Column(name = "action_id", nullable = false) + Long getActionId() { + return actionId + } + + void setActionId(Long actionId) { + this.actionId = actionId + } + + @Id + @Column(name = "user_id", nullable = false) + Long getUserId() { + return userId + } + + void setUserId(Long userId) { + this.userId = userId + } + + @Basic + @Column(name = "actioned_on", nullable = false) + Timestamp getActionedOn() { + return actionedOn + } + + void setActionedOn(Timestamp actionedOn) { + this.actionedOn = actionedOn + } + + @Override + boolean equals(Object o) { + if (this == o) return true + if (o == null || getClass() != o.getClass()) return false + + ActionedByModel that = (ActionedByModel) o + + if (actionId != null ? !actionId.equals(that.actionId) : that.actionId != null) return false + if (userId != null ? !userId.equals(that.userId) : that.userId != null) return false + if (actionedOn != null ? !actionedOn.equals(that.actionedOn) : that.actionedOn != null) return false + + return true + } + + @Override + int hashCode() { + int result = actionId != null ? actionId.hashCode() : 0 + result = 31 * result + (userId != null ? userId.hashCode() : 0) + result = 31 * result + (actionedOn != null ? actionedOn.hashCode() : 0) + return result + } +} diff --git a/api/src/main/groovy/com/assist/api/models/ActionedByModelPK.groovy b/api/src/main/groovy/com/assist/api/models/ActionedByModelPK.groovy new file mode 100644 index 00000000..f2910219 --- /dev/null +++ b/api/src/main/groovy/com/assist/api/models/ActionedByModelPK.groovy @@ -0,0 +1,50 @@ +package com.assist.api.models + +import javax.persistence.Column +import javax.persistence.Id +import java.io.Serializable + +class ActionedByModelPK implements Serializable { + private Long actionId + private Long userId + + @Column(name = "action_id", nullable = false) + @Id + Long getActionId() { + return actionId + } + + void setActionId(Long actionId) { + this.actionId = actionId + } + + @Column(name = "user_id", nullable = false) + @Id + Long getUserId() { + return userId + } + + void setUserId(Long userId) { + this.userId = userId + } + + @Override + boolean equals(Object o) { + if (this == o) return true + if (o == null || getClass() != o.getClass()) return false + + ActionedByModelPK that = (ActionedByModelPK) o + + if (actionId != null ? !actionId.equals(that.actionId) : that.actionId != null) return false + if (userId != null ? !userId.equals(that.userId) : that.userId != null) return false + + return true + } + + @Override + int hashCode() { + int result = actionId != null ? actionId.hashCode() : 0 + result = 31 * result + (userId != null ? userId.hashCode() : 0) + return result + } +} diff --git a/api/src/main/groovy/com/assist/api/models/ActionsModel.groovy b/api/src/main/groovy/com/assist/api/models/ActionsModel.groovy new file mode 100644 index 00000000..3a7bc418 --- /dev/null +++ b/api/src/main/groovy/com/assist/api/models/ActionsModel.groovy @@ -0,0 +1,242 @@ +package com.assist.api.models + +import org.hibernate.annotations.UpdateTimestamp + +import javax.persistence.* + +@Entity +@Table(name = "actions", schema = "assist") +class ActionsModel { + private Long actionId + private String actionType + private String description + private String itemName + private Long itemQuantity + private Long postedByUser + private Long postedByOrganisation + private Boolean fulfilled + private Long locationId + private Double latitude + private Double longitude + private Long fileId + private Date createdOn + private UserModel userByPostedByUser + private OrganisationModel organisationByPostedByOrganisation + private LocationsModel locationsByLocationId + private FilesModel filesByFileId + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "action_id", nullable = false) + Long getActionId() { + return actionId + } + + void setActionId(Long actionId) { + this.actionId = actionId + } + + @Basic + @Column(name = "action_type", nullable = false, length = 100) + String getActionType() { + return actionType + } + + void setActionType(String actionType) { + this.actionType = actionType + } + + @Basic + @Column(name = "description", nullable = true, length = -1) + String getDescription() { + return description + } + + void setDescription(String description) { + this.description = description + } + + @Basic + @Column(name = "item_name", nullable = true, length = 256) + String getItemName() { + return itemName + } + + void setItemName(String itemName) { + this.itemName = itemName + } + + @Basic + @Column(name = "item_quantity", nullable = true) + Long getItemQuantity() { + return itemQuantity + } + + void setItemQuantity(Long itemQuantity) { + this.itemQuantity = itemQuantity + } + + @Basic + @Column(name = "posted_by_user", nullable = true) + Long getPostedByUser() { + return postedByUser + } + + void setPostedByUser(Long postedByUser) { + this.postedByUser = postedByUser + } + + @Basic + @Column(name = "posted_by_organisation", nullable = true,insertable = false,updatable = false) + Long getPostedByOrganisation() { + return postedByOrganisation + } + + void setPostedByOrganisation(Long postedByOrganisation) { + this.postedByOrganisation = postedByOrganisation + } + + @Basic + @Column(name = "fulfilled", nullable = false) + Boolean getFulfilled() { + return fulfilled + } + + void setFulfilled(Boolean fulfilled) { + this.fulfilled = fulfilled + } + + + @Basic + @Column(name = "location_id", nullable = false) + Long getLocationId() { + return locationId + } + + void setLocationId(Long locationId) { + this.locationId = locationId + } + + @Basic + @Column(name = "latitude", nullable = true, precision = 0) + Double getLatitude() { + return latitude + } + + void setLatitude(Double latitude) { + this.latitude = latitude + } + + @Basic + @Column(name = "longitude", nullable = true, precision = 0) + Double getLongitude() { + return longitude + } + + void setLongitude(Double longitude) { + this.longitude = longitude + } + + @Basic + @Column(name = "file_id", nullable = true,insertable = false,updatable = false) + Long getFileId() { + return fileId + } + + void setFileId(Long fileId) { + this.fileId = fileId + } + + @Basic + @UpdateTimestamp + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", nullable = false) + Date getCreatedOn() { + return createdOn + } + + void setCreatedOn(Date createdOn) { + this.createdOn = createdOn + } + + @Override + boolean equals(Object o) { + if (this == o) return true + if (o == null || getClass() != o.getClass()) return false + + ActionsModel that = (ActionsModel) o + + if (actionId != null ? !actionId.equals(that.actionId) : that.actionId != null) return false + if (actionType != null ? !actionType.equals(that.actionType) : that.actionType != null) return false + if (description != null ? !description.equals(that.description) : that.description != null) return false + if (itemName != null ? !itemName.equals(that.itemName) : that.itemName != null) return false + if (itemQuantity != null ? !itemQuantity.equals(that.itemQuantity) : that.itemQuantity != null) return false + if (postedByUser != null ? !postedByUser.equals(that.postedByUser) : that.postedByUser != null) return false + if (postedByOrganisation != null ? !postedByOrganisation.equals(that.postedByOrganisation) : that.postedByOrganisation != null) + return false + if (fulfilled != null ? !fulfilled.equals(that.fulfilled) : that.fulfilled != null) return false + if (locationId != null ? !locationId.equals(that.locationId) : that.locationId != null) return false + if (latitude != null ? !latitude.equals(that.latitude) : that.latitude != null) return false + if (longitude != null ? !longitude.equals(that.longitude) : that.longitude != null) return false + if (fileId != null ? !fileId.equals(that.fileId) : that.fileId != null) return false + + return true + } + + @Override + int hashCode() { + int result = actionId != null ? actionId.hashCode() : 0 + result = 31 * result + (actionType != null ? actionType.hashCode() : 0) + result = 31 * result + (description != null ? description.hashCode() : 0) + result = 31 * result + (itemName != null ? itemName.hashCode() : 0) + result = 31 * result + (itemQuantity != null ? itemQuantity.hashCode() : 0) + result = 31 * result + (postedByUser != null ? postedByUser.hashCode() : 0) + result = 31 * result + (postedByOrganisation != null ? postedByOrganisation.hashCode() : 0) + result = 31 * result + (fulfilled != null ? fulfilled.hashCode() : 0) + result = 31 * result + (locationId != null ? locationId.hashCode() : 0) + result = 31 * result + (latitude != null ? latitude.hashCode() : 0) + result = 31 * result + (longitude != null ? longitude.hashCode() : 0) + result = 31 * result + (fileId != null ? fileId.hashCode() : 0) + return result + } + + @ManyToOne + @JoinColumn(name = "posted_by_user", referencedColumnName = "user_id",insertable = false,updatable = false) + UserModel getUserByPostedByUser() { + return userByPostedByUser + } + + void setUserByPostedByUser(UserModel userByPostedByUser) { + this.userByPostedByUser = userByPostedByUser + } + + @ManyToOne + @JoinColumn(name = "posted_by_organisation", referencedColumnName = "organisation_id",insertable = false,updatable = false) + OrganisationModel getOrganisationByPostedByOrganisation() { + return organisationByPostedByOrganisation + } + + void setOrganisationByPostedByOrganisation(OrganisationModel organisationByPostedByOrganisation) { + this.organisationByPostedByOrganisation = organisationByPostedByOrganisation + } + + @ManyToOne + @JoinColumn(name = "location_id", referencedColumnName = "location_id",insertable = false,updatable = false) + LocationsModel getLocationsByLocationId() { + return locationsByLocationId + } + + void setLocationsByLocationId(LocationsModel locationsByLocationId) { + this.locationsByLocationId = locationsByLocationId + } + + @ManyToOne + @JoinColumn(name = "file_id", referencedColumnName = "file_id",insertable = false,updatable = false) + FilesModel getFilesByFileId() { + return filesByFileId + } + + void setFilesByFileId(FilesModel filesByFileId) { + this.filesByFileId = filesByFileId + } +} diff --git a/api/src/main/groovy/com/assist/api/models/AuthorityModel.groovy b/api/src/main/groovy/com/assist/api/models/AuthorityModel.groovy new file mode 100644 index 00000000..50aa4a34 --- /dev/null +++ b/api/src/main/groovy/com/assist/api/models/AuthorityModel.groovy @@ -0,0 +1,67 @@ +package com.assist.api.models + +import org.springframework.security.core.GrantedAuthority + +import javax.persistence.* + +@Entity +@Table(name = "authority", schema = "assist") +class AuthorityModel implements GrantedAuthority{ + private Long authorityId + private String authority + private Collection userAuthoritiesByAuthorityId + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "authority_id", nullable = false) + Long getAuthorityId() { + return authorityId + } + + + void setAuthorityId(Long authorityId) { + this.authorityId = authorityId + } + + @Override + @Basic + @Column(name = "authority_name", nullable = false, length = 45) + String getAuthority() { + return authority + } + + void setAuthority(String authority) { + this.authority = authority + } + + @Override + boolean equals(Object o) { + if (this == o) return true + if (o == null || getClass() != o.getClass()) return false + + AuthorityModel that = (AuthorityModel) o + + if (authorityId != null ? !authorityId.equals(that.authorityId) : that.authorityId != null) return false + if (authority != null ? !authority.equals(that.authority) : that.authority != null) + return false + + return true + } + + @Override + int hashCode() { + int result = authorityId != null ? authorityId.hashCode() : 0 + result = 31 * result + (authority != null ? authority.hashCode() : 0) + return result + } + + @OneToMany(mappedBy = "authorityByAuthorityId") + Collection getUserAuthoritiesByAuthorityId() { + return userAuthoritiesByAuthorityId + } + + void setUserAuthoritiesByAuthorityId(Collection userAuthoritiesByAuthorityId) { + this.userAuthoritiesByAuthorityId = userAuthoritiesByAuthorityId + } + +} diff --git a/api/src/main/groovy/com/assist/api/models/FilesModel.groovy b/api/src/main/groovy/com/assist/api/models/FilesModel.groovy new file mode 100644 index 00000000..343b18a6 --- /dev/null +++ b/api/src/main/groovy/com/assist/api/models/FilesModel.groovy @@ -0,0 +1,75 @@ +package com.assist.api.models + +import javax.persistence.* +import java.util.Collection + +@Entity +@Table(name = "files", schema = "assist") +class FilesModel { + private Long fileId + private String fileName + private String fileLocation + private Collection actionsByFileId + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "file_id", nullable = false) + Long getFileId() { + return fileId + } + + void setFileId(Long fileId) { + this.fileId = fileId + } + + @Basic + @Column(name = "file_name", nullable = false, length = 256) + String getFileName() { + return fileName + } + + void setFileName(String fileName) { + this.fileName = fileName + } + + @Basic + @Column(name = "file_location", nullable = false, length = 512) + String getFileLocation() { + return fileLocation + } + + void setFileLocation(String fileLocation) { + this.fileLocation = fileLocation + } + + @Override + boolean equals(Object o) { + if (this == o) return true + if (o == null || getClass() != o.getClass()) return false + + FilesModel that = (FilesModel) o + + if (fileId != null ? !fileId.equals(that.fileId) : that.fileId != null) return false + if (fileName != null ? !fileName.equals(that.fileName) : that.fileName != null) return false + if (fileLocation != null ? !fileLocation.equals(that.fileLocation) : that.fileLocation != null) return false + + return true + } + + @Override + int hashCode() { + int result = fileId != null ? fileId.hashCode() : 0 + result = 31 * result + (fileName != null ? fileName.hashCode() : 0) + result = 31 * result + (fileLocation != null ? fileLocation.hashCode() : 0) + return result + } + + @OneToMany(mappedBy = "filesByFileId") + Collection getActionsByFileId() { + return actionsByFileId + } + + void setActionsByFileId(Collection actionsByFileId) { + this.actionsByFileId = actionsByFileId + } +} diff --git a/api/src/main/groovy/com/assist/api/models/LocationsModel.groovy b/api/src/main/groovy/com/assist/api/models/LocationsModel.groovy new file mode 100644 index 00000000..4326a91d --- /dev/null +++ b/api/src/main/groovy/com/assist/api/models/LocationsModel.groovy @@ -0,0 +1,108 @@ +package com.assist.api.models + +import javax.persistence.* +import java.util.Collection + +@Entity +@Table(name = "locations", schema = "assist") +class LocationsModel { + private Long locationId + private String locationName + private Double latitude + private Double longitude + private Collection actionsByLocationId + private Collection organisationsByLocationId + private Collection storageCentresByLocationId; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "location_id", nullable = false) + Long getLocationId() { + return locationId + } + + void setLocationId(Long locationId) { + this.locationId = locationId + } + + @Basic + @Column(name = "location_name", nullable = false, length = 256) + String getLocationName() { + return locationName + } + + void setLocationName(String locationName) { + this.locationName = locationName + } + + @Basic + @Column(name = "latitude", nullable = true, precision = 0) + Double getLatitude() { + return latitude + } + + void setLatitude(Double latitude) { + this.latitude = latitude + } + + @Basic + @Column(name = "longitude", nullable = true, precision = 0) + Double getLongitude() { + return longitude + } + + void setLongitude(Double longitude) { + this.longitude = longitude + } + + @Override + boolean equals(Object o) { + if (this == o) return true + if (o == null || getClass() != o.getClass()) return false + + LocationsModel that = (LocationsModel) o + + if (locationId != null ? !locationId.equals(that.locationId) : that.locationId != null) return false + if (locationName != null ? !locationName.equals(that.locationName) : that.locationName != null) return false + if (latitude != null ? !latitude.equals(that.latitude) : that.latitude != null) return false + if (longitude != null ? !longitude.equals(that.longitude) : that.longitude != null) return false + + return true + } + + @Override + int hashCode() { + int result = locationId != null ? locationId.hashCode() : 0 + result = 31 * result + (locationName != null ? locationName.hashCode() : 0) + result = 31 * result + (latitude != null ? latitude.hashCode() : 0) + result = 31 * result + (longitude != null ? longitude.hashCode() : 0) + return result + } + + @OneToMany(mappedBy = "locationsByLocationId") + Collection getActionsByLocationId() { + return actionsByLocationId + } + + void setActionsByLocationId(Collection actionsByLocationId) { + this.actionsByLocationId = actionsByLocationId + } + + @OneToMany(mappedBy = "locationsByLocationId") + Collection getOrganisationsByLocationId() { + return organisationsByLocationId + } + + void setOrganisationsByLocationId(Collection organisationsByLocationId) { + this.organisationsByLocationId = organisationsByLocationId + } + + @OneToMany(mappedBy = "locationsByLocationId") + Collection getStorageCentresByLocationId() { + return storageCentresByLocationId; + } + + void setStorageCentresByLocationId(Collection storageCentresByLocationId) { + this.storageCentresByLocationId = storageCentresByLocationId; + } +} diff --git a/api/src/main/groovy/com/assist/api/models/OrganisationModel.groovy b/api/src/main/groovy/com/assist/api/models/OrganisationModel.groovy new file mode 100644 index 00000000..309fa698 --- /dev/null +++ b/api/src/main/groovy/com/assist/api/models/OrganisationModel.groovy @@ -0,0 +1,163 @@ +package com.assist.api.models + +import org.hibernate.annotations.UpdateTimestamp + +import javax.persistence.* + +@Entity +@Table(name = "organisation", schema = "assist") +class OrganisationModel { + private Long organisationId + private String name + private String url + private Long locationId + private Long createdBy + private Date createdOn + private String description + private Collection actionsByOrganisationId + private LocationsModel locationsByLocationId + private UserModel userByCreatedBy + private Collection userOrganisationMappingsByOrganisationId + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "organisation_id", nullable = false) + Long getOrganisationId() { + return organisationId + } + + void setOrganisationId(Long organisationId) { + this.organisationId = organisationId + } + + @Basic + @Column(name = "name", nullable = false, length = 45) + String getName() { + return name + } + + void setName(String name) { + this.name = name + } + + @Basic + @Column(name = "url", nullable = true, length = 45) + String getUrl() { + return url + } + + void setUrl(String url) { + this.url = url + } + + @Basic + @Column(name = "location_id", nullable = false) + Long getLocationId() { + return locationId + } + + void setLocationId(Long locationId) { + this.locationId = locationId + } + + @Basic + @Column(name = "created_by", nullable = false) + Long getCreatedBy() { + return createdBy + } + + void setCreatedBy(Long createdBy) { + this.createdBy = createdBy + } + + @Basic + @UpdateTimestamp + @Temporal(value = TemporalType.TIMESTAMP) + @Column(name = "created_on", nullable = false) + Date getCreatedOn() { + return createdOn + } + + void setCreatedOn(Date createdOn) { + this.createdOn = createdOn + } + + @Basic + @Column(name = "description", nullable = true, length = -1) + String getDescription() { + return description + } + + void setDescription(String description) { + this.description = description + } + + @Override + boolean equals(Object o) { + if (this == o) return true + if (o == null || getClass() != o.getClass()) return false + + OrganisationModel that = (OrganisationModel) o + + if (organisationId != null ? !organisationId.equals(that.organisationId) : that.organisationId != null) + return false + if (name != null ? !name.equals(that.name) : that.name != null) return false + if (url != null ? !url.equals(that.url) : that.url != null) return false + if (locationId != null ? !locationId.equals(that.locationId) : that.locationId != null) return false + if (createdBy != null ? !createdBy.equals(that.createdBy) : that.createdBy != null) return false + if (createdOn != null ? !createdOn.equals(that.createdOn) : that.createdOn != null) return false + if (description != null ? !description.equals(that.description) : that.description != null) return false + + return true + } + + @Override + int hashCode() { + int result = organisationId != null ? organisationId.hashCode() : 0 + result = 31 * result + (name != null ? name.hashCode() : 0) + result = 31 * result + (url != null ? url.hashCode() : 0) + result = 31 * result + (locationId != null ? locationId.hashCode() : 0) + result = 31 * result + (createdBy != null ? createdBy.hashCode() : 0) + result = 31 * result + (createdOn != null ? createdOn.hashCode() : 0) + result = 31 * result + (description != null ? description.hashCode() : 0) + return result + } + + @OneToMany(mappedBy = "organisationByPostedByOrganisation") + Collection getActionsByOrganisationId() { + return actionsByOrganisationId + } + + void setActionsByOrganisationId(Collection actionsByOrganisationId) { + this.actionsByOrganisationId = actionsByOrganisationId + } + + @ManyToOne + @JoinColumn(name = "location_id", referencedColumnName = "location_id",insertable = false,updatable = false) + LocationsModel getLocationsByLocationId() { + return locationsByLocationId + } + + void setLocationsByLocationId(LocationsModel locationsByLocationId) { + this.locationsByLocationId = locationsByLocationId + } + + @ManyToOne + @JoinColumn(name = "created_by", referencedColumnName = "user_id", nullable = false,insertable = false,updatable = false) + UserModel getUserByCreatedBy() { + return userByCreatedBy + } + + void setUserByCreatedBy(UserModel userByCreatedBy) { + this.userByCreatedBy = userByCreatedBy + } + + @OneToMany(mappedBy = "organisationByOrganisationId") + Collection getUserOrganisationMappingsByOrganisationId() { + return userOrganisationMappingsByOrganisationId + } + + void setUserOrganisationMappingsByOrganisationId(Collection userOrganisationMappingsByOrganisationId) { + this.userOrganisationMappingsByOrganisationId = userOrganisationMappingsByOrganisationId + } +} diff --git a/api/src/main/groovy/com/assist/api/models/StorageCentreModel.groovy b/api/src/main/groovy/com/assist/api/models/StorageCentreModel.groovy new file mode 100644 index 00000000..5af5223c --- /dev/null +++ b/api/src/main/groovy/com/assist/api/models/StorageCentreModel.groovy @@ -0,0 +1,152 @@ +package com.assist.api.models + +import org.hibernate.annotations.UpdateTimestamp + +import javax.persistence.* + +@Entity +@Table(name = "storage_centre", schema = "assist") +class StorageCentreModel { + private Long centreId + private String centreName + private Long locationId + private Double latitude + private Double longitude + private Long createdBy + private Date createdOn + private Collection storagesByCentreId + private LocationsModel locationsByLocationId + private UserModel usersByCreatedBy + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "centre_id", nullable = false) + Long getCentreId() { + return centreId + } + + void setCentreId(Long centreId) { + this.centreId = centreId + } + + @Basic + @Column(name = "centre_name", nullable = false, length = 512) + String getCentreName() { + return centreName + } + + void setCentreName(String centreName) { + this.centreName = centreName + } + + @Basic + @Column(name = "location_id", nullable = false) + Long getLocationId() { + return locationId + } + + void setLocationId(Long locationId) { + this.locationId = locationId + } + + @Basic + @Column(name = "latitude", nullable = true, precision = 0) + Double getLatitude() { + return latitude + } + + void setLatitude(Double latitude) { + this.latitude = latitude + } + + @Basic + @Column(name = "longitude", nullable = true, precision = 0) + Double getLongitude() { + return longitude + } + + void setLongitude(Double longitude) { + this.longitude = longitude + } + + @Basic + @Column(name = "created_by", nullable = false) + Long getCreatedBy() { + return createdBy + } + + void setCreatedBy(Long createdBy) { + this.createdBy = createdBy + } + + @Basic + @UpdateTimestamp + @Temporal(value = TemporalType.TIMESTAMP) + @Column(name = "created_on", nullable = true) + Date getCreatedOn() { + return createdOn + } + + void setCreatedOn(Date createdOn) { + this.createdOn = createdOn + } + + @Override + boolean equals(Object o) { + if (this == o) return true + if (o == null || getClass() != o.getClass()) return false + + StorageCentreModel that = (StorageCentreModel) o + + if (centreId != null ? !centreId.equals(that.centreId) : that.centreId != null) return false + if (centreName != null ? !centreName.equals(that.centreName) : that.centreName != null) return false + if (locationId != null ? !locationId.equals(that.locationId) : that.locationId != null) return false + if (latitude != null ? !latitude.equals(that.latitude) : that.latitude != null) return false + if (longitude != null ? !longitude.equals(that.longitude) : that.longitude != null) return false + if (createdBy != null ? !createdBy.equals(that.createdBy) : that.createdBy != null) return false + if (createdOn != null ? !createdOn.equals(that.createdOn) : that.createdOn != null) return false + + return true + } + + @Override + int hashCode() { + int result = centreId != null ? centreId.hashCode() : 0 + result = 31 * result + (centreName != null ? centreName.hashCode() : 0) + result = 31 * result + (locationId != null ? locationId.hashCode() : 0) + result = 31 * result + (latitude != null ? latitude.hashCode() : 0) + result = 31 * result + (longitude != null ? longitude.hashCode() : 0) + result = 31 * result + (createdBy != null ? createdBy.hashCode() : 0) + result = 31 * result + (createdOn != null ? createdOn.hashCode() : 0) + return result + } + + @OneToMany(mappedBy = "storageCentreByCentreId") + Collection getStoragesByCentreId() { + return storagesByCentreId + } + + void setStoragesByCentreId(Collection storagesByCentreId) { + this.storagesByCentreId = storagesByCentreId + } + + @ManyToOne + @JoinColumn(name = "location_id", referencedColumnName = "location_id", nullable = false,updatable = false,insertable = false) + LocationsModel getLocationsByLocationId() { + return locationsByLocationId + } + + void setLocationsByLocationId(LocationsModel locationsByLocationId) { + this.locationsByLocationId = locationsByLocationId + } + + @ManyToOne + @JoinColumn(name = "created_by", referencedColumnName = "user_id", nullable = false,updatable = false,insertable = false) + UserModel getUsersByCreatedBy() { + return usersByCreatedBy + } + + void setUsersByCreatedBy(UserModel usersByCreatedBy) { + this.usersByCreatedBy = usersByCreatedBy + } +} diff --git a/api/src/main/groovy/com/assist/api/models/StorageItemModel.groovy b/api/src/main/groovy/com/assist/api/models/StorageItemModel.groovy new file mode 100644 index 00000000..3f08fc78 --- /dev/null +++ b/api/src/main/groovy/com/assist/api/models/StorageItemModel.groovy @@ -0,0 +1,88 @@ +package com.assist.api.models + +import javax.persistence.* + +@Entity +@Table(name = "storage_item", schema = "assist") +class StorageItemModel { + private Long storageId + private Long centreId + private String itemName + private Integer itemQuantity + private StorageCentreModel storageCentreByCentreId + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "storage_id", nullable = false) + Long getStorageId() { + return storageId + } + + void setStorageId(Long storageId) { + this.storageId = storageId + } + + @Basic + @Column(name = "centre_id", nullable = false) + Long getCentreId() { + return centreId + } + + void setCentreId(Long centreId) { + this.centreId = centreId + } + + @Basic + @Column(name = "item_name", nullable = false, length = 512) + String getItemName() { + return itemName + } + + void setItemName(String itemName) { + this.itemName = itemName + } + + @Basic + @Column(name = "item_quantity", nullable = false) + Integer getItemQuantity() { + return itemQuantity + } + + void setItemQuantity(Integer itemQuantity) { + this.itemQuantity = itemQuantity + } + + @Override + boolean equals(Object o) { + if (this == o) return true + if (o == null || getClass() != o.getClass()) return false + + StorageItemModel that = (StorageItemModel) o + + if (storageId != null ? !storageId.equals(that.storageId) : that.storageId != null) return false + if (centreId != null ? !centreId.equals(that.centreId) : that.centreId != null) return false + if (itemName != null ? !itemName.equals(that.itemName) : that.itemName != null) return false + if (itemQuantity != null ? !itemQuantity.equals(that.itemQuantity) : that.itemQuantity != null) return false + + return true + } + + @Override + int hashCode() { + int result = storageId != null ? storageId.hashCode() : 0 + result = 31 * result + (centreId != null ? centreId.hashCode() : 0) + result = 31 * result + (itemName != null ? itemName.hashCode() : 0) + result = 31 * result + (itemQuantity != null ? itemQuantity.hashCode() : 0) + return result + } + + @ManyToOne + @JoinColumn(name = "centre_id", referencedColumnName = "centre_id", nullable = false,updatable = false,insertable = false) + StorageCentreModel getStorageCentreByCentreId() { + return storageCentreByCentreId + } + + void setStorageCentreByCentreId(StorageCentreModel storageCentreByCentreId) { + this.storageCentreByCentreId = storageCentreByCentreId + } +} diff --git a/api/src/main/groovy/com/assist/api/models/UserAuthorityModel.groovy b/api/src/main/groovy/com/assist/api/models/UserAuthorityModel.groovy new file mode 100644 index 00000000..7f57f810 --- /dev/null +++ b/api/src/main/groovy/com/assist/api/models/UserAuthorityModel.groovy @@ -0,0 +1,73 @@ +package com.assist.api.models + +import javax.persistence.* + +@Entity +@Table(name = "user_authority", schema = "assist") +@IdClass(UserAuthorityModelPK.class) +class UserAuthorityModel { + private Long userId + private Long authorityId + private UserModel userByUserId + private AuthorityModel authorityByAuthorityId + + @Id + @Column(name = "user_id", nullable = false) + Long getUserId() { + return userId + } + + void setUserId(Long userId) { + this.userId = userId + } + + @Id + @Column(name = "authority_id", nullable = false) + Long getAuthorityId() { + return authorityId + } + + void setAuthorityId(Long authorityId) { + this.authorityId = authorityId + } + + @Override + boolean equals(Object o) { + if (this == o) return true + if (o == null || getClass() != o.getClass()) return false + + UserAuthorityModel that = (UserAuthorityModel) o + + if (userId != null ? !userId.equals(that.userId) : that.userId != null) return false + if (authorityId != null ? !authorityId.equals(that.authorityId) : that.authorityId != null) return false + + return true + } + + @Override + int hashCode() { + int result = userId != null ? userId.hashCode() : 0 + result = 31 * result + (authorityId != null ? authorityId.hashCode() : 0) + return result + } + + @ManyToOne + @JoinColumn(name = "user_id", referencedColumnName = "user_id", nullable = false,insertable = false,updatable = false) + UserModel getUserByUserId() { + return userByUserId + } + + void setUserByUserId(UserModel userByUserId) { + this.userByUserId = userByUserId + } + + @ManyToOne + @JoinColumn(name = "authority_id", referencedColumnName = "authority_id", nullable = false,insertable = false,updatable = false) + AuthorityModel getAuthorityByAuthorityId() { + return authorityByAuthorityId + } + + void setAuthorityByAuthorityId(AuthorityModel authorityByAuthorityId) { + this.authorityByAuthorityId = authorityByAuthorityId + } +} diff --git a/api/src/main/groovy/com/assist/api/models/UserAuthorityModelPK.groovy b/api/src/main/groovy/com/assist/api/models/UserAuthorityModelPK.groovy new file mode 100644 index 00000000..f9ba640e --- /dev/null +++ b/api/src/main/groovy/com/assist/api/models/UserAuthorityModelPK.groovy @@ -0,0 +1,50 @@ +package com.assist.api.models + +import javax.persistence.Column +import javax.persistence.Id +import java.io.Serializable + +class UserAuthorityModelPK implements Serializable { + private Long userId + private Long authorityId + + @Column(name = "user_id", nullable = false) + @Id + Long getUserId() { + return userId + } + + void setUserId(Long userId) { + this.userId = userId + } + + @Column(name = "authority_id", nullable = false) + @Id + Long getAuthorityId() { + return authorityId + } + + void setAuthorityId(Long authorityId) { + this.authorityId = authorityId + } + + @Override + boolean equals(Object o) { + if (this == o) return true + if (o == null || getClass() != o.getClass()) return false + + UserAuthorityModelPK that = (UserAuthorityModelPK) o + + if (userId != null ? !userId.equals(that.userId) : that.userId != null) return false + if (authorityId != null ? !authorityId.equals(that.authorityId) : that.authorityId != null) return false + + return true + } + + @Override + int hashCode() { + int result = userId != null ? userId.hashCode() : 0 + result = 31 * result + (authorityId != null ? authorityId.hashCode() : 0) + return result + } +} diff --git a/api/src/main/groovy/com/assist/api/models/UserModel.groovy b/api/src/main/groovy/com/assist/api/models/UserModel.groovy new file mode 100644 index 00000000..adb18a45 --- /dev/null +++ b/api/src/main/groovy/com/assist/api/models/UserModel.groovy @@ -0,0 +1,151 @@ +package com.assist.api.models + +import javax.persistence.* +import java.util.Collection + +@Entity +@Table(name = "users", schema = "assist") +class UserModel { + private Long userId + private String name + private String mobile + private String email + private String password + private Collection actionsByUserId + private Collection organisationsByUserId + private Collection storageCentresByUserId + private Collection userAuthoritiesByUserId + private Collection userOrganisationMappingsByUserId + private Collection userOrganisationMappingsByUserId_0 + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "user_id", nullable = false) + Long getUserId() { + return userId + } + + void setUserId(Long userId) { + this.userId = userId + } + + @Basic + @Column(name = "user_name", nullable = false, length = 256) + String getName() { + return name + } + + void setName(String name) { + this.name = name + } + + @Basic + @Column(name = "mobile", nullable = true,length = 15) + String getMobile() { + return mobile + } + + void setMobile(String mobile) { + this.mobile = mobile + } + + @Basic + @Column(name = "email", nullable = true, length = 246) + String getEmail() { + return email + } + + void setEmail(String email) { + this.email = email + } + + @Basic + @Column(name = "passwd", nullable = false, length = 256) + String getPassword() { + return password + } + + void setPassword(String password) { + this.password = password + } + + @Override + boolean equals(Object o) { + if (this == o) return true + if (o == null || getClass() != o.getClass()) return false + + UserModel userModel = (UserModel) o + + if (userId != null ? !userId.equals(userModel.userId) : userModel.userId != null) return false + if (name != null ? !name.equals(userModel.name) : userModel.name != null) return false + if (mobile != null ? !mobile.equals(userModel.mobile) : userModel.mobile != null) return false + if (email != null ? !email.equals(userModel.email) : userModel.email != null) return false + if (password != null ? !password.equals(userModel.password) : userModel.password != null) return false + + return true + } + + @Override + int hashCode() { + int result = userId != null ? userId.hashCode() : 0 + result = 31 * result + (name != null ? name.hashCode() : 0) + result = 31 * result + (mobile != null ? mobile.hashCode() : 0) + result = 31 * result + (email != null ? email.hashCode() : 0) + result = 31 * result + (password != null ? password.hashCode() : 0) + return result + } + + @OneToMany(mappedBy = "userByPostedByUser") + Collection getActionsByUserId() { + return actionsByUserId + } + + void setActionsByUserId(Collection actionsByUserId) { + this.actionsByUserId = actionsByUserId + } + + @OneToMany(mappedBy = "userByCreatedBy") + Collection getOrganisationsByUserId() { + return organisationsByUserId + } + + void setOrganisationsByUserId(Collection organisationsByUserId) { + this.organisationsByUserId = organisationsByUserId + } + + @OneToMany(mappedBy = "usersByCreatedBy") + Collection getStorageCentresByUserId() { + return storageCentresByUserId; + } + + void setStorageCentresByUserId(Collection storageCentresByUserId) { + this.storageCentresByUserId = storageCentresByUserId; + } + + @OneToMany(mappedBy = "userByUserId",fetch = FetchType.EAGER) + Collection getUserAuthoritiesByUserId() { + return userAuthoritiesByUserId + } + + void setUserAuthoritiesByUserId(Collection userAuthoritiesByUserId) { + this.userAuthoritiesByUserId = userAuthoritiesByUserId + } + + @OneToMany(mappedBy = "userByUserId") + Collection getUserOrganisationMappingsByUserId() { + return userOrganisationMappingsByUserId + } + + void setUserOrganisationMappingsByUserId(Collection userOrganisationMappingsByUserId) { + this.userOrganisationMappingsByUserId = userOrganisationMappingsByUserId + } + + @OneToMany(mappedBy = "userByAddedBy") + Collection getUserOrganisationMappingsByUserId_0() { + return userOrganisationMappingsByUserId_0 + } + + void setUserOrganisationMappingsByUserId_0(Collection userOrganisationMappingsByUserId_0) { + this.userOrganisationMappingsByUserId_0 = userOrganisationMappingsByUserId_0 + } +} diff --git a/api/src/main/groovy/com/assist/api/models/UserOrganisationMappingModel.groovy b/api/src/main/groovy/com/assist/api/models/UserOrganisationMappingModel.groovy new file mode 100644 index 00000000..4fb4f5d0 --- /dev/null +++ b/api/src/main/groovy/com/assist/api/models/UserOrganisationMappingModel.groovy @@ -0,0 +1,128 @@ +package com.assist.api.models + +import org.hibernate.annotations.UpdateTimestamp + +import javax.persistence.* + +@Entity +@Table(name = "user_organisation_mapping", schema = "assist") +@IdClass(UserOrganisationMappingModelPK) +class UserOrganisationMappingModel { + private Long organisationId + private Long userId + private boolean isAdmin + private Date addedOn + private Long addedBy + private OrganisationModel organisationByOrganisationId + private UserModel userByUserId + private UserModel userByAddedBy + + @Id + @Column(name = "organisation_id", nullable = false) + Long getOrganisationId() { + return organisationId + } + + void setOrganisationId(Long organisationId) { + this.organisationId = organisationId + } + + @Id + @Column(name = "user_id", nullable = false) + Long getUserId() { + return userId + } + + void setUserId(Long userId) { + this.userId = userId + } + + @Basic + @Column(name = "is_admin", nullable = false) + boolean getIsAdmin() { + return isAdmin + } + + void setIsAdmin(boolean isAdmin) { + this.isAdmin = isAdmin + } + + @Basic + @UpdateTimestamp + @Temporal(value = TemporalType.TIMESTAMP) + @Column(name = "added_on", nullable = false) + Date getAddedOn() { + return addedOn + } + + void setAddedOn(Date addedOn) { + this.addedOn = addedOn + } + + @Basic + @Column(name = "added_by", nullable = false) + Long getAddedBy() { + return addedBy + } + + void setAddedBy(Long addedBy) { + this.addedBy = addedBy + } + + @Override + boolean equals(Object o) { + if (this == o) return true + if (o == null || getClass() != o.getClass()) return false + + UserOrganisationMappingModel that = (UserOrganisationMappingModel) o + + if (organisationId != null ? !organisationId.equals(that.organisationId) : that.organisationId != null) + return false + if (userId != null ? !userId.equals(that.userId) : that.userId != null) return false + if (isAdmin != null ? !isAdmin.equals(that.isAdmin) : that.isAdmin != null) return false + if (addedOn != null ? !addedOn.equals(that.addedOn) : that.addedOn != null) return false + if (addedBy != null ? !addedBy.equals(that.addedBy) : that.addedBy != null) return false + + return true + } + + @Override + int hashCode() { + int result = organisationId != null ? organisationId.hashCode() : 0 + result = 31 * result + (userId != null ? userId.hashCode() : 0) + result = 31 * result + (isAdmin != null ? isAdmin.hashCode() : 0) + result = 31 * result + (addedOn != null ? addedOn.hashCode() : 0) + result = 31 * result + (addedBy != null ? addedBy.hashCode() : 0) + return result + } + + @ManyToOne + @JoinColumn(name = "organisation_id", referencedColumnName = "organisation_id", nullable = false,insertable = false,updatable = false) + OrganisationModel getOrganisationByOrganisationId() { + return organisationByOrganisationId + } + + void setOrganisationByOrganisationId(OrganisationModel organisationByOrganisationId) { + this.organisationByOrganisationId = organisationByOrganisationId + } + + @ManyToOne + @JoinColumn(name = "user_id", referencedColumnName = "user_id", nullable = false,insertable = false,updatable = false) + UserModel getUserByUserId() { + return userByUserId + } + + void setUserByUserId(UserModel userByUserId) { + this.userByUserId = userByUserId + } + + @ManyToOne + @JoinColumn(name = "added_by", referencedColumnName = "user_id", nullable = false,insertable = false,updatable = false) + UserModel getUserByAddedBy() { + return userByAddedBy + } + + void setUserByAddedBy(UserModel userByAddedBy) { + this.userByAddedBy = userByAddedBy + } +} diff --git a/api/src/main/groovy/com/assist/api/models/UserOrganisationMappingModelPK.groovy b/api/src/main/groovy/com/assist/api/models/UserOrganisationMappingModelPK.groovy new file mode 100644 index 00000000..f05f4472 --- /dev/null +++ b/api/src/main/groovy/com/assist/api/models/UserOrganisationMappingModelPK.groovy @@ -0,0 +1,51 @@ +package com.assist.api.models + +import javax.persistence.Column +import javax.persistence.Id +import java.io.Serializable + +class UserOrganisationMappingModelPK implements Serializable { + private Long organisationId + private Long userId + + @Column(name = "organisation_id", nullable = false) + @Id + Long getOrganisationId() { + return organisationId + } + + void setOrganisationId(Long organisationId) { + this.organisationId = organisationId + } + + @Column(name = "user_id", nullable = false) + @Id + Long getUserId() { + return userId + } + + void setUserId(Long userId) { + this.userId = userId + } + + @Override + boolean equals(Object o) { + if (this == o) return true + if (o == null || getClass() != o.getClass()) return false + + UserOrganisationMappingModelPK that = (UserOrganisationMappingModelPK) o + + if (organisationId != null ? !organisationId.equals(that.organisationId) : that.organisationId != null) + return false + if (userId != null ? !userId.equals(that.userId) : that.userId != null) return false + + return true + } + + @Override + int hashCode() { + int result = organisationId != null ? organisationId.hashCode() : 0 + result = 31 * result + (userId != null ? userId.hashCode() : 0) + return result + } +} diff --git a/api/src/main/groovy/com/assist/api/pogo/dto/ActionDto.groovy b/api/src/main/groovy/com/assist/api/pogo/dto/ActionDto.groovy new file mode 100644 index 00000000..2393517d --- /dev/null +++ b/api/src/main/groovy/com/assist/api/pogo/dto/ActionDto.groovy @@ -0,0 +1,133 @@ +package com.assist.api.pogo.dto + +import com.assist.api.cache.LocationsCache +import com.assist.api.models.ActionsModel + +class ActionDto { + + private Long actionId + private String actionType + private String description + private String itemName + private Long itemQuantity + private Boolean fulfilled + private Double latitude + private Double longitude + private UserDto postedByUser + private OrganisationDto postedByOrganisation + private LocationDto location + private FilesDto file + + ActionDto(ActionsModel actionsModel){ + if(actionsModel){ + actionId = actionsModel.actionId + actionType = actionsModel.actionType + description = actionsModel.description + itemName = actionsModel.itemName + itemQuantity = actionsModel.itemQuantity + fulfilled = actionsModel.fulfilled + latitude = actionsModel.latitude + longitude = actionsModel.longitude + postedByUser = actionsModel.userByPostedByUser ? new UserDto(actionsModel.userByPostedByUser) : null + postedByOrganisation = actionsModel.organisationByPostedByOrganisation ? new OrganisationDto(actionsModel.organisationByPostedByOrganisation) : null + location = actionsModel.locationId ? LocationsCache.getLocationById(actionsModel.locationId) : null + file = actionsModel.filesByFileId ? new FilesDto(actionsModel.filesByFileId) : null + } + } + + Long getActionId() { + return actionId + } + + void setActionId(Long actionId) { + this.actionId = actionId + } + + String getActionType() { + return actionType + } + + void setActionType(String actionType) { + this.actionType = actionType + } + + String getDescription() { + return description + } + + void setDescription(String description) { + this.description = description + } + + String getItemName() { + return itemName + } + + void setItemName(String itemName) { + this.itemName = itemName + } + + Long getItemQuantity() { + return itemQuantity + } + + void setItemQuantity(Long itemQuantity) { + this.itemQuantity = itemQuantity + } + + Boolean getFulfilled() { + return fulfilled + } + + void setFulfilled(Boolean fulfilled) { + this.fulfilled = fulfilled + } + + Double getLatitude() { + return latitude + } + + void setLatitude(Double latitude) { + this.latitude = latitude + } + + Double getLongitude() { + return longitude + } + + void setLongitude(Double longitude) { + this.longitude = longitude + } + + UserDto getPostedByUser() { + return postedByUser + } + + void setPostedByUser(UserDto postedByUser) { + this.postedByUser = postedByUser + } + + OrganisationDto getPostedByOrganisation() { + return postedByOrganisation + } + + void setPostedByOrganisation(OrganisationDto postedByOrganisation) { + this.postedByOrganisation = postedByOrganisation + } + + LocationDto getLocation() { + return location + } + + void setLocation(LocationDto location) { + this.location = location + } + + FilesDto getFile() { + return file + } + + void setFile(FilesDto file) { + this.file = file + } +} diff --git a/api/src/main/groovy/com/assist/api/pogo/dto/FilesDto.groovy b/api/src/main/groovy/com/assist/api/pogo/dto/FilesDto.groovy new file mode 100644 index 00000000..a761a2de --- /dev/null +++ b/api/src/main/groovy/com/assist/api/pogo/dto/FilesDto.groovy @@ -0,0 +1,32 @@ +package com.assist.api.pogo.dto + +import com.assist.api.models.FilesModel + +class FilesDto { + + private Long fileId + private String fileName + + FilesDto(FilesModel filesModel) { + if(filesModel){ + fileId = filesModel.fileId + fileName = filesModel.fileName + } + } + + Long getFileId() { + return fileId + } + + void setFileId(Long fileId) { + this.fileId = fileId + } + + String getFileName() { + return fileName + } + + void setFileName(String fileName) { + this.fileName = fileName + } +} diff --git a/api/src/main/groovy/com/assist/api/pogo/dto/LocationDto.groovy b/api/src/main/groovy/com/assist/api/pogo/dto/LocationDto.groovy new file mode 100644 index 00000000..c26c7065 --- /dev/null +++ b/api/src/main/groovy/com/assist/api/pogo/dto/LocationDto.groovy @@ -0,0 +1,53 @@ +package com.assist.api.pogo.dto + +import com.assist.api.models.LocationsModel + +class LocationDto { + + private Long locationId + private String locationName + private Double latitude + private Double longitude + + LocationDto(LocationsModel locationsModel) { + if(locationsModel){ + locationId = locationsModel.locationId + locationName = locationsModel.locationName + latitude = locationsModel.latitude + longitude = locationsModel.longitude + } + + } + + Long getLocationId() { + return locationId + } + + void setLocationId(Long locationId) { + this.locationId = locationId + } + + String getLocationName() { + return locationName + } + + void setLocationName(String locationName) { + this.locationName = locationName + } + + Double getLatitude() { + return latitude + } + + void setLatitude(Double latitude) { + this.latitude = latitude + } + + Double getLongitude() { + return longitude + } + + void setLongitude(Double longitude) { + this.longitude = longitude + } +} diff --git a/api/src/main/groovy/com/assist/api/pogo/dto/OrganisationDetailsDto.groovy b/api/src/main/groovy/com/assist/api/pogo/dto/OrganisationDetailsDto.groovy new file mode 100644 index 00000000..83308809 --- /dev/null +++ b/api/src/main/groovy/com/assist/api/pogo/dto/OrganisationDetailsDto.groovy @@ -0,0 +1,92 @@ +package com.assist.api.pogo.dto + +import com.assist.api.models.OrganisationModel + +class OrganisationDetailsDto { + + private Long organisationId + private String name + private String url + private Date createdOn + private String description + private LocationDto location + private UserDto createdBy + private List mappedUsers + + OrganisationDetailsDto(OrganisationModel organisationModel) { + if(organisationModel){ + organisationId = organisationModel.organisationId + name = organisationModel.name + url = organisationModel.url + createdOn = organisationModel.createdOn + description = organisationModel.description + location = new LocationDto(organisationModel.locationsByLocationId) + createdBy = new UserDto(organisationModel.userByCreatedBy) + mappedUsers = organisationModel.userOrganisationMappingsByOrganisationId.collect {new UserDto(it.userByUserId)} + } + } + + Long getOrganisationId() { + return organisationId + } + + void setOrganisationId(Long organisationId) { + this.organisationId = organisationId + } + + String getName() { + return name + } + + void setName(String name) { + this.name = name + } + + String getUrl() { + return url + } + + void setUrl(String url) { + this.url = url + } + + Date getCreatedOn() { + return createdOn + } + + void setCreatedOn(Date createdOn) { + this.createdOn = createdOn + } + + String getDescription() { + return description + } + + void setDescription(String description) { + this.description = description + } + + LocationDto getLocation() { + return location + } + + void setLocation(LocationDto location) { + this.location = location + } + + UserDto getCreatedBy() { + return createdBy + } + + void setCreatedBy(UserDto createdBy) { + this.createdBy = createdBy + } + + List getMappedUsers() { + return mappedUsers + } + + void setMappedUsers(List mappedUsers) { + this.mappedUsers = mappedUsers + } +} diff --git a/api/src/main/groovy/com/assist/api/pogo/dto/OrganisationDto.groovy b/api/src/main/groovy/com/assist/api/pogo/dto/OrganisationDto.groovy new file mode 100644 index 00000000..fd976292 --- /dev/null +++ b/api/src/main/groovy/com/assist/api/pogo/dto/OrganisationDto.groovy @@ -0,0 +1,63 @@ +package com.assist.api.pogo.dto + +import com.assist.api.cache.LocationsCache +import com.assist.api.models.OrganisationModel + +class OrganisationDto { + + private Long organisationId + private String name + private String url + private String locationName + private String description + + OrganisationDto(OrganisationModel organisationModel) { + if(organisationModel){ + organisationId = organisationModel.organisationId + name = organisationModel.name + url = organisationModel.url + locationName = LocationsCache.getLocationById(organisationModel.locationId).locationName + description = organisationModel.description + } + } + + Long getOrganisationId() { + return organisationId + } + + void setOrganisationId(Long organisationId) { + this.organisationId = organisationId + } + + String getName() { + return name + } + + void setName(String name) { + this.name = name + } + + String getUrl() { + return url + } + + void setUrl(String url) { + this.url = url + } + + String getLocationName() { + return locationName + } + + void setLocationName(String locationName) { + this.locationName = locationName + } + + String getDescription() { + return description + } + + void setDescription(String description) { + this.description = description + } +} diff --git a/api/src/main/groovy/com/assist/api/pogo/dto/StorageCentreDto.groovy b/api/src/main/groovy/com/assist/api/pogo/dto/StorageCentreDto.groovy new file mode 100644 index 00000000..fc1056f7 --- /dev/null +++ b/api/src/main/groovy/com/assist/api/pogo/dto/StorageCentreDto.groovy @@ -0,0 +1,85 @@ +package com.assist.api.pogo.dto + +import com.assist.api.cache.LocationsCache +import com.assist.api.models.StorageCentreModel + +class StorageCentreDto { + + private Long centreId + private String centreName + private LocationDto location + private Double latitude + private Double longitude + private UserDto createdBy + private Date createdOn + private List inventoryDtoList + + StorageCentreDto(StorageCentreModel storageCentreModel) { + if(storageCentreModel){ + centreId = storageCentreModel.centreId + centreName = storageCentreModel.centreName + location = LocationsCache.getLocationById(storageCentreModel.locationId) + latitude = storageCentreModel.latitude + longitude = storageCentreModel.longitude + createdBy = new UserDto(storageCentreModel.usersByCreatedBy) + createdOn = storageCentreModel.createdOn + inventoryDtoList = storageCentreModel.storagesByCentreId.collect{new StorageInventoryDto(it)} + } + } + + Long getCentreId() { + return centreId + } + + void setCentreId(Long centreId) { + this.centreId = centreId + } + + String getCentreName() { + return centreName + } + + void setCentreName(String centreName) { + this.centreName = centreName + } + + LocationDto getLocation() { + return location + } + + void setLocation(LocationDto location) { + this.location = location + } + + Double getLatitude() { + return latitude + } + + void setLatitude(Double latitude) { + this.latitude = latitude + } + + Double getLongitude() { + return longitude + } + + void setLongitude(Double longitude) { + this.longitude = longitude + } + + UserDto getCreatedBy() { + return createdBy + } + + void setCreatedBy(UserDto createdBy) { + this.createdBy = createdBy + } + + Date getCreatedOn() { + return createdOn + } + + void setCreatedOn(Date createdOn) { + this.createdOn = createdOn + } +} diff --git a/api/src/main/groovy/com/assist/api/pogo/dto/StorageInventoryDto.groovy b/api/src/main/groovy/com/assist/api/pogo/dto/StorageInventoryDto.groovy new file mode 100644 index 00000000..b50e119b --- /dev/null +++ b/api/src/main/groovy/com/assist/api/pogo/dto/StorageInventoryDto.groovy @@ -0,0 +1,50 @@ +package com.assist.api.pogo.dto + +import com.assist.api.models.StorageItemModel + +class StorageInventoryDto { + + private Long storageId + private Long centreId + private String itemName + private Integer itemQuantity + + StorageInventoryDto(StorageItemModel storageItemModel) { + storageId = storageItemModel.storageId + centreId = storageItemModel.centreId + itemName = storageItemModel.itemName + itemQuantity = storageItemModel.itemQuantity + } + + Long getStorageId() { + return storageId + } + + void setStorageId(Long storageId) { + this.storageId = storageId + } + + Long getCentreId() { + return centreId + } + + void setCentreId(Long centreId) { + this.centreId = centreId + } + + String getItemName() { + return itemName + } + + void setItemName(String itemName) { + this.itemName = itemName + } + + Integer getItemQuantity() { + return itemQuantity + } + + void setItemQuantity(Integer itemQuantity) { + this.itemQuantity = itemQuantity + } +} diff --git a/api/src/main/groovy/com/assist/api/pogo/dto/UserDto.groovy b/api/src/main/groovy/com/assist/api/pogo/dto/UserDto.groovy new file mode 100644 index 00000000..e93e3b9c --- /dev/null +++ b/api/src/main/groovy/com/assist/api/pogo/dto/UserDto.groovy @@ -0,0 +1,52 @@ +package com.assist.api.pogo.dto + +import com.assist.api.models.UserModel + +class UserDto { + + private Long userId + private String name + private String mobile + private String email + + UserDto(UserModel userModel) { + if(userModel){ + userId = userModel.userId + name = userModel.name + mobile = userModel.mobile + email = userModel.email + } + } + + Long getUserId() { + return userId + } + + void setUserId(Long userId) { + this.userId = userId + } + + String getName() { + return name + } + + void setName(String name) { + this.name = name + } + + String getMobile() { + return mobile + } + + void setMobile(String mobile) { + this.mobile = mobile + } + + String getEmail() { + return email + } + + void setEmail(String email) { + this.email = email + } +} diff --git a/api/src/main/groovy/com/assist/api/pogo/enums/ActionType.groovy b/api/src/main/groovy/com/assist/api/pogo/enums/ActionType.groovy new file mode 100644 index 00000000..571edd5a --- /dev/null +++ b/api/src/main/groovy/com/assist/api/pogo/enums/ActionType.groovy @@ -0,0 +1,9 @@ +package com.assist.api.pogo.enums + +enum ActionType { + + NEED_HELP, + WANT_TO_HELP, + RESOURCES_AVAILABLE + +} diff --git a/api/src/main/groovy/com/assist/api/pogo/request/ActionSaveRequest.groovy b/api/src/main/groovy/com/assist/api/pogo/request/ActionSaveRequest.groovy new file mode 100644 index 00000000..da6e6328 --- /dev/null +++ b/api/src/main/groovy/com/assist/api/pogo/request/ActionSaveRequest.groovy @@ -0,0 +1,113 @@ +package com.assist.api.pogo.request + +class ActionSaveRequest { + + private Long actionId + private String actionType + private String description + private String itemName + private Long itemQuantity + private Long postedByUser + private Long postedByOrganisation + private boolean fulfilled + private Long locationId + private Double latitude + private Double longitude + private Long fileId + + Long getActionId() { + return actionId + } + + void setActionId(Long actionId) { + this.actionId = actionId + } + + String getActionType() { + return actionType + } + + void setActionType(String actionType) { + this.actionType = actionType + } + + String getDescription() { + return description + } + + void setDescription(String description) { + this.description = description + } + + String getItemName() { + return itemName + } + + void setItemName(String itemName) { + this.itemName = itemName + } + + Long getItemQuantity() { + return itemQuantity + } + + void setItemQuantity(Long itemQuantity) { + this.itemQuantity = itemQuantity + } + + Long getPostedByUser() { + return postedByUser + } + + void setPostedByUser(Long postedByUser) { + this.postedByUser = postedByUser + } + + Long getPostedByOrganisation() { + return postedByOrganisation + } + + void setPostedByOrganisation(Long postedByOrganisation) { + this.postedByOrganisation = postedByOrganisation + } + + boolean getFulfilled() { + return fulfilled + } + + void setFulfilled(boolean fulfilled) { + this.fulfilled = fulfilled + } + + Long getLocationId() { + return locationId + } + + void setLocationId(Long locationId) { + this.locationId = locationId + } + + Double getLatitude() { + return latitude + } + + void setLatitude(Double latitude) { + this.latitude = latitude + } + + Double getLongitude() { + return longitude + } + + void setLongitude(Double longitude) { + this.longitude = longitude + } + + Long getFileId() { + return fileId + } + + void setFileId(Long fileId) { + this.fileId = fileId + } +} diff --git a/api/src/main/groovy/com/assist/api/pogo/request/LoginRequest.groovy b/api/src/main/groovy/com/assist/api/pogo/request/LoginRequest.groovy new file mode 100644 index 00000000..a2db4718 --- /dev/null +++ b/api/src/main/groovy/com/assist/api/pogo/request/LoginRequest.groovy @@ -0,0 +1,23 @@ +package com.assist.api.pogo.request + +class LoginRequest { + + private String userIdentifier + private String password + + String getUserIdentifier() { + return userIdentifier + } + + void setUserIdentifier(String userIdentifier) { + this.userIdentifier = userIdentifier + } + + String getPassword() { + return password + } + + void setPassword(String password) { + this.password = password + } +} diff --git a/api/src/main/groovy/com/assist/api/pogo/request/OrganisationSaveRequest.groovy b/api/src/main/groovy/com/assist/api/pogo/request/OrganisationSaveRequest.groovy new file mode 100644 index 00000000..277b750b --- /dev/null +++ b/api/src/main/groovy/com/assist/api/pogo/request/OrganisationSaveRequest.groovy @@ -0,0 +1,50 @@ +package com.assist.api.pogo.request + +class OrganisationSaveRequest { + + private Long organisationId + private String name + private String url + private Long locationId + private String description + + Long getOrganisationId() { + return organisationId + } + + void setOrganisationId(Long organisationId) { + this.organisationId = organisationId + } + + String getName() { + return name + } + + void setName(String name) { + this.name = name + } + + String getUrl() { + return url + } + + void setUrl(String url) { + this.url = url + } + + Long getLocationId() { + return locationId + } + + void setLocationId(Long locationId) { + this.locationId = locationId + } + + String getDescription() { + return description + } + + void setDescription(String description) { + this.description = description + } +} diff --git a/api/src/main/groovy/com/assist/api/pogo/request/StorageCentreSaveRequest.groovy b/api/src/main/groovy/com/assist/api/pogo/request/StorageCentreSaveRequest.groovy new file mode 100644 index 00000000..d6d88ba7 --- /dev/null +++ b/api/src/main/groovy/com/assist/api/pogo/request/StorageCentreSaveRequest.groovy @@ -0,0 +1,59 @@ +package com.assist.api.pogo.request + +class StorageCentreSaveRequest { + + private Long centreId + private String centreName + private Integer locationId + private Double latitude + private Double longitude + private Long createdBy + + Long getCentreId() { + return centreId + } + + void setCentreId(Long centreId) { + this.centreId = centreId + } + + String getCentreName() { + return centreName + } + + void setCentreName(String centreName) { + this.centreName = centreName + } + + Integer getLocationId() { + return locationId + } + + void setLocationId(Integer locationId) { + this.locationId = locationId + } + + Double getLatitude() { + return latitude + } + + void setLatitude(Double latitude) { + this.latitude = latitude + } + + Double getLongitude() { + return longitude + } + + void setLongitude(Double longitude) { + this.longitude = longitude + } + + Long getCreatedBy() { + return createdBy + } + + void setCreatedBy(Long createdBy) { + this.createdBy = createdBy + } +} diff --git a/api/src/main/groovy/com/assist/api/pogo/request/StorageInventoryUpdationRequest.groovy b/api/src/main/groovy/com/assist/api/pogo/request/StorageInventoryUpdationRequest.groovy new file mode 100644 index 00000000..82362947 --- /dev/null +++ b/api/src/main/groovy/com/assist/api/pogo/request/StorageInventoryUpdationRequest.groovy @@ -0,0 +1,41 @@ +package com.assist.api.pogo.request + +class StorageInventoryUpdationRequest { + + private Long storageId + private Long centreId + private String itemName + private Integer itemQuantity + + Long getStorageId() { + return storageId + } + + void setStorageId(Long storageId) { + this.storageId = storageId + } + + Long getCentreId() { + return centreId + } + + void setCentreId(Long centreId) { + this.centreId = centreId + } + + String getItemName() { + return itemName + } + + void setItemName(String itemName) { + this.itemName = itemName + } + + Integer getItemQuantity() { + return itemQuantity + } + + void setItemQuantity(Integer itemQuantity) { + this.itemQuantity = itemQuantity + } +} diff --git a/api/src/main/groovy/com/assist/api/pogo/request/UserRegistrationRequest.groovy b/api/src/main/groovy/com/assist/api/pogo/request/UserRegistrationRequest.groovy new file mode 100644 index 00000000..2a24da9d --- /dev/null +++ b/api/src/main/groovy/com/assist/api/pogo/request/UserRegistrationRequest.groovy @@ -0,0 +1,41 @@ +package com.assist.api.pogo.request + +class UserRegistrationRequest { + + private String email + private String mobile + private String password + private String name + + String getEmail() { + return email + } + + void setEmail(String email) { + this.email = email + } + + String getMobile() { + return mobile + } + + void setMobile(String mobile) { + this.mobile = mobile + } + + String getPassword() { + return password + } + + void setPassword(String password) { + this.password = password + } + + String getName() { + return name + } + + void setName(String name) { + this.name = name + } +} diff --git a/api/src/main/groovy/com/assist/api/pogo/response/GenericResponse.groovy b/api/src/main/groovy/com/assist/api/pogo/response/GenericResponse.groovy new file mode 100644 index 00000000..f1d086b9 --- /dev/null +++ b/api/src/main/groovy/com/assist/api/pogo/response/GenericResponse.groovy @@ -0,0 +1,32 @@ +package com.assist.api.pogo.response + +class GenericResponse { + + private String message + private boolean status + private Object responseObject + + String getMessage() { + return message + } + + void setMessage(String message) { + this.message = message + } + + boolean getStatus() { + return status + } + + void setStatus(boolean status) { + this.status = status + } + + Object getResponseObject() { + return responseObject + } + + void setResponseObject(Object responseObject) { + this.responseObject = responseObject + } +} diff --git a/api/src/main/groovy/com/assist/api/repositories/ActionedByRepository.groovy b/api/src/main/groovy/com/assist/api/repositories/ActionedByRepository.groovy new file mode 100644 index 00000000..8042db93 --- /dev/null +++ b/api/src/main/groovy/com/assist/api/repositories/ActionedByRepository.groovy @@ -0,0 +1,9 @@ +package com.assist.api.repositories + +import com.assist.api.models.ActionedByModel +import com.assist.api.models.ActionedByModelPK +import org.springframework.data.jpa.repository.JpaRepository + +interface ActionedByRepository extends JpaRepository{ + +} \ No newline at end of file diff --git a/api/src/main/groovy/com/assist/api/repositories/ActionsRepository.groovy b/api/src/main/groovy/com/assist/api/repositories/ActionsRepository.groovy new file mode 100644 index 00000000..3632f6cc --- /dev/null +++ b/api/src/main/groovy/com/assist/api/repositories/ActionsRepository.groovy @@ -0,0 +1,11 @@ +package com.assist.api.repositories + +import com.assist.api.models.ActionsModel +import org.springframework.data.domain.Pageable +import org.springframework.data.repository.PagingAndSortingRepository + +interface ActionsRepository extends PagingAndSortingRepository { + + List findByActionTypeAndLocationIdAndCreatedOnBetween(String actionType, Long locationId, Date startDate, Date endDate, Pageable pageable) + List findByPostedByUserAndActionTypeAndLocationIdAndCreatedOnBetween(Long userId,String actionType, Long locationId, Date startDate, Date endDate, Pageable pageable) +} \ No newline at end of file diff --git a/api/src/main/groovy/com/assist/api/repositories/FilesRepository.groovy b/api/src/main/groovy/com/assist/api/repositories/FilesRepository.groovy new file mode 100644 index 00000000..ac075d62 --- /dev/null +++ b/api/src/main/groovy/com/assist/api/repositories/FilesRepository.groovy @@ -0,0 +1,7 @@ +package com.assist.api.repositories + +import com.assist.api.models.FilesModel +import org.springframework.data.jpa.repository.JpaRepository + +interface FilesRepository extends JpaRepository{ +} diff --git a/api/src/main/groovy/com/assist/api/repositories/LocationsRepository.groovy b/api/src/main/groovy/com/assist/api/repositories/LocationsRepository.groovy new file mode 100644 index 00000000..90d2e38a --- /dev/null +++ b/api/src/main/groovy/com/assist/api/repositories/LocationsRepository.groovy @@ -0,0 +1,7 @@ +package com.assist.api.repositories + +import com.assist.api.models.LocationsModel +import org.springframework.data.jpa.repository.JpaRepository + +interface LocationsRepository extends JpaRepository{ +} diff --git a/api/src/main/groovy/com/assist/api/repositories/OrganisationsRepository.groovy b/api/src/main/groovy/com/assist/api/repositories/OrganisationsRepository.groovy new file mode 100644 index 00000000..9547446a --- /dev/null +++ b/api/src/main/groovy/com/assist/api/repositories/OrganisationsRepository.groovy @@ -0,0 +1,9 @@ +package com.assist.api.repositories + +import com.assist.api.models.OrganisationModel +import org.springframework.data.jpa.repository.JpaRepository + +interface OrganisationsRepository extends JpaRepository{ + + List findByLocationId(Long locationId) +} \ No newline at end of file diff --git a/api/src/main/groovy/com/assist/api/repositories/StorageCentreRepository.groovy b/api/src/main/groovy/com/assist/api/repositories/StorageCentreRepository.groovy new file mode 100644 index 00000000..188bab44 --- /dev/null +++ b/api/src/main/groovy/com/assist/api/repositories/StorageCentreRepository.groovy @@ -0,0 +1,11 @@ +package com.assist.api.repositories + +import com.assist.api.models.StorageCentreModel +import org.springframework.data.jpa.repository.JpaRepository + +interface StorageCentreRepository extends JpaRepository{ + + List findByLocationId(long locationId) + + +} \ No newline at end of file diff --git a/api/src/main/groovy/com/assist/api/repositories/StorageItemRepository.groovy b/api/src/main/groovy/com/assist/api/repositories/StorageItemRepository.groovy new file mode 100644 index 00000000..9e92cef9 --- /dev/null +++ b/api/src/main/groovy/com/assist/api/repositories/StorageItemRepository.groovy @@ -0,0 +1,10 @@ +package com.assist.api.repositories + +import com.assist.api.models.StorageItemModel +import org.springframework.data.jpa.repository.JpaRepository + +interface StorageItemRepository extends JpaRepository{ + + StorageItemModel findByItemNameAndCentreId(String itemName, Long centreId) + List findByCentreId(Long centreId) +} diff --git a/api/src/main/groovy/com/assist/api/repositories/UserOrganisationMappingRepository.groovy b/api/src/main/groovy/com/assist/api/repositories/UserOrganisationMappingRepository.groovy new file mode 100644 index 00000000..71e34538 --- /dev/null +++ b/api/src/main/groovy/com/assist/api/repositories/UserOrganisationMappingRepository.groovy @@ -0,0 +1,8 @@ +package com.assist.api.repositories + +import com.assist.api.models.UserOrganisationMappingModel +import com.assist.api.models.UserOrganisationMappingModelPK +import org.springframework.data.jpa.repository.JpaRepository + +interface UserOrganisationMappingRepository extends JpaRepository{ +} diff --git a/api/src/main/groovy/com/assist/api/repositories/UserRepository.groovy b/api/src/main/groovy/com/assist/api/repositories/UserRepository.groovy new file mode 100644 index 00000000..739cfa7b --- /dev/null +++ b/api/src/main/groovy/com/assist/api/repositories/UserRepository.groovy @@ -0,0 +1,10 @@ +package com.assist.api.repositories + +import com.assist.api.models.UserModel +import org.springframework.data.jpa.repository.JpaRepository + +interface UserRepository extends JpaRepository{ + + Optional findByEmail(String email) + Optional findByMobile(String mobile) +} diff --git a/api/src/main/groovy/com/assist/api/security/CurrentUser.groovy b/api/src/main/groovy/com/assist/api/security/CurrentUser.groovy new file mode 100644 index 00000000..3a22d586 --- /dev/null +++ b/api/src/main/groovy/com/assist/api/security/CurrentUser.groovy @@ -0,0 +1,17 @@ +package com.assist.api.security + +import org.springframework.security.core.annotation.AuthenticationPrincipal + +import java.lang.annotation.Documented +import java.lang.annotation.ElementType +import java.lang.annotation.Retention +import java.lang.annotation.RetentionPolicy +import java.lang.annotation.Target + +@Target([ElementType.PARAMETER, ElementType.TYPE]) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@AuthenticationPrincipal +@interface CurrentUser { + +} \ No newline at end of file diff --git a/api/src/main/groovy/com/assist/api/security/CustomUserDetailsService.groovy b/api/src/main/groovy/com/assist/api/security/CustomUserDetailsService.groovy new file mode 100644 index 00000000..ba0b95c1 --- /dev/null +++ b/api/src/main/groovy/com/assist/api/security/CustomUserDetailsService.groovy @@ -0,0 +1,33 @@ +package com.assist.api.security + +import com.assist.api.models.UserModel +import com.assist.api.services.UserService +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.security.core.userdetails.UserDetails +import org.springframework.security.core.userdetails.UserDetailsService +import org.springframework.security.core.userdetails.UsernameNotFoundException +import org.springframework.stereotype.Service + +@Service +class CustomUserDetailsService implements UserDetailsService{ + + @Autowired + UserService userService + + @Override + UserDetails loadUserByUsername(String userIdentifier) throws UsernameNotFoundException { + UserModel userModel = userService.findUser(userIdentifier) + if(userModel){ + return new UserPrincipal(userModel) + } + return null + } + + UserDetails loadUserById(Long id) { + UserModel userModel = userService.findById(id) + if(userModel){ + return new UserPrincipal(userModel) + } + return null + } +} diff --git a/api/src/main/groovy/com/assist/api/security/RestAuthenticationEntryPoint.groovy b/api/src/main/groovy/com/assist/api/security/RestAuthenticationEntryPoint.groovy new file mode 100644 index 00000000..c07ab01d --- /dev/null +++ b/api/src/main/groovy/com/assist/api/security/RestAuthenticationEntryPoint.groovy @@ -0,0 +1,24 @@ +package com.assist.api.security + +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import org.springframework.security.core.AuthenticationException +import org.springframework.security.web.AuthenticationEntryPoint + +import javax.servlet.ServletException +import javax.servlet.http.HttpServletRequest +import javax.servlet.http.HttpServletResponse + +class RestAuthenticationEntryPoint implements AuthenticationEntryPoint { + + private static final Logger logger = LoggerFactory.getLogger(RestAuthenticationEntryPoint) + + @Override + void commence(HttpServletRequest httpServletRequest, + HttpServletResponse httpServletResponse, + AuthenticationException e) throws IOException, ServletException { + logger.error("Responding with unauthorized error. Message - {}", e.getMessage()) + httpServletResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED, + e.getLocalizedMessage()) + } +} diff --git a/api/src/main/groovy/com/assist/api/security/UserPrincipal.groovy b/api/src/main/groovy/com/assist/api/security/UserPrincipal.groovy new file mode 100644 index 00000000..2e18dae8 --- /dev/null +++ b/api/src/main/groovy/com/assist/api/security/UserPrincipal.groovy @@ -0,0 +1,65 @@ +package com.assist.api.security + +import com.assist.api.models.UserModel +import org.springframework.security.core.GrantedAuthority +import org.springframework.security.core.userdetails.UserDetails + +class UserPrincipal implements UserDetails { + + private Long userId + private String email + private String mobile + private String password + private List authorities + + UserPrincipal(UserModel userModel){ + userId = userModel.userId + email = userModel.email + mobile = userModel.mobile + password = userModel.password + authorities = userModel.userAuthoritiesByUserId + } + + Long getUserId() { + return userId + } + + void setUserId(Long userId) { + this.userId = userId + } + + @Override + Collection getAuthorities() { + return authorities + } + + @Override + String getPassword() { + return password + } + + @Override + String getUsername() { + return email ?: mobile + } + + @Override + boolean isAccountNonExpired() { + return true + } + + @Override + boolean isAccountNonLocked() { + return true + } + + @Override + boolean isCredentialsNonExpired() { + return true + } + + @Override + boolean isEnabled() { + return true + } +} diff --git a/api/src/main/groovy/com/assist/api/services/ActionService.groovy b/api/src/main/groovy/com/assist/api/services/ActionService.groovy new file mode 100644 index 00000000..8241615a --- /dev/null +++ b/api/src/main/groovy/com/assist/api/services/ActionService.groovy @@ -0,0 +1,44 @@ +package com.assist.api.services + +import com.assist.api.models.ActionsModel +import com.assist.api.repositories.ActionsRepository +import com.assist.api.util.ActionsUtil +import com.assist.api.util.DateUtils +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.data.domain.PageRequest +import org.springframework.data.domain.Pageable +import org.springframework.data.domain.Sort +import org.springframework.stereotype.Service + +@Service +class ActionService { + + @Autowired + private ActionsRepository actionsRepository + + ActionsModel save(ActionsModel actionsModel){ + if(actionsModel.actionId){ + // Updating an existing action + ActionsModel existingModel = findById(actionsModel.actionId) + return actionsRepository.save(ActionsUtil.merge(actionsModel,existingModel)) + }else{ + // Creating a new action + return actionsRepository.save(actionsModel) + } + } + + List fetch(long locationId,String actionType,int noOfDays,int pageNumber, + int noOfRecords,boolean displayForUserOnly,Long userId){ + Date startDate = new Date() + Date endDate = DateUtils.getDateBefore(noOfDays) + Pageable pageable = PageRequest.of(pageNumber,noOfRecords,Sort.by('actionId').descending()) + if(displayForUserOnly){ + return actionsRepository.findByPostedByUserAndActionTypeAndLocationIdAndCreatedOnBetween(userId,actionType,locationId,endDate,startDate,pageable) + } + return actionsRepository.findByActionTypeAndLocationIdAndCreatedOnBetween(actionType,locationId,endDate,startDate,pageable) + } + + ActionsModel findById(Long actionId){ + return actionsRepository.findById(actionId).orElse(null) + } +} diff --git a/api/src/main/groovy/com/assist/api/services/LocationService.groovy b/api/src/main/groovy/com/assist/api/services/LocationService.groovy new file mode 100644 index 00000000..0645d9ea --- /dev/null +++ b/api/src/main/groovy/com/assist/api/services/LocationService.groovy @@ -0,0 +1,17 @@ +package com.assist.api.services + +import com.assist.api.models.LocationsModel +import com.assist.api.repositories.LocationsRepository +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.stereotype.Service + +@Service +class LocationService { + + @Autowired + private LocationsRepository locationsRepository + + List getAllLocations(){ + locationsRepository.findAll() + } +} diff --git a/api/src/main/groovy/com/assist/api/services/OrganisationService.groovy b/api/src/main/groovy/com/assist/api/services/OrganisationService.groovy new file mode 100644 index 00000000..dff7ea08 --- /dev/null +++ b/api/src/main/groovy/com/assist/api/services/OrganisationService.groovy @@ -0,0 +1,35 @@ +package com.assist.api.services + +import com.assist.api.models.OrganisationModel +import com.assist.api.repositories.OrganisationsRepository +import com.assist.api.util.OrganisationUtils +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.stereotype.Service + +@Service +class OrganisationService { + + @Autowired + private OrganisationsRepository organisationsRepository + @Autowired + private UserOrganisationMappingService userOrganisationMappingService + + OrganisationModel save(OrganisationModel organisationModel){ + if(organisationModel.organisationId){ + OrganisationModel mergedModel = OrganisationUtils.merge(organisationModel,findById(organisationModel.organisationId)) + return organisationsRepository.save(mergedModel) + }else{ + OrganisationModel savedModel = organisationsRepository.save(organisationModel) + userOrganisationMappingService.addUser(savedModel.organisationId,organisationModel.createdBy,true,organisationModel.createdBy) + return savedModel + } + } + + OrganisationModel findById(Long organisationId){ + organisationsRepository.findById(organisationId).orElse(null) + } + + List findAllInLocation(Long locationId){ + organisationsRepository.findByLocationId(locationId) + } +} diff --git a/api/src/main/groovy/com/assist/api/services/StorageCentreService.groovy b/api/src/main/groovy/com/assist/api/services/StorageCentreService.groovy new file mode 100644 index 00000000..55c66307 --- /dev/null +++ b/api/src/main/groovy/com/assist/api/services/StorageCentreService.groovy @@ -0,0 +1,31 @@ +package com.assist.api.services + +import com.assist.api.models.StorageCentreModel +import com.assist.api.repositories.StorageCentreRepository +import com.assist.api.util.StorageCentreUtils +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.stereotype.Service + +@Service +class StorageCentreService { + + @Autowired + private StorageCentreRepository storageCentreRepository + + StorageCentreModel save(StorageCentreModel storageCentreModel){ + if(storageCentreModel.centreId){ + StorageCentreModel existingModel = findById(storageCentreModel.centreId) + return storageCentreRepository.save(StorageCentreUtils.merge(storageCentreModel,existingModel)) + }else{ + return storageCentreRepository.save(storageCentreModel) + } + } + + StorageCentreModel findById(long storageCentreId){ + storageCentreRepository.findById(storageCentreId).orElse(null) + } + + List findByLocation(long locationId){ + storageCentreRepository.findByLocationId(locationId) + } +} diff --git a/api/src/main/groovy/com/assist/api/services/StorageItemService.groovy b/api/src/main/groovy/com/assist/api/services/StorageItemService.groovy new file mode 100644 index 00000000..7c832a71 --- /dev/null +++ b/api/src/main/groovy/com/assist/api/services/StorageItemService.groovy @@ -0,0 +1,46 @@ +package com.assist.api.services + +import com.assist.api.models.StorageItemModel +import com.assist.api.repositories.StorageItemRepository +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.data.jpa.repository.Modifying +import org.springframework.stereotype.Service + +import javax.transaction.Transactional + +@Service +class StorageItemService { + + @Autowired + private StorageItemRepository storageItemRepository + + StorageItemModel save(StorageItemModel storageItemModel){ + StorageItemModel existingModel = findByItemName(storageItemModel.itemName,storageItemModel.centreId) + StorageItemModel updatedModel + if(existingModel){ + existingModel.itemQuantity = storageItemModel.itemQuantity + updatedModel = storageItemRepository.save(existingModel) + }else{ + updatedModel = storageItemRepository.save(storageItemModel) + } + if(updatedModel.itemQuantity == 0){ + delete(updatedModel.storageId) + } + return updatedModel + } + + StorageItemModel findByItemName(String itemName,Long centreId){ + return storageItemRepository.findByItemNameAndCentreId(itemName,centreId) + } + + List getDetails(Long centreId){ + return storageItemRepository.findByCentreId(centreId) + } + + @Transactional + @Modifying + void delete(Long storageId){ + storageItemRepository.deleteById(storageId) + } + +} diff --git a/api/src/main/groovy/com/assist/api/services/TokenProvider.groovy b/api/src/main/groovy/com/assist/api/services/TokenProvider.groovy new file mode 100644 index 00000000..c7207f71 --- /dev/null +++ b/api/src/main/groovy/com/assist/api/services/TokenProvider.groovy @@ -0,0 +1,56 @@ +package com.assist.api.services + +import io.jsonwebtoken.* +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import org.springframework.beans.factory.annotation.Value +import org.springframework.stereotype.Service + +@Service +class TokenProvider { + private static final Logger logger = LoggerFactory.getLogger(TokenProvider) + + @Value('${app.auth.tokenSecret}') + private String tokenSecret + @Value('${app.auth.tokenExpirationMsec}') + private long tokenExpirationMsec + + String createToken(Long userId) { + Date now = new Date() + Date expiryDate = new Date(now.getTime() + tokenExpirationMsec) + + return Jwts.builder() + .setSubject(Long.toString(userId)) + .setIssuedAt(new Date()) + .setExpiration(expiryDate) + .signWith(SignatureAlgorithm.HS512, tokenSecret) + .compact() + } + + Long getUserIdFromToken(String token) { + Claims claims = Jwts.parser() + .setSigningKey(tokenSecret) + .parseClaimsJws(token) + .getBody() + + return Long.parseLong(claims.getSubject()) + } + + boolean validateToken(String authToken) { + try { + Jwts.parser().setSigningKey(tokenSecret).parseClaimsJws(authToken) + return true + } catch (SignatureException se) { + logger.error("Invalid JWT signature",se) + } catch (MalformedJwtException mje) { + logger.error("Invalid JWT token",mje) + } catch (ExpiredJwtException ejw) { + logger.error("Expired JWT token",ejw) + } catch (UnsupportedJwtException uje) { + logger.error("Unsupported JWT token",uje) + } catch (IllegalArgumentException iae) { + logger.error("JWT claims string is empty",iae) + } + return false + } +} diff --git a/api/src/main/groovy/com/assist/api/services/UserOrganisationMappingService.groovy b/api/src/main/groovy/com/assist/api/services/UserOrganisationMappingService.groovy new file mode 100644 index 00000000..4a536252 --- /dev/null +++ b/api/src/main/groovy/com/assist/api/services/UserOrganisationMappingService.groovy @@ -0,0 +1,40 @@ +package com.assist.api.services + +import com.assist.api.models.UserModel +import com.assist.api.models.UserOrganisationMappingModel +import com.assist.api.models.UserOrganisationMappingModelPK +import com.assist.api.repositories.UserOrganisationMappingRepository +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.stereotype.Service + +@Service +class UserOrganisationMappingService { + + @Autowired + private UserOrganisationMappingRepository userOrganisationMappingRepository + @Autowired + private UserService userService + + void addUser(long orgId,long userId,boolean isAdmin,long addedBy){ + UserOrganisationMappingModel userOrganisationMappingModel = new UserOrganisationMappingModel( + organisationId : orgId, + userId : userId, + isAdmin : isAdmin, + addedBy : addedBy + ) + userOrganisationMappingRepository.save(userOrganisationMappingModel) + } + + void addUser(String userIdentifier,long orgId,boolean isAdmin,long addedBy){ + UserModel userModel = userService.findUser(userIdentifier) + if(userModel){ + if(userOrganisationMappingRepository.findById(new UserOrganisationMappingModelPK(organisationId:orgId,userId:userModel.userId))){ + throw new Exception('User is already mapped to the organisation') + } + addUser(orgId,userModel.userId,isAdmin,addedBy) + }else { + throw new Exception('No user found') + } + } + +} diff --git a/api/src/main/groovy/com/assist/api/services/UserService.groovy b/api/src/main/groovy/com/assist/api/services/UserService.groovy new file mode 100644 index 00000000..8e234396 --- /dev/null +++ b/api/src/main/groovy/com/assist/api/services/UserService.groovy @@ -0,0 +1,50 @@ +package com.assist.api.services + +import com.assist.api.models.UserModel +import com.assist.api.repositories.UserRepository +import com.assist.api.util.Utils +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.security.crypto.password.PasswordEncoder +import org.springframework.stereotype.Service + +@Service +class UserService { + + @Autowired + private UserRepository userRepository + @Autowired + private PasswordEncoder passwordEncoder + + UserModel findUser(String identifier){ + if(Utils.isMobile(identifier)){ + return userRepository.findByMobile(identifier).orElse(null) + }else if(Utils.isEmail(identifier)){ + return userRepository.findByEmail(identifier).orElse(null) + }else{ + return null + } + } + + UserModel authenticateUser(String identifier,String password){ + UserModel userModel = findUser(identifier) + passwordEncoder.matches(password,userModel.password) ? userModel : null + } + + UserModel findUserByEmailOrMobile(String email,String mobile){ + UserModel userModel = userRepository.findByMobile(mobile).orElse(null) + if(userModel){ + return userModel + }else{ + return userRepository.findByEmail(email).orElse(null) + } + } + + UserModel findById(Long id){ + return userRepository.findById(id).orElse(null) + } + + UserModel save(UserModel userModel){ + userModel.password = passwordEncoder.encode(userModel.password) + userRepository.save(userModel) + } +} diff --git a/api/src/main/groovy/com/assist/api/util/ActionsUtil.groovy b/api/src/main/groovy/com/assist/api/util/ActionsUtil.groovy new file mode 100644 index 00000000..aaf9e94a --- /dev/null +++ b/api/src/main/groovy/com/assist/api/util/ActionsUtil.groovy @@ -0,0 +1,41 @@ +package com.assist.api.util + +import com.assist.api.models.ActionsModel +import com.assist.api.pogo.request.ActionSaveRequest + +class ActionsUtil { + + static ActionsModel convertToActionsModel(ActionSaveRequest actionSaveRequest){ + ActionsModel actionsModel = new ActionsModel() + actionsModel.actionId = actionSaveRequest.actionId + actionsModel.actionType = actionSaveRequest.actionType + actionsModel.description = actionSaveRequest.description + actionsModel.itemName = actionSaveRequest.itemName + actionsModel.itemQuantity = actionSaveRequest.itemQuantity + actionsModel.postedByUser = actionSaveRequest.postedByUser + actionsModel.postedByOrganisation = actionSaveRequest.postedByOrganisation + actionsModel.fulfilled = actionSaveRequest.fulfilled + actionsModel.locationId = actionSaveRequest.locationId + actionsModel.latitude = actionSaveRequest.latitude + actionsModel.longitude = actionSaveRequest.longitude + actionsModel.fileId = actionSaveRequest.fileId + return actionsModel + } + + static ActionsModel merge(ActionsModel newRequest,ActionsModel previousModel){ + ActionsModel actionsModel = new ActionsModel() + actionsModel.actionId = newRequest.actionId + actionsModel.actionType = newRequest.actionType ?: previousModel.actionType + actionsModel.description = newRequest.description ?: previousModel.description + actionsModel.itemName = newRequest.itemName ?: previousModel.itemName + actionsModel.itemQuantity = newRequest.itemQuantity ?: previousModel.itemQuantity + actionsModel.postedByUser = newRequest.postedByUser ?: previousModel.postedByUser + actionsModel.postedByOrganisation = newRequest.postedByOrganisation ?: previousModel.postedByOrganisation + actionsModel.fulfilled = newRequest.fulfilled != null ?: previousModel.fulfilled + actionsModel.locationId = newRequest.locationId ?: previousModel.locationId + actionsModel.latitude = newRequest.latitude ?: previousModel.latitude + actionsModel.longitude = newRequest.longitude ?: previousModel.longitude + actionsModel.fileId = newRequest.fileId ?: previousModel.fileId + return actionsModel + } +} diff --git a/api/src/main/groovy/com/assist/api/util/DateUtils.groovy b/api/src/main/groovy/com/assist/api/util/DateUtils.groovy new file mode 100644 index 00000000..56c38fcc --- /dev/null +++ b/api/src/main/groovy/com/assist/api/util/DateUtils.groovy @@ -0,0 +1,13 @@ +package com.assist.api.util + +import java.time.LocalDate +import java.time.ZoneId + +class DateUtils { + + static Date getDateBefore(int noOfDays){ + LocalDate date = LocalDate.now().minusDays(noOfDays) + ZoneId defaultZoneId = ZoneId.systemDefault() + return Date.from(date.atStartOfDay(defaultZoneId).toInstant()) + } +} diff --git a/api/src/main/groovy/com/assist/api/util/OrganisationUtils.groovy b/api/src/main/groovy/com/assist/api/util/OrganisationUtils.groovy new file mode 100644 index 00000000..e0269ca5 --- /dev/null +++ b/api/src/main/groovy/com/assist/api/util/OrganisationUtils.groovy @@ -0,0 +1,34 @@ +package com.assist.api.util + +import com.assist.api.models.OrganisationModel +import com.assist.api.pogo.request.OrganisationSaveRequest + +class OrganisationUtils { + + static OrganisationModel create(OrganisationSaveRequest organisationSaveRequest,Long userId){ + OrganisationModel organisationModel = new OrganisationModel() + organisationModel.organisationId = organisationSaveRequest.organisationId + organisationModel.name = organisationSaveRequest.name + organisationModel.url = organisationSaveRequest.url + organisationModel.locationId = organisationSaveRequest.locationId + organisationModel.createdBy = userId + organisationModel.description = organisationSaveRequest.description + return organisationModel + } + + static OrganisationModel merge(OrganisationModel saveRequest,OrganisationModel existingModel){ + if(existingModel && saveRequest){ + OrganisationModel organisationModel = new OrganisationModel() + organisationModel.organisationId = saveRequest.organisationId + organisationModel.name = saveRequest.name ?: existingModel.name + organisationModel.url = saveRequest.url ?: existingModel.url + organisationModel.locationId = saveRequest.locationId ?: existingModel.locationId + organisationModel.description = saveRequest.description ?: existingModel.description + return organisationModel + }else if(existingModel){ + return existingModel + }else if(saveRequest){ + return saveRequest + } + } +} diff --git a/api/src/main/groovy/com/assist/api/util/StorageCentreUtils.groovy b/api/src/main/groovy/com/assist/api/util/StorageCentreUtils.groovy new file mode 100644 index 00000000..1f8a1eac --- /dev/null +++ b/api/src/main/groovy/com/assist/api/util/StorageCentreUtils.groovy @@ -0,0 +1,29 @@ +package com.assist.api.util + +import com.assist.api.models.StorageCentreModel +import com.assist.api.pogo.request.StorageCentreSaveRequest + +class StorageCentreUtils { + + static StorageCentreModel create(StorageCentreSaveRequest storageCentreSaveRequest,Long userId){ + StorageCentreModel storageCentreModel = new StorageCentreModel() + storageCentreModel.centreId = storageCentreSaveRequest.centreId + storageCentreModel.centreName = storageCentreSaveRequest.centreName + storageCentreModel.locationId = storageCentreSaveRequest.locationId + storageCentreModel.latitude = storageCentreSaveRequest.latitude + storageCentreModel.longitude = storageCentreSaveRequest.longitude + storageCentreModel.createdBy = userId + return storageCentreModel + } + + static StorageCentreModel merge(StorageCentreModel newModel,StorageCentreModel existingModel){ + StorageCentreModel storageCentreModel = new StorageCentreModel() + storageCentreModel.centreId = newModel.centreId + storageCentreModel.centreName = newModel.centreName ?: existingModel.centreName + storageCentreModel.locationId = newModel.locationId ?: existingModel.locationId + storageCentreModel.latitude = newModel.latitude ?: existingModel.locationId + storageCentreModel.longitude = newModel.longitude ?: existingModel.longitude + return storageCentreModel + } + +} diff --git a/api/src/main/groovy/com/assist/api/util/StorageItemUtil.groovy b/api/src/main/groovy/com/assist/api/util/StorageItemUtil.groovy new file mode 100644 index 00000000..1519a8f5 --- /dev/null +++ b/api/src/main/groovy/com/assist/api/util/StorageItemUtil.groovy @@ -0,0 +1,16 @@ +package com.assist.api.util + +import com.assist.api.models.StorageItemModel +import com.assist.api.pogo.request.StorageInventoryUpdationRequest + +class StorageItemUtil { + + static StorageItemModel convert(StorageInventoryUpdationRequest storageInventoryUpdationRequest){ + StorageItemModel storageItemModel = new StorageItemModel() + storageItemModel.storageId = storageInventoryUpdationRequest.storageId + storageItemModel.centreId = storageInventoryUpdationRequest.centreId + storageItemModel.itemName = storageInventoryUpdationRequest.itemName + storageItemModel.itemQuantity = storageInventoryUpdationRequest.itemQuantity + return storageItemModel + } +} diff --git a/api/src/main/groovy/com/assist/api/util/Utils.groovy b/api/src/main/groovy/com/assist/api/util/Utils.groovy new file mode 100644 index 00000000..8303ce17 --- /dev/null +++ b/api/src/main/groovy/com/assist/api/util/Utils.groovy @@ -0,0 +1,17 @@ +package com.assist.api.util + +class Utils { + + static boolean isEmail(String email){ + String pattern = "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}" + return email.matches(pattern) + } + + static boolean isMobile(String mobile){ + return (mobile.size() >= 10 && mobile.size() <=12) && mobile.isNumber() + } + + static boolean convertStringToBoolean(String booleanString){ + return booleanString && ( booleanString == 'TRUE' || booleanString == 'true') + } +} diff --git a/api/src/main/resources/application.properties b/api/src/main/resources/application.properties new file mode 100644 index 00000000..2cd4d227 --- /dev/null +++ b/api/src/main/resources/application.properties @@ -0,0 +1,12 @@ +jwt.enabled = true +jwt.dummyUserId = 2 + +spring.datasource.url = jdbc:mysql://localhost:3306/assist?useSSL=false +spring.datasource.username = root +spring.datasource.password = root +spring.jpa.show-sql=false + +app.auth.tokenSecret = 926D96C90030DD58429D2751AC1BDBBC +app.auth.tokenExpirationMsec = 864000000 + +actions.default.days=7 diff --git a/api/src/main/resources/db/chennai_locations.sql b/api/src/main/resources/db/chennai_locations.sql new file mode 100644 index 00000000..034404dd --- /dev/null +++ b/api/src/main/resources/db/chennai_locations.sql @@ -0,0 +1,50 @@ +insert into `locations` (location_name) values ('Adambakkam'); +insert into `locations` (location_name) values ('Adyar'); +insert into `locations` (location_name) values ('Alandur'); +insert into `locations` (location_name) values ('Anna Nagar'); +insert into `locations` (location_name) values ('Ashok Nagar'); +insert into `locations` (location_name) values ('Ayanavaram'); +insert into `locations` (location_name) values ('Chennai'); +insert into `locations` (location_name) values ('Chetpet'); +insert into `locations` (location_name) values ('Chitlapakkam'); +insert into `locations` (location_name) values ('Choolai'); +insert into `locations` (location_name) values ('Chromepet'); +insert into `locations` (location_name) values ('Egmore'); +insert into `locations` (location_name) values ('Gopalapuram'); +insert into `locations` (location_name) values ('Guindy'); +insert into `locations` (location_name) values ('Injambakkam'); +insert into `locations` (location_name) values ('K. K. Nagar'); +insert into `locations` (location_name) values ('Kodambakkam'); +insert into `locations` (location_name) values ('Kodungaiyur'); +insert into `locations` (location_name) values ('Kolathur'); +insert into `locations` (location_name) values ('Korukkupet'); +insert into `locations` (location_name) values ('Madhavaram'); +insert into `locations` (location_name) values ('Mambalam'); +insert into `locations` (location_name) values ('Mannivakkam'); +insert into `locations` (location_name) values ('Medavakkam'); +insert into `locations` (location_name) values ('Meenambakkam'); +insert into `locations` (location_name) values ('Mudichur'); +insert into `locations` (location_name) values ('Mylapore'); +insert into `locations` (location_name) values ('New Washermenpet'); +insert into `locations` (location_name) values ('Nungambakkam'); +insert into `locations` (location_name) values ('Park Town'); +insert into `locations` (location_name) values ('Peerkankaranai'); +insert into `locations` (location_name) values ('Perambur'); +insert into `locations` (location_name) values ('Perungalathur'); +insert into `locations` (location_name) values ('Purasawalkam'); +insert into `locations` (location_name) values ('Saidapet'); +insert into `locations` (location_name) values ('Sembakkam'); +insert into `locations` (location_name) values ('Shenoy Nagar'); +insert into `locations` (location_name) values ('Sholinganallur'); +insert into `locations` (location_name) values ('T. Nagar'); +insert into `locations` (location_name) values ('Teynampet'); +insert into `locations` (location_name) values ('Tharamani'); +insert into `locations` (location_name) values ('Thiru. Vi. Ka Nagar'); +insert into `locations` (location_name) values ('Thuraipakkam'); +insert into `locations` (location_name) values ('Tirusulam'); +insert into `locations` (location_name) values ('Tondiarpet'); +insert into `locations` (location_name) values ('Triplicane'); +insert into `locations` (location_name) values ('Vadapalani'); +insert into `locations` (location_name) values ('Vandalur'); +insert into `locations` (location_name) values ('Vyasarpadi'); +insert into `locations` (location_name) values ('Washermanpet'); \ No newline at end of file diff --git a/api/src/main/resources/db/tables.sql b/api/src/main/resources/db/tables.sql new file mode 100644 index 00000000..c29e0b36 --- /dev/null +++ b/api/src/main/resources/db/tables.sql @@ -0,0 +1,182 @@ +use assist; + +DROP TABLE IF EXISTS storage_item; +DROP TABLE IF EXISTS storage_centre; +DROP TABLE IF EXISTS actioned_by; +DROP TABLE IF EXISTS actions; +DROP TABLE IF EXISTS user_organisation_mapping; +DROP TABLE IF EXISTS organisation; +DROP TABLE IF EXISTS user_authority; +DROP TABLE IF EXISTS authority; +DROP TABLE IF EXISTS users; +DROP TABLE IF EXISTS files; +DROP TABLE IF EXISTS locations; + +CREATE TABLE `files` ( + `file_id` INT NOT NULL AUTO_INCREMENT, + `file_name` VARCHAR(256) NOT NULL, + `file_location` VARCHAR(512) NOT NULL, + PRIMARY KEY (`file_id`)); + +CREATE TABLE `users` ( + `user_id` INT NOT NULL AUTO_INCREMENT, + `user_name` VARCHAR(256) NOT NULL, + `mobile` VARCHAR(15) NULL, + `email` VARCHAR(246) NULL, + `passwd` VARCHAR(256) NOT NULL, + PRIMARY KEY (`user_id`)); + +CREATE TABLE `authority` ( + `authority_id` INT NOT NULL AUTO_INCREMENT, + `authority_name` VARCHAR(45) NOT NULL, + PRIMARY KEY (`authority_id`)); + +CREATE TABLE `user_authority` ( + `user_id` INT NOT NULL, + `authority_id` INT NOT NULL, + PRIMARY KEY (`user_id`, `authority_id`), + INDEX `fk_user_authority_1_idx` (`authority_id` ASC), + CONSTRAINT `fk_user_authority_1` + FOREIGN KEY (`authority_id`) + REFERENCES `authority` (`authority_id`) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_user_authority_2` + FOREIGN KEY (`user_id`) + REFERENCES `users` (`user_id`) + ON DELETE NO ACTION + ON UPDATE NO ACTION); + +CREATE TABLE `locations` ( + `location_id` INT NOT NULL AUTO_INCREMENT, + `location_name` VARCHAR(256) NOT NULL, + `latitude` FLOAT NULL, + `longitude` FLOAT NULL, + PRIMARY KEY (`location_id`)); + +CREATE TABLE `organisation` ( + `organisation_id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `url` VARCHAR(45) NULL, + `location_id` INT NULL, + `created_by` INT NOT NULL, + `created_on` DATETIME NOT NULL DEFAULT NOW(), + `description` TEXT NULL, + PRIMARY KEY (`organisation_id`), + CONSTRAINT `fk_organisation_1` + FOREIGN KEY (`location_id`) + REFERENCES `locations` (`location_id`) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_organisation_2` + FOREIGN KEY (`created_by`) + REFERENCES `users` (`user_id`) + ON DELETE NO ACTION + ON UPDATE NO ACTION); + +CREATE TABLE `user_organisation_mapping` ( + `organisation_id` INT NOT NULL, + `user_id` INT NOT NULL, + `isAdmin` TINYINT NOT NULL DEFAULT 0, + `addedOn` DATETIME NOT NULL DEFAULT NOW(), + `added_by` INT NOT NULL, + PRIMARY KEY (`organisation_id`, `user_id`), + INDEX `fk_user_organisation_mapping_2_idx` (`user_id` ASC), + INDEX `fk_user_organisation_mapping_3_idx` (`added_by` ASC), + CONSTRAINT `fk_user_organisation_mapping_1` + FOREIGN KEY (`organisation_id`) + REFERENCES `organisation` (`organisation_id`) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_user_organisation_mapping_2` + FOREIGN KEY (`user_id`) + REFERENCES `users` (`user_id`) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_user_organisation_mapping_3` + FOREIGN KEY (`added_by`) + REFERENCES `users` (`user_id`) + ON DELETE NO ACTION + ON UPDATE NO ACTION); + +CREATE TABLE `actions` ( + `action_id` INT NOT NULL AUTO_INCREMENT, + `action_type` VARCHAR(100) NOT NULL, + `description` TEXT NULL, + `item_name` VARCHAR(256) NULL, + `item_quantity` INT NULL, + `posted_by_user` INT NULL, + `posted_by_organisation` INT NULL, + `fulfilled` TINYINT NOT NULL DEFAULT 0, + `location_id` INT NULL, + `latitude` FLOAT NULL, + `longitude` FLOAT NULL, + `file_id` INT NULL, + `created_on` DATETIME NOT NULL DEFAULT NOW(), + PRIMARY KEY (`action_id`), + INDEX `fk_actions_1_idx` (`file_id` ASC), + INDEX `fk_actions_2_idx` (`location_id` ASC), + INDEX `fk_actions_3_idx` (`posted_by_user` ASC), + INDEX `fk_actions_4_idx` (`posted_by_organisation` ASC), + CONSTRAINT `fk_actions_1` + FOREIGN KEY (`file_id`) + REFERENCES `files` (`file_id`) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_actions_2` + FOREIGN KEY (`location_id`) + REFERENCES `locations` (`location_id`) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_actions_3` + FOREIGN KEY (`posted_by_user`) + REFERENCES `users` (`user_id`) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_actions_4` + FOREIGN KEY (`posted_by_organisation`) + REFERENCES `organisation` (`organisation_id`) + ON DELETE NO ACTION + ON UPDATE NO ACTION); + +CREATE TABLE `actioned_by` ( + `action_id` INT NOT NULL, + `user_id` INT NOT NULL, + `actioned_on` DATETIME NOT NULL DEFAULT NOW(), + PRIMARY KEY (`action_id`, `user_id`)); + +CREATE TABLE `storage_centre` ( + `centre_id` INT NOT NULL AUTO_INCREMENT, + `centre_name` VARCHAR(512) NOT NULL, + `location_id` INT NOT NULL, + `latitude` FLOAT NULL, + `longitude` FLOAT NULL, + `created_by` INT NOT NULL, + `created_on` DATETIME NULL DEFAULT NOW(), + PRIMARY KEY (`centre_id`), + INDEX `fk_storage_centre_1_idx` (`location_id` ASC), + INDEX `fk_storage_centre_2_idx` (`created_by` ASC), + CONSTRAINT `fk_storage_centre_1` + FOREIGN KEY (`location_id`) + REFERENCES `locations` (`location_id`) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_storage_centre_2` + FOREIGN KEY (`created_by`) + REFERENCES `users` (`user_id`) + ON DELETE NO ACTION + ON UPDATE NO ACTION); + +CREATE TABLE `storage_item` ( + `storage_id` INT NOT NULL AUTO_INCREMENT, + `centre_id` INT NOT NULL, + `item_name` VARCHAR(512) NOT NULL, + `item_quantity` INT NOT NULL, + PRIMARY KEY (`storage_id`), + INDEX `fk_storage_1_idx` (`centre_id` ASC), + CONSTRAINT `fk_storage_1` + FOREIGN KEY (`centre_id`) + REFERENCES `storage_centre` (`centre_id`) + ON DELETE NO ACTION + ON UPDATE NO ACTION); + diff --git a/api/src/test/groovy/com/assist/api/AssistApiApplicationTests.groovy b/api/src/test/groovy/com/assist/api/AssistApiApplicationTests.groovy new file mode 100644 index 00000000..7cc7bdfa --- /dev/null +++ b/api/src/test/groovy/com/assist/api/AssistApiApplicationTests.groovy @@ -0,0 +1,16 @@ +package com.assist.api + +import org.junit.Test +import org.junit.runner.RunWith +import org.springframework.boot.test.context.SpringBootTest +import org.springframework.test.context.junit4.SpringRunner + +@RunWith(SpringRunner) +@SpringBootTest +class AssistApiApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 00000000..0510e3de --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,31 @@ +# flood-management + +The app built to help affected people in floods. This is part of Lync Hacks 2.o, Oct12-13, 2019. + +# Fiasco + +This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 8.3.9. + +## Development server + +Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. + +## Code scaffolding + +Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. + +## Build + +Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `--prod` flag for a production build. + +## Running unit tests + +Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). + +## Running end-to-end tests + +Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). + +## Further help + +To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). diff --git a/frontend/angular.json b/frontend/angular.json new file mode 100644 index 00000000..88bb45ec --- /dev/null +++ b/frontend/angular.json @@ -0,0 +1,136 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "fiasco": { + "projectType": "application", + "schematics": { + "@schematics/angular:component": { + "style": "scss" + } + }, + "root": "", + "sourceRoot": "src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "outputPath": "dist/fiasco", + "index": "src/index.html", + "main": "src/main.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.app.json", + "aot": false, + "assets": [ + "src/favicon.ico", + "src/assets", + "src/manifest.webmanifest" + ], + "styles": [ + "./node_modules/@angular/material/prebuilt-themes/indigo-pink.css", + "src/styles.scss" + ], + "scripts": [] + }, + "configurations": { + "production": { + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ], + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "extractCss": true, + "namedChunks": false, + "aot": true, + "extractLicenses": true, + "vendorChunk": false, + "buildOptimizer": true, + "budgets": [ + { + "type": "initial", + "maximumWarning": "2mb", + "maximumError": "5mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "6kb", + "maximumError": "10kb" + } + ], + "serviceWorker": true, + "ngswConfigPath": "ngsw-config.json" + } + } + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "options": { + "browserTarget": "fiasco:build" + }, + "configurations": { + "production": { + "browserTarget": "fiasco:build:production" + } + } + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "fiasco:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "src/test.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.spec.json", + "karmaConfig": "karma.conf.js", + "assets": [ + "src/favicon.ico", + "src/assets", + "src/manifest.webmanifest" + ], + "styles": [ + "./node_modules/@angular/material/prebuilt-themes/indigo-pink.css", + "src/styles.scss" + ], + "scripts": [] + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "tsconfig.app.json", + "tsconfig.spec.json", + "e2e/tsconfig.json" + ], + "exclude": [ + "**/node_modules/**" + ] + } + }, + "e2e": { + "builder": "@angular-devkit/build-angular:protractor", + "options": { + "protractorConfig": "e2e/protractor.conf.js", + "devServerTarget": "fiasco:serve" + }, + "configurations": { + "production": { + "devServerTarget": "fiasco:serve:production" + } + } + } + } + } + }, + "defaultProject": "fiasco" +} \ No newline at end of file diff --git a/frontend/browserslist b/frontend/browserslist new file mode 100644 index 00000000..80848532 --- /dev/null +++ b/frontend/browserslist @@ -0,0 +1,12 @@ +# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. +# For additional information regarding the format and rule options, please see: +# https://github.com/browserslist/browserslist#queries + +# You can see what browsers were selected by your queries by running: +# npx browserslist + +> 0.5% +last 2 versions +Firefox ESR +not dead +not IE 9-11 # For IE 9-11 support, remove 'not'. \ No newline at end of file diff --git a/frontend/e2e/protractor.conf.js b/frontend/e2e/protractor.conf.js new file mode 100644 index 00000000..73e4e680 --- /dev/null +++ b/frontend/e2e/protractor.conf.js @@ -0,0 +1,32 @@ +// @ts-check +// Protractor configuration file, see link for more information +// https://github.com/angular/protractor/blob/master/lib/config.ts + +const { SpecReporter } = require('jasmine-spec-reporter'); + +/** + * @type { import("protractor").Config } + */ +exports.config = { + allScriptsTimeout: 11000, + specs: [ + './src/**/*.e2e-spec.ts' + ], + capabilities: { + 'browserName': 'chrome' + }, + directConnect: true, + baseUrl: 'http://localhost:4200/', + framework: 'jasmine', + jasmineNodeOpts: { + showColors: true, + defaultTimeoutInterval: 30000, + print: function() {} + }, + onPrepare() { + require('ts-node').register({ + project: require('path').join(__dirname, './tsconfig.json') + }); + jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); + } +}; \ No newline at end of file diff --git a/frontend/e2e/src/app.e2e-spec.ts b/frontend/e2e/src/app.e2e-spec.ts new file mode 100644 index 00000000..01f25a28 --- /dev/null +++ b/frontend/e2e/src/app.e2e-spec.ts @@ -0,0 +1,23 @@ +import { AppPage } from './app.po'; +import { browser, logging } from 'protractor'; + +describe('workspace-project App', () => { + let page: AppPage; + + beforeEach(() => { + page = new AppPage(); + }); + + it('should display welcome message', () => { + page.navigateTo(); + expect(page.getTitleText()).toEqual('fiasco app is running!'); + }); + + afterEach(async () => { + // Assert that there are no errors emitted from the browser + const logs = await browser.manage().logs().get(logging.Type.BROWSER); + expect(logs).not.toContain(jasmine.objectContaining({ + level: logging.Level.SEVERE, + } as logging.Entry)); + }); +}); diff --git a/frontend/e2e/src/app.po.ts b/frontend/e2e/src/app.po.ts new file mode 100644 index 00000000..b8498c26 --- /dev/null +++ b/frontend/e2e/src/app.po.ts @@ -0,0 +1,11 @@ +import { browser, by, element } from 'protractor'; + +export class AppPage { + navigateTo() { + return browser.get(browser.baseUrl) as Promise; + } + + getTitleText() { + return element(by.css('app-root .content span')).getText() as Promise; + } +} diff --git a/frontend/e2e/tsconfig.json b/frontend/e2e/tsconfig.json new file mode 100644 index 00000000..39b800f7 --- /dev/null +++ b/frontend/e2e/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/e2e", + "module": "commonjs", + "target": "es5", + "types": [ + "jasmine", + "jasminewd2", + "node" + ] + } +} diff --git a/frontend/karma.conf.js b/frontend/karma.conf.js new file mode 100644 index 00000000..d3e2d1ef --- /dev/null +++ b/frontend/karma.conf.js @@ -0,0 +1,32 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage-istanbul-reporter'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client: { + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + coverageIstanbulReporter: { + dir: require('path').join(__dirname, './coverage/fiasco'), + reports: ['html', 'lcovonly', 'text-summary'], + fixWebpackSourcePaths: true + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false, + restartOnFileChange: true + }); +}; diff --git a/frontend/ngsw-config.json b/frontend/ngsw-config.json new file mode 100644 index 00000000..4ddf1a71 --- /dev/null +++ b/frontend/ngsw-config.json @@ -0,0 +1,29 @@ +{ + "$schema": "./node_modules/@angular/service-worker/config/schema.json", + "index": "/index.html", + "assetGroups": [ + { + "name": "app", + "installMode": "prefetch", + "resources": { + "files": [ + "/favicon.ico", + "/index.html", + "/manifest.webmanifest", + "/*.css", + "/*.js" + ] + } + }, { + "name": "assets", + "installMode": "lazy", + "updateMode": "prefetch", + "resources": { + "files": [ + "/assets/**", + "/*.(eot|svg|cur|jpg|png|webp|gif|otf|ttf|woff|woff2|ani)" + ] + } + } + ] +} diff --git a/frontend/package-lock.json b/frontend/package-lock.json new file mode 100644 index 00000000..8460079e --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,13191 @@ +{ + "name": "fiasco", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@angular-devkit/architect": { + "version": "0.803.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.803.9.tgz", + "integrity": "sha512-grbnPxZ8vnd1UWQUWdJKBxsG8kD6Pj9XtTOEqKg5gH9Vha1zKkEnROWG18TFZzHrJffCE8E18c0OgDIjz+pL3g==", + "dev": true, + "requires": { + "@angular-devkit/core": "8.3.9", + "rxjs": "6.4.0" + } + }, + "@angular-devkit/build-angular": { + "version": "0.803.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.803.9.tgz", + "integrity": "sha512-fSA3b506Z06l+Lvbw8xxytG+/WcWclMoO3QTMec897shXAFAZNtK+3KtoF2VITTQcYP12MNIVM7TQiTGof70AQ==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.803.9", + "@angular-devkit/build-optimizer": "0.803.9", + "@angular-devkit/build-webpack": "0.803.9", + "@angular-devkit/core": "8.3.9", + "@babel/core": "7.5.5", + "@babel/preset-env": "7.5.5", + "@ngtools/webpack": "8.3.9", + "ajv": "6.10.2", + "autoprefixer": "9.6.1", + "browserslist": "4.6.6", + "cacache": "12.0.2", + "caniuse-lite": "1.0.30000989", + "circular-dependency-plugin": "5.2.0", + "clean-css": "4.2.1", + "copy-webpack-plugin": "5.0.4", + "core-js": "3.2.1", + "file-loader": "4.2.0", + "find-cache-dir": "3.0.0", + "glob": "7.1.4", + "istanbul-instrumenter-loader": "3.0.1", + "jest-worker": "24.9.0", + "karma-source-map-support": "1.4.0", + "less": "3.9.0", + "less-loader": "5.0.0", + "license-webpack-plugin": "2.1.2", + "loader-utils": "1.2.3", + "mini-css-extract-plugin": "0.8.0", + "minimatch": "3.0.4", + "open": "6.4.0", + "parse5": "4.0.0", + "postcss": "7.0.17", + "postcss-import": "12.0.1", + "postcss-loader": "3.0.0", + "raw-loader": "3.1.0", + "regenerator-runtime": "0.13.3", + "rxjs": "6.4.0", + "sass": "1.22.9", + "sass-loader": "7.2.0", + "semver": "6.3.0", + "source-map": "0.7.3", + "source-map-loader": "0.2.4", + "source-map-support": "0.5.13", + "speed-measure-webpack-plugin": "1.3.1", + "style-loader": "1.0.0", + "stylus": "0.54.5", + "stylus-loader": "3.0.2", + "terser": "4.3.8", + "terser-webpack-plugin": "1.4.1", + "tree-kill": "1.2.1", + "webpack": "4.39.2", + "webpack-dev-middleware": "3.7.0", + "webpack-dev-server": "3.8.0", + "webpack-merge": "4.2.1", + "webpack-sources": "1.4.3", + "webpack-subresource-integrity": "1.1.0-rc.6", + "worker-plugin": "3.2.0" + } + }, + "@angular-devkit/build-optimizer": { + "version": "0.803.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.803.9.tgz", + "integrity": "sha512-AeuQroeK7eCTTc7JG+DLzglGGp8aymA+9hkFveOoUgqdhnCG9FaqBew8ZetBD6FEokU7eFT4bERJmgq497MTOg==", + "dev": true, + "requires": { + "loader-utils": "1.2.3", + "source-map": "0.7.3", + "tslib": "1.10.0", + "typescript": "3.5.3", + "webpack-sources": "1.4.3" + } + }, + "@angular-devkit/build-webpack": { + "version": "0.803.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.803.9.tgz", + "integrity": "sha512-IqS7xAEigI9Uwbv8WtcDN9YYqfYJsS/HxRq0XNYXUfHsdbZGb2qBrQ/8QODbh3V1S99yxTiPn0x+LYhO98zlnA==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.803.9", + "@angular-devkit/core": "8.3.9", + "rxjs": "6.4.0", + "webpack-merge": "4.2.1" + } + }, + "@angular-devkit/core": { + "version": "8.3.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-8.3.9.tgz", + "integrity": "sha512-LYNdY8UpcEGaqWq0smPhSAiz+Oq1gv4j1LGLLyY1d2CJpf4czIuI8SkTHtmGMjpKy8ss/Vk1mHwRjBrWB0dUag==", + "requires": { + "ajv": "6.10.2", + "fast-json-stable-stringify": "2.0.0", + "magic-string": "0.25.3", + "rxjs": "6.4.0", + "source-map": "0.7.3" + } + }, + "@angular-devkit/schematics": { + "version": "8.3.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-8.3.9.tgz", + "integrity": "sha512-JKrXdbJhyvvMfSoJ01l5zDk1Rhg0em0tgyzFWiqQ+cSt/zbPQrDRDpNJ7f95dPNu6R1KCuojAnaC8MXKRNTm0A==", + "requires": { + "@angular-devkit/core": "8.3.9", + "rxjs": "6.4.0" + } + }, + "@angular/animations": { + "version": "8.2.10", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-8.2.10.tgz", + "integrity": "sha512-JX3r3CC5yt4s+XevUPyqbKIdGFb8FxoDCjCHi2ujBVRRsZaSZK8STIZsy+l+WZUd7/7Qu8MYCw0vazZN0kNyDg==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/cdk": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-8.2.3.tgz", + "integrity": "sha512-ZwO5Sn720RA2YvBqud0JAHkZXjmjxM0yNzCO8RVtRE9i8Gl26Wk0j0nQeJkVm4zwv2QO8MwbKUKGTMt8evsokA==", + "requires": { + "parse5": "^5.0.0", + "tslib": "^1.7.1" + }, + "dependencies": { + "parse5": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", + "optional": true + } + } + }, + "@angular/cli": { + "version": "8.3.9", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-8.3.9.tgz", + "integrity": "sha512-kQTRu2cx/B0lbcKvCtz50x7s1gMHGfHaRqzJZJ7XtW+fQSUyz/gbJ/K44M19BBz4U4LzjXs5zZoJTH0z5SutQQ==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.803.9", + "@angular-devkit/core": "8.3.9", + "@angular-devkit/schematics": "8.3.9", + "@schematics/angular": "8.3.9", + "@schematics/update": "0.803.9", + "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.1", + "debug": "^4.1.1", + "ini": "1.3.5", + "inquirer": "6.5.1", + "npm-package-arg": "6.1.0", + "npm-pick-manifest": "3.0.2", + "open": "6.4.0", + "pacote": "9.5.5", + "read-package-tree": "5.3.1", + "semver": "6.3.0", + "symbol-observable": "1.2.0", + "universal-analytics": "^0.4.20", + "uuid": "^3.3.2" + }, + "dependencies": { + "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 + } + } + }, + "@angular/common": { + "version": "8.2.10", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-8.2.10.tgz", + "integrity": "sha512-ZbSTbyn6BrOvBqLZvDNeiatJNgH9LV/Qm0kLwfthrBYNPlS4eUzSn4EMO3n4vVFWCsyCNM0ieQjtKmyD1lg1fg==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/compiler": { + "version": "8.2.10", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-8.2.10.tgz", + "integrity": "sha512-pIHGhu+eXzTIsfQtYGnFi1Mknk+Z0h9lMVUpq6cazHukUBl76HVCeaGJ9+/sdHhDqNTrDV2ceCE0GkTU3H7RdA==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/compiler-cli": { + "version": "8.2.10", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-8.2.10.tgz", + "integrity": "sha512-3oM9y6vr/4qcN9DXkggdRXMLbdIZJ98YKYhVxhachNgMt+l4kkofP2JMLbmzgL4tVghevoWXeeY+6MB8gYVUZQ==", + "dev": true, + "requires": { + "canonical-path": "1.0.0", + "chokidar": "^2.1.1", + "convert-source-map": "^1.5.1", + "dependency-graph": "^0.7.2", + "magic-string": "^0.25.0", + "minimist": "^1.2.0", + "reflect-metadata": "^0.1.2", + "source-map": "^0.6.1", + "tslib": "^1.9.0", + "yargs": "13.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 + }, + "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 + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "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" + } + }, + "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 + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "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.1", + "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": "4.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "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.3.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "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.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "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.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "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.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": 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 + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "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" + } + }, + "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 + }, + "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 + }, + "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" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "yargs": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.1.0.tgz", + "integrity": "sha512-1UhJbXfzHiPqkfXNHYhiz79qM/kZqjTE8yGlEjZa85Q+3+OwcV6NRkV7XOV1W2Eom2bzILeUn55pQYffjVOLAg==", + "dev": true, + "requires": { + "cliui": "^4.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.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==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "@angular/core": { + "version": "8.2.10", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-8.2.10.tgz", + "integrity": "sha512-nUd/xZWIb1DHbr8agjVTvk4XUN9yBGEGQWN5ja5wJbPasoZC2GfiBHcmhttGHkocyB674d3x+xR2MvMvzEUdvw==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/flex-layout": { + "version": "8.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@angular/flex-layout/-/flex-layout-8.0.0-beta.27.tgz", + "integrity": "sha512-qmpvQPesU4ZQ56IscwgmVRpK2UnyV+gwvXUql7TMv0QV215hLcHczjGsrKkLfW2By5E7XEyDat9br72uVXcPMw==", + "requires": { + "tslib": "^1.7.1" + } + }, + "@angular/forms": { + "version": "8.2.10", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-8.2.10.tgz", + "integrity": "sha512-41Vjc55EGEW5I+3N0wiNQL4vbFgQwWrwnN6H2mvOx7WOprHSfL5a9kk+5s/13kql3es7vyPyDDqQqkmBWuQtzg==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/language-service": { + "version": "8.2.10", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-8.2.10.tgz", + "integrity": "sha512-VJaFkbffRPh4WC8aW01BXljLVyiMs2p32LgGxPTntNZ4cSLDRkUXkIoiCMUK9CHl+RCstFKWhlDnppONDePONw==", + "dev": true + }, + "@angular/material": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-8.2.3.tgz", + "integrity": "sha512-SOczkIaqes+r+9XF/UUiokidfFKBpHkOPIaFK857sFD0FBNPvPEpOr5oHKCG3feERRwAFqHS7Wo2ohVEWypb5A==", + "requires": { + "tslib": "^1.7.1" + } + }, + "@angular/platform-browser": { + "version": "8.2.10", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-8.2.10.tgz", + "integrity": "sha512-HHxI+25z3bSMrwvgRkCVgo8v1BmKiqdVDHiLa5uRUCVo9QAlPyvugqa949okzVVS2aOVso5jRKqqAz09qBH6dA==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/platform-browser-dynamic": { + "version": "8.2.10", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-8.2.10.tgz", + "integrity": "sha512-mpViCrRlCOtM4iW1VwPwANEAPLu2gHAQbtnZheSN1RSyuXFoe1th8ToGfSWcsWa0Hep6xU0sunYbaYWtb2IgjA==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/pwa": { + "version": "0.803.9", + "resolved": "https://registry.npmjs.org/@angular/pwa/-/pwa-0.803.9.tgz", + "integrity": "sha512-x3PMgEVGLolFQ+e5Pj9ppcm3KwSGhut6Ibe6Zy3H9p064H76FSgGrh/PlatUHHAtWHVe2GYb3p7RKXqRrwsK+g==", + "requires": { + "@angular-devkit/core": "8.3.9", + "@angular-devkit/schematics": "8.3.9", + "@schematics/angular": "8.3.9", + "parse5-html-rewriting-stream": "5.1.0" + } + }, + "@angular/router": { + "version": "8.2.10", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-8.2.10.tgz", + "integrity": "sha512-qY5HnxrP1pKq87xp/iREVEGFmIB+NXZnS4BFN0sU8vwqPtEv8yC45YNIilT4zwn2fDxmTHvC7W+t3+yRizz+cQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/service-worker": { + "version": "8.2.10", + "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-8.2.10.tgz", + "integrity": "sha512-xBRtK73VmQIr2MuxFwVG9dZOkG6Wlsjdr/T2h8r1IT4+9s0sunBlscPfmeYtg6KaoPVGuMvS0h2vVp9Aq+f+ag==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/core": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.5.5.tgz", + "integrity": "sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helpers": "^7.5.5", + "@babel/parser": "^7.5.5", + "@babel/template": "^7.4.4", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5", + "convert-source-map": "^1.1.0", + "debug": "^4.1.0", + "json5": "^2.1.0", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "json5": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", + "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "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 + } + } + }, + "@babel/generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.4.tgz", + "integrity": "sha512-jsBuXkFoZxk0yWLyGI9llT9oiQ2FeTASmRFE32U+aaDTfoE92t78eroO7PTpU/OrYq38hlcDM6vbfLDaOLy+7w==", + "dev": true, + "requires": { + "@babel/types": "^7.6.3", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz", + "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz", + "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-call-delegate": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz", + "integrity": "sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.4.4", + "@babel/traverse": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/helper-define-map": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz", + "integrity": "sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/types": "^7.5.5", + "lodash": "^4.17.13" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz", + "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz", + "integrity": "sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz", + "integrity": "sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==", + "dev": true, + "requires": { + "@babel/types": "^7.5.5" + } + }, + "@babel/helper-module-imports": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", + "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz", + "integrity": "sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/template": "^7.4.4", + "@babel/types": "^7.5.5", + "lodash": "^4.17.13" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz", + "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", + "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", + "dev": true + }, + "@babel/helper-regex": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.5.5.tgz", + "integrity": "sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw==", + "dev": true, + "requires": { + "lodash": "^4.17.13" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz", + "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-wrap-function": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-replace-supers": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz", + "integrity": "sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.5.5", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5" + } + }, + "@babel/helper-simple-access": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz", + "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==", + "dev": true, + "requires": { + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/helper-wrap-function": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz", + "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.2.0" + } + }, + "@babel/helpers": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.6.2.tgz", + "integrity": "sha512-3/bAUL8zZxYs1cdX2ilEE0WobqbCmKWr/889lf2SS0PpDcpEIY8pb1CCyz0pEcX3pEb+MCbks1jIokz2xLtGTA==", + "dev": true, + "requires": { + "@babel/template": "^7.6.0", + "@babel/traverse": "^7.6.2", + "@babel/types": "^7.6.0" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.4.tgz", + "integrity": "sha512-D8RHPW5qd0Vbyo3qb+YjO5nvUVRTXFLQ/FsDxJU2Nqz4uB5EnUN0ZQSEYpvTIbRuttig1XbHWU5oMeQwQSAA+A==", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz", + "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0", + "@babel/plugin-syntax-async-generators": "^7.2.0" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz", + "integrity": "sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz", + "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-json-strings": "^7.2.0" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.6.2.tgz", + "integrity": "sha512-LDBXlmADCsMZV1Y9OQwMc0MyGZ8Ta/zlD9N67BfQT8uYwkRswiu2hU6nJKrjrt/58aH/vqfQlR/9yId/7A2gWw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz", + "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.6.2.tgz", + "integrity": "sha512-NxHETdmpeSCtiatMRYWVJo7266rrvAC3DTeG5exQBIH/fMIUK7ejDNznBbn3HQl/o9peymRRg7Yqkx6PdUXmMw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.6.0" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz", + "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz", + "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz", + "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", + "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz", + "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz", + "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz", + "integrity": "sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz", + "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.3.tgz", + "integrity": "sha512-7hvrg75dubcO3ZI2rjYTzUrEuh1E9IyDEhhB6qfcooxhDA33xx2MasuLVgdxzcP6R/lipAC6n9ub9maNW6RKdw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "lodash": "^4.17.13" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz", + "integrity": "sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-define-map": "^7.5.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.5.5", + "@babel/helper-split-export-declaration": "^7.4.4", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz", + "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.6.0.tgz", + "integrity": "sha512-2bGIS5P1v4+sWTCnKNDZDxbGvEqi0ijeqM/YqHtVGrvG2y0ySgnEEhXErvE9dA0bnIzY9bIzdFK0jFA46ASIIQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.6.2.tgz", + "integrity": "sha512-KGKT9aqKV+9YMZSkowzYoYEiHqgaDhGmPNZlZxX6UeHC4z30nC1J9IrZuGqbYFB1jaIGdv91ujpze0exiVK8bA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.6.0" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz", + "integrity": "sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz", + "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz", + "integrity": "sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz", + "integrity": "sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz", + "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz", + "integrity": "sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz", + "integrity": "sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.6.0.tgz", + "integrity": "sha512-Ma93Ix95PNSEngqomy5LSBMAQvYKVe3dy+JlVJSHEXZR5ASL9lQBedMiCyVtmTLraIDVRE3ZjTZvmXXD2Ozw3g==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.4.4", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz", + "integrity": "sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.4.4", + "@babel/helper-plugin-utils": "^7.0.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz", + "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.6.3.tgz", + "integrity": "sha512-jTkk7/uE6H2s5w6VlMHeWuH+Pcy2lmdwFoeWCVnvIrDUnB5gQqTVI8WfmEAhF2CDEarGrknZcmSFg1+bkfCoSw==", + "dev": true, + "requires": { + "regexpu-core": "^4.6.0" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz", + "integrity": "sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz", + "integrity": "sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.5.5" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz", + "integrity": "sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==", + "dev": true, + "requires": { + "@babel/helper-call-delegate": "^7.4.4", + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz", + "integrity": "sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz", + "integrity": "sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.0" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz", + "integrity": "sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz", + "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.6.2.tgz", + "integrity": "sha512-DpSvPFryKdK1x+EDJYCy28nmAaIMdxmhot62jAXF/o99iA33Zj2Lmcp3vDmz+MUh0LNYVPvfj5iC3feb3/+PFg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz", + "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz", + "integrity": "sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz", + "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.6.2.tgz", + "integrity": "sha512-orZI6cWlR3nk2YmYdb0gImrgCUwb5cBUwjf6Ks6dvNVvXERkwtJWOQaEOjPiu0Gu1Tq6Yq/hruCZZOOi9F34Dw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.6.0" + } + }, + "@babel/preset-env": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.5.5.tgz", + "integrity": "sha512-GMZQka/+INwsMz1A5UEql8tG015h5j/qjptpKY2gJ7giy8ohzU710YciJB5rcKsWGWHiW3RUnHib0E5/m3Tp3A==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-async-generator-functions": "^7.2.0", + "@babel/plugin-proposal-dynamic-import": "^7.5.0", + "@babel/plugin-proposal-json-strings": "^7.2.0", + "@babel/plugin-proposal-object-rest-spread": "^7.5.5", + "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-syntax-async-generators": "^7.2.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0", + "@babel/plugin-syntax-json-strings": "^7.2.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", + "@babel/plugin-transform-arrow-functions": "^7.2.0", + "@babel/plugin-transform-async-to-generator": "^7.5.0", + "@babel/plugin-transform-block-scoped-functions": "^7.2.0", + "@babel/plugin-transform-block-scoping": "^7.5.5", + "@babel/plugin-transform-classes": "^7.5.5", + "@babel/plugin-transform-computed-properties": "^7.2.0", + "@babel/plugin-transform-destructuring": "^7.5.0", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/plugin-transform-duplicate-keys": "^7.5.0", + "@babel/plugin-transform-exponentiation-operator": "^7.2.0", + "@babel/plugin-transform-for-of": "^7.4.4", + "@babel/plugin-transform-function-name": "^7.4.4", + "@babel/plugin-transform-literals": "^7.2.0", + "@babel/plugin-transform-member-expression-literals": "^7.2.0", + "@babel/plugin-transform-modules-amd": "^7.5.0", + "@babel/plugin-transform-modules-commonjs": "^7.5.0", + "@babel/plugin-transform-modules-systemjs": "^7.5.0", + "@babel/plugin-transform-modules-umd": "^7.2.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.4.5", + "@babel/plugin-transform-new-target": "^7.4.4", + "@babel/plugin-transform-object-super": "^7.5.5", + "@babel/plugin-transform-parameters": "^7.4.4", + "@babel/plugin-transform-property-literals": "^7.2.0", + "@babel/plugin-transform-regenerator": "^7.4.5", + "@babel/plugin-transform-reserved-words": "^7.2.0", + "@babel/plugin-transform-shorthand-properties": "^7.2.0", + "@babel/plugin-transform-spread": "^7.2.0", + "@babel/plugin-transform-sticky-regex": "^7.2.0", + "@babel/plugin-transform-template-literals": "^7.4.4", + "@babel/plugin-transform-typeof-symbol": "^7.2.0", + "@babel/plugin-transform-unicode-regex": "^7.4.4", + "@babel/types": "^7.5.5", + "browserslist": "^4.6.0", + "core-js-compat": "^3.1.1", + "invariant": "^2.2.2", + "js-levenshtein": "^1.1.3", + "semver": "^5.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/template": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.6.0.tgz", + "integrity": "sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.0" + } + }, + "@babel/traverse": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.3.tgz", + "integrity": "sha512-unn7P4LGsijIxaAJo/wpoU11zN+2IaClkQAxcJWBNCMS6cmVh802IyLHNkAjQ0iYnRS3nnxk5O3fuXW28IMxTw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.6.3", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.6.3", + "@babel/types": "^7.6.3", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz", + "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "@ngtools/webpack": { + "version": "8.3.9", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-8.3.9.tgz", + "integrity": "sha512-SicYBW+3GA0S3q2YMkbNeoidUK0mjiNYk/Im+WaNo9uxyE8Jq2Ui5NXQ9QUxANtFsaeFomXW5rUwCrgkLYLg0w==", + "dev": true, + "requires": { + "@angular-devkit/core": "8.3.9", + "enhanced-resolve": "4.1.0", + "rxjs": "6.4.0", + "tree-kill": "1.2.1", + "webpack-sources": "1.4.3" + } + }, + "@schematics/angular": { + "version": "8.3.9", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-8.3.9.tgz", + "integrity": "sha512-hVEkssR35otuZbHUYx9bwhhGms5deM4+lJG+FeasAjPCNkOVzIemVvF/DuBDitb4WxGpr99hjtEBr7yBIyVAUQ==", + "requires": { + "@angular-devkit/core": "8.3.9", + "@angular-devkit/schematics": "8.3.9" + } + }, + "@schematics/update": { + "version": "0.803.9", + "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.803.9.tgz", + "integrity": "sha512-2cGuWiHzz7/qNAGZ3m7ryPKwWkM+h4nn9Rr7LnOupCAOWDfdoGzf+c+a9HdsLHONd0wjC5/yBXNBa9sdZELaHA==", + "dev": true, + "requires": { + "@angular-devkit/core": "8.3.9", + "@angular-devkit/schematics": "8.3.9", + "@yarnpkg/lockfile": "1.1.0", + "ini": "1.3.5", + "pacote": "9.5.5", + "rxjs": "6.4.0", + "semver": "6.3.0", + "semver-intersect": "1.4.0" + } + }, + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", + "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==", + "dev": true, + "requires": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/jasmine": { + "version": "3.3.16", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.3.16.tgz", + "integrity": "sha512-Nveep4zKGby8uIvG2AEUyYOwZS8uVeHK9TgbuWYSawUDDdIgfhCKz28QzamTo//Jk7Ztt9PO3f+vzlB6a4GV1Q==", + "dev": true + }, + "@types/jasminewd2": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.8.tgz", + "integrity": "sha512-d9p31r7Nxk0ZH0U39PTH0hiDlJ+qNVGjlt1ucOoTUptxb2v+Y5VMnsxfwN+i3hK4yQnqBi3FMmoMFcd1JHDxdg==", + "dev": true, + "requires": { + "@types/jasmine": "*" + } + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/node": { + "version": "8.9.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.9.5.tgz", + "integrity": "sha512-jRHfWsvyMtXdbhnz5CVHxaBgnV6duZnPlQuRSo/dm/GnmikNcmZhxIES4E9OZjUmQ8C+HCl4KJux+cXN/ErGDQ==", + "dev": true + }, + "@types/q": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", + "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", + "dev": true + }, + "@types/selenium-webdriver": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.16.tgz", + "integrity": "sha512-lMC2G0ItF2xv4UCiwbJGbnJlIuUixHrioOhNGHSCsYCJ8l4t9hMCUimCytvFv7qy6AfSzRxhRHoGa+UqaqwyeA==", + "dev": true + }, + "@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", + "dev": true + }, + "@types/webpack-sources": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.5.tgz", + "integrity": "sha512-zfvjpp7jiafSmrzJ2/i3LqOyTYTuJ7u1KOXlKgDlvsj9Rr0x7ZiYu5lZbXwobL7lmsRNtPXlBfmaUD8eU2Hu8w==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "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 + } + } + }, + "@webassemblyjs/ast": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", + "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", + "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", + "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", + "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", + "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", + "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", + "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", + "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", + "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", + "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", + "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", + "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", + "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/helper-wasm-section": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-opt": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", + "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", + "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", + "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", + "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/floating-point-hex-parser": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-code-frame": "1.8.5", + "@webassemblyjs/helper-fsm": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", + "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", + "dev": true + }, + "adm-zip": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.13.tgz", + "integrity": "sha512-fERNJX8sOXfel6qCBCMPvZLzENBEhZTzKqg6vrOW5pvoEaQuJhRU4ndTAh6lHOxn1I6jnz2NHra56ZODM751uw==", + "dev": true + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "dev": true + }, + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "agentkeepalive": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", + "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", + "dev": true, + "requires": { + "humanize-ms": "^1.2.1" + } + }, + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "dev": true + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true + }, + "ansi-escapes": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.2.1.tgz", + "integrity": "sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q==", + "dev": true, + "requires": { + "type-fest": "^0.5.2" + } + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "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" + } + }, + "app-root-path": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.2.1.tgz", + "integrity": "sha512-91IFKeKk7FjfmezPKkwtaRvSpnUc4gDwPAjA1YZ9Gn0q0PPeW+vbeUsZuyDwjI7+QTHhcLen2v25fi/AmhvbJA==", + "dev": true + }, + "append-transform": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", + "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", + "dev": true, + "requires": { + "default-require-extensions": "^2.0.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "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" + } + }, + "aria-query": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", + "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", + "dev": true, + "requires": { + "ast-types-flow": "0.0.7", + "commander": "^2.11.0" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", + "dev": true + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "autoprefixer": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.1.tgz", + "integrity": "sha512-aVo5WxR3VyvyJxcJC3h4FKfwCQvQWb1tSI5VHNibddCVWrcD1NvlxEweg3TSgiPztMnWfjpy2FURKA2kvDE+Tw==", + "dev": true, + "requires": { + "browserslist": "^4.6.3", + "caniuse-lite": "^1.0.30000980", + "chalk": "^2.4.2", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.17", + "postcss-value-parser": "^4.0.0" + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true + }, + "axobject-query": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.0.2.tgz", + "integrity": "sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww==", + "dev": true, + "requires": { + "ast-types-flow": "0.0.7" + } + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + }, + "dependencies": { + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "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 + } + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "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==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "core-js": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", + "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + } + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + }, + "dependencies": { + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + } + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "dev": true + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "dev": true + }, + "base64id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "dev": true, + "requires": { + "callsite": "1.0.0" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", + "dev": true + }, + "blob": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", + "dev": true + }, + "blocking-proxy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", + "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "bluebird": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.0.tgz", + "integrity": "sha512-aBQ1FxIa7kSWCcmKHlcHFlT2jt6J/l4FzC7KcPELkOJOsPOb/bccdhmIrKDfXhwFrmc7vDoDrrepFvGqjyXGJg==", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "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" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.6.tgz", + "integrity": "sha512-D2Nk3W9JL9Fp/gIcWei8LrERCS+eXu9AM5cfXA8WEZ84lFks+ARnZ0q/R69m2SV3Wjma83QDDPxsNKXUwdIsyA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000984", + "electron-to-chromium": "^1.3.191", + "node-releases": "^1.1.25" + } + }, + "browserstack": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.5.3.tgz", + "integrity": "sha512-AO+mECXsW4QcqC9bxwM29O7qWa7bJT94uBFzeb5brylIQwawuEziwq20dPYbins95GlWzOawgyDNdjYAo32EKg==", + "dev": true, + "requires": { + "https-proxy-agent": "^2.2.1" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cacache": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.2.tgz", + "integrity": "sha512-ifKgxH2CKhJEg6tNdAwziu6Q33EvuG26tYcda6PT3WKisZcYDXsnEdnRv67Po3yCzFfaSoMjGZzJyD2c3DT1dg==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "dev": true + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30000989", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000989.tgz", + "integrity": "sha512-vrMcvSuMz16YY6GSVZ0dWDTJP8jqk3iFQ/Aq5iqblPwxSVVZI+zxDyTX0VPqtQsDnfdrBDcsmhgTEOh5R8Lbpw==", + "dev": true + }, + "canonical-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-1.0.0.tgz", + "integrity": "sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "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" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "chokidar": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.2.1.tgz", + "integrity": "sha512-/j5PPkb5Feyps9e+jo07jUZGvkB5Aj953NrI4s8xSVScrAo/RHeILrtdb4uzR7N6aaFFxxJ+gt8mA8HfNpw76w==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.0", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.1.3" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", + "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "chownr": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", + "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "circular-dependency-plugin": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.2.0.tgz", + "integrity": "sha512-7p4Kn/gffhQaavNfyDFg7LS5S/UT1JAjyGd4UqR2+jzoYF02eDkj0Ec3+48TsIa4zghjLY87nQHIh/ecK9qLdw==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-css": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", + "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + }, + "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 + } + } + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "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" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "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 + }, + "codelyzer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-5.1.2.tgz", + "integrity": "sha512-1z7mtpwxcz5uUqq0HLO0ifj/tz2dWEmeaK+8c5TEZXAwwVxrjjg0118ODCOCCOcpfYaaEHxStNCaWVYo9FUPXw==", + "dev": true, + "requires": { + "app-root-path": "^2.2.1", + "aria-query": "^3.0.0", + "axobject-query": "^2.0.2", + "css-selector-tokenizer": "^0.7.1", + "cssauron": "^1.4.0", + "damerau-levenshtein": "^1.0.4", + "semver-dsl": "^1.0.1", + "source-map": "^0.5.7", + "sprintf-js": "^1.1.2" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "dev": true + } + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "compare-versions": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.5.1.tgz", + "integrity": "sha512-9fGPIB7C6AyM18CJJBHt5EnCZDG3oiTJYy0NjfIAGjKpzv0tkxWko7TNQHF5ymqm7IH03tqmeuBxtvD+Izh6mg==", + "dev": true + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "dev": true + }, + "compressible": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", + "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==", + "dev": true, + "requires": { + "mime-db": ">= 1.40.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "^0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-webpack-plugin": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.0.4.tgz", + "integrity": "sha512-YBuYGpSzoCHSSDGyHy6VJ7SHojKp6WHT4D7ItcQFNAYx2hrwkMe56e97xfVR0/ovDuMTrMffXUiltvQljtAGeg==", + "dev": true, + "requires": { + "cacache": "^11.3.3", + "find-cache-dir": "^2.1.0", + "glob-parent": "^3.1.0", + "globby": "^7.1.1", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", + "minimatch": "^3.0.4", + "normalize-path": "^3.0.0", + "p-limit": "^2.2.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.7.0", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "cacache": { + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.3.tgz", + "integrity": "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + } + } + }, + "core-js": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.2.1.tgz", + "integrity": "sha512-Qa5XSVefSVPRxy2XfUC13WbvqkxhkwB3ve+pgCQveNgYzbM/UxZeu1dcOX/xr4UmfUd+muuvsaxilQzCyUurMw==", + "dev": true + }, + "core-js-compat": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.2.1.tgz", + "integrity": "sha512-MwPZle5CF9dEaMYdDeWm73ao/IflDH+FjeJCWEADcEgFSE9TLimFKwJsfmkwzI8eC0Aj0mgvMDjeQjrElkz4/A==", + "dev": true, + "requires": { + "browserslist": "^4.6.6", + "semver": "^6.3.0" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css-parse": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz", + "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=", + "dev": true + }, + "css-selector-tokenizer": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz", + "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==", + "dev": true, + "requires": { + "cssesc": "^0.1.0", + "fastparse": "^1.1.1", + "regexpu-core": "^1.0.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + }, + "regexpu-core": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", + "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", + "dev": true, + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + } + } + } + }, + "cssauron": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", + "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=", + "dev": true, + "requires": { + "through": "X.X.X" + } + }, + "cssesc": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", + "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", + "dev": true + }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "damerau-levenshtein": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.5.tgz", + "integrity": "sha512-CBCRqFnpu715iPmw1KrdOrzRqbdFwQTwAWyyyYS42+iAgHCuXZ+/TdMgQkUENPomxEz9z1BEzuQU2Xw0kUuAgA==", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "date-format": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", + "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", + "dev": true + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "debug": { + "version": "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" + } + }, + "debuglog": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", + "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", + "dev": true + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.0.tgz", + "integrity": "sha512-ZbfWJq/wN1Z273o7mUSjILYqehAktR2NVoSrOukDkU9kg2v/Uv89yU4Cvz8seJeAmtN5oqiefKq8FPuXOboqLw==", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + } + }, + "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=", + "dev": true, + "requires": { + "strip-bom": "^3.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" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "dependencies": { + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "dependency-graph": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.7.2.tgz", + "integrity": "sha512-KqtH4/EZdtdfWX0p6MGP9jljvxSY6msy/pRUD4jgNwVpv3v1QmNLlsB3LDSSUg79BRVSn7jI1QPRtArGABovAQ==", + "dev": true + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "dev": true + }, + "dezalgo": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", + "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "dev": true, + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "requires": { + "path-type": "^3.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "dev": true, + "requires": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.281", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.281.tgz", + "integrity": "sha512-oxXKngPjTWRmXFy4vV9FeAkPl7wU4xMejfOY+HXjGrj4T0z9l96loWWVDLJEtbT/aPKOWKrSz6xoYxd+YJ/gJA==", + "dev": true + }, + "elliptic": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.1.tgz", + "integrity": "sha512-xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "dev": true, + "requires": { + "iconv-lite": "~0.4.13" + } + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "engine.io": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", + "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.0", + "ws": "~3.3.1" + }, + "dependencies": { + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + } + } + }, + "engine.io-client": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", + "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.1", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "~3.3.1", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + } + } + }, + "engine.io-parser": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", + "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "err-code": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", + "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=", + "dev": true + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.15.0.tgz", + "integrity": "sha512-bhkEqWJ2t2lMeaJDuk7okMkJWI/yqgH/EoGwpcvv0XW9RWQsRspI4wt6xuyuvMvvQE3gg/D9HXppgk21w78GyQ==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.0", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-inspect": "^1.6.0", + "object-keys": "^1.1.1", + "string.prototype.trimleft": "^2.1.0", + "string.prototype.trimright": "^2.1.0" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "requires": { + "es6-promise": "^4.0.3" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "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 + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eventemitter3": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", + "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==", + "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==", + "dev": true + }, + "eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "dev": true, + "requires": { + "original": "^1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "dev": true + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "dev": true + }, + "figures": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.0.0.tgz", + "integrity": "sha512-HKri+WoWoUgr83pehn/SIgLOMZ9nAWC6dcGj26RY2R4F50u4+RTUz0RCrUlOV3nKRAICW1UGzyb+kcX2qK1S/g==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-loader": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.2.0.tgz", + "integrity": "sha512-+xZnaK5R8kBJrHK0/6HRlrKNamvVS5rjyuju+rnyxRGuwUJwpAMsVzUl5dz6rK8brkzjV6JpcFNjp6NqV0g1OQ==", + "dev": true, + "requires": { + "loader-utils": "^1.2.3", + "schema-utils": "^2.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.4.1.tgz", + "integrity": "sha512-RqYLpkPZX5Oc3fw/kHHHyP56fg5Y+XBpIpV8nCg0znIALfq3OH+Ea9Hfeac9BAMwG5IICltiZ0vxFvJQONfA5w==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + } + } + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "^7.0.3", + "minimatch": "^3.0.3" + } + }, + "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" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.0.0.tgz", + "integrity": "sha512-t7ulV1fmbxh5G9l/492O1p5+EBbr3uwpt6odhFTMc+nWyhmbloe+ja9BZ8pIBtqFWhOmCWVjx+pTW4zDkFoclw==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.0", + "pkg-dir": "^4.1.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "make-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", + "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", + "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" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + } + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "flatted": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", + "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "follow-redirects": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.9.0.tgz", + "integrity": "sha512-CRcPzsSIbXyVDl0QI01muNDu69S8trU4jArW9LpOt2WtC6LyUJetcIrmfHsRBx7/Jb6GHJUiuqyYxPooFfNt6A==", + "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" + } + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-access": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", + "dev": true, + "requires": { + "null-check": "^1.0.0" + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "dev": true, + "requires": { + "minipass": "^2.6.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=", + "dev": true + }, + "fsevents": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.0.tgz", + "integrity": "sha512-+iXhW3LuDQsno8dOIrCIT/CBjeBWuP7PXe8w9shnj9Lebny/Gx1ZjVBYwexLz36Ri2jKuXMNpV6CYNh8lHHgrQ==", + "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 + }, + "genfun": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", + "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", + "dev": true + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "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 + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "graceful-fs": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", + "dev": true + }, + "hammerjs": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", + "integrity": "sha1-BO93hiz/K7edMPdpIJWTAiK/YPE=" + }, + "handle-thing": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", + "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", + "dev": true + }, + "handlebars": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.4.3.tgz", + "integrity": "sha512-B0W4A2U1ww3q7VVthTKfh+epHx+q4mCt6iK+zEAzbMBpWQAwxCeKxEGpj/1oQTpzPXDNSOG7hmG14TsISH50yw==", + "dev": true, + "requires": { + "neo-async": "^2.6.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + }, + "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 + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "dev": true, + "requires": { + "isarray": "2.0.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "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", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true + }, + "http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", + "dev": true + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "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==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "dev": true, + "requires": { + "agent-base": "4", + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "https-proxy-agent": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.2.tgz", + "integrity": "sha512-c8Ndjc9Bkpfx/vCJueCPy0jlP4ccCCSNDp8xwCZzPjKJUm+B+u9WX2x98Qx4n1PiMNTWo3D7KK5ifNV/yJyRzg==", + "dev": true, + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.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" + } + } + } + }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "dev": true, + "requires": { + "ms": "^2.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "ignore-walk": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "optional": true + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "dev": true + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "dev": true, + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "inquirer": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.1.tgz", + "integrity": "sha512-uxNHBeQhRXIoHWTSNYUFhQVrHYFThIt6IVo2fFmSe8aBwdR3/w6b58hJpiL/fMukFkvGzjg+hSxFtwvVmKZmXw==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^2.4.2", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^4.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "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 + }, + "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 + }, + "string-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.1.0.tgz", + "integrity": "sha512-NrX+1dVVh+6Y9dnQ19pR0pP4FiEIlUvdTGn8pw6CKTNq5sgib2nIhmUNT5TAmhWmvKr3WcxBcP3E8nWezuipuQ==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^5.2.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" + } + } + } + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.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", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "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==", + "dev": true + }, + "is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "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": "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": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.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 + }, + "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-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-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "requires": { + "is-path-inside": "^2.1.0" + } + }, + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isbinaryfile": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", + "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "dev": true, + "requires": { + "buffer-alloc": "^1.2.0" + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul-api": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-2.1.6.tgz", + "integrity": "sha512-x0Eicp6KsShG1k1rMgBAi/1GgY7kFGEBwQpw3PXGEmu+rBcBNhqU8g2DgY9mlepAsLPzrzrbqSgCGANnki4POA==", + "dev": true, + "requires": { + "async": "^2.6.2", + "compare-versions": "^3.4.0", + "fileset": "^2.0.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", + "minimatch": "^3.0.4", + "once": "^1.4.0" + }, + "dependencies": { + "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==", + "dev": true + }, + "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" + } + } + } + }, + "istanbul-instrumenter-loader": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz", + "integrity": "sha512-a5SPObZgS0jB/ixaKSMdn6n/gXSrK2S6q/UfRJBT3e6gQmVjwZROTODQsYW5ZNwOu78hG62Y3fWlebaVOL0C+w==", + "dev": true, + "requires": { + "convert-source-map": "^1.5.0", + "istanbul-lib-instrument": "^1.7.3", + "loader-utils": "^1.1.0", + "schema-utils": "^0.3.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "dev": true, + "requires": { + "ajv": "^5.0.0" + } + } + } + }, + "istanbul-lib-coverage": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", + "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", + "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==", + "dev": true, + "requires": { + "append-transform": "^1.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", + "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", + "dev": true, + "requires": { + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.2.1", + "semver": "^5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "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==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "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==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "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==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "dependencies": { + "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==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", + "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", + "dev": true, + "requires": { + "handlebars": "^4.1.2" + } + }, + "jasmine": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", + "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", + "dev": true, + "requires": { + "exit": "^0.1.2", + "glob": "^7.0.6", + "jasmine-core": "~2.8.0" + }, + "dependencies": { + "jasmine-core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", + "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=", + "dev": true + } + } + }, + "jasmine-core": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.4.0.tgz", + "integrity": "sha512-HU/YxV4i6GcmiH4duATwAbJQMlE0MsDIR5XmSVxURxKHn3aGAdbY1/ZJFmVRbKtnLwIxxMJD7gYaPsypcbYimg==", + "dev": true + }, + "jasmine-spec-reporter": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz", + "integrity": "sha512-FZBoZu7VE5nR7Nilzy+Np8KuVIOxF4oXDPDknehCYBDE080EnlPu0afdZNmpGDBRCUBv3mj5qgqCRmk6W/K8vg==", + "dev": true, + "requires": { + "colors": "1.1.2" + } + }, + "jasminewd2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", + "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=", + "dev": true + }, + "jest-worker": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", + "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "dev": true, + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "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" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jszip": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.2.tgz", + "integrity": "sha512-NmKajvAFQpbg3taXQXr/ccS2wcucR1AZ+NtyWp2Nq7HHVsXhcJFR8p0Baf32C2yVvBylFWVeKf+WI2AnvlPhpA==", + "dev": true, + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + } + }, + "karma": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/karma/-/karma-4.1.0.tgz", + "integrity": "sha512-xckiDqyNi512U4dXGOOSyLKPwek6X/vUizSy2f3geYevbLj+UIdvNwbn7IwfUIL2g1GXEPWt/87qFD1fBbl/Uw==", + "dev": true, + "requires": { + "bluebird": "^3.3.0", + "body-parser": "^1.16.1", + "braces": "^2.3.2", + "chokidar": "^2.0.3", + "colors": "^1.1.0", + "connect": "^3.6.0", + "core-js": "^2.2.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.0", + "flatted": "^2.0.0", + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "http-proxy": "^1.13.0", + "isbinaryfile": "^3.0.0", + "lodash": "^4.17.11", + "log4js": "^4.0.0", + "mime": "^2.3.1", + "minimatch": "^3.0.2", + "optimist": "^0.6.1", + "qjobs": "^1.1.4", + "range-parser": "^1.2.0", + "rimraf": "^2.6.0", + "safe-buffer": "^5.0.1", + "socket.io": "2.1.1", + "source-map": "^0.6.1", + "tmp": "0.0.33", + "useragent": "2.3.0" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "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 + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "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" + } + }, + "core-js": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", + "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==", + "dev": true + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "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.1", + "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": "4.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "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.3.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "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.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "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.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "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.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "dev": true + }, + "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" + } + }, + "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 + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "karma-chrome-launcher": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz", + "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==", + "dev": true, + "requires": { + "fs-access": "^1.0.0", + "which": "^1.2.1" + } + }, + "karma-coverage-istanbul-reporter": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.0.6.tgz", + "integrity": "sha512-WFh77RI8bMIKdOvI/1/IBmgnM+Q7NOLhnwG91QJrM8lW+CIXCjTzhhUsT/svLvAkLmR10uWY4RyYbHMLkTglvg==", + "dev": true, + "requires": { + "istanbul-api": "^2.1.6", + "minimatch": "^3.0.4" + } + }, + "karma-jasmine": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-2.0.1.tgz", + "integrity": "sha512-iuC0hmr9b+SNn1DaUD2QEYtUxkS1J+bSJSn7ejdEexs7P8EYvA1CWkEdrDQ+8jVH3AgWlCNwjYsT1chjcNW9lA==", + "dev": true, + "requires": { + "jasmine-core": "^3.3" + } + }, + "karma-jasmine-html-reporter": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.4.2.tgz", + "integrity": "sha512-7g0gPj8+9JepCNJR9WjDyQ2RkZ375jpdurYQyAYv8PorUCadepl8vrD6LmMqOGcM17cnrynBawQYZHaumgDjBw==", + "dev": true + }, + "karma-source-map-support": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", + "dev": true, + "requires": { + "source-map-support": "^0.5.5" + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "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" + } + }, + "less": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/less/-/less-3.9.0.tgz", + "integrity": "sha512-31CmtPEZraNUtuUREYjSqRkeETFdyEHSEPAGq4erDlUXtda7pzNmctdljdIagSb589d/qXGWiiP31R5JVf+v0w==", + "dev": true, + "requires": { + "clone": "^2.1.2", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "mime": "^1.4.1", + "mkdirp": "^0.5.0", + "promise": "^7.1.1", + "request": "^2.83.0", + "source-map": "~0.6.0" + }, + "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, + "optional": true + } + } + }, + "less-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-5.0.0.tgz", + "integrity": "sha512-bquCU89mO/yWLaUq0Clk7qCsKhsF/TZpJUzETRvJa9KSVEL9SO3ovCvdEHISBhrC81OwC8QSVX7E0bzElZj9cg==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "loader-utils": "^1.1.0", + "pify": "^4.0.1" + } + }, + "license-webpack-plugin": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.1.2.tgz", + "integrity": "sha512-7poZHRla+ae0eEButlwMrPpkXyhNVBf2EHePYWT0jyLnI6311/OXJkTI2sOIRungRpQgU2oDMpro5bSFPT5F0A==", + "dev": true, + "requires": { + "@types/webpack-sources": "^0.1.5", + "webpack-sources": "^1.2.0" + } + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "requires": { + "immediate": "~3.0.5" + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "log4js": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-4.5.1.tgz", + "integrity": "sha512-EEEgFcE9bLgaYUKuozyFfytQM2wDHtXn4tAN41pkaxpNjAykv11GVdeI4tHtmPWW4Xrgh9R/2d7XYghDVjbKKw==", + "dev": true, + "requires": { + "date-format": "^2.0.0", + "debug": "^4.1.1", + "flatted": "^2.0.0", + "rfdc": "^1.1.4", + "streamroller": "^1.0.6" + } + }, + "loglevel": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.4.tgz", + "integrity": "sha512-p0b6mOGKcGa+7nnmKbpzR6qloPbrgLcnio++E+14Vo/XffOGwZtRpUhr8dTH/x2oCMmEoIU0Zwm3ZauhvYD17g==", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "magic-string": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.3.tgz", + "integrity": "sha512-6QK0OpF/phMz0Q2AxILkX2mFhi7m+WMwTRg0LQKq/WBB0cDP4rYH3Wp4/d3OTXlrPLVJT/RFqj8tFeAR4nk8AA==", + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "make-error": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "dev": true + }, + "make-fetch-happen": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.0.tgz", + "integrity": "sha512-nFr/vpL1Jc60etMVKeaLOqfGjMMb3tAHFVJWxHOFCFS04Zmd7kGlMxo0l1tzfhoQje0/UPnd0X8OeGUiXXnfPA==", + "dev": true, + "requires": { + "agentkeepalive": "^3.4.1", + "cacache": "^12.0.0", + "http-cache-semantics": "^3.8.1", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.1", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "node-fetch-npm": "^2.0.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^4.0.0", + "ssri": "^6.0.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", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "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-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "dev": true + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "dev": true, + "requires": { + "mime-db": "1.40.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 + }, + "mini-css-extract-plugin": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.0.tgz", + "integrity": "sha512-MNpRGbNA52q6U92i0qbVpQNsgk7LExy41MdAlG84FeytfDOtRIf/mCHdEgG8rpTKOaNKiqUnZdlptF469hxqOw==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "dev": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "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 + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-fetch-npm": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz", + "integrity": "sha512-nJIxm1QmAj4v3nfCvEeCrYSoVwXyxLnaPBK5W1W5DGEJwjlKuC2VEUycGw5oxk+4zZahRrB84PUJJgEmhFTDFw==", + "dev": true, + "requires": { + "encoding": "^0.1.11", + "json-parse-better-errors": "^1.0.0", + "safe-buffer": "^5.1.1" + } + }, + "node-forge": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", + "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==", + "dev": true + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "node-releases": { + "version": "1.1.35", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.35.tgz", + "integrity": "sha512-JGcM/wndCN/2elJlU0IGdVEJQQnJwsLbgPCFd2pY7V0mxf17bZ0Gb/lgOtL29ZQhvEX5shnVhxQyZz3ex94N8w==", + "dev": true, + "requires": { + "semver": "^6.3.0" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + }, + "npm-bundled": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz", + "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", + "dev": true + }, + "npm-package-arg": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.0.tgz", + "integrity": "sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.6.0", + "osenv": "^0.1.5", + "semver": "^5.5.0", + "validate-npm-package-name": "^3.0.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "npm-packlist": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.6.tgz", + "integrity": "sha512-u65uQdb+qwtGvEJh/DgQgW1Xg7sqeNbmxYyrvlNznaVTjV3E5P6F/EFjM+BVHXl7JJlsdG8A64M0XI8FI/IOlg==", + "dev": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npm-pick-manifest": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz", + "integrity": "sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "npm-package-arg": "^6.0.0", + "semver": "^5.4.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "npm-registry-fetch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.2.tgz", + "integrity": "sha512-Z0IFtPEozNdeZRPh3aHHxdG+ZRpzcbQaJLthsm3VhNf6DScicTFRHZzK82u8RsJUsUHkX+QH/zcB/5pmd20H4A==", + "dev": true, + "requires": { + "JSONStream": "^1.3.4", + "bluebird": "^3.5.1", + "figgy-pudding": "^3.4.1", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^5.0.0", + "npm-package-arg": "^6.1.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true + } + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "null-check": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", + "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", + "dev": true + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", + "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", + "dev": true + }, + "object-is": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", + "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + } + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "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" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "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.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "requires": { + "retry": "^0.12.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 + }, + "pacote": { + "version": "9.5.5", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.5.tgz", + "integrity": "sha512-jAEP+Nqj4kyMWyNpfTU/Whx1jA7jEc5cCOlurm0/0oL+v8TAp1QSsK83N7bYe+2bEdFzMAtPG5TBebjzzGV0cA==", + "dev": true, + "requires": { + "bluebird": "^3.5.3", + "cacache": "^12.0.2", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.1.0", + "glob": "^7.1.3", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^5.0.0", + "minimatch": "^3.0.4", + "minipass": "^2.3.5", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "normalize-package-data": "^2.4.0", + "npm-package-arg": "^6.1.0", + "npm-packlist": "^1.1.12", + "npm-pick-manifest": "^2.2.3", + "npm-registry-fetch": "^4.0.0", + "osenv": "^0.1.5", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "protoduck": "^5.0.1", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.2", + "semver": "^5.6.0", + "ssri": "^6.0.1", + "tar": "^4.4.8", + "unique-filename": "^1.1.1", + "which": "^1.3.1" + }, + "dependencies": { + "npm-pick-manifest": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz", + "integrity": "sha512-+IluBC5K201+gRU85vFlUwX3PFShZAbAgDNp2ewJdWMVSppdo/Zih0ul2Ecky/X7b51J7LrrUAP+XOmOCvYZqA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "npm-package-arg": "^6.0.0", + "semver": "^5.4.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "pako": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", + "dev": true + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-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" + } + }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, + "parse5-html-rewriting-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-5.1.0.tgz", + "integrity": "sha512-hZlaOTHJs4dpC5yFHnOSEMh26ErsqTsLzxKqkuRcUqtiu0kMsBQ9pkgANkECDyoBUhJ3+hvb2DPLsyqbtcS61Q==", + "requires": { + "parse5": "^5.1.0", + "parse5-sax-parser": "^5.1.0" + }, + "dependencies": { + "parse5": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==" + } + } + }, + "parse5-sax-parser": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-5.1.0.tgz", + "integrity": "sha512-VEhdEDhBkoSILPmsZ96SoIIUow3hZbtgQsqXw7r8DxxnqsCIO0fwkT9mWgBcf9SPjVUh92liuEprHrrYzXBPWQ==", + "requires": { + "parse5": "^5.1.0" + }, + "dependencies": { + "parse5": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==" + } + } + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "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==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "picomatch": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.0.7.tgz", + "integrity": "sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "portfinder": { + "version": "1.0.24", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.24.tgz", + "integrity": "sha512-ekRl7zD2qxYndYflwiryJwMioBI7LI7rVXg3EnLK3sjkouT5eOuhS3gS255XxBksa30VG8UPZYZCdgfGOfkSUg==", + "dev": true, + "requires": { + "async": "^1.5.2", + "debug": "^2.2.0", + "mkdirp": "0.5.x" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-import": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-12.0.1.tgz", + "integrity": "sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==", + "dev": true, + "requires": { + "postcss": "^7.0.1", + "postcss-value-parser": "^3.2.3", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-load-config": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", + "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + } + }, + "postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + } + }, + "postcss-value-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz", + "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "optional": true, + "requires": { + "asap": "~2.0.3" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "promise-retry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", + "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", + "dev": true, + "requires": { + "err-code": "^1.0.0", + "retry": "^0.10.0" + }, + "dependencies": { + "retry": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", + "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", + "dev": true + } + } + }, + "protoduck": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", + "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", + "dev": true, + "requires": { + "genfun": "^5.0.0" + } + }, + "protractor": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.4.2.tgz", + "integrity": "sha512-zlIj64Cr6IOWP7RwxVeD8O4UskLYPoyIcg0HboWJL9T79F1F0VWtKkGTr/9GN6BKL+/Q/GmM7C9kFVCfDbP5sA==", + "dev": true, + "requires": { + "@types/q": "^0.0.32", + "@types/selenium-webdriver": "^3.0.0", + "blocking-proxy": "^1.0.0", + "browserstack": "^1.5.1", + "chalk": "^1.1.3", + "glob": "^7.0.3", + "jasmine": "2.8.0", + "jasminewd2": "^2.1.0", + "optimist": "~0.6.0", + "q": "1.4.1", + "saucelabs": "^1.5.0", + "selenium-webdriver": "3.6.0", + "source-map-support": "~0.4.0", + "webdriver-js-extender": "2.1.0", + "webdriver-manager": "^12.0.6" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + } + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "webdriver-manager": { + "version": "12.1.7", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.7.tgz", + "integrity": "sha512-XINj6b8CYuUYC93SG3xPkxlyUc3IJbD6Vvo75CVGuG9uzsefDzWQrhz0Lq8vbPxtb4d63CZdYophF8k8Or/YiA==", + "dev": true, + "requires": { + "adm-zip": "^0.4.9", + "chalk": "^1.1.1", + "del": "^2.2.0", + "glob": "^7.0.3", + "ini": "^1.3.4", + "minimist": "^1.2.0", + "q": "^1.4.1", + "request": "^2.87.0", + "rimraf": "^2.5.2", + "semver": "^5.3.0", + "xml2js": "^0.4.17" + } + } + } + }, + "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==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.0" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz", + "integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", + "dev": true + }, + "qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dev": true, + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "querystringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", + "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + } + } + }, + "raw-loader": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-3.1.0.tgz", + "integrity": "sha512-lzUVMuJ06HF4rYveaz9Tv0WRlUMxJ0Y1hgSkkgg+50iEdaI0TthyEDe08KIHb0XsF6rn8WYTqPCaGTZg3sX+qA==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "schema-utils": "^2.0.1" + }, + "dependencies": { + "schema-utils": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.4.1.tgz", + "integrity": "sha512-RqYLpkPZX5Oc3fw/kHHHyP56fg5Y+XBpIpV8nCg0znIALfq3OH+Ea9Hfeac9BAMwG5IICltiZ0vxFvJQONfA5w==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + } + } + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "requires": { + "pify": "^2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "read-package-json": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.0.tgz", + "integrity": "sha512-KLhu8M1ZZNkMcrq1+0UJbR8Dii8KZUqB0Sha4mOx/bknfKI/fyrQVrG/YIt2UOtG667sD8+ee4EXMM91W9dC+A==", + "dev": true, + "requires": { + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "json-parse-better-errors": "^1.0.1", + "normalize-package-data": "^2.0.0", + "slash": "^1.0.0" + } + }, + "read-package-tree": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.3.1.tgz", + "integrity": "sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw==", + "dev": true, + "requires": { + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0", + "util-promisify": "^2.1.0" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "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" + } + }, + "readdir-scoped-modules": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", + "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", + "dev": true, + "requires": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "readdirp": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.1.3.tgz", + "integrity": "sha512-ZOsfTGkjO2kqeR5Mzr5RYDbTGYneSkdNKX2fOX2P5jF7vMrd/GNnIAUtDldeHHumHUCQ3V05YfWUdxMPAsRu9Q==", + "dev": true, + "requires": { + "picomatch": "^2.0.4" + } + }, + "reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "dev": true + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz", + "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", + "dev": true + }, + "regenerator-transform": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz", + "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==", + "dev": true, + "requires": { + "private": "^0.1.6" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexp.prototype.flags": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz", + "integrity": "sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2" + } + }, + "regexpu-core": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz", + "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.1.0", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.1.0" + } + }, + "regjsgen": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", + "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", + "dev": true + }, + "regjsparser": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", + "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + }, + "rfdc": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz", + "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sass": { + "version": "1.22.9", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.22.9.tgz", + "integrity": "sha512-FzU1X2V8DlnqabrL4u7OBwD2vcOzNMongEJEx3xMEhWY/v26FFR3aG0hyeu2T965sfR0E9ufJwmG+Qjz78vFPQ==", + "dev": true, + "requires": { + "chokidar": ">=2.0.0 <4.0.0" + } + }, + "sass-loader": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.2.0.tgz", + "integrity": "sha512-h8yUWaWtsbuIiOCgR9fd9c2lRXZ2uG+h8Dzg/AGNj+Hg/3TO8+BBAW9mEP+mh8ei+qBKqSJ0F1FLlYjNBc61OA==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "loader-utils": "^1.0.1", + "neo-async": "^2.5.0", + "pify": "^4.0.1", + "semver": "^5.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 + } + } + }, + "saucelabs": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", + "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", + "dev": true, + "requires": { + "https-proxy-agent": "^2.2.1" + } + }, + "sax": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", + "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selenium-webdriver": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", + "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", + "dev": true, + "requires": { + "jszip": "^3.1.3", + "rimraf": "^2.5.4", + "tmp": "0.0.30", + "xml2js": "^0.4.17" + }, + "dependencies": { + "tmp": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", + "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.1" + } + } + } + }, + "selfsigned": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", + "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", + "dev": true, + "requires": { + "node-forge": "0.9.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "semver-dsl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz", + "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=", + "dev": true, + "requires": { + "semver": "^5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "semver-intersect": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.4.0.tgz", + "integrity": "sha512-d8fvGg5ycKAq0+I6nfWeCx6ffaWJCsBYU0H2Rq56+/zFePYfT8mXkB3tWBSjR5BerkHNZ5eTPIk1/LBYas35xQ==", + "dev": true, + "requires": { + "semver": "^5.0.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", + "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==", + "dev": true + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shallow-clone": { + "version": "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", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "smart-buffer": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.0.2.tgz", + "integrity": "sha512-JDhEpTKzXusOqXZ0BUIdH+CjFdO/CR3tLlf5CN34IypI+xMmXW1uB16OOY8z3cICbJlDAVJzNbwBhNO0wt9OAw==", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "socket.io": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", + "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", + "dev": true, + "requires": { + "debug": "~3.1.0", + "engine.io": "~3.2.0", + "has-binary2": "~1.0.2", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.1.1", + "socket.io-parser": "~3.2.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "socket.io-adapter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", + "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=", + "dev": true + }, + "socket.io-client": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", + "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", + "dev": true, + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "engine.io-client": "~3.2.0", + "has-binary2": "~1.0.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "~3.2.0", + "to-array": "0.1.4" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "socket.io-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", + "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "dev": true, + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.0.1" + } + }, + "sockjs-client": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz", + "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", + "dev": true, + "requires": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + }, + "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" + } + }, + "faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + } + } + }, + "socks": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.2.tgz", + "integrity": "sha512-pCpjxQgOByDHLlNqlnh/mNSAxIUkyBBuwwhTcV+enZGbDaClPvHdvm6uvOwZfFJkam7cGhBNbb4JxiP8UZkRvQ==", + "dev": true, + "requires": { + "ip": "^1.1.5", + "smart-buffer": "4.0.2" + } + }, + "socks-proxy-agent": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", + "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", + "dev": true, + "requires": { + "agent-base": "~4.2.1", + "socks": "~2.3.2" + }, + "dependencies": { + "agent-base": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + } + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + }, + "source-map-loader": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-0.2.4.tgz", + "integrity": "sha512-OU6UJUty+i2JDpTItnizPrlpOIBLmQbWMuBg9q5bVtnHACqw1tn9nNwqJLbv0/00JjnJb/Ee5g5WS5vrRv7zIQ==", + "dev": true, + "requires": { + "async": "^2.5.0", + "loader-utils": "^1.1.0" + } + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "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 + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "sourcemap-codec": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz", + "integrity": "sha512-1ZooVLYFxC448piVLBbtOxFcXwnymH9oUF8nRd3CuYDVvkRBxRl6pB4Mtas5a4drtL+E8LDgFkQNcgIw6tc8Hg==" + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, + "spdy": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz", + "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + }, + "dependencies": { + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "speed-measure-webpack-plugin": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.3.1.tgz", + "integrity": "sha512-qVIkJvbtS9j/UeZumbdfz0vg+QfG/zxonAjzefZrqzkr7xOncLVXkeGbTpzd1gjCBM4PmVNkWlkeTVhgskAGSQ==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "streamroller": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-1.0.6.tgz", + "integrity": "sha512-3QC47Mhv3/aZNFpDDVO44qQb9gwB9QggMEE0sQmkTAwBVYdBRWISdsywlkfm5II1Q5y/pmrHflti/IgmIzdDBg==", + "dev": true, + "requires": { + "async": "^2.6.2", + "date-format": "^2.0.0", + "debug": "^3.2.6", + "fs-extra": "^7.0.1", + "lodash": "^4.17.14" + }, + "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" + } + } + } + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "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" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string.prototype.trimleft": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", + "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", + "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "style-loader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.0.0.tgz", + "integrity": "sha512-B0dOCFwv7/eY31a5PCieNwMgMhVGFe9w+rh7s/Bx8kfFkrth9zfTZquoYvdw8URgiqxObQKcpW51Ugz1HjfdZw==", + "dev": true, + "requires": { + "loader-utils": "^1.2.3", + "schema-utils": "^2.0.1" + }, + "dependencies": { + "schema-utils": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.4.1.tgz", + "integrity": "sha512-RqYLpkPZX5Oc3fw/kHHHyP56fg5Y+XBpIpV8nCg0znIALfq3OH+Ea9Hfeac9BAMwG5IICltiZ0vxFvJQONfA5w==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + } + } + }, + "stylus": { + "version": "0.54.5", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.5.tgz", + "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=", + "dev": true, + "requires": { + "css-parse": "1.7.x", + "debug": "*", + "glob": "7.0.x", + "mkdirp": "0.5.x", + "sax": "0.5.x", + "source-map": "0.1.x" + }, + "dependencies": { + "glob": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", + "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "stylus-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-3.0.2.tgz", + "integrity": "sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "lodash.clonedeep": "^4.5.0", + "when": "~3.6.x" + } + }, + "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" + } + }, + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "dev": true + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "dev": 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" + } + }, + "terser": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.3.8.tgz", + "integrity": "sha512-otmIRlRVmLChAWsnSFNO0Bfk6YySuBp6G9qrHiJwlLDd4mxe2ta4sjI7TzIR+W1nBMjilzrMcPOz9pSusgx3hQ==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "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 + } + } + }, + "terser-webpack-plugin": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz", + "integrity": "sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg==", + "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": "^1.7.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "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 + } + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "thunky": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz", + "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==", + "dev": true + }, + "timers-browserify": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "dev": true + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "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" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "tree-kill": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.1.tgz", + "integrity": "sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "ts-node": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", + "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "dev": true, + "requires": { + "arrify": "^1.0.0", + "buffer-from": "^1.1.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.6", + "yn": "^2.0.0" + } + }, + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" + }, + "tslint": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.15.0.tgz", + "integrity": "sha512-6bIEujKR21/3nyeoX2uBnE8s+tMXCQXhqMmaIPJpHmXJoBJPTLcI7/VHRtUwMhnLVdwLqqY3zmd8Dxqa5CVdJA==", + "dev": true, + "requires": { + "babel-code-frame": "^6.22.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^3.2.0", + "glob": "^7.1.1", + "js-yaml": "^3.13.0", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.29.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type-fest": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.5.2.tgz", + "integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typescript": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.3.tgz", + "integrity": "sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g==", + "dev": true + }, + "uglify-js": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.1.tgz", + "integrity": "sha512-+dSJLJpXBb6oMHP+Yvw8hUgElz4gLTh82XuX68QiJVTXaE5ibl6buzhNkQdYhBlIhozWOC9ge16wyRmjG4TwVQ==", + "dev": true, + "optional": true, + "requires": { + "commander": "2.20.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true, + "optional": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "dev": true + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.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==", + "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==", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "universal-analytics": { + "version": "0.4.20", + "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.20.tgz", + "integrity": "sha512-gE91dtMvNkjO+kWsPstHRtSwHXz0l2axqptGYp5ceg4MsuurloM0PU3pdOfpb5zBXUvyjT4PwhWK2m39uczZuw==", + "dev": true, + "requires": { + "debug": "^3.0.0", + "request": "^2.88.0", + "uuid": "^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" + } + } + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-parse": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "useragent": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", + "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==", + "dev": true, + "requires": { + "lru-cache": "4.1.x", + "tmp": "0.0.x" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util-promisify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/util-promisify/-/util-promisify-2.1.0.tgz", + "integrity": "sha1-PCI2R2xNMsX/PEcAKt18E7moKlM=", + "dev": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", + "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" + } + }, + "validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "dev": true, + "requires": { + "builtins": "^1.0.3" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vm-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", + "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==", + "dev": true + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "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 + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "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" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "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.1", + "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": "4.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "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.3.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "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.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "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.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "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.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "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" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "webdriver-js-extender": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz", + "integrity": "sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ==", + "dev": true, + "requires": { + "@types/selenium-webdriver": "^3.0.0", + "selenium-webdriver": "^3.0.1" + } + }, + "webpack": { + "version": "4.39.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.39.2.tgz", + "integrity": "sha512-AKgTfz3xPSsEibH00JfZ9sHXGUwIQ6eZ9tLN8+VLzachk1Cw2LVmy+4R7ZiwTa9cZZ15tzySjeMui/UnSCAZhA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/wasm-edit": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "acorn": "^6.2.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.1", + "watchpack": "^1.6.0", + "webpack-sources": "^1.4.1" + } + }, + "webpack-core": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", + "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", + "dev": true, + "requires": { + "source-list-map": "~0.1.7", + "source-map": "~0.4.1" + }, + "dependencies": { + "source-list-map": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", + "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=", + "dev": true + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "webpack-dev-middleware": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.0.tgz", + "integrity": "sha512-qvDesR1QZRIAZHOE3iQ4CXLZZSQ1lAUsSpnQmlB1PBfoN/xdRjmge3Dok0W4IdaVLJOGJy3sGI4sZHwjRU0PCA==", + "dev": true, + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.2", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "dev": true + } + } + }, + "webpack-dev-server": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.8.0.tgz", + "integrity": "sha512-Hs8K9yI6pyMvGkaPTeTonhD6JXVsigXDApYk9JLW4M7viVBspQvb1WdAcWxqtmttxNW4zf2UFLsLNe0y87pIGQ==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.6", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.2.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.0", + "killable": "^1.0.1", + "loglevel": "^1.6.3", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.21", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.4", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "0.3.19", + "sockjs-client": "1.3.0", + "spdy": "^4.0.1", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.0", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "12.0.5" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "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 + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "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" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "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.1", + "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": "4.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "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.3.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "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.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "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.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "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.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "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" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + } + }, + "webpack-merge": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.1.tgz", + "integrity": "sha512-4p8WQyS98bUJcCvFMbdGZyZmsKuWjWVnVHnAS3FFg0HDaRVrPbkivx2RYCre8UiemD67RsiFFLfn4JhLAin8Vw==", + "dev": true, + "requires": { + "lodash": "^4.17.5" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "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 + } + } + }, + "webpack-subresource-integrity": { + "version": "1.1.0-rc.6", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.1.0-rc.6.tgz", + "integrity": "sha512-Az7y8xTniNhaA0620AV1KPwWOqawurVVDzQSpPAeR5RwNbL91GoBSJAAo9cfd+GiFHwsS5bbHepBw1e6Hzxy4w==", + "dev": true, + "requires": { + "webpack-core": "^0.6.8" + } + }, + "websocket-driver": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", + "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", + "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==", + "dev": true + }, + "when": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/when/-/when-3.6.4.tgz", + "integrity": "sha1-RztRfsFZ4rhQBUl6E5g/CVQS404=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "worker-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/worker-plugin/-/worker-plugin-3.2.0.tgz", + "integrity": "sha512-W5nRkw7+HlbsEt3qRP6MczwDDISjiRj2GYt9+bpe8A2La00TmJdwzG5bpdMXhRt1qcWmwAvl1TiKaHRa+XDS9Q==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xml2js": { + "version": "0.4.22", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.22.tgz", + "integrity": "sha512-MWTbxAQqclRSTnehWWe5nMKzI3VmJ8ltiJEco8akcC6j3miOhjjfzKum5sId+CWhfxdOs/1xauYr8/ZDBtQiRw==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "util.promisify": "~1.0.0", + "xmlbuilder": "~11.0.0" + }, + "dependencies": { + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + } + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true + }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "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 + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true + }, + "yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "dev": true + }, + "zone.js": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.9.1.tgz", + "integrity": "sha512-GkPiJL8jifSrKReKaTZ5jkhrMEgXbXYC+IPo1iquBjayRa0q86w3Dipjn8b415jpitMExe9lV8iTsv8tk3DGag==" + } + } +} diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 00000000..770e10d8 --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,53 @@ +{ + "name": "fiasco", + "version": "0.0.0", + "scripts": { + "ng": "ng", + "start": "ng serve", + "build": "ng build", + "test": "ng test", + "lint": "ng lint", + "e2e": "ng e2e" + }, + "private": true, + "dependencies": { + "@angular/animations": "~8.2.9", + "@angular/cdk": "~8.2.3", + "@angular/common": "~8.2.9", + "@angular/compiler": "~8.2.9", + "@angular/core": "~8.2.9", + "@angular/flex-layout": "^8.0.0-beta.27", + "@angular/forms": "~8.2.9", + "@angular/material": "^8.2.3", + "@angular/platform-browser": "~8.2.9", + "@angular/platform-browser-dynamic": "~8.2.9", + "@angular/pwa": "^0.803.9", + "@angular/router": "~8.2.9", + "@angular/service-worker": "~8.2.9", + "hammerjs": "^2.0.8", + "rxjs": "~6.4.0", + "tslib": "^1.10.0", + "zone.js": "~0.9.1" + }, + "devDependencies": { + "@angular-devkit/build-angular": "~0.803.9", + "@angular/cli": "~8.3.9", + "@angular/compiler-cli": "~8.2.9", + "@angular/language-service": "~8.2.9", + "@types/node": "~8.9.4", + "@types/jasmine": "~3.3.8", + "@types/jasminewd2": "~2.0.3", + "codelyzer": "^5.0.0", + "jasmine-core": "~3.4.0", + "jasmine-spec-reporter": "~4.2.1", + "karma": "~4.1.0", + "karma-chrome-launcher": "~2.2.0", + "karma-coverage-istanbul-reporter": "~2.0.1", + "karma-jasmine": "~2.0.1", + "karma-jasmine-html-reporter": "^1.4.0", + "protractor": "~5.4.0", + "ts-node": "~7.0.0", + "tslint": "~5.15.0", + "typescript": "~3.5.3" + } +} diff --git a/frontend/src/app/app-routing.module.ts b/frontend/src/app/app-routing.module.ts new file mode 100644 index 00000000..36e181ae --- /dev/null +++ b/frontend/src/app/app-routing.module.ts @@ -0,0 +1,35 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; + +const routes: Routes = [ + { + path: 'login', + loadChildren: () => import('./views/login/login.module').then(m => m.LoginModule) + }, + { + path: 'register', + loadChildren: () => import('./views/register/register.module').then(m => m.RegisterModule) + }, + { + path: 'homepage', + loadChildren: () => import('./views/homepage/homepage.module').then(m => m.HomepageModule) + }, + { + path: 'area/:areaId', + loadChildren: () => import('./views/area/area.module').then(m => m.AreaModule) + }, + { + path: 'not-found', + loadChildren: () => import('./views/not-found/not-found.module').then(m => m.NotFoundModule) + }, + { + path: '**', + redirectTo: 'not-found' + } +]; + +@NgModule({ + imports: [RouterModule.forRoot(routes)], + exports: [RouterModule] +}) +export class AppRoutingModule {} diff --git a/frontend/src/app/app.component.html b/frontend/src/app/app.component.html new file mode 100644 index 00000000..0680b43f --- /dev/null +++ b/frontend/src/app/app.component.html @@ -0,0 +1 @@ + diff --git a/frontend/src/app/app.component.scss b/frontend/src/app/app.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/frontend/src/app/app.component.spec.ts b/frontend/src/app/app.component.spec.ts new file mode 100644 index 00000000..a23e6fc3 --- /dev/null +++ b/frontend/src/app/app.component.spec.ts @@ -0,0 +1,35 @@ +import { TestBed, async } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; +import { AppComponent } from './app.component'; + +describe('AppComponent', () => { + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [ + RouterTestingModule + ], + declarations: [ + AppComponent + ], + }).compileComponents(); + })); + + it('should create the app', () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.debugElement.componentInstance; + expect(app).toBeTruthy(); + }); + + it(`should have as title 'fiasco'`, () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.debugElement.componentInstance; + expect(app.title).toEqual('fiasco'); + }); + + it('should render title', () => { + const fixture = TestBed.createComponent(AppComponent); + fixture.detectChanges(); + const compiled = fixture.debugElement.nativeElement; + expect(compiled.querySelector('.content span').textContent).toContain('fiasco app is running!'); + }); +}); diff --git a/frontend/src/app/app.component.ts b/frontend/src/app/app.component.ts new file mode 100644 index 00000000..1176e3b4 --- /dev/null +++ b/frontend/src/app/app.component.ts @@ -0,0 +1,12 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-root', + templateUrl: './app.component.html', + styleUrls: ['./app.component.scss'] +}) +export class AppComponent { + title = 'fiasco'; + + constructor() {} +} diff --git a/frontend/src/app/app.module.ts b/frontend/src/app/app.module.ts new file mode 100644 index 00000000..a9425af4 --- /dev/null +++ b/frontend/src/app/app.module.ts @@ -0,0 +1,29 @@ +import { BrowserModule } from '@angular/platform-browser'; +import { NgModule } from '@angular/core'; + +import { AppRoutingModule } from './app-routing.module'; +import { AppComponent } from './app.component'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { SharedModule } from './shared/shared.module'; +import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http'; +import { TokenInterceptorService } from './services/token-interceptor.service'; +import { ServiceWorkerModule } from '@angular/service-worker'; +import { environment } from '../environments/environment'; + +@NgModule({ + declarations: [AppComponent], + imports: [ + BrowserModule, + AppRoutingModule, + BrowserAnimationsModule, + SharedModule, + HttpClientModule, + ServiceWorkerModule.register('ngsw-worker.js', { enabled: environment.production }) + ], + providers: [ + HttpClientModule, + { provide: HTTP_INTERCEPTORS, useClass: TokenInterceptorService, multi: true } + ], + bootstrap: [AppComponent] +}) +export class AppModule {} diff --git a/frontend/src/app/models/area.model.ts b/frontend/src/app/models/area.model.ts new file mode 100644 index 00000000..8580bb26 --- /dev/null +++ b/frontend/src/app/models/area.model.ts @@ -0,0 +1,60 @@ +export interface IAreaAction { + actionId: number; + actionType: string; + description: string; + itemName: string; + itemQuantity: number; + fulfilled: boolean; + latitude?: any; + longitude?: any; + postedByUser: IPostedByUser; + postedByOrganisation?: any; + location: ILocation; + file?: any; +} + +export interface IPostedByUser { + userId: number; + name: string; + mobile: string; + email: string; +} + +export interface ILocation { + locationId: number; + locationName: string; + latitude?: any; + longitude?: any; +} + +export interface IStorage { + storageId: number; + centreId: number; + itemName: string; + itemQuantity: number; +} + +// Storage List +export interface Location { + locationId: number; + locationName: string; + latitude?: any; + longitude?: any; +} + +export interface CreatedBy { + userId: number; + name: string; + mobile: string; + email: string; +} + +export interface IStorageList { + centreId: number; + centreName: string; + location: Location; + latitude?: any; + longitude?: any; + createdBy: CreatedBy; + createdOn: string; +} diff --git a/frontend/src/app/services/area.service.ts b/frontend/src/app/services/area.service.ts new file mode 100644 index 00000000..de111417 --- /dev/null +++ b/frontend/src/app/services/area.service.ts @@ -0,0 +1,51 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { environment } from '../../environments/environment'; +import { IStorage, IStorageList } from '../models/area.model'; +import { Observable } from 'rxjs'; + +@Injectable({ + providedIn: 'root' +}) +export class AreaService { + baseUrl = environment.ipAddress; + + constructor(private http: HttpClient) {} + + getDonations(areaId: number) { + return this.http.get( + `${this.baseUrl}/action/?locationId=${areaId}&actionType=RESOURCES_AVAILABLE&noOfDays=2&pageNo=0&noOfRecords=3` + ); + } + + getVolunteers(areaId) { + return this.http.get( + `${this.baseUrl}/action/?locationId=${areaId}&actionType=WANT_TO_HELP&noOfDays=2&pageNo=0&noOfRecords=3` + ); + } + + getRequests(areaId) { + return this.http.get( + `${this.baseUrl}/action/?locationId=${areaId}&actionType=NEED_HELP &noOfDays=2&pageNo=0&noOfRecords=3` + ); + } + + getAllArea() { + return this.http.get(`${this.baseUrl}/location/`); + } + + submitAction(params: JSON) { + return this.http.post(`${this.baseUrl}/action/`, params); + } + + getAllStorages(locationId: number): Observable { + return this.http.get(`${this.baseUrl}/storage/location/${locationId}`); + } + + getStorageData(storageId: number): Observable { + return this.http.get(`${this.baseUrl}/storage/item/show/${storageId}`); + } + saveStorage(params: JSON) { + return this.http.post(`${this.baseUrl}/storage/item/save/`, params); + } +} diff --git a/frontend/src/app/services/token-interceptor.service.ts b/frontend/src/app/services/token-interceptor.service.ts new file mode 100644 index 00000000..65b0e2d2 --- /dev/null +++ b/frontend/src/app/services/token-interceptor.service.ts @@ -0,0 +1,62 @@ +import { Observable } from 'rxjs'; +import { Injectable } from '@angular/core'; +import { + HttpInterceptor, + HttpRequest, + HttpHandler, + HttpEvent, + HttpErrorResponse +} from '@angular/common/http'; +import { tap } from 'rxjs/operators'; +import { Router } from '@angular/router'; +import { MatSnackBar } from '@angular/material'; +import { UserService } from './user.service'; + +@Injectable({ + providedIn: 'root' +}) +export class TokenInterceptorService implements HttpInterceptor { + constructor( + private userService: UserService, + private router: Router, + private snackbar: MatSnackBar + ) {} + + intercept(req: HttpRequest, next: HttpHandler): Observable> { + const token = this.userService.getApi(); + const clonedReq = req.clone({ + setHeaders: { + Authorization: `${token}` + } + }); + + return next.handle(clonedReq).pipe( + // if api call returns any error, show details in console and redirect to appropriate page + tap( + (event: HttpEvent) => {}, + (err: any) => { + if (err instanceof HttpErrorResponse) { + ////////// ERROR 404 - REDIRECT ////////// + if (err.status === 404) { + this.router.navigate(['/not-found']); + } + + ////////// ERROR 403 - SNACKBAR ////////// + if (err.status === 403) { + console.log('error'); + this.snackbar.open( + `You do not have required permissions to perform the action. Please contact admin.` + ); + } + + ////////// ERROR 401 - REDIRECT ////////// + if (err.status === 401) { + // this.snackbar.open(`Oops! You are not authorised. Please login to continue.`); + this.router.navigate(['/login']); + } + } + } + ) + ); + } +} diff --git a/frontend/src/app/services/user.service.ts b/frontend/src/app/services/user.service.ts new file mode 100644 index 00000000..a82873a2 --- /dev/null +++ b/frontend/src/app/services/user.service.ts @@ -0,0 +1,25 @@ +import { Injectable, ɵConsole } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { environment } from '../../environments/environment'; + +@Injectable({ + providedIn: 'root' +}) +export class UserService { + baseUrl = environment.ipAddress; + + constructor(private http: HttpClient) {} + + getApi() { + return localStorage.getItem('token'); + } + setApi(token) { + localStorage.setItem('token', token); + } + login(params: JSON) { + return this.http.post(`${this.baseUrl}/auth/login/`, params); + } + register(params: JSON) { + return this.http.post(`${this.baseUrl}/auth/register/`, params); + } +} diff --git a/frontend/src/app/shared/modules/material.module.ts b/frontend/src/app/shared/modules/material.module.ts new file mode 100644 index 00000000..52e8fca7 --- /dev/null +++ b/frontend/src/app/shared/modules/material.module.ts @@ -0,0 +1,45 @@ +import { MatInputModule } from '@angular/material/input'; +import { MatToolbarModule } from '@angular/material/toolbar'; +import { MatIconModule } from '@angular/material/icon'; +import { NgModule } from '@angular/core'; + +// Material Components +import { MatCardModule } from '@angular/material/card'; +import { MatButtonModule } from '@angular/material/button'; +import { MatSelectModule } from '@angular/material/select'; +import { MatAutocompleteModule } from '@angular/material/autocomplete'; +import { MatSidenavModule } from '@angular/material/sidenav'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatListModule } from '@angular/material/list'; +import { MatMenuModule } from '@angular/material/menu'; +import { FlexLayoutModule } from '@angular/flex-layout'; +import { MatTableModule } from '@angular/material/table'; +import { MatRadioModule } from '@angular/material/radio'; +import { MatExpansionModule } from '@angular/material/expansion'; + +const MatModules = [ + MatCardModule, + MatButtonModule, + MatSelectModule, + MatAutocompleteModule, + MatSidenavModule, + MatIconModule, + MatToolbarModule, + MatDividerModule, + MatListModule, + MatMenuModule, + MatInputModule, + MatIconModule, + MatToolbarModule, + MatInputModule, + FlexLayoutModule, + MatTableModule, + MatRadioModule, + MatExpansionModule +]; + +@NgModule({ + imports: [MatModules], + exports: [MatModules] +}) +export class MaterialModule {} diff --git a/frontend/src/app/shared/shared.module.ts b/frontend/src/app/shared/shared.module.ts new file mode 100644 index 00000000..271fd100 --- /dev/null +++ b/frontend/src/app/shared/shared.module.ts @@ -0,0 +1,28 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MaterialModule } from './modules/material.module'; +import { RouterModule } from '@angular/router'; +import { MatSnackBarModule } from '@angular/material/snack-bar'; + +const allModules = [ + CommonModule, + MaterialModule, + FormsModule, + ReactiveFormsModule, + RouterModule, + MatSnackBarModule +]; +const allEntryComponents = []; +const allComponents = []; +const allDirectives = []; +const allProviders = []; + +@NgModule({ + declarations: [[...allComponents], [...allDirectives], [...allEntryComponents]], + imports: allModules, + providers: allProviders, + entryComponents: allEntryComponents, + exports: [[...allModules], [...allComponents], [...allDirectives]] +}) +export class SharedModule {} diff --git a/frontend/src/app/views/area/action-form/action-form-routing.module.ts b/frontend/src/app/views/area/action-form/action-form-routing.module.ts new file mode 100644 index 00000000..09954c76 --- /dev/null +++ b/frontend/src/app/views/area/action-form/action-form-routing.module.ts @@ -0,0 +1,11 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; +import { ActionFormComponent } from './action-form.component'; + +const routes: Routes = [{ path: '', component: ActionFormComponent }]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class ActionFormRoutingModule {} diff --git a/frontend/src/app/views/area/action-form/action-form.component.html b/frontend/src/app/views/area/action-form/action-form.component.html new file mode 100644 index 00000000..6dd0b999 --- /dev/null +++ b/frontend/src/app/views/area/action-form/action-form.component.html @@ -0,0 +1,97 @@ +
+
Fill in the following details
+
+ + + + + {{ option.locationName }} + + + + This is required + + +
+ What do you need ? + + + {{ help }} + + +
+ + Item Name + + + This is required + + + + Item Quantity + + + This is required + + +
+ I want to help as + + Volunteer + Doctor + +
+ + + + +
+
diff --git a/frontend/src/app/views/area/action-form/action-form.component.scss b/frontend/src/app/views/area/action-form/action-form.component.scss new file mode 100644 index 00000000..99c285cf --- /dev/null +++ b/frontend/src/app/views/area/action-form/action-form.component.scss @@ -0,0 +1,12 @@ +#actionFormContainer { + margin-top: 70px; +} +.radio-group { + display: flex; + flex-direction: column; + margin: 15px 0; +} + +.radio-button { + margin: 5px; +} diff --git a/frontend/src/app/views/area/action-form/action-form.component.ts b/frontend/src/app/views/area/action-form/action-form.component.ts new file mode 100644 index 00000000..132bf619 --- /dev/null +++ b/frontend/src/app/views/area/action-form/action-form.component.ts @@ -0,0 +1,147 @@ +import { AreaService } from './../../../services/area.service'; +import { Component, OnInit } from '@angular/core'; +import { ErrorStateMatcher } from '@angular/material/core'; +import { + FormControl, + FormGroupDirective, + NgForm, + FormGroup, + FormBuilder, + Validators +} from '@angular/forms'; +import { Observable } from 'rxjs'; +import { startWith, map } from 'rxjs/operators'; +import { ActivatedRoute, Router } from '@angular/router'; + +/** Error when invalid control is dirty, touched, or submitted. */ +export class MyErrorStateMatcher implements ErrorStateMatcher { + isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean { + const isSubmitted = form && form.submitted; + return !!(control && control.invalid && (control.dirty || control.touched || isSubmitted)); + } +} + +export interface HelpGroup { + value: string; + viewValue: string; +} + +export interface Location { + latitude: number; + locationId: number; + locationName: string; + longitude: number; +} + +@Component({ + selector: 'app-action-form', + templateUrl: './action-form.component.html', + styleUrls: ['./action-form.component.scss'] +}) +export class ActionFormComponent implements OnInit { + actionForm: FormGroup; + matcher: MyErrorStateMatcher; + needHelpOptions = ['Rescue Me', 'I need resources', 'I need doctor']; + options: any; + filteredOptions: Observable; + type: string; + constructor( + private fb: FormBuilder, + private areaService: AreaService, + private route: ActivatedRoute, + private router: Router + ) { + route.queryParams.subscribe(params => { + this.type = params.type; + }); + this.areaService.getAllArea().subscribe(data => { + this.options = data; + this.filteredOptions = this.actionForm.get('area').valueChanges.pipe( + startWith(''), + map(value => (typeof value === 'string' ? value : value.locationName)), + map(locationName => (locationName ? this._filter(locationName) : this.options.slice())) + ); + }); + } + + ngOnInit() { + this.actionForm = new FormGroup({ + itemName: new FormControl(''), + itemQuantity: new FormControl(''), + serviceOffered: new FormControl(''), + needHelp: new FormControl(''), + description: new FormControl(''), + area: new FormControl('') + }); + this.actionForm = this.fb.group({ + itemName: ['', Validators.required], + itemQuantity: ['', Validators.required], + serviceOffered: [''], + needHelp: ['', Validators.required], + description: ['', Validators.required], + area: ['', Validators.required] + }); + + this.matcher = new MyErrorStateMatcher(); + } + + displayFn(location?: Location): string | undefined { + return location ? location.locationName : undefined; + } + + isSubmitDisabled() { + if (this.type === 'WANT_TO_HELP') { + if ( + this.actionForm.get('area').value.locationId && + this.actionForm.get('serviceOffered').value + ) { + return true; + } + } else if (this.type === 'RESOURCES_AVAILABLE') { + if ( + this.actionForm.get('area').value.locationId && + this.actionForm.get('itemName').value && + this.actionForm.get('itemQuantity').value + ) { + return true; + } + } else if (this.type === 'NEED_HELP') { + if (this.actionForm.get('area').value.locationId && this.actionForm.get('needHelp').value) { + return true; + } + return false; + } + } + + submitAction() { + var params = JSON; + if (this.type === 'WANT_TO_HELP') { + params['locationId'] = this.actionForm.get('area').value.locationId; + params['itemName'] = this.actionForm.get('serviceOffered').value; + params['actionType'] = 'WANT_TO_HELP'; + } else if (this.type === 'RESOURCES_AVAILABLE') { + params['locationId'] = this.actionForm.get('area').value.locationId; + params['itemName'] = this.actionForm.get('itemName').value; + params['itemQuantity'] = this.actionForm.get('itemQuantity').value; + params['actionType'] = 'RESOURCES_AVAILABLE'; + } else if (this.type === 'NEED_HELP') { + params['locationId'] = this.actionForm.get('area').value.locationId; + var help = this.actionForm.get('needHelp').value; + console.log(help); + params['itemName'] = help.toString(); + params['description'] = this.actionForm.get('description').value; + params['actionType'] = 'NEED_HELP'; + } + this.areaService.submitAction(params).subscribe(data => { + this.router.navigate(['../../../'], { relativeTo: this.route, queryParams: null }); + }); + } + + private _filter(name: string): Location[] { + const filterValue = name.toLowerCase(); + + return this.options.filter( + option => option.locationName.toLowerCase().indexOf(filterValue) === 0 + ); + } +} diff --git a/frontend/src/app/views/area/action-form/action-form.module.ts b/frontend/src/app/views/area/action-form/action-form.module.ts new file mode 100644 index 00000000..c670fc03 --- /dev/null +++ b/frontend/src/app/views/area/action-form/action-form.module.ts @@ -0,0 +1,11 @@ +import { ActionFormRoutingModule } from './action-form-routing.module'; +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { ActionFormComponent } from './action-form.component'; +import { SharedModule } from 'src/app/shared/shared.module'; + +@NgModule({ + declarations: [ActionFormComponent], + imports: [CommonModule, ActionFormRoutingModule, SharedModule] +}) +export class ActionFormModule {} diff --git a/frontend/src/app/views/area/area-routing.module.ts b/frontend/src/app/views/area/area-routing.module.ts new file mode 100644 index 00000000..44096b72 --- /dev/null +++ b/frontend/src/app/views/area/area-routing.module.ts @@ -0,0 +1,53 @@ +import { StorageFormModule } from './storage/storage-form/storage-form.module'; +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; +import { AreaComponent } from './area.component'; + +const routes: Routes = [ + { + path: '', + component: AreaComponent, + children: [ + { + path: 'Donations', + loadChildren: () => import('./donors/donors.module').then(m => m.DonorsModule) + }, + { + path: 'Volunteers', + loadChildren: () => import('./volunteers/volunteers.module').then(m => m.VolunteersModule) + }, + { + path: 'Help', + loadChildren: () => + import('./request-help/request-help.module').then(m => m.RequestHelpModule) + }, + { + path: 'Storage', + loadChildren: () => import('./storage/storage.module').then(m => m.StorageModule) + }, + { + path: 'Donations/action-form', + loadChildren: () => import('./action-form/action-form.module').then(m => m.ActionFormModule) + }, + { + path: 'Volunteers/action-form', + loadChildren: () => import('./action-form/action-form.module').then(m => m.ActionFormModule) + }, + { + path: 'Help/action-form', + loadChildren: () => import('./action-form/action-form.module').then(m => m.ActionFormModule) + }, + { + path: 'Storage/storage-form', + loadChildren: () => + import('./storage/storage-form/storage-form.module').then(m => m.StorageFormModule) + } + ] + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class AreaRoutingModule {} diff --git a/frontend/src/app/views/area/area.component.html b/frontend/src/app/views/area/area.component.html new file mode 100644 index 00000000..f6a6a975 --- /dev/null +++ b/frontend/src/app/views/area/area.component.html @@ -0,0 +1,67 @@ +
+ +
+ menu +
+
+
+ + + + + {{ option.locationName }} + + + +
+
+
+
+ {{ userInitial }} +
+
+
+ + + + + Donations + + Volunteers + + Request Help + + Storage + + + + + +
+ +
+
+
+
+ + + + + + diff --git a/frontend/src/app/views/area/area.component.scss b/frontend/src/app/views/area/area.component.scss new file mode 100644 index 00000000..d5276d5e --- /dev/null +++ b/frontend/src/app/views/area/area.component.scss @@ -0,0 +1,55 @@ +.area-container { + margin: auto; + width: 100%; + background-color: #607d8b; + display: flex; + flex-direction: column; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; +} + +.round-small-image { + background-color: #ff9800; + height: 30px; + width: 30px; + border-radius: 50%; + flex-shrink: 0; + object-fit: cover; +} + +.header-toolbar { + position: fixed; + /* Make sure the toolbar will stay on top of the content as it scrolls past. */ + z-index: 2; + width: 100%; + height: 60px; + padding: 5px; + width: 100%; +} + +h1.example-app-name { + margin-left: 8px; +} + +.sidenav-container { + /* When the sidenav is not fixed, stretch the sidenav container to fill the available space. This + causes `` to act as our scrolling element for desktop layouts. */ + flex: 1; +} + +.sidenav-container { + /* When the sidenav is fixed, don't constrain the height of the sidenav container. This allows the + `` to be our scrolling element for mobile layouts. */ + flex: 1 0 auto; +} +.sidenav { + margin-top: 56px; +} + +.area-info-area { + margin-top: 60px; + padding: 15px; +} diff --git a/frontend/src/app/views/area/area.component.ts b/frontend/src/app/views/area/area.component.ts new file mode 100644 index 00000000..19e3c883 --- /dev/null +++ b/frontend/src/app/views/area/area.component.ts @@ -0,0 +1,77 @@ +import { AreaService } from './../../services/area.service'; +import { Component, OnInit } from '@angular/core'; +import { FormGroup, FormBuilder, FormControl } from '@angular/forms'; +import { Observable } from 'rxjs'; +import { startWith, map } from 'rxjs/operators'; +import { Router, ActivatedRoute } from '@angular/router'; + +export interface Location { + latitude: number; + locationId: number; + locationName: string; + longitude: number; +} + +@Component({ + selector: 'app-area', + templateUrl: './area.component.html', + styleUrls: ['./area.component.scss'] +}) +export class AreaComponent implements OnInit { + areaForm: FormGroup; + options: any; + filteredOptions: Observable; + userInitial: string; + constructor( + private areaService: AreaService, + private router: Router, + private route: ActivatedRoute + ) {} + + changeLocation(event) { + const option = event.option.value; + this.router.navigate(['/area', option.locationId, 'Donations'], { relativeTo: this.route }); + } + + setAreaName() { + const areaId = parseInt(this.route.snapshot.paramMap.get('areaId'), 10); + const selectedArea = this.options.filter(area => area.locationId === areaId)[0]; + this.areaForm.get('area').setValue(selectedArea); + } + + getLocationData() { + this.areaService.getAllArea().subscribe((data: Array) => { + this.options = data; + this.setAreaName(); + this.filteredOptions = this.areaForm.get('area').valueChanges.pipe( + startWith(''), + map(value => (typeof value === 'string' ? value : value.locationName)), + map(locationName => (locationName ? this._filter(locationName) : this.options.slice())) + ); + }); + this.userInitial = localStorage.getItem('initial'); + } + + ngOnInit() { + this.getLocationData(); + this.areaForm = new FormGroup({ + area: new FormControl('') + }); + const areaId = this.route.snapshot.paramMap.get('areaId'); + this.router.navigate(['Donations'], { + relativeTo: this.route + }); + } + + displayFn(location?: Location): string | undefined { + return location ? location.locationName : undefined; + } + + private _filter(name: string): Location[] { + const filterValue = name.toLowerCase(); + + return this.options.filter( + option => option.locationName.toLowerCase().indexOf(filterValue) === 0 + ); + } +} diff --git a/frontend/src/app/views/area/area.module.ts b/frontend/src/app/views/area/area.module.ts new file mode 100644 index 00000000..15c1d011 --- /dev/null +++ b/frontend/src/app/views/area/area.module.ts @@ -0,0 +1,13 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +import { AreaRoutingModule } from './area-routing.module'; +import { AreaComponent } from './area.component'; +import { UserComponent } from './components/user/user.component'; +import { SharedModule } from '../../shared/shared.module'; + +@NgModule({ + declarations: [AreaComponent, UserComponent], + imports: [CommonModule, AreaRoutingModule, SharedModule] +}) +export class AreaModule {} diff --git a/frontend/src/app/views/area/components/user/user.component.html b/frontend/src/app/views/area/components/user/user.component.html new file mode 100644 index 00000000..d039bb7b --- /dev/null +++ b/frontend/src/app/views/area/components/user/user.component.html @@ -0,0 +1 @@ +

user works!

diff --git a/frontend/src/app/views/area/components/user/user.component.scss b/frontend/src/app/views/area/components/user/user.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/frontend/src/app/views/area/components/user/user.component.ts b/frontend/src/app/views/area/components/user/user.component.ts new file mode 100644 index 00000000..6fd5a202 --- /dev/null +++ b/frontend/src/app/views/area/components/user/user.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-user', + templateUrl: './user.component.html', + styleUrls: ['./user.component.scss'] +}) +export class UserComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/frontend/src/app/views/area/donors/donors-routing.module.ts b/frontend/src/app/views/area/donors/donors-routing.module.ts new file mode 100644 index 00000000..6ca942b4 --- /dev/null +++ b/frontend/src/app/views/area/donors/donors-routing.module.ts @@ -0,0 +1,11 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; +import { DonorsComponent } from './donors.component'; + +const routes: Routes = [{ path: '', component: DonorsComponent }]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class DonorsRoutingModule {} diff --git a/frontend/src/app/views/area/donors/donors.component.html b/frontend/src/app/views/area/donors/donors.component.html new file mode 100644 index 00000000..21db52a5 --- /dev/null +++ b/frontend/src/app/views/area/donors/donors.component.html @@ -0,0 +1,48 @@ + +

Donations available for collection

+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Qty{{ element.itemQuantity }}Name{{ element.postedByUser.name }}Item(s){{ element.itemName }}Contact{{ element.postedByUser.mobile }}
+
diff --git a/frontend/src/app/views/area/donors/donors.component.scss b/frontend/src/app/views/area/donors/donors.component.scss new file mode 100644 index 00000000..8eea6fee --- /dev/null +++ b/frontend/src/app/views/area/donors/donors.component.scss @@ -0,0 +1,20 @@ +.area-sub-heading { + font-size: 18px; + font-weight: bold; + color: #ff9800; +} + +table { + width: 500px; + margin-top: 10px; +} + +.donate { + display: block; + margin: 0px auto 10px auto; +} + +.overflow-table { + overflow: auto; + padding: 10px 10px 25px 10px; +} diff --git a/frontend/src/app/views/area/donors/donors.component.ts b/frontend/src/app/views/area/donors/donors.component.ts new file mode 100644 index 00000000..c97abe43 --- /dev/null +++ b/frontend/src/app/views/area/donors/donors.component.ts @@ -0,0 +1,39 @@ +import { ActivatedRoute, Router } from '@angular/router'; +import { Component, OnInit, OnDestroy } from '@angular/core'; +import { IAreaAction } from 'src/app/models/area.model'; +import { AreaService } from 'src/app/services/area.service'; +import { takeUntil } from 'rxjs/operators'; +import { Subject } from 'rxjs'; + +@Component({ + selector: 'app-donors', + templateUrl: './donors.component.html', + styleUrls: ['./donors.component.scss'] +}) +export class DonorsComponent implements OnInit, OnDestroy { + subscriptions$ = new Subject(); + dataSource: IAreaAction[] = []; + displayedColumns: string[] = ['Name', 'Qty', 'Item(s)', 'Contact']; + constructor( + private areaService: AreaService, + private route: ActivatedRoute, + private router: Router + ) {} + + ngOnInit() { + const areaId = parseInt(window.location.href.split('/')[4], 10); + this.areaService + .getDonations(areaId) + .pipe(takeUntil(this.subscriptions$)) + .subscribe((data: IAreaAction[]) => (this.dataSource = data)); + + this.router.routeReuseStrategy.shouldReuseRoute = () => { + return false; + }; + } + + ngOnDestroy() { + this.subscriptions$.next(); + this.subscriptions$.complete(); + } +} diff --git a/frontend/src/app/views/area/donors/donors.module.ts b/frontend/src/app/views/area/donors/donors.module.ts new file mode 100644 index 00000000..3089e81f --- /dev/null +++ b/frontend/src/app/views/area/donors/donors.module.ts @@ -0,0 +1,12 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +import { DonorsRoutingModule } from './donors-routing.module'; +import { DonorsComponent } from './donors.component'; +import { SharedModule } from 'src/app/shared/shared.module'; + +@NgModule({ + declarations: [DonorsComponent], + imports: [CommonModule, DonorsRoutingModule, SharedModule] +}) +export class DonorsModule {} diff --git a/frontend/src/app/views/area/request-help/request-help-routing.module.ts b/frontend/src/app/views/area/request-help/request-help-routing.module.ts new file mode 100644 index 00000000..d741df28 --- /dev/null +++ b/frontend/src/app/views/area/request-help/request-help-routing.module.ts @@ -0,0 +1,11 @@ +import { RequestHelpComponent } from './request-help.component'; +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; + +const routes: Routes = [{ path: '', component: RequestHelpComponent }]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class RequestHelpRoutingModule {} diff --git a/frontend/src/app/views/area/request-help/request-help.component.html b/frontend/src/app/views/area/request-help/request-help.component.html new file mode 100644 index 00000000..f98bd70f --- /dev/null +++ b/frontend/src/app/views/area/request-help/request-help.component.html @@ -0,0 +1,11 @@ +
+ +
diff --git a/frontend/src/app/views/area/request-help/request-help.component.scss b/frontend/src/app/views/area/request-help/request-help.component.scss new file mode 100644 index 00000000..bb1b4e11 --- /dev/null +++ b/frontend/src/app/views/area/request-help/request-help.component.scss @@ -0,0 +1,4 @@ +.request { + display: block; + margin: 0px auto 10px auto; +} diff --git a/frontend/src/app/views/area/request-help/request-help.component.ts b/frontend/src/app/views/area/request-help/request-help.component.ts new file mode 100644 index 00000000..f23b73ca --- /dev/null +++ b/frontend/src/app/views/area/request-help/request-help.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-request-help', + templateUrl: './request-help.component.html', + styleUrls: ['./request-help.component.scss'] +}) +export class RequestHelpComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/frontend/src/app/views/area/request-help/request-help.module.ts b/frontend/src/app/views/area/request-help/request-help.module.ts new file mode 100644 index 00000000..bf511a60 --- /dev/null +++ b/frontend/src/app/views/area/request-help/request-help.module.ts @@ -0,0 +1,12 @@ +import { SharedModule } from 'src/app/shared/shared.module'; +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +import { RequestHelpRoutingModule } from './request-help-routing.module'; +import { RequestHelpComponent } from './request-help.component'; + +@NgModule({ + declarations: [RequestHelpComponent], + imports: [CommonModule, RequestHelpRoutingModule, SharedModule] +}) +export class RequestHelpModule {} diff --git a/frontend/src/app/views/area/storage/storage-form/storage-form-routing.module.ts b/frontend/src/app/views/area/storage/storage-form/storage-form-routing.module.ts new file mode 100644 index 00000000..6899ab35 --- /dev/null +++ b/frontend/src/app/views/area/storage/storage-form/storage-form-routing.module.ts @@ -0,0 +1,16 @@ +import { StorageFormComponent } from './storage-form.component'; +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; + +const routes: Routes = [ + { + path: '', + component: StorageFormComponent + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class StorageFormRoutingModule {} diff --git a/frontend/src/app/views/area/storage/storage-form/storage-form.component.html b/frontend/src/app/views/area/storage/storage-form/storage-form.component.html new file mode 100644 index 00000000..a5e9c89f --- /dev/null +++ b/frontend/src/app/views/area/storage/storage-form/storage-form.component.html @@ -0,0 +1,60 @@ +
+
Add Stock
+
+ + Please Select storage center + + + {{ storageCenter.centreName }} + + + + + Item Name + + + This is required + + + + Item Quantity + + + This is required + + + +
+
diff --git a/frontend/src/app/views/area/storage/storage-form/storage-form.component.scss b/frontend/src/app/views/area/storage/storage-form/storage-form.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/frontend/src/app/views/area/storage/storage-form/storage-form.component.ts b/frontend/src/app/views/area/storage/storage-form/storage-form.component.ts new file mode 100644 index 00000000..947f77e5 --- /dev/null +++ b/frontend/src/app/views/area/storage/storage-form/storage-form.component.ts @@ -0,0 +1,76 @@ +import { AreaService } from './../../../../services/area.service'; +import { Component, OnInit } from '@angular/core'; +import { ErrorStateMatcher } from '@angular/material'; +import { + FormControl, + FormGroupDirective, + NgForm, + FormGroup, + Validators, + FormBuilder +} from '@angular/forms'; +import { ActivatedRoute, Router } from '@angular/router'; + +// export interface Food { +// value: string; +// viewValue: string; +// } + +/** Error when invalid control is dirty, touched, or submitted. */ +export class MyErrorStateMatcher implements ErrorStateMatcher { + isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean { + const isSubmitted = form && form.submitted; + return !!(control && control.invalid && (control.dirty || control.touched || isSubmitted)); + } +} + +@Component({ + selector: 'app-storage-form', + templateUrl: './storage-form.component.html', + styleUrls: ['./storage-form.component.scss'] +}) +export class StorageFormComponent implements OnInit { + storageCenterList: any; + storageForm: FormGroup; + matcher: MyErrorStateMatcher; + constructor( + private fb: FormBuilder, + private areaService: AreaService, + private route: ActivatedRoute, + private router: Router + ) { + this.areaService.getAllStorages(43).subscribe(data => { + this.storageCenterList = data; + }); + } + + ngOnInit() { + this.storageForm = new FormGroup({ + storageCenter: new FormControl(''), + itemName: new FormControl(''), + itemQuantity: new FormControl('') + }); + this.storageForm = this.fb.group({ + storageCenter: ['', Validators.required], + itemName: ['', Validators.required], + itemQuantity: ['', Validators.required] + }); + + this.matcher = new MyErrorStateMatcher(); + } + + isSubmitDisabled() { + return !this.storageForm.valid; + } + + submitAction() { + let param = JSON; + param['centreId'] = this.storageForm.get('storageCenter').value; + param['itemName'] = this.storageForm.get('itemName').value; + param['itemQuantity'] = this.storageForm.get('itemQuantity').value; + + this.areaService.saveStorage(param).subscribe(data => { + this.router.navigate(['../../../'], { relativeTo: this.route }); + }); + } +} diff --git a/frontend/src/app/views/area/storage/storage-form/storage-form.module.ts b/frontend/src/app/views/area/storage/storage-form/storage-form.module.ts new file mode 100644 index 00000000..679c0e9c --- /dev/null +++ b/frontend/src/app/views/area/storage/storage-form/storage-form.module.ts @@ -0,0 +1,11 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { StorageFormRoutingModule } from './storage-form-routing.module'; +import { StorageFormComponent } from './storage-form.component'; +import { SharedModule } from 'src/app/shared/shared.module'; + +@NgModule({ + declarations: [StorageFormComponent], + imports: [CommonModule, StorageFormRoutingModule, SharedModule] +}) +export class StorageFormModule {} diff --git a/frontend/src/app/views/area/storage/storage-routing.module.ts b/frontend/src/app/views/area/storage/storage-routing.module.ts new file mode 100644 index 00000000..fa20a3cc --- /dev/null +++ b/frontend/src/app/views/area/storage/storage-routing.module.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; +import { StorageComponent } from './storage.component'; + +const routes: Routes = [ + { + path: '', + component: StorageComponent + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class StorageRoutingModule {} diff --git a/frontend/src/app/views/area/storage/storage.component.html b/frontend/src/app/views/area/storage/storage.component.html new file mode 100644 index 00000000..5335fa39 --- /dev/null +++ b/frontend/src/app/views/area/storage/storage.component.html @@ -0,0 +1,29 @@ +
+ +
+ + + + + {{ storage.centreName }} + + + + + + + + + + + + + + + + +
Item Name{{ element.itemName }}Item Quantity{{ element.itemQuantity }}
+
+
diff --git a/frontend/src/app/views/area/storage/storage.component.scss b/frontend/src/app/views/area/storage/storage.component.scss new file mode 100644 index 00000000..1922e7ff --- /dev/null +++ b/frontend/src/app/views/area/storage/storage.component.scss @@ -0,0 +1,3 @@ +table { + width: 100%; +} diff --git a/frontend/src/app/views/area/storage/storage.component.ts b/frontend/src/app/views/area/storage/storage.component.ts new file mode 100644 index 00000000..42bb504e --- /dev/null +++ b/frontend/src/app/views/area/storage/storage.component.ts @@ -0,0 +1,24 @@ +import { Component, OnInit } from '@angular/core'; +import { IStorage, IStorageList } from 'src/app/models/area.model'; +import { AreaService } from 'src/app/services/area.service'; + +@Component({ + selector: 'app-storage', + templateUrl: './storage.component.html', + styleUrls: ['./storage.component.scss'] +}) +export class StorageComponent implements OnInit { + storages: IStorageList[] = []; + items: IStorage[] = []; + + displayedColumns = ['Item Name', 'Item Quantity']; + constructor(private areaService: AreaService) {} + + ngOnInit() { + this.areaService.getAllStorages(43).subscribe(data => (this.storages = data)); + } + + planelOpened(storageId: number) { + this.areaService.getStorageData(storageId).subscribe(data => (this.items = data)); + } +} diff --git a/frontend/src/app/views/area/storage/storage.module.ts b/frontend/src/app/views/area/storage/storage.module.ts new file mode 100644 index 00000000..8558b361 --- /dev/null +++ b/frontend/src/app/views/area/storage/storage.module.ts @@ -0,0 +1,12 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +import { StorageRoutingModule } from './storage-routing.module'; +import { StorageComponent } from './storage.component'; +import { SharedModule } from 'src/app/shared/shared.module'; + +@NgModule({ + declarations: [StorageComponent], + imports: [CommonModule, StorageRoutingModule, SharedModule] +}) +export class StorageModule {} diff --git a/frontend/src/app/views/area/volunteers/volunteers-routing.module.ts b/frontend/src/app/views/area/volunteers/volunteers-routing.module.ts new file mode 100644 index 00000000..f550bfea --- /dev/null +++ b/frontend/src/app/views/area/volunteers/volunteers-routing.module.ts @@ -0,0 +1,11 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; +import { VolunteersComponent } from './volunteers.component'; + +const routes: Routes = [{ path: '', component: VolunteersComponent }]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class VolunteersRoutingModule {} diff --git a/frontend/src/app/views/area/volunteers/volunteers.component.html b/frontend/src/app/views/area/volunteers/volunteers.component.html new file mode 100644 index 00000000..82ed5089 --- /dev/null +++ b/frontend/src/app/views/area/volunteers/volunteers.component.html @@ -0,0 +1,48 @@ + +

Volunteers Available

+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Qty{{ element.itemQuantity }}Name{{ element.postedByUser.name }}Item(s){{ element.itemName }}Location{{ element.location.locationName }}Contact{{ element.postedByUser.mobile }}
+
diff --git a/frontend/src/app/views/area/volunteers/volunteers.component.scss b/frontend/src/app/views/area/volunteers/volunteers.component.scss new file mode 100644 index 00000000..8eea6fee --- /dev/null +++ b/frontend/src/app/views/area/volunteers/volunteers.component.scss @@ -0,0 +1,20 @@ +.area-sub-heading { + font-size: 18px; + font-weight: bold; + color: #ff9800; +} + +table { + width: 500px; + margin-top: 10px; +} + +.donate { + display: block; + margin: 0px auto 10px auto; +} + +.overflow-table { + overflow: auto; + padding: 10px 10px 25px 10px; +} diff --git a/frontend/src/app/views/area/volunteers/volunteers.component.ts b/frontend/src/app/views/area/volunteers/volunteers.component.ts new file mode 100644 index 00000000..716e88ce --- /dev/null +++ b/frontend/src/app/views/area/volunteers/volunteers.component.ts @@ -0,0 +1,22 @@ +import { Component, OnInit } from '@angular/core'; +import { IAreaAction } from 'src/app/models/area.model'; +import { AreaService } from 'src/app/services/area.service'; +import { ActivatedRoute } from '@angular/router'; + +@Component({ + selector: 'app-volunteers', + templateUrl: './volunteers.component.html', + styleUrls: ['./volunteers.component.scss'] +}) +export class VolunteersComponent implements OnInit { + dataSource: IAreaAction[] = []; + displayedColumns: string[] = ['Name', 'Qty', 'Item(s)', 'Location', 'Contact']; + constructor(private areaService: AreaService, private route: ActivatedRoute) {} + + ngOnInit() { + const areaId = parseInt(window.location.href.split('/')[4], 10); + this.areaService + .getVolunteers(areaId) + .subscribe((data: IAreaAction[]) => (this.dataSource = data)); + } +} diff --git a/frontend/src/app/views/area/volunteers/volunteers.module.ts b/frontend/src/app/views/area/volunteers/volunteers.module.ts new file mode 100644 index 00000000..6438fcd0 --- /dev/null +++ b/frontend/src/app/views/area/volunteers/volunteers.module.ts @@ -0,0 +1,12 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +import { VolunteersRoutingModule } from './volunteers-routing.module'; +import { VolunteersComponent } from './volunteers.component'; +import { SharedModule } from 'src/app/shared/shared.module'; + +@NgModule({ + declarations: [VolunteersComponent], + imports: [CommonModule, VolunteersRoutingModule, SharedModule] +}) +export class VolunteersModule {} diff --git a/frontend/src/app/views/homepage/homepage-routing.module.ts b/frontend/src/app/views/homepage/homepage-routing.module.ts new file mode 100644 index 00000000..8cd2103d --- /dev/null +++ b/frontend/src/app/views/homepage/homepage-routing.module.ts @@ -0,0 +1,11 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; +import { HomepageComponent } from './homepage.component'; + +const routes: Routes = [{ path: '', component: HomepageComponent }]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class HomepageRoutingModule {} diff --git a/frontend/src/app/views/homepage/homepage.component.html b/frontend/src/app/views/homepage/homepage.component.html new file mode 100644 index 00000000..65767f76 --- /dev/null +++ b/frontend/src/app/views/homepage/homepage.component.html @@ -0,0 +1,72 @@ + +
+
+ + Assist +
+
+
+ + + +
+
+ + + + + {{ option.locationName }} + + + + +
+
+

If you are in distress let us know.

+

If you want to help people in distress you are welcome to join us.

+

Workers on the ground... we will be nothing without you

+

Lend your space for keeping important stuff safe

+
+ +
+ + + + +
+
diff --git a/frontend/src/app/views/homepage/homepage.component.scss b/frontend/src/app/views/homepage/homepage.component.scss new file mode 100644 index 00000000..b264bc31 --- /dev/null +++ b/frontend/src/app/views/homepage/homepage.component.scss @@ -0,0 +1,70 @@ +.header { + width: 100%; + background: #607d8b; + padding: 5px; + + .show-flex { + display: flex; + justify-content: space-between; + align-items: center; + + .logo-area { + display: flex; + color: white; + align-items: center; + + span { + margin-left: 10px; + } + + .logo { + width: 50px; + height: 50px; + } + } + } + + .login { + cursor: pointer; + } +} + +.banner { + width: 100%; + min-height: 50%; + background: linear-gradient(0deg, rgba(0, 0, 0, 0.6) 100%, rgba(0, 0, 0, 0.6) 100%), + url('../../../assets/images/kerala-floods-8.jpg'); + background-size: cover; + background-position: center; + background-repeat: no-repeat; + position: relative; + color: white; + + .quote { + position: absolute; + bottom: 10%; + width: 100%; + text-align: center; + } + p { + font-style: italic; + font-size: 1.3rem; + } +} + +.fields { + display: flex; + justify-content: space-between; + + .mat-form-field { + width: 47%; + } +} + +#areaForm { + height: 40px; + + button { + margin-top: 3px; + } +} diff --git a/frontend/src/app/views/homepage/homepage.component.ts b/frontend/src/app/views/homepage/homepage.component.ts new file mode 100644 index 00000000..941317d0 --- /dev/null +++ b/frontend/src/app/views/homepage/homepage.component.ts @@ -0,0 +1,61 @@ +import { FormGroup, FormControl } from '@angular/forms'; +import { Component, OnInit } from '@angular/core'; +import { Observable } from 'rxjs'; +import { AreaService } from 'src/app/services/area.service'; +import { startWith, map } from 'rxjs/operators'; +import { Router } from '@angular/router'; + +export interface Location { + latitude: number; + locationId: number; + locationName: string; + longitude: number; +} + +@Component({ + selector: 'app-homepage', + templateUrl: './homepage.component.html', + styleUrls: ['./homepage.component.scss'] +}) +export class HomepageComponent implements OnInit { + areaForm: FormGroup; + options: any; + filteredOptions: Observable; + constructor(private areaService: AreaService, private router: Router) { + console.log('homepage'); + } + + ngOnInit() { + this.areaForm = new FormGroup({ + area: new FormControl('') + }); + this.areaService.getAllArea().subscribe(data => { + this.options = data; + this.filteredOptions = this.areaForm.get('area').valueChanges.pipe( + startWith(''), + map(value => (typeof value === 'string' ? value : value.locationName)), + map(locationName => (locationName ? this._filter(locationName) : this.options.slice())) + ); + }); + } + + isContinueDisabled() { + return !this.areaForm.valid; + } + continue() { + var areaData = this.areaForm.get('area').value; + this.router.navigate(['area/', areaData.locationId]); + } + + displayFn(location?: Location): string | undefined { + return location ? location.locationName : undefined; + } + + private _filter(name: string): Location[] { + const filterValue = name.toLowerCase(); + + return this.options.filter( + option => option.locationName.toLowerCase().indexOf(filterValue) === 0 + ); + } +} diff --git a/frontend/src/app/views/homepage/homepage.module.ts b/frontend/src/app/views/homepage/homepage.module.ts new file mode 100644 index 00000000..7b8cd6c0 --- /dev/null +++ b/frontend/src/app/views/homepage/homepage.module.ts @@ -0,0 +1,12 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +import { HomepageRoutingModule } from './homepage-routing.module'; +import { HomepageComponent } from './homepage.component'; +import { SharedModule } from '../../shared/shared.module'; + +@NgModule({ + declarations: [HomepageComponent], + imports: [CommonModule, HomepageRoutingModule, SharedModule] +}) +export class HomepageModule {} diff --git a/frontend/src/app/views/login/login-routing.module.ts b/frontend/src/app/views/login/login-routing.module.ts new file mode 100644 index 00000000..5c7c499d --- /dev/null +++ b/frontend/src/app/views/login/login-routing.module.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; +import { LoginComponent } from './login.component'; + +const routes: Routes = [ + { + path: '', + component: LoginComponent + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class LoginRoutingModule {} diff --git a/frontend/src/app/views/login/login.component.html b/frontend/src/app/views/login/login.component.html new file mode 100644 index 00000000..0f2f6576 --- /dev/null +++ b/frontend/src/app/views/login/login.component.html @@ -0,0 +1,50 @@ + +
+ menu + Assist +
+
+ diff --git a/frontend/src/app/views/login/login.component.scss b/frontend/src/app/views/login/login.component.scss new file mode 100644 index 00000000..b0bbfb1f --- /dev/null +++ b/frontend/src/app/views/login/login.component.scss @@ -0,0 +1,3 @@ +.login-container { + padding: 20px; +} diff --git a/frontend/src/app/views/login/login.component.ts b/frontend/src/app/views/login/login.component.ts new file mode 100644 index 00000000..67573475 --- /dev/null +++ b/frontend/src/app/views/login/login.component.ts @@ -0,0 +1,63 @@ +import { UserService } from './../../services/user.service'; +import { Component, OnInit } from '@angular/core'; +import { ErrorStateMatcher } from '@angular/material/core'; +import { + FormControl, + FormGroupDirective, + NgForm, + FormGroup, + FormBuilder, + Validators +} from '@angular/forms'; +import { Router } from '@angular/router'; +/** Error when invalid control is dirty, touched, or submitted. */ +export class MyErrorStateMatcher implements ErrorStateMatcher { + isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean { + const isSubmitted = form && form.submitted; + return !!(control && control.invalid && (control.dirty || control.touched || isSubmitted)); + } +} +@Component({ + selector: 'app-login', + templateUrl: './login.component.html', + styleUrls: ['./login.component.scss'] +}) +export class LoginComponent implements OnInit { + loginForm: FormGroup; + matcher: MyErrorStateMatcher; + constructor(private fb: FormBuilder, private userService: UserService, private router: Router) {} + + ngOnInit() { + this.loginForm = new FormGroup({ + username: new FormControl(''), + password: new FormControl('') + }); + this.loginForm = this.fb.group({ + username: ['', Validators.required], + password: ['', Validators.required] + }); + + this.matcher = new MyErrorStateMatcher(); + } + + login() { + let params = JSON; + params['userIdentifier'] = this.loginForm.get('username').value; + params['password'] = this.loginForm.get('password').value; + this.userService.login(params).subscribe( + (data: any) => { + if (data['message']) { + localStorage.setItem('token', `Bearer ${data.message}`); + localStorage.setItem('initial', data['responseObject'].name.charAt(0)); + this.router.navigate(['/homepage']); + } + }, + err => console.error(err), + () => console.log('Observer got a complete notification') + ); + } + + isLoginDisabled() { + return !this.loginForm.valid; + } +} diff --git a/frontend/src/app/views/login/login.module.ts b/frontend/src/app/views/login/login.module.ts new file mode 100644 index 00000000..2673ac65 --- /dev/null +++ b/frontend/src/app/views/login/login.module.ts @@ -0,0 +1,12 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +import { LoginRoutingModule } from './login-routing.module'; +import { LoginComponent } from './login.component'; +import { SharedModule } from 'src/app/shared/shared.module'; + +@NgModule({ + declarations: [LoginComponent], + imports: [CommonModule, LoginRoutingModule, SharedModule] +}) +export class LoginModule {} diff --git a/frontend/src/app/views/not-found/not-found-routing.module.ts b/frontend/src/app/views/not-found/not-found-routing.module.ts new file mode 100644 index 00000000..5524ec70 --- /dev/null +++ b/frontend/src/app/views/not-found/not-found-routing.module.ts @@ -0,0 +1,11 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; +import { NotFoundComponent } from './not-found.component'; + +const routes: Routes = [{ path: '', component: NotFoundComponent }]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class NotFoundRoutingModule {} diff --git a/frontend/src/app/views/not-found/not-found.component.html b/frontend/src/app/views/not-found/not-found.component.html new file mode 100644 index 00000000..80710204 --- /dev/null +++ b/frontend/src/app/views/not-found/not-found.component.html @@ -0,0 +1 @@ +

not-found works!

diff --git a/frontend/src/app/views/not-found/not-found.component.scss b/frontend/src/app/views/not-found/not-found.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/frontend/src/app/views/not-found/not-found.component.ts b/frontend/src/app/views/not-found/not-found.component.ts new file mode 100644 index 00000000..8a117dc2 --- /dev/null +++ b/frontend/src/app/views/not-found/not-found.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-not-found', + templateUrl: './not-found.component.html', + styleUrls: ['./not-found.component.scss'] +}) +export class NotFoundComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/frontend/src/app/views/not-found/not-found.module.ts b/frontend/src/app/views/not-found/not-found.module.ts new file mode 100644 index 00000000..4f6e1753 --- /dev/null +++ b/frontend/src/app/views/not-found/not-found.module.ts @@ -0,0 +1,15 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +import { NotFoundRoutingModule } from './not-found-routing.module'; +import { NotFoundComponent } from './not-found.component'; + + +@NgModule({ + declarations: [NotFoundComponent], + imports: [ + CommonModule, + NotFoundRoutingModule + ] +}) +export class NotFoundModule { } diff --git a/frontend/src/app/views/register/register-routing.module.ts b/frontend/src/app/views/register/register-routing.module.ts new file mode 100644 index 00000000..bf616f92 --- /dev/null +++ b/frontend/src/app/views/register/register-routing.module.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; +import { RegisterComponent } from './register.component'; + +const routes: Routes = [ + { + path: '', + component: RegisterComponent + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class RegisterRoutingModule {} diff --git a/frontend/src/app/views/register/register.component.html b/frontend/src/app/views/register/register.component.html new file mode 100644 index 00000000..6506a53d --- /dev/null +++ b/frontend/src/app/views/register/register.component.html @@ -0,0 +1,84 @@ + +
+ menu + Let's Help +
+
+
+
+ + Name + + + This is required + + + + Email + + + This is required + + + Please enter a valid email + + + + Mobile Number + + + This is required + + + Please enter minimum 10 numbers + + + Please enter maximum 10 numbers + + + + Password + + + This is required + + + +
+
diff --git a/frontend/src/app/views/register/register.component.scss b/frontend/src/app/views/register/register.component.scss new file mode 100644 index 00000000..e26b663f --- /dev/null +++ b/frontend/src/app/views/register/register.component.scss @@ -0,0 +1,3 @@ +.register-container { + padding: 10px; +} diff --git a/frontend/src/app/views/register/register.component.ts b/frontend/src/app/views/register/register.component.ts new file mode 100644 index 00000000..8009b0af --- /dev/null +++ b/frontend/src/app/views/register/register.component.ts @@ -0,0 +1,66 @@ +import { Router } from '@angular/router'; +import { Component, OnInit, ɵConsole } from '@angular/core'; +import { ErrorStateMatcher } from '@angular/material/core'; +import { + FormControl, + FormGroupDirective, + NgForm, + FormGroup, + FormBuilder, + Validators +} from '@angular/forms'; +import { UserService } from 'src/app/services/user.service'; + +/** Error when invalid control is dirty, touched, or submitted. */ +export class MyErrorStateMatcher implements ErrorStateMatcher { + isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean { + const isSubmitted = form && form.submitted; + return !!(control && control.invalid && (control.dirty || control.touched || isSubmitted)); + } +} +@Component({ + selector: 'app-register', + templateUrl: './register.component.html', + styleUrls: ['./register.component.scss'] +}) +export class RegisterComponent implements OnInit { + registerForm: FormGroup; + matcher: MyErrorStateMatcher; + constructor(private fb: FormBuilder, private userService: UserService, private router: Router) {} + + ngOnInit() { + this.registerForm = new FormGroup({ + name: new FormControl(''), + email: new FormControl(''), + mobileNumber: new FormControl(''), + password: new FormControl('') + }); + this.registerForm = this.fb.group({ + name: ['', Validators.required], + email: ['', Validators.email], + mobileNumber: ['', [Validators.minLength(10), Validators.maxLength(10)]], + password: ['', Validators.required] + }); + + this.matcher = new MyErrorStateMatcher(); + } + + register() { + let params = JSON; + params['name'] = this.registerForm.get('name').value; + params['password'] = this.registerForm.get('password').value; + params['email'] = this.registerForm.get('email').value; + params['mobile'] = this.registerForm.get('mobileNumber').value; + this.userService.register(params).subscribe( + data => { + this.router.navigate(['login']); + }, + err => console.error(err), + () => console.log('Observer got a complete notification') + ); + } + + isRegisterDisabled() { + return !this.registerForm.valid; + } +} diff --git a/frontend/src/app/views/register/register.module.ts b/frontend/src/app/views/register/register.module.ts new file mode 100644 index 00000000..66afaed5 --- /dev/null +++ b/frontend/src/app/views/register/register.module.ts @@ -0,0 +1,11 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { RegisterComponent } from './register.component'; +import { SharedModule } from 'src/app/shared/shared.module'; +import { RegisterRoutingModule } from './register-routing.module'; + +@NgModule({ + declarations: [RegisterComponent], + imports: [CommonModule, RegisterRoutingModule, SharedModule] +}) +export class RegisterModule {} diff --git a/frontend/src/assets/.gitkeep b/frontend/src/assets/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/frontend/src/assets/icons/icon-128x128.png b/frontend/src/assets/icons/icon-128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..9f9241f0be40661db1eed29384231e76d33b6e7c GIT binary patch literal 1253 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 A1ONa4 literal 0 HcmV?d00001 diff --git a/frontend/src/assets/icons/icon-152x152.png b/frontend/src/assets/icons/icon-152x152.png new file mode 100644 index 0000000000000000000000000000000000000000..34a1a8d645872c776c9425de45c3fcfba12c271e GIT binary patch literal 1427 zcmV;E1#J3>P)0{{R3FC5Sl00004XF*Lt006O% z3;baP00001b5ch_0Itp)=>Px#S5Qn;MNDaN)BrNc058)3FxCJt%K$IW1~u3KFxCJt z*8nrs05IMFFxCJu+yF7w05QV=FWmq!|NsBlCs6RIx%%hq)l6;YNo@Dg+Uk;~=yZ

X{-?>fGCXfYNSFwSa_5FdK zVWbmbiyjU>K0ZD^K0ZD^KL2TsQY8DMN~18(vn<;gTO#sXvhT>_UZ`aLlk6vfOgE>x z$T-hm!ES8PrsW=;^Kr6C!eqm8&oyA1v_kq*?gp^0oQ|86yBTb~R+yAK1#Fd8crAA# znB!KMDR(-UvsRcdcL>ZyD=d{e3TC$zlI3!r%+{YP;V#uJdT7g#Xqm;#0N{kF{1!}pE)7`+j3=Yr=A6bs)`+*fjoG~J)&x^s8 z_jj;s0P7~D{|#2dlPq?GcR}Ua z{+_|MsARG8yA+k{=P%eNDp~OG4wS2UoLa{Ulq`6lc*f+~J&)5nP_iJHz$Vx7307j0 zYyg5u$Q8r*0%Cw98-idFB-dsPRzs2%AXtJtFg3lhQHW%vZLn_oGdTw95XqufBuC^} zpqzrm$Z^33dMyITwR*jMs{qNumm@L#fi)2U)kti#;?W8&*b#JvZYHF1{36S zl>T3^PqJhK7)+ASQD$y?}F88 z9_@nlYJR5FA|6=i{)<^n7pz4J@Fer8w` zTCgqu^~JOcHmrGl7ucESt>yX3@;t&!4|~X?3%0KL#V*(z)}ssdQ1i3H+8(jKyI?0Z h@8jd+Hf^L(!7eV+I8=gXo5oJ1=hR0aT`iN0Qe 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 literal 0 HcmV?d00001 diff --git a/frontend/src/assets/icons/icon-512x512.png b/frontend/src/assets/icons/icon-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..51ee297df1cbeb0354814ffe95afa6e4bc86ea23 GIT binary patch literal 5008 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 l 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

M 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%0DP-8e|iie2=b$?Z##KAPil*F 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 literal 0 HcmV?d00001 diff --git a/frontend/src/assets/images/logo.svg b/frontend/src/assets/images/logo.svg new file mode 100644 index 00000000..84da43e7 --- /dev/null +++ b/frontend/src/assets/images/logo.svg @@ -0,0 +1,92 @@ + diff --git a/frontend/src/environments/environment.prod.ts b/frontend/src/environments/environment.prod.ts new file mode 100644 index 00000000..3612073b --- /dev/null +++ b/frontend/src/environments/environment.prod.ts @@ -0,0 +1,3 @@ +export const environment = { + production: true +}; diff --git a/frontend/src/environments/environment.ts b/frontend/src/environments/environment.ts new file mode 100644 index 00000000..d92e2795 --- /dev/null +++ b/frontend/src/environments/environment.ts @@ -0,0 +1,17 @@ +// This file can be replaced during build by using the `fileReplacements` array. +// `ng build --prod` replaces `environment.ts` with `environment.prod.ts`. +// The list of file replacements can be found in `angular.json`. + +export const environment = { + production: false, + ipAddress: 'http://172.18.13.156:8080' +}; + +/* + * For easier debugging in development mode, you can import the following file + * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. + * + * This import should be commented out in production mode because it will have a negative impact + * on performance if an error is thrown. + */ +// import 'zone.js/dist/zone-error'; // Included with Angular CLI. diff --git a/frontend/src/favicon.ico b/frontend/src/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..997406ad22c29aae95893fb3d666c30258a09537 GIT binary patch literal 948 zcmV;l155mgP)CBYU7IjCFmI-B}4sMJt3^s9NVg!P0 z6hDQy(L`XWMkB@zOLgN$4KYz;j0zZxq9KKdpZE#5@k0crP^5f9KO};h)ZDQ%ybhht z%t9#h|nu0K(bJ ztIkhEr!*UyrZWQ1k2+YkGqDi8Z<|mIN&$kzpKl{cNP=OQzXHz>vn+c)F)zO|Bou>E z2|-d_=qY#Y+yOu1a}XI?cU}%04)zz%anD(XZC{#~WreV!a$7k2Ug`?&CUEc0EtrkZ zL49MB)h!_K{H(*l_93D5tO0;BUnvYlo+;yss%n^&qjt6fZOa+}+FDO(~2>G z2dx@=JZ?DHP^;b7*Y1as5^uphBsh*s*z&MBd?e@I>-9kU>63PjP&^#5YTOb&x^6Cf z?674rmSHB5Fk!{Gv7rv!?qX#ei_L(XtwVqLX3L}$MI|kJ*w(rhx~tc&L&xP#?cQow zX_|gx$wMr3pRZIIr_;;O|8fAjd;1`nOeu5K(pCu7>^3E&D2OBBq?sYa(%S?GwG&_0-s%_v$L@R!5H_fc)lOb9ZoOO#p`Nn`KU z3LTTBtjwo`7(HA6 z7gmO$yTR!5L>Bsg!X8616{JUngg_@&85%>W=mChTR;x4`P=?PJ~oPuy5 zU-L`C@_!34D21{fD~Y8NVnR3t;aqZI3fIhmgmx}$oc-dKDC6Ap$Gy>a!`A*x2L1v0 WcZ@i?LyX}70000 + + + + Fiasco + + + + + + + + + + + + + diff --git a/frontend/src/main.ts b/frontend/src/main.ts new file mode 100644 index 00000000..3b2b7d07 --- /dev/null +++ b/frontend/src/main.ts @@ -0,0 +1,13 @@ +import 'hammerjs'; +import { enableProdMode } from '@angular/core'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { AppModule } from './app/app.module'; +import { environment } from './environments/environment'; + +if (environment.production) { + enableProdMode(); +} + +platformBrowserDynamic().bootstrapModule(AppModule) + .catch(err => console.error(err)); diff --git a/frontend/src/manifest.webmanifest b/frontend/src/manifest.webmanifest new file mode 100644 index 00000000..55c6a089 --- /dev/null +++ b/frontend/src/manifest.webmanifest @@ -0,0 +1,51 @@ +{ + "name": "fiasco", + "short_name": "fiasco", + "theme_color": "#1976d2", + "background_color": "#fafafa", + "display": "standalone", + "scope": "/", + "start_url": "/", + "icons": [ + { + "src": "assets/icons/icon-72x72.png", + "sizes": "72x72", + "type": "image/png" + }, + { + "src": "assets/icons/icon-96x96.png", + "sizes": "96x96", + "type": "image/png" + }, + { + "src": "assets/icons/icon-128x128.png", + "sizes": "128x128", + "type": "image/png" + }, + { + "src": "assets/icons/icon-144x144.png", + "sizes": "144x144", + "type": "image/png" + }, + { + "src": "assets/icons/icon-152x152.png", + "sizes": "152x152", + "type": "image/png" + }, + { + "src": "assets/icons/icon-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "assets/icons/icon-384x384.png", + "sizes": "384x384", + "type": "image/png" + }, + { + "src": "assets/icons/icon-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ] +} \ No newline at end of file diff --git a/frontend/src/polyfills.ts b/frontend/src/polyfills.ts new file mode 100644 index 00000000..aa665d6b --- /dev/null +++ b/frontend/src/polyfills.ts @@ -0,0 +1,63 @@ +/** + * This file includes polyfills needed by Angular and is loaded before the app. + * You can add your own extra polyfills to this file. + * + * This file is divided into 2 sections: + * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. + * 2. Application imports. Files imported after ZoneJS that should be loaded before your main + * file. + * + * The current setup is for so-called "evergreen" browsers; the last versions of browsers that + * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), + * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. + * + * Learn more in https://angular.io/guide/browser-support + */ + +/*************************************************************************************************** + * BROWSER POLYFILLS + */ + +/** IE10 and IE11 requires the following for NgClass support on SVG elements */ +// import 'classlist.js'; // Run `npm install --save classlist.js`. + +/** + * Web Animations `@angular/platform-browser/animations` + * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. + * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). + */ +// import 'web-animations-js'; // Run `npm install --save web-animations-js`. + +/** + * By default, zone.js will patch all possible macroTask and DomEvents + * user can disable parts of macroTask/DomEvents patch by setting following flags + * because those flags need to be set before `zone.js` being loaded, and webpack + * will put import in the top of bundle, so user need to create a separate file + * in this directory (for example: zone-flags.ts), and put the following flags + * into that file, and then add the following code before importing zone.js. + * import './zone-flags.ts'; + * + * The flags allowed in zone-flags.ts are listed here. + * + * The following flags will work for all browsers. + * + * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame + * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick + * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames + * + * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js + * with the following flag, it will bypass `zone.js` patch for IE/Edge + * + * (window as any).__Zone_enable_cross_context_check = true; + * + */ + +/*************************************************************************************************** + * Zone JS is required by default for Angular itself. + */ +import 'zone.js/dist/zone'; // Included with Angular CLI. + + +/*************************************************************************************************** + * APPLICATION IMPORTS + */ diff --git a/frontend/src/styles.scss b/frontend/src/styles.scss new file mode 100644 index 00000000..31800418 --- /dev/null +++ b/frontend/src/styles.scss @@ -0,0 +1,43 @@ +/* You can add global styles to this file, and also import other style files */ +$primary: #607d8b; +html, +body { + height: 100%; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body, +input { + color: #1b1b1b; + text-rendering: optimizeLegibility; + font-family: Roboto, 'Helvetica Neue', sans-serif; +} + +a { + text-decoration: none; + color: inherit; +} + +// common styles +.container { + width: 95%; + margin: auto; +} +.margins { + padding: 10px; + margin-top: 15px; +} +.divider { + width: 60%; + height: 3px; + background: #607d8b; + margin: 5px 0px; +} +.form-container { + padding: 20px; +} diff --git a/frontend/src/test.ts b/frontend/src/test.ts new file mode 100644 index 00000000..16317897 --- /dev/null +++ b/frontend/src/test.ts @@ -0,0 +1,20 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js/dist/zone-testing'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +declare const require: any; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting() +); +// Then we find all the tests. +const context = require.context('./', true, /\.spec\.ts$/); +// And load the modules. +context.keys().map(context); diff --git a/frontend/tsconfig.app.json b/frontend/tsconfig.app.json new file mode 100644 index 00000000..565a11a2 --- /dev/null +++ b/frontend/tsconfig.app.json @@ -0,0 +1,18 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": [] + }, + "files": [ + "src/main.ts", + "src/polyfills.ts" + ], + "include": [ + "src/**/*.ts" + ], + "exclude": [ + "src/test.ts", + "src/**/*.spec.ts" + ] +} diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json new file mode 100644 index 00000000..30956ae7 --- /dev/null +++ b/frontend/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./", + "outDir": "./dist/out-tsc", + "sourceMap": true, + "declaration": false, + "downlevelIteration": true, + "experimentalDecorators": true, + "module": "esnext", + "moduleResolution": "node", + "importHelpers": true, + "target": "es2015", + "typeRoots": [ + "node_modules/@types" + ], + "lib": [ + "es2018", + "dom" + ] + }, + "angularCompilerOptions": { + "fullTemplateTypeCheck": true, + "strictInjectionParameters": true + } +} diff --git a/frontend/tsconfig.spec.json b/frontend/tsconfig.spec.json new file mode 100644 index 00000000..6400fde7 --- /dev/null +++ b/frontend/tsconfig.spec.json @@ -0,0 +1,18 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/spec", + "types": [ + "jasmine", + "node" + ] + }, + "files": [ + "src/test.ts", + "src/polyfills.ts" + ], + "include": [ + "src/**/*.spec.ts", + "src/**/*.d.ts" + ] +} diff --git a/frontend/tslint.json b/frontend/tslint.json new file mode 100644 index 00000000..c8d70f15 --- /dev/null +++ b/frontend/tslint.json @@ -0,0 +1,91 @@ +{ + "extends": "tslint:recommended", + "rules": { + "array-type": false, + "arrow-parens": false, + "deprecation": { + "severity": "warning" + }, + "component-class-suffix": true, + "contextual-lifecycle": true, + "directive-class-suffix": true, + "directive-selector": [ + true, + "attribute", + "app", + "camelCase" + ], + "component-selector": [ + true, + "element", + "app", + "kebab-case" + ], + "import-blacklist": [ + true, + "rxjs/Rx" + ], + "interface-name": false, + "max-classes-per-file": false, + "max-line-length": [ + true, + 140 + ], + "member-access": false, + "member-ordering": [ + true, + { + "order": [ + "static-field", + "instance-field", + "static-method", + "instance-method" + ] + } + ], + "no-consecutive-blank-lines": false, + "no-console": [ + true, + "debug", + "info", + "time", + "timeEnd", + "trace" + ], + "no-empty": false, + "no-inferrable-types": [ + true, + "ignore-params" + ], + "no-non-null-assertion": true, + "no-redundant-jsdoc": true, + "no-switch-case-fall-through": true, + "no-var-requires": false, + "object-literal-key-quotes": [ + true, + "as-needed" + ], + "object-literal-sort-keys": false, + "ordered-imports": false, + "quotemark": [ + true, + "single" + ], + "trailing-comma": false, + "no-conflicting-lifecycle": true, + "no-host-metadata-property": true, + "no-input-rename": true, + "no-inputs-metadata-property": true, + "no-output-native": true, + "no-output-on-prefix": true, + "no-output-rename": true, + "no-outputs-metadata-property": true, + "template-banana-in-box": true, + "template-no-negated-async": true, + "use-lifecycle-interface": true, + "use-pipe-transform-interface": true + }, + "rulesDirectory": [ + "codelyzer" + ] +} \ No newline at end of file From 9ce979b39415c016e19ff700b2b501e0fc90816b Mon Sep 17 00:00:00 2001 From: Pinaki Date: Sun, 13 Oct 2019 11:49:30 +0530 Subject: [PATCH 2/3] UI hotfix --- frontend/src/app/views/area/area.component.html | 4 ++-- frontend/src/app/views/area/donors/donors.component.html | 2 +- frontend/src/app/views/area/donors/donors.component.ts | 6 +++--- .../src/app/views/area/volunteers/volunteers.component.html | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/frontend/src/app/views/area/area.component.html b/frontend/src/app/views/area/area.component.html index f6a6a975..557f9ea9 100644 --- a/frontend/src/app/views/area/area.component.html +++ b/frontend/src/app/views/area/area.component.html @@ -27,14 +27,14 @@

--> diff --git a/frontend/src/app/views/area/donors/donors.component.html b/frontend/src/app/views/area/donors/donors.component.html index 21db52a5..2fbfbc80 100644 --- a/frontend/src/app/views/area/donors/donors.component.html +++ b/frontend/src/app/views/area/donors/donors.component.html @@ -7,7 +7,7 @@ > Donate Now -

Donations available for collection

+

People willing to help

diff --git a/frontend/src/app/views/area/donors/donors.component.ts b/frontend/src/app/views/area/donors/donors.component.ts index c97abe43..c2a8d1c1 100644 --- a/frontend/src/app/views/area/donors/donors.component.ts +++ b/frontend/src/app/views/area/donors/donors.component.ts @@ -27,9 +27,9 @@ export class DonorsComponent implements OnInit, OnDestroy { .pipe(takeUntil(this.subscriptions$)) .subscribe((data: IAreaAction[]) => (this.dataSource = data)); - this.router.routeReuseStrategy.shouldReuseRoute = () => { - return false; - }; + // this.router.routeReuseStrategy.shouldReuseRoute = () => { + // return false; + // }; } ngOnDestroy() { diff --git a/frontend/src/app/views/area/volunteers/volunteers.component.html b/frontend/src/app/views/area/volunteers/volunteers.component.html index 82ed5089..6d91a5b9 100644 --- a/frontend/src/app/views/area/volunteers/volunteers.component.html +++ b/frontend/src/app/views/area/volunteers/volunteers.component.html @@ -7,7 +7,7 @@ > Volunteer -

Volunteers Available

+

Heroes on the ground

From b6f63d93c670fef1cd6180ab522846fbae883f49 Mon Sep 17 00:00:00 2001 From: Pinaki Date: Sun, 13 Oct 2019 12:48:46 +0530 Subject: [PATCH 3/3] Updating README file --- README.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/README.md b/README.md index 8485fa33..aefe8945 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,19 @@ # disaster-management Lynk Hackathon 2019 - Disaster Management + +Tech Stack + + - RestAPIs + - Groovy (2.5.8) + - Spring Boot (2.1.9.RELEASE) and Spring Data JPA + - MySql (5.7) + - JWT based authentication + + - Frontend + - Angular 8 + - Angular material framework + - PWA supported + +The two applications needs to be run separately. The IP of the api application needs to be updated in the frontend application for proper functioning (environment.ts) + +PagingAndSortingRepository and JPARepository interfaces has been used for handling all DB related operations.