From 5bd5c2ebbf4a5938120d1170c656968027c50375 Mon Sep 17 00:00:00 2001 From: krishna agarwal <35657404+krishnaCG-1997@users.noreply.github.com> Date: Fri, 4 Dec 2020 19:47:54 +0530 Subject: [PATCH 01/10] team1 krishna frontend backend --- jumpthequeue-angular/.editorconfig | 13 + jumpthequeue-angular/.gitignore | 46 + jumpthequeue-angular/README.md | 27 + jumpthequeue-angular/angular.json | 132 + jumpthequeue-angular/browserslist | 12 + jumpthequeue-angular/e2e/protractor.conf.js | 32 + jumpthequeue-angular/e2e/src/app.e2e-spec.ts | 23 + jumpthequeue-angular/e2e/src/app.po.ts | 11 + jumpthequeue-angular/e2e/tsconfig.json | 13 + jumpthequeue-angular/karma.conf.js | 32 + jumpthequeue-angular/package-lock.json | 12536 ++++++++++++++++ jumpthequeue-angular/package.json | 51 + .../src/app/app-routing.module.ts | 42 + .../src/app/app.component.css | 4 + .../src/app/app.component.html | 3 + .../src/app/app.component.spec.ts | 35 + jumpthequeue-angular/src/app/app.component.ts | 15 + jumpthequeue-angular/src/app/app.module.ts | 42 + .../src/app/auth/auth.component.css | 7 + .../src/app/auth/auth.component.html | 10 + .../src/app/auth/auth.component.spec.ts | 25 + .../src/app/auth/auth.component.ts | 15 + .../src/app/auth/auth.guard.ts | 25 + .../src/app/auth/auth.service.spec.ts | 16 + .../src/app/auth/auth.service.ts | 117 + .../src/app/auth/login/login.component.css | 12 + .../src/app/auth/login/login.component.html | 29 + .../app/auth/login/login.component.spec.ts | 25 + .../src/app/auth/login/login.component.ts | 44 + .../app/auth/models/filter-visitor.model.ts | 8 + .../src/app/auth/models/pageable.model.ts | 7 + .../src/app/auth/models/sort.model.ts | 4 + .../src/app/auth/models/visitor.model.ts | 10 + .../app/auth/register/register.component.css | 8 + .../app/auth/register/register.component.html | 87 + .../auth/register/register.component.spec.ts | 25 + .../app/auth/register/register.component.ts | 86 + .../src/app/shared/modals/event.modal.ts | 16 + .../shared/modals/queue-detail-cto.model.ts | 13 + .../app/shared/modals/queue-detail.model.ts | 10 + .../app/shared/services/event.service.spec.ts | 16 + .../src/app/shared/services/event.service.ts | 91 + .../src/app/user/home/home.component.css | 39 + .../src/app/user/home/home.component.html | 11 + .../src/app/user/home/home.component.spec.ts | 25 + .../src/app/user/home/home.component.ts | 25 + .../src/app/user/user.component.css | 71 + .../src/app/user/user.component.html | 30 + .../src/app/user/user.component.spec.ts | 25 + .../src/app/user/user.component.ts | 63 + .../user/view-queue/view-queue.component.css | 50 + .../user/view-queue/view-queue.component.html | 28 + .../view-queue/view-queue.component.spec.ts | 25 + .../user/view-queue/view-queue.component.ts | 90 + jumpthequeue-angular/src/assets/.gitkeep | 0 .../src/assets/image/candle (1).png | Bin 0 -> 1035 bytes .../src/assets/image/candle.png | Bin 0 -> 805 bytes .../src/assets/image/diya.svg | 1 + .../src/assets/image/jumptheq.png | Bin 0 -> 15841 bytes .../src/assets/image/screen.png | Bin 0 -> 93059 bytes .../src/assets/image/undraw_Taken_re_yn20.svg | 1 + .../src/environments/environment.prod.ts | 3 + .../src/environments/environment.ts | 16 + jumpthequeue-angular/src/favicon.ico | Bin 0 -> 948 bytes jumpthequeue-angular/src/index.html | 20 + jumpthequeue-angular/src/main.ts | 12 + jumpthequeue-angular/src/polyfills.ts | 63 + jumpthequeue-angular/src/styles.css | 4 + jumpthequeue-angular/src/test.ts | 25 + jumpthequeue-angular/tsconfig.app.json | 14 + jumpthequeue-angular/tsconfig.json | 26 + jumpthequeue-angular/tsconfig.spec.json | 18 + jumpthequeue-angular/tslint.json | 91 + jumpthequeue-java/jtqjava/.gitignore | 21 + jumpthequeue-java/jtqjava/api/pom.xml | 45 + .../eventmanagement/common/api/Event.java | 89 + .../logic/api/Eventmanagement.java | 11 + .../logic/api/to/EventEto.java | 208 + .../logic/api/to/EventSearchCriteriaTo.java | 232 + .../logic/api/usecase/UcFindEvent.java | 28 + .../logic/api/usecase/UcManageEvent.java | 42 + .../api/rest/EventmanagementRestService.java | 65 + .../general/common/api/ApplicationEntity.java | 11 + .../api/to/AbstractSearchCriteriaTo.java | 32 + .../common/api/QueueDetail.java | 83 + .../logic/api/Queuedetailmanagement.java | 11 + .../logic/api/to/QueueDetailCto.java | 50 + .../logic/api/to/QueueDetailEto.java | 198 + .../api/to/QueueDetailSearchCriteriaTo.java | 182 + .../logic/api/usecase/UcFindQueueDetail.java | 53 + .../api/usecase/UcManageQueueDetail.java | 26 + .../QueuedetailmanagementRestService.java | 90 + .../visitormanagement/common/api/Visitor.java | 91 + .../logic/api/Visitormanagement.java | 11 + .../logic/api/to/VisitorEto.java | 191 + .../logic/api/to/VisitorSearchCriteriaTo.java | 226 + .../logic/api/usecase/UcFindVisitor.java | 28 + .../logic/api/usecase/UcManageVisitor.java | 26 + .../rest/VisitormanagementRestService.java | 65 + .../devonfw/application/jtqjava/ToTest.java | 323 + jumpthequeue-java/jtqjava/core/pom.xml | 217 + .../application/jtqjava/SpringBootApp.java | 29 + .../dataaccess/api/EventEntity.java | 183 + .../dataaccess/api/repo/EventRepository.java | 141 + .../logic/base/usecase/AbstractEventUc.java | 27 + .../logic/impl/EventmanagementImpl.java | 73 + .../logic/impl/usecase/UcFindEventImpl.java | 50 + .../logic/impl/usecase/UcManageEventImpl.java | 92 + .../rest/EventmanagementRestServiceImpl.java | 46 + .../general/common/api/ApplicationEntity.java | 11 + .../ApplicationAccessControlConfig.java | 32 + .../base/AbstractBeanMapperSupport.java | 31 + .../ApplicationObjectMapperFactory.java | 51 + .../common/impl/config/BeansOrikaConfig.java | 14 + .../common/impl/config/CsrfTokenImpl.java | 60 + .../impl/security/BaseUserDetailsService.java | 123 + .../impl/security/CsrfRequestMatcher.java | 54 + .../api/ApplicationPersistenceEntity.java | 86 + .../general/dataaccess/impl/JpaConfig.java | 27 + .../logic/base/AbstractComponentFacade.java | 16 + .../general/logic/base/AbstractLogic.java | 127 + .../general/logic/base/AbstractUc.java | 18 + .../DefaultRolesPrefixPostProcessor.java | 61 + .../impl/config/BaseWebSecurityConfig.java | 119 + .../impl/config/ServletInitializer.java | 23 + .../service/impl/config/WebConfig.java | 80 + .../impl/config/WebSecurityBeansConfig.java | 52 + .../impl/config/WebSecurityConfig.java | 21 + .../rest/ApplicationAccessDeniedHandler.java | 46 + .../dataaccess/api/QueueDetailEntity.java | 218 + .../api/repo/QueueDetailRepository.java | 141 + .../base/usecase/AbstractQueueDetailUc.java | 27 + .../logic/impl/QueuedetailmanagementImpl.java | 70 + .../impl/usecase/UcFindQueueDetailImpl.java | 97 + .../impl/usecase/UcManageQueueDetailImpl.java | 150 + .../QueuedetailmanagementRestServiceImpl.java | 66 + .../dataaccess/api/VisitorEntity.java | 144 + .../api/repo/VisitorRepository.java | 140 + .../logic/base/usecase/AbstractVisitorUc.java | 27 + .../logic/impl/VisitormanagementImpl.java | 50 + .../logic/impl/usecase/UcFindVisitorImpl.java | 48 + .../impl/usecase/UcManageVisitorImpl.java | 49 + .../VisitormanagementRestServiceImpl.java | 46 + .../META-INF/cxf/org.apache.cxf.Logger | 1 + .../src/main/resources/application.properties | 36 + .../resources/config/application.properties | 27 + .../migration/1.0/V0001__Create_Sequence.sql | 3 + .../migration/1.0/V0005__Create_Visitor.sql | 4 + .../db/migration/1.0/V0006__Create_Event.sql | 3 + .../1.0/V0007__Create_Queue_Detail.sql | 5 + .../db/migration/1.0/V0008__Master_data.sql | 25 + .../core/src/main/resources/static/index.html | 18 + .../logic/impl/EventmanagementTest.java | 67 + .../common/base/Devon4jPackageCheckTest.java | 66 + .../common/base/PermissionCheckTest.java | 67 + .../base/test/ApplicationComponentTest.java | 22 + .../base/test/ApplicationSubsystemTest.java | 16 + .../common/base/test/DbTestHelper.java | 44 + .../general/common/base/test/TestUtil.java | 29 + .../common/impl/config/TestDbConfig.java | 35 + .../impl/config/TestWebSecurityConfig.java | 54 + .../service/base/test/RestServiceTest.java | 67 + .../logic/impl/VisitormanagementTest.java | 63 + .../logic/impl/QueueDetailmanagementTest.java | 75 + .../resources/config/application.properties | 13 + .../test/resources/db/test/V0001__InitDb.sql | 2 + jumpthequeue-java/jtqjava/pom.xml | 488 + jumpthequeue-java/jtqjava/server/pom.xml | 145 + .../server/src/main/resources/logback.xml | 32 + .../jtqjava/SpringBootBatchApp.java | 29 + .../batch/impl/config/BeansBatchConfig.java | 193 + .../migration/h2/V0005__Add_batch_tables.sql | 81 + .../base/test/SpringBatchIntegrationTest.java | 53 + .../general/common/base/test/TestUtil.java | 29 + 174 files changed, 21964 insertions(+) create mode 100644 jumpthequeue-angular/.editorconfig create mode 100644 jumpthequeue-angular/.gitignore create mode 100644 jumpthequeue-angular/README.md create mode 100644 jumpthequeue-angular/angular.json create mode 100644 jumpthequeue-angular/browserslist create mode 100644 jumpthequeue-angular/e2e/protractor.conf.js create mode 100644 jumpthequeue-angular/e2e/src/app.e2e-spec.ts create mode 100644 jumpthequeue-angular/e2e/src/app.po.ts create mode 100644 jumpthequeue-angular/e2e/tsconfig.json create mode 100644 jumpthequeue-angular/karma.conf.js create mode 100644 jumpthequeue-angular/package-lock.json create mode 100644 jumpthequeue-angular/package.json create mode 100644 jumpthequeue-angular/src/app/app-routing.module.ts create mode 100644 jumpthequeue-angular/src/app/app.component.css create mode 100644 jumpthequeue-angular/src/app/app.component.html create mode 100644 jumpthequeue-angular/src/app/app.component.spec.ts create mode 100644 jumpthequeue-angular/src/app/app.component.ts create mode 100644 jumpthequeue-angular/src/app/app.module.ts create mode 100644 jumpthequeue-angular/src/app/auth/auth.component.css create mode 100644 jumpthequeue-angular/src/app/auth/auth.component.html create mode 100644 jumpthequeue-angular/src/app/auth/auth.component.spec.ts create mode 100644 jumpthequeue-angular/src/app/auth/auth.component.ts create mode 100644 jumpthequeue-angular/src/app/auth/auth.guard.ts create mode 100644 jumpthequeue-angular/src/app/auth/auth.service.spec.ts create mode 100644 jumpthequeue-angular/src/app/auth/auth.service.ts create mode 100644 jumpthequeue-angular/src/app/auth/login/login.component.css create mode 100644 jumpthequeue-angular/src/app/auth/login/login.component.html create mode 100644 jumpthequeue-angular/src/app/auth/login/login.component.spec.ts create mode 100644 jumpthequeue-angular/src/app/auth/login/login.component.ts create mode 100644 jumpthequeue-angular/src/app/auth/models/filter-visitor.model.ts create mode 100644 jumpthequeue-angular/src/app/auth/models/pageable.model.ts create mode 100644 jumpthequeue-angular/src/app/auth/models/sort.model.ts create mode 100644 jumpthequeue-angular/src/app/auth/models/visitor.model.ts create mode 100644 jumpthequeue-angular/src/app/auth/register/register.component.css create mode 100644 jumpthequeue-angular/src/app/auth/register/register.component.html create mode 100644 jumpthequeue-angular/src/app/auth/register/register.component.spec.ts create mode 100644 jumpthequeue-angular/src/app/auth/register/register.component.ts create mode 100644 jumpthequeue-angular/src/app/shared/modals/event.modal.ts create mode 100644 jumpthequeue-angular/src/app/shared/modals/queue-detail-cto.model.ts create mode 100644 jumpthequeue-angular/src/app/shared/modals/queue-detail.model.ts create mode 100644 jumpthequeue-angular/src/app/shared/services/event.service.spec.ts create mode 100644 jumpthequeue-angular/src/app/shared/services/event.service.ts create mode 100644 jumpthequeue-angular/src/app/user/home/home.component.css create mode 100644 jumpthequeue-angular/src/app/user/home/home.component.html create mode 100644 jumpthequeue-angular/src/app/user/home/home.component.spec.ts create mode 100644 jumpthequeue-angular/src/app/user/home/home.component.ts create mode 100644 jumpthequeue-angular/src/app/user/user.component.css create mode 100644 jumpthequeue-angular/src/app/user/user.component.html create mode 100644 jumpthequeue-angular/src/app/user/user.component.spec.ts create mode 100644 jumpthequeue-angular/src/app/user/user.component.ts create mode 100644 jumpthequeue-angular/src/app/user/view-queue/view-queue.component.css create mode 100644 jumpthequeue-angular/src/app/user/view-queue/view-queue.component.html create mode 100644 jumpthequeue-angular/src/app/user/view-queue/view-queue.component.spec.ts create mode 100644 jumpthequeue-angular/src/app/user/view-queue/view-queue.component.ts create mode 100644 jumpthequeue-angular/src/assets/.gitkeep create mode 100644 jumpthequeue-angular/src/assets/image/candle (1).png create mode 100644 jumpthequeue-angular/src/assets/image/candle.png create mode 100644 jumpthequeue-angular/src/assets/image/diya.svg create mode 100644 jumpthequeue-angular/src/assets/image/jumptheq.png create mode 100644 jumpthequeue-angular/src/assets/image/screen.png create mode 100644 jumpthequeue-angular/src/assets/image/undraw_Taken_re_yn20.svg create mode 100644 jumpthequeue-angular/src/environments/environment.prod.ts create mode 100644 jumpthequeue-angular/src/environments/environment.ts create mode 100644 jumpthequeue-angular/src/favicon.ico create mode 100644 jumpthequeue-angular/src/index.html create mode 100644 jumpthequeue-angular/src/main.ts create mode 100644 jumpthequeue-angular/src/polyfills.ts create mode 100644 jumpthequeue-angular/src/styles.css create mode 100644 jumpthequeue-angular/src/test.ts create mode 100644 jumpthequeue-angular/tsconfig.app.json create mode 100644 jumpthequeue-angular/tsconfig.json create mode 100644 jumpthequeue-angular/tsconfig.spec.json create mode 100644 jumpthequeue-angular/tslint.json create mode 100644 jumpthequeue-java/jtqjava/.gitignore create mode 100644 jumpthequeue-java/jtqjava/api/pom.xml create mode 100644 jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/eventmanagement/common/api/Event.java create mode 100644 jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/api/Eventmanagement.java create mode 100644 jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/api/to/EventEto.java create mode 100644 jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/api/to/EventSearchCriteriaTo.java create mode 100644 jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/api/usecase/UcFindEvent.java create mode 100644 jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/api/usecase/UcManageEvent.java create mode 100644 jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/eventmanagement/service/api/rest/EventmanagementRestService.java create mode 100644 jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/general/common/api/ApplicationEntity.java create mode 100644 jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/general/common/api/to/AbstractSearchCriteriaTo.java create mode 100644 jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/common/api/QueueDetail.java create mode 100644 jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/api/Queuedetailmanagement.java create mode 100644 jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/api/to/QueueDetailCto.java create mode 100644 jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/api/to/QueueDetailEto.java create mode 100644 jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/api/to/QueueDetailSearchCriteriaTo.java create mode 100644 jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/api/usecase/UcFindQueueDetail.java create mode 100644 jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/api/usecase/UcManageQueueDetail.java create mode 100644 jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/service/api/rest/QueuedetailmanagementRestService.java create mode 100644 jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/visitormanagement/common/api/Visitor.java create mode 100644 jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/visitormanagement/logic/api/Visitormanagement.java create mode 100644 jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/visitormanagement/logic/api/to/VisitorEto.java create mode 100644 jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/visitormanagement/logic/api/to/VisitorSearchCriteriaTo.java create mode 100644 jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/visitormanagement/logic/api/usecase/UcFindVisitor.java create mode 100644 jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/visitormanagement/logic/api/usecase/UcManageVisitor.java create mode 100644 jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/visitormanagement/service/api/rest/VisitormanagementRestService.java create mode 100644 jumpthequeue-java/jtqjava/api/src/test/java/com/devonfw/application/jtqjava/ToTest.java create mode 100644 jumpthequeue-java/jtqjava/core/pom.xml create mode 100644 jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/SpringBootApp.java create mode 100644 jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/eventmanagement/dataaccess/api/EventEntity.java create mode 100644 jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/eventmanagement/dataaccess/api/repo/EventRepository.java create mode 100644 jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/base/usecase/AbstractEventUc.java create mode 100644 jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/impl/EventmanagementImpl.java create mode 100644 jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/impl/usecase/UcFindEventImpl.java create mode 100644 jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/impl/usecase/UcManageEventImpl.java create mode 100644 jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/eventmanagement/service/impl/rest/EventmanagementRestServiceImpl.java create mode 100644 jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/common/api/ApplicationEntity.java create mode 100644 jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/common/api/security/ApplicationAccessControlConfig.java create mode 100644 jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/common/base/AbstractBeanMapperSupport.java create mode 100644 jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/common/impl/config/ApplicationObjectMapperFactory.java create mode 100644 jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/common/impl/config/BeansOrikaConfig.java create mode 100644 jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/common/impl/config/CsrfTokenImpl.java create mode 100644 jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/common/impl/security/BaseUserDetailsService.java create mode 100644 jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/common/impl/security/CsrfRequestMatcher.java create mode 100644 jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/dataaccess/api/ApplicationPersistenceEntity.java create mode 100644 jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/dataaccess/impl/JpaConfig.java create mode 100644 jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/logic/base/AbstractComponentFacade.java create mode 100644 jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/logic/base/AbstractLogic.java create mode 100644 jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/logic/base/AbstractUc.java create mode 100644 jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/logic/impl/config/DefaultRolesPrefixPostProcessor.java create mode 100644 jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/service/impl/config/BaseWebSecurityConfig.java create mode 100644 jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/service/impl/config/ServletInitializer.java create mode 100644 jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/service/impl/config/WebConfig.java create mode 100644 jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/service/impl/config/WebSecurityBeansConfig.java create mode 100644 jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/service/impl/config/WebSecurityConfig.java create mode 100644 jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/service/impl/rest/ApplicationAccessDeniedHandler.java create mode 100644 jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/dataaccess/api/QueueDetailEntity.java create mode 100644 jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/dataaccess/api/repo/QueueDetailRepository.java create mode 100644 jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/base/usecase/AbstractQueueDetailUc.java create mode 100644 jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/impl/QueuedetailmanagementImpl.java create mode 100644 jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/impl/usecase/UcFindQueueDetailImpl.java create mode 100644 jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/impl/usecase/UcManageQueueDetailImpl.java create mode 100644 jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/service/impl/rest/QueuedetailmanagementRestServiceImpl.java create mode 100644 jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/visitormanagement/dataaccess/api/VisitorEntity.java create mode 100644 jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/visitormanagement/dataaccess/api/repo/VisitorRepository.java create mode 100644 jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/visitormanagement/logic/base/usecase/AbstractVisitorUc.java create mode 100644 jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/visitormanagement/logic/impl/VisitormanagementImpl.java create mode 100644 jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/visitormanagement/logic/impl/usecase/UcFindVisitorImpl.java create mode 100644 jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/visitormanagement/logic/impl/usecase/UcManageVisitorImpl.java create mode 100644 jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/visitormanagement/service/impl/rest/VisitormanagementRestServiceImpl.java create mode 100644 jumpthequeue-java/jtqjava/core/src/main/resources/META-INF/cxf/org.apache.cxf.Logger create mode 100644 jumpthequeue-java/jtqjava/core/src/main/resources/application.properties create mode 100644 jumpthequeue-java/jtqjava/core/src/main/resources/config/application.properties create mode 100644 jumpthequeue-java/jtqjava/core/src/main/resources/db/migration/1.0/V0001__Create_Sequence.sql create mode 100644 jumpthequeue-java/jtqjava/core/src/main/resources/db/migration/1.0/V0005__Create_Visitor.sql create mode 100644 jumpthequeue-java/jtqjava/core/src/main/resources/db/migration/1.0/V0006__Create_Event.sql create mode 100644 jumpthequeue-java/jtqjava/core/src/main/resources/db/migration/1.0/V0007__Create_Queue_Detail.sql create mode 100644 jumpthequeue-java/jtqjava/core/src/main/resources/db/migration/1.0/V0008__Master_data.sql create mode 100644 jumpthequeue-java/jtqjava/core/src/main/resources/static/index.html create mode 100644 jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/eventmanagement/logic/impl/EventmanagementTest.java create mode 100644 jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/general/common/base/Devon4jPackageCheckTest.java create mode 100644 jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/general/common/base/PermissionCheckTest.java create mode 100644 jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/general/common/base/test/ApplicationComponentTest.java create mode 100644 jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/general/common/base/test/ApplicationSubsystemTest.java create mode 100644 jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/general/common/base/test/DbTestHelper.java create mode 100644 jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/general/common/base/test/TestUtil.java create mode 100644 jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/general/common/impl/config/TestDbConfig.java create mode 100644 jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/general/common/impl/config/TestWebSecurityConfig.java create mode 100644 jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/general/service/base/test/RestServiceTest.java create mode 100644 jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/visitormanagement/logic/impl/VisitormanagementTest.java create mode 100644 jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjavaqueuedetailmanagement/logic/impl/QueueDetailmanagementTest.java create mode 100644 jumpthequeue-java/jtqjava/core/src/test/resources/config/application.properties create mode 100644 jumpthequeue-java/jtqjava/core/src/test/resources/db/test/V0001__InitDb.sql create mode 100644 jumpthequeue-java/jtqjava/pom.xml create mode 100644 jumpthequeue-java/jtqjava/server/pom.xml create mode 100644 jumpthequeue-java/jtqjava/server/src/main/resources/logback.xml create mode 100644 jumpthequeue-java/jtqjava/src/main/java/com/devonfw/application/jtqjava/SpringBootBatchApp.java create mode 100644 jumpthequeue-java/jtqjava/src/main/java/com/devonfw/application/jtqjava/general/batch/impl/config/BeansBatchConfig.java create mode 100644 jumpthequeue-java/jtqjava/src/main/resources/db/migration/h2/V0005__Add_batch_tables.sql create mode 100644 jumpthequeue-java/jtqjava/src/test/java/com/devonfw/application/jtqjava/general/batch/base/test/SpringBatchIntegrationTest.java create mode 100644 jumpthequeue-java/jtqjava/src/test/java/com/devonfw/application/jtqjava/general/common/base/test/TestUtil.java diff --git a/jumpthequeue-angular/.editorconfig b/jumpthequeue-angular/.editorconfig new file mode 100644 index 0000000..e89330a --- /dev/null +++ b/jumpthequeue-angular/.editorconfig @@ -0,0 +1,13 @@ +# Editor configuration, see https://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/jumpthequeue-angular/.gitignore b/jumpthequeue-angular/.gitignore new file mode 100644 index 0000000..86d943a --- /dev/null +++ b/jumpthequeue-angular/.gitignore @@ -0,0 +1,46 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp +/out-tsc +# Only exists if Bazel was run +/bazel-out + +# dependencies +/node_modules + +# profiling files +chrome-profiler-events*.json +speed-measure-plugin*.json + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings + +# System Files +.DS_Store +Thumbs.db diff --git a/jumpthequeue-angular/README.md b/jumpthequeue-angular/README.md new file mode 100644 index 0000000..4c5dab4 --- /dev/null +++ b/jumpthequeue-angular/README.md @@ -0,0 +1,27 @@ +# JumpthequeueAngular + +This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 9.0.2. + +## 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/jumpthequeue-angular/angular.json b/jumpthequeue-angular/angular.json new file mode 100644 index 0000000..a98d515 --- /dev/null +++ b/jumpthequeue-angular/angular.json @@ -0,0 +1,132 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "jumpthequeue-angular": { + "projectType": "application", + "schematics": {}, + "root": "", + "sourceRoot": "src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "outputPath": "dist/jumpthequeue-angular", + "index": "src/index.html", + "main": "src/main.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.app.json", + "aot": true, + "assets": [ + "src/favicon.ico", + "src/assets" + ], + "styles": [ + "./node_modules/@angular/material/prebuilt-themes/pink-bluegrey.css", + "src/styles.css" + ], + "scripts": [ + "node_modules/jquery/dist/jquery.min.js" + ] + }, + "configurations": { + "production": { + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ], + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "extractCss": true, + "namedChunks": false, + "extractLicenses": true, + "vendorChunk": false, + "buildOptimizer": true, + "budgets": [ + { + "type": "initial", + "maximumWarning": "2mb", + "maximumError": "5mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "6kb", + "maximumError": "10kb" + } + ] + } + } + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "options": { + "browserTarget": "jumpthequeue-angular:build" + }, + "configurations": { + "production": { + "browserTarget": "jumpthequeue-angular:build:production" + } + } + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "jumpthequeue-angular: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" + ], + "styles": [ + "./node_modules/@angular/material/prebuilt-themes/pink-bluegrey.css", + "src/styles.css" + ], + "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": "jumpthequeue-angular:serve" + }, + "configurations": { + "production": { + "devServerTarget": "jumpthequeue-angular:serve:production" + } + } + } + } + } + }, + "defaultProject": "jumpthequeue-angular", + "cli": { + "analytics": "ac92908a-57c4-40bc-a162-0e4c5e9d64b4" + } +} \ No newline at end of file diff --git a/jumpthequeue-angular/browserslist b/jumpthequeue-angular/browserslist new file mode 100644 index 0000000..8084853 --- /dev/null +++ b/jumpthequeue-angular/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/jumpthequeue-angular/e2e/protractor.conf.js b/jumpthequeue-angular/e2e/protractor.conf.js new file mode 100644 index 0000000..7c798cf --- /dev/null +++ b/jumpthequeue-angular/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/jumpthequeue-angular/e2e/src/app.e2e-spec.ts b/jumpthequeue-angular/e2e/src/app.e2e-spec.ts new file mode 100644 index 0000000..baa2a2e --- /dev/null +++ b/jumpthequeue-angular/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('jumpthequeue-angular 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/jumpthequeue-angular/e2e/src/app.po.ts b/jumpthequeue-angular/e2e/src/app.po.ts new file mode 100644 index 0000000..b68475e --- /dev/null +++ b/jumpthequeue-angular/e2e/src/app.po.ts @@ -0,0 +1,11 @@ +import { browser, by, element } from 'protractor'; + +export class AppPage { + navigateTo(): Promise { + return browser.get(browser.baseUrl) as Promise; + } + + getTitleText(): Promise { + return element(by.css('app-root .content span')).getText() as Promise; + } +} diff --git a/jumpthequeue-angular/e2e/tsconfig.json b/jumpthequeue-angular/e2e/tsconfig.json new file mode 100644 index 0000000..39b800f --- /dev/null +++ b/jumpthequeue-angular/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/jumpthequeue-angular/karma.conf.js b/jumpthequeue-angular/karma.conf.js new file mode 100644 index 0000000..8870cc6 --- /dev/null +++ b/jumpthequeue-angular/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/jumpthequeue-angular'), + 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/jumpthequeue-angular/package-lock.json b/jumpthequeue-angular/package-lock.json new file mode 100644 index 0000000..0f4ebfb --- /dev/null +++ b/jumpthequeue-angular/package-lock.json @@ -0,0 +1,12536 @@ +{ + "name": "jumpthequeue-angular", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@angular-devkit/architect": { + "version": "0.900.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.900.7.tgz", + "integrity": "sha512-hfiTVYc72kzbXrzK4tea6jnTDnSKpE1D+vEptBXN2tdXEVNEAQI5Qm5L1zVDtt16UdqoUTUypIgUc9jcNH1mUQ==", + "dev": true, + "requires": { + "@angular-devkit/core": "9.0.7", + "rxjs": "6.5.3" + }, + "dependencies": { + "rxjs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", + "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@angular-devkit/build-angular": { + "version": "0.900.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.900.7.tgz", + "integrity": "sha512-Yv2y3OEaYEd0fE0pKvtqBpmkQYs9xJws7thHnJYCwIfYO55RfolYsXkJgAXke/4NPLrD3EsIDqoPxF7l+uw2/Q==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.900.7", + "@angular-devkit/build-optimizer": "0.900.7", + "@angular-devkit/build-webpack": "0.900.7", + "@angular-devkit/core": "9.0.7", + "@babel/core": "7.7.7", + "@babel/generator": "7.7.7", + "@babel/preset-env": "7.7.7", + "@ngtools/webpack": "9.0.7", + "ajv": "6.10.2", + "autoprefixer": "9.7.1", + "babel-loader": "8.0.6", + "browserslist": "^4.9.1", + "cacache": "13.0.1", + "caniuse-lite": "^1.0.30001032", + "circular-dependency-plugin": "5.2.0", + "copy-webpack-plugin": "5.1.1", + "core-js": "3.6.4", + "coverage-istanbul-loader": "2.0.3", + "cssnano": "4.1.10", + "file-loader": "4.2.0", + "find-cache-dir": "3.0.0", + "glob": "7.1.5", + "jest-worker": "24.9.0", + "karma-source-map-support": "1.4.0", + "less": "3.10.3", + "less-loader": "5.0.0", + "license-webpack-plugin": "2.1.3", + "loader-utils": "1.2.3", + "magic-string": "0.25.4", + "mini-css-extract-plugin": "0.8.0", + "minimatch": "3.0.4", + "open": "7.0.0", + "parse5": "4.0.0", + "postcss": "7.0.21", + "postcss-import": "12.0.1", + "postcss-loader": "3.0.0", + "raw-loader": "3.1.0", + "regenerator-runtime": "0.13.3", + "rimraf": "3.0.0", + "rollup": "1.25.2", + "rxjs": "6.5.3", + "sass": "1.23.3", + "sass-loader": "8.0.0", + "semver": "6.3.0", + "source-map": "0.7.3", + "source-map-loader": "0.2.4", + "source-map-support": "0.5.16", + "speed-measure-webpack-plugin": "1.3.1", + "style-loader": "1.0.0", + "stylus": "0.54.7", + "stylus-loader": "3.0.2", + "terser": "4.5.1", + "terser-webpack-plugin": "2.3.3", + "tree-kill": "1.2.2", + "webpack": "4.41.2", + "webpack-dev-middleware": "3.7.2", + "webpack-dev-server": "3.9.0", + "webpack-merge": "4.2.2", + "webpack-sources": "1.4.3", + "webpack-subresource-integrity": "1.3.4", + "worker-plugin": "3.2.0" + }, + "dependencies": { + "rxjs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", + "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@angular-devkit/build-optimizer": { + "version": "0.900.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.900.7.tgz", + "integrity": "sha512-gxin2oPNMN+PYo82At2JP1Q+uxnvwyDFWA1Wl+Ufuc5zHGhjKqxdQjkdMF7OT0ihtmkllN+t/NTB7rcx/Sx9Wg==", + "dev": true, + "requires": { + "loader-utils": "1.2.3", + "source-map": "0.7.3", + "tslib": "1.10.0", + "typescript": "3.6.4", + "webpack-sources": "1.4.3" + }, + "dependencies": { + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", + "dev": true + }, + "typescript": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.6.4.tgz", + "integrity": "sha512-unoCll1+l+YK4i4F8f22TaNVPRHcD9PA3yCuZ8g5e0qGqlVlJ/8FSateOLLSagn+Yg5+ZwuPkL8LFUc0Jcvksg==", + "dev": true + } + } + }, + "@angular-devkit/build-webpack": { + "version": "0.900.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.900.7.tgz", + "integrity": "sha512-Nwwqjo1ZpHFLavN+nXOmuBgGjhoMBZGelDCvHtiQlQ9N6i7k9cKnP7eU5pY7jbalBguS+gWg5wJIGnbqk1K9Rg==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.900.7", + "@angular-devkit/core": "9.0.7", + "rxjs": "6.5.3" + }, + "dependencies": { + "rxjs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", + "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@angular-devkit/core": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-9.0.7.tgz", + "integrity": "sha512-tMrz36sM1xrwvFf9Qm59GwALscVlMP7rQBjtd0fIR/QbsiOAIX4AQbV+vN6Vtwnzo5NIRZY1IXJUhesWms+h5w==", + "dev": true, + "requires": { + "ajv": "6.10.2", + "fast-json-stable-stringify": "2.0.0", + "magic-string": "0.25.4", + "rxjs": "6.5.3", + "source-map": "0.7.3" + }, + "dependencies": { + "rxjs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", + "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@angular-devkit/schematics": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-9.0.7.tgz", + "integrity": "sha512-ryPC+l24f3gX5DFMTLkDM/q2Kp6LPzBn6400k7j4qVdb1cIrZx+JUQd7F4iAksTTkX15EQPanptQXeztUrl9Ng==", + "dev": true, + "requires": { + "@angular-devkit/core": "9.0.7", + "ora": "4.0.2", + "rxjs": "6.5.3" + }, + "dependencies": { + "rxjs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", + "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@angular/animations": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-9.0.7.tgz", + "integrity": "sha512-74gY7onajmmnksy5E0/32bFv3B9NuWxV64kqD15YjGrh8AWe1BHt5enQI+rJ2tO8m2DKnwZsctis6k0Kcy+YKQ==" + }, + "@angular/cdk": { + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-9.2.4.tgz", + "integrity": "sha512-iw2+qHMXHYVC6K/fttHeNHIieSKiTEodVutZoOEcBu9rmRTGbLB26V/CRsfIRmA1RBk+uFYWc6UQZnMC3RdnJQ==", + "requires": { + "parse5": "^5.0.0" + }, + "dependencies": { + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "optional": true + } + } + }, + "@angular/cli": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-9.0.7.tgz", + "integrity": "sha512-/9CUNSSVyTtTNUADZ/VXJDEdhineMN/rfd35w6VsHiob49tKkeOTggaoiSne3RY4VCTqlo7GGf4KhhVXEMGnDQ==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.900.7", + "@angular-devkit/core": "9.0.7", + "@angular-devkit/schematics": "9.0.7", + "@schematics/angular": "9.0.7", + "@schematics/update": "0.900.7", + "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.1", + "debug": "^4.1.1", + "ini": "1.3.5", + "inquirer": "7.0.0", + "npm-package-arg": "6.1.1", + "npm-pick-manifest": "3.0.2", + "open": "7.0.0", + "pacote": "9.5.8", + "read-package-tree": "5.3.1", + "rimraf": "3.0.0", + "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": "9.0.7", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-9.0.7.tgz", + "integrity": "sha512-B58YgxZva1DBaeayOBsaUOOkoyR+GRibuNC3gfOMm2vXeW9eCNX+jvDtw767GnKm2yGzIq8wB3x6GHojN00dPw==" + }, + "@angular/compiler": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-9.0.7.tgz", + "integrity": "sha512-hFpkuGpzxpK5h59LHHAjTFWsY6DCXZwgJFqvCuTPxWi/srvLGZRXrpC6Z1SlgHI9xxXaPfoa4uWw2VfA3BnqEg==" + }, + "@angular/compiler-cli": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-9.0.7.tgz", + "integrity": "sha512-+RXghex63v0Vi8vpQtDpWiqpAAnrTaN3bHT5fntRenq5+Ok5vL1MJ1mzbTmBXs2tuwTqNlwMm2AlZB7G/xcDMQ==", + "dev": true, + "requires": { + "canonical-path": "1.0.0", + "chokidar": "^3.0.0", + "convert-source-map": "^1.5.1", + "dependency-graph": "^0.7.2", + "fs-extra": "4.0.2", + "magic-string": "^0.25.0", + "minimist": "^1.2.0", + "reflect-metadata": "^0.1.2", + "semver": "^6.3.0", + "source-map": "^0.6.1", + "sourcemap-codec": "^1.4.8", + "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 + }, + "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 + }, + "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 + }, + "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" + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "@angular/core": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-9.0.7.tgz", + "integrity": "sha512-E9XZH5Dl+9MWG3MDC6wrKllhA8Rljpz66HOIeqKv2fHPed8kzuJZU3WJWLtbhDAXFwtGTyTZ4c82ZLSmqwTorg==" + }, + "@angular/forms": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-9.0.7.tgz", + "integrity": "sha512-PaHAmjMJDtg/3aGCPuq5BCRC1eZ/DBCpva9f7NrA1kqk0LcLdebm0v2uHwTOBtiz/VEgPvxiS4tXC4rjvUtfEg==" + }, + "@angular/language-service": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-9.0.7.tgz", + "integrity": "sha512-IZG1kvw48JyFRy7bfMHqBixWrEHZmXmkP5DWsi5Tw6KusaczkMghI20BevCkodPcajXWHAUHNKyp1tlE3OnH0w==", + "dev": true + }, + "@angular/material": { + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-9.2.4.tgz", + "integrity": "sha512-LkoTXE6B0slvMhvfZDdPWaz4yaYLkaAp5VSPunI9pxGsPxzqEV9e210wC1/sjG/76Nk8Ep7/2z9XKac8Q9bMwA==" + }, + "@angular/platform-browser": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-9.0.7.tgz", + "integrity": "sha512-Por8omrEiSV2U/K2mm/Kuv+2R2rJkbAZ3ctEM6CWj9Y4Gz2akjOCxmEgWhhBeqdigcC3T1v707f52osf9jWBkg==" + }, + "@angular/platform-browser-dynamic": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-9.0.7.tgz", + "integrity": "sha512-jwpyd93ofcRtchbayKD5v4GN4Lc7vbPe6dMUiwfnVnVAql0bOD/3YRI7w5qJ0Xx0sgQT+9Xo6jTXYnyUsZpEww==" + }, + "@angular/router": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-9.0.7.tgz", + "integrity": "sha512-uKru9F/Zju//gg6INl54abnlpLdEUUO/GpCfMk4zqu8LCZGNFta6OY7VT+9DK9Vdrh/XUD70oE9WoelcRwwTYA==" + }, + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/core": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.7.7.tgz", + "integrity": "sha512-jlSjuj/7z138NLZALxVgrx13AOtqip42ATZP7+kYl53GvDV6+4dCek1mVUo8z8c8Xnw/mx2q3d9HWh3griuesQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.7.7", + "@babel/helpers": "^7.7.4", + "@babel/parser": "^7.7.7", + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4", + "convert-source-map": "^1.7.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.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "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.7.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.7.tgz", + "integrity": "sha512-/AOIBpHh/JU1l0ZFS4kiRCBnLi6OTHzh0RPk3h9isBxkkqELtQNFi1Vr/tiG9p1yfoUdKVwISuXWQR+hwwM4VQ==", + "dev": true, + "requires": { + "@babel/types": "^7.7.4", + "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.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", + "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", + "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.1.tgz", + "integrity": "sha512-rsZ4LGvFTZnzdNZR5HZdmJVuXK8834R5QkF3WvcnBhrlVtF0HSIUC6zbreL9MgjTywhKokn8RIYRiq99+DLAxA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-regex": "^7.10.4", + "regexpu-core": "^4.7.1" + } + }, + "@babel/helper-define-map": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", + "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/types": "^7.10.5", + "lodash": "^4.17.19" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz", + "integrity": "sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", + "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-module-imports": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", + "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.5" + } + }, + "@babel/helper-module-transforms": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", + "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-simple-access": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/helper-validator-identifier": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "lodash": "^4.17.19" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + }, + "@babel/helper-regex": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", + "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", + "dev": true, + "requires": { + "lodash": "^4.17.19" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz", + "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-wrap-function": "^7.10.4", + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-replace-supers": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", + "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" + } + }, + "@babel/helper-simple-access": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", + "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", + "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz", + "integrity": "sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helpers": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", + "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", + "dev": true, + "requires": { + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.5.tgz", + "integrity": "sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ==", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.1.tgz", + "integrity": "sha512-d+/o30tJxFxrA1lhzJqiUcEJdI6jKlNregCv5bASeGf2Q4MXmnwH7viDo7nhx1/ohf09oaH8j1GVYG/e3Yqk6A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.12.1", + "@babel/plugin-syntax-async-generators": "^7.8.0" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz", + "integrity": "sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz", + "integrity": "sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.0" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.12.1" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz", + "integrity": "sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz", + "integrity": "sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", + "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz", + "integrity": "sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz", + "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.12.1" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz", + "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz", + "integrity": "sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz", + "integrity": "sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-define-map": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.10.4", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz", + "integrity": "sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz", + "integrity": "sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz", + "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz", + "integrity": "sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz", + "integrity": "sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz", + "integrity": "sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz", + "integrity": "sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz", + "integrity": "sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz", + "integrity": "sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz", + "integrity": "sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz", + "integrity": "sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-simple-access": "^7.12.1", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz", + "integrity": "sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.10.4", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-validator-identifier": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz", + "integrity": "sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz", + "integrity": "sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz", + "integrity": "sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz", + "integrity": "sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz", + "integrity": "sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz", + "integrity": "sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz", + "integrity": "sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz", + "integrity": "sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz", + "integrity": "sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz", + "integrity": "sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.1.tgz", + "integrity": "sha512-CiUgKQ3AGVk7kveIaPEET1jNDhZZEl1RPMWdTBE1799bdz++SwqDHStmxfCtDfBhQgCl38YRiSnrMuUMZIWSUQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-regex": "^7.10.4" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz", + "integrity": "sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.1.tgz", + "integrity": "sha512-EPGgpGy+O5Kg5pJFNDKuxt9RdmTgj5sgrus2XVeMp/ZIbOESadgILUbm50SNpghOh3/6yrbsH+NB5+WJTmsA7Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz", + "integrity": "sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/preset-env": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.7.7.tgz", + "integrity": "sha512-pCu0hrSSDVI7kCVUOdcMNQEbOPJ52E+LrQ14sN8uL2ALfSqePZQlKrOy+tM4uhEdYlCHi4imr8Zz2cZe9oSdIg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.7.4", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-async-generator-functions": "^7.7.4", + "@babel/plugin-proposal-dynamic-import": "^7.7.4", + "@babel/plugin-proposal-json-strings": "^7.7.4", + "@babel/plugin-proposal-object-rest-spread": "^7.7.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.7.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.7.7", + "@babel/plugin-syntax-async-generators": "^7.7.4", + "@babel/plugin-syntax-dynamic-import": "^7.7.4", + "@babel/plugin-syntax-json-strings": "^7.7.4", + "@babel/plugin-syntax-object-rest-spread": "^7.7.4", + "@babel/plugin-syntax-optional-catch-binding": "^7.7.4", + "@babel/plugin-syntax-top-level-await": "^7.7.4", + "@babel/plugin-transform-arrow-functions": "^7.7.4", + "@babel/plugin-transform-async-to-generator": "^7.7.4", + "@babel/plugin-transform-block-scoped-functions": "^7.7.4", + "@babel/plugin-transform-block-scoping": "^7.7.4", + "@babel/plugin-transform-classes": "^7.7.4", + "@babel/plugin-transform-computed-properties": "^7.7.4", + "@babel/plugin-transform-destructuring": "^7.7.4", + "@babel/plugin-transform-dotall-regex": "^7.7.7", + "@babel/plugin-transform-duplicate-keys": "^7.7.4", + "@babel/plugin-transform-exponentiation-operator": "^7.7.4", + "@babel/plugin-transform-for-of": "^7.7.4", + "@babel/plugin-transform-function-name": "^7.7.4", + "@babel/plugin-transform-literals": "^7.7.4", + "@babel/plugin-transform-member-expression-literals": "^7.7.4", + "@babel/plugin-transform-modules-amd": "^7.7.5", + "@babel/plugin-transform-modules-commonjs": "^7.7.5", + "@babel/plugin-transform-modules-systemjs": "^7.7.4", + "@babel/plugin-transform-modules-umd": "^7.7.4", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.7.4", + "@babel/plugin-transform-new-target": "^7.7.4", + "@babel/plugin-transform-object-super": "^7.7.4", + "@babel/plugin-transform-parameters": "^7.7.7", + "@babel/plugin-transform-property-literals": "^7.7.4", + "@babel/plugin-transform-regenerator": "^7.7.5", + "@babel/plugin-transform-reserved-words": "^7.7.4", + "@babel/plugin-transform-shorthand-properties": "^7.7.4", + "@babel/plugin-transform-spread": "^7.7.4", + "@babel/plugin-transform-sticky-regex": "^7.7.4", + "@babel/plugin-transform-template-literals": "^7.7.4", + "@babel/plugin-transform-typeof-symbol": "^7.7.4", + "@babel/plugin-transform-unicode-regex": "^7.7.4", + "@babel/types": "^7.7.4", + "browserslist": "^4.6.0", + "core-js-compat": "^3.6.0", + "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/runtime": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "dev": true + } + } + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.5.tgz", + "integrity": "sha512-xa15FbQnias7z9a62LwYAA5SZZPkHIXpd42C6uW68o8uTuua96FHZy1y61Va5P/i83FAAcMpW8+A/QayntzuqA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.5", + "@babel/types": "^7.12.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + }, + "dependencies": { + "@babel/generator": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.5.tgz", + "integrity": "sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==", + "dev": true, + "requires": { + "@babel/types": "^7.12.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "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/types": { + "version": "7.12.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.6.tgz", + "integrity": "sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true + }, + "@ngtools/webpack": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-9.0.7.tgz", + "integrity": "sha512-MvoMaErkjESefoIrbt8F2RpKDr9KavwvH4v3hwSAKooVNFdFKNsjJ7m3gCQehumEfsYFq2mrEK2sTW4/CpFlMQ==", + "dev": true, + "requires": { + "@angular-devkit/core": "9.0.7", + "enhanced-resolve": "4.1.1", + "rxjs": "6.5.3", + "webpack-sources": "1.4.3" + }, + "dependencies": { + "rxjs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", + "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@schematics/angular": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-9.0.7.tgz", + "integrity": "sha512-3UCeexYx/YVo3kboyPZ8KgqBTduMA18AAm3s2yrC0qj41fBFVVZAZLa74uouTf4RYVgy9kR7J3uv6VLxrJPOnQ==", + "dev": true, + "requires": { + "@angular-devkit/core": "9.0.7", + "@angular-devkit/schematics": "9.0.7" + } + }, + "@schematics/update": { + "version": "0.900.7", + "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.900.7.tgz", + "integrity": "sha512-e9tX2DGNYfj/k9mVICpQt2bWIYyD92dlsip7LzPeZGt+R9zCp5w19uBLa8Z00OgEGzFR1krhRvkQE5OxkkAnVw==", + "dev": true, + "requires": { + "@angular-devkit/core": "9.0.7", + "@angular-devkit/schematics": "9.0.7", + "@yarnpkg/lockfile": "1.1.0", + "ini": "1.3.5", + "npm-package-arg": "^7.0.0", + "pacote": "9.5.8", + "rxjs": "6.5.3", + "semver": "6.3.0", + "semver-intersect": "1.4.0" + }, + "dependencies": { + "npm-package-arg": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-7.0.0.tgz", + "integrity": "sha512-xXxr8y5U0kl8dVkz2oK7yZjPBvqM2fwaO5l3Yg13p03v8+E3qQcD0JNhHzjL1vyGgxcKkD0cco+NLR72iuPk3g==", + "dev": true, + "requires": { + "hosted-git-info": "^3.0.2", + "osenv": "^0.1.5", + "semver": "^5.6.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 + } + } + }, + "rxjs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", + "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@types/estree": { + "version": "0.0.45", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.45.tgz", + "integrity": "sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g==", + "dev": true + }, + "@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/jasmine": { + "version": "3.5.14", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.5.14.tgz", + "integrity": "sha512-Fkgk536sHPqcOtd+Ow+WiUNuk0TSo/BntKkF8wSvcd6M2FvPjeXcUE6Oz/bwDZiUZEaXLslAgw00Q94Pnx6T4w==", + "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/json-schema": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", + "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", + "dev": true + }, + "@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": "12.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.3.tgz", + "integrity": "sha512-8Jduo8wvvwDzEVJCOvS/G6sgilOLvvhn1eMmK3TW8/T217O7u1jdrK6ImKLv80tVryaPSVeKu6sjDEiFjd4/eg==", + "dev": true + }, + "@types/q": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", + "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", + "dev": true + }, + "@types/selenium-webdriver": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.17.tgz", + "integrity": "sha512-tGomyEuzSC1H28y2zlW6XPCaDaXFaD6soTdb4GNdmte2qfHtrKqhy0ZFs4r/1hpazCfEZqeTSRLvSasmEx89uw==", + "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.8", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.8.tgz", + "integrity": "sha512-JHB2/xZlXOjzjBB6fMOpH1eQAfsrpqVVIbneE0Rok16WXwFaznaI5vfg75U5WgGJm7V9W1c4xeRQDjX/zwvghA==", + "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": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "adm-zip": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", + "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", + "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" + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "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.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + } + }, + "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 + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "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": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "assert": { + "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.7.1", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.1.tgz", + "integrity": "sha512-w3b5y1PXWlhYulevrTJ0lizkQ5CyqfeU6BIRDbuhsMupstHQOeb1Ur80tcB1zxSu7AwyY/qCQ7Vvqklh31ZBFw==", + "dev": true, + "requires": { + "browserslist": "^4.7.2", + "caniuse-lite": "^1.0.30001006", + "chalk": "^2.4.2", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.21", + "postcss-value-parser": "^4.0.2" + } + }, + "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.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "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-loader": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz", + "integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==", + "dev": true, + "requires": { + "find-cache-dir": "^2.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1", + "pify": "^4.0.1" + }, + "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" + } + } + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "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.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "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.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "bn.js": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", + "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==", + "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" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "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" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.14.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.6.tgz", + "integrity": "sha512-zeFYcUo85ENhc/zxHbiIp0LGzzTrE2Pv2JhxvS7kpUb9Q9D38kUX6Bie7pGutJ/5iF5rOxE7CepAuWD56xJ33A==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001154", + "electron-to-chromium": "^1.3.585", + "escalade": "^3.1.1", + "node-releases": "^1.1.65" + } + }, + "browserstack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.6.0.tgz", + "integrity": "sha512-HJDJ0TSlmkwnt9RZ+v5gFpa1XZTBYTj0ywvLwJ3241J7vMw2jAsGNVhKHtmCOyg+VxeLZyaibO9UL71AsUeDIw==", + "dev": true, + "requires": { + "https-proxy-agent": "^2.2.1" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "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": "13.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz", + "integrity": "sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==", + "dev": true, + "requires": { + "chownr": "^1.1.2", + "figgy-pudding": "^3.5.1", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.2", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "minipass": "^3.0.0", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "p-map": "^3.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^2.7.1", + "ssri": "^7.0.0", + "unique-filename": "^1.1.1" + }, + "dependencies": { + "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" + } + } + } + }, + "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" + } + }, + "call-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", + "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^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-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001154", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001154.tgz", + "integrity": "sha512-y9DvdSti8NnYB9Be92ddMZQrcOe04kcQtcxtBx4NkB04+qZ+JUWotnXBJTmxlKudhxNTQ3RRknMwNU2YQl/Org==", + "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.4.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", + "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "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-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "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-spinners": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.5.0.tgz", + "integrity": "sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ==", + "dev": true + }, + "cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "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" + } + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + } + }, + "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.2.2", + "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-5.2.2.tgz", + "integrity": "sha512-jB4FZ1Sx7kZhvZVdf+N2BaKTdrrNZOL0Bj10RRfrhHrb3zEvXjJvvq298JPMJAiyiCS/v4zs1QlGU0ip7xGqeA==", + "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": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", + "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", + "dev": true, + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.4" + } + }, + "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 + }, + "color-string": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.4.tgz", + "integrity": "sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==", + "dev": true, + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "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.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", + "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.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.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.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "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.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "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" + }, + "dependencies": { + "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" + } + } + } + }, + "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.1.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.1.tgz", + "integrity": "sha512-P15M5ZC8dyCjQHWwd4Ia/dm0SgVvZJMYeykVIVYXbGyqO4dWB5oyPHp9i7wjwo5LhtlhKbiBCdS2NvM07Wlybg==", + "dev": true, + "requires": { + "cacache": "^12.0.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.1", + "schema-utils": "^1.0.0", + "serialize-javascript": "^2.1.2", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + } + } + }, + "core-js": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz", + "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==", + "dev": true + }, + "core-js-compat": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", + "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", + "dev": true, + "requires": { + "browserslist": "^4.8.5", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "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" + } + }, + "coverage-istanbul-loader": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/coverage-istanbul-loader/-/coverage-istanbul-loader-2.0.3.tgz", + "integrity": "sha512-LiGRvyIuzVYs3M1ZYK1tF0HekjH0DJ8zFdUwAZq378EJzqOgToyb1690dp3TAUlP6Y+82uu42LRjuROVeJ54CA==", + "dev": true, + "requires": { + "convert-source-map": "^1.7.0", + "istanbul-lib-instrument": "^4.0.0", + "loader-utils": "^1.2.3", + "merge-source-map": "^1.1.0", + "schema-utils": "^2.6.1" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "create-hash": { + "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": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.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 + } + } + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true + }, + "css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "dev": true, + "requires": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + } + }, + "css-parse": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", + "integrity": "sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q=", + "dev": true, + "requires": { + "css": "^2.0.0" + } + }, + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true + }, + "css-selector-tokenizer": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz", + "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "fastparse": "^1.1.2" + } + }, + "css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dev": true, + "requires": { + "mdn-data": "2.0.4", + "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 + } + } + }, + "css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "dev": true + }, + "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": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "cssnano": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", + "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.7", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "cssnano-preset-default": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", + "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", + "dev": true, + "requires": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.2", + "postcss-unique-selectors": "^4.0.1" + } + }, + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", + "dev": true + }, + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", + "dev": true + }, + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "dev": true + }, + "csso": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.1.0.tgz", + "integrity": "sha512-h+6w/W1WqXaJA4tb1dk7r5tVbOm97MsKxzwnvOR04UQ6GILroryjMWu3pmCCtL2mLaEStQ0fZgeGiy99mo7iyg==", + "dev": true, + "requires": { + "css-tree": "^1.0.0" + }, + "dependencies": { + "css-tree": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0.tgz", + "integrity": "sha512-CdVYz/Yuqw0VdKhXPBIgi8DO3NicJVYZNWeX9XcIuSp9ZoFT5IcleVRW07O5rMjdcx1mb+MEJPknTTEW7DdsYw==", + "dev": true, + "requires": { + "mdn-data": "2.0.12", + "source-map": "^0.6.1" + } + }, + "mdn-data": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.12.tgz", + "integrity": "sha512-ULbAlgzVb8IqZ0Hsxm6hHSlQl3Jckst2YEQS7fODu9ilNWy2LvcoSY7TRFIktABP2mdppBioc66va90T+NUs8Q==", + "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 + } + } + }, + "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.6", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", + "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==", + "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 + }, + "debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "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" + } + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + }, + "dependencies": { + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + } + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "del": { + "version": "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 + } + } + }, + "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 + }, + "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" + } + } + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "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-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": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "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" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "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" + } + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.2.tgz", + "integrity": "sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA==", + "dev": true + } + } + }, + "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 + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "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.587", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.587.tgz", + "integrity": "sha512-8XFNxzNj0R8HpTQslWAw6UWpGSuOKSP3srhyFHVbGUGb8vTHckZGCyWi+iQlaXJx5DNeTQTQLd6xN11WSckkmA==", + "dev": true + }, + "elliptic": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", + "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "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" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "emoji-regex": { + "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.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "requires": { + "iconv-lite": "^0.6.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", + "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", + "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.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 + }, + "entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "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.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-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" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "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.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "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.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "events": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", + "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", + "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=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "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.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "dev": true + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "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": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "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.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "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.13.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", + "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==", + "dev": true + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "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-extra": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz", + "integrity": "sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "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-intrinsic": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz", + "integrity": "sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "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.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz", + "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==", + "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.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "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.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + } + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "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.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "hash.js": { + "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" + } + }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "dev": true + }, + "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": "3.0.7", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz", + "integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "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" + } + }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", + "dev": true + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", + "dev": true + }, + "html-comment-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", + "dev": true + }, + "html-entities": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz", + "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "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.5.2", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.2.tgz", + "integrity": "sha512-opCO9ASqg5Wy2FNo7A0sxy71yGbbkJJXLdgMK04Tcypw9jr2MgWbyubb0+WdmDmGnFflO7fRbqbaihh/ENDlRQ==", + "dev": true + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "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.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "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.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "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 + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "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": "7.0.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.0.tgz", + "integrity": "sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ==", + "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": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "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.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "strip-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" + }, + "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 + } + } + } + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "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.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", + "dev": true + }, + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "dev": true, + "requires": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "is-core-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.0.0.tgz", + "integrity": "sha512-jq1AH6C8MuteOoBPwkxHafmByhL9j5q4OaPGdbuD+ZtQJVzH+i6E3BJDQcBA09k57i2Hh2yQbEG8yObZ0jdlWw==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-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-docker": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", + "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", + "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-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-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true + }, + "is-negative-zero": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", + "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "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-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-svg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", + "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", + "dev": true, + "requires": { + "html-comment-regex": "^1.1.0" + } + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "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.7", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-2.1.7.tgz", + "integrity": "sha512-LYTOa2UrYFyJ/aSczZi/6lBykVMjCCvUmT64gOe+jPZFy4w6FYfPGqFT2IiQ2BxVHHDOvCD7qrIXb0EOh4uGWw==", + "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.5", + "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-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "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": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + } + }, + "istanbul-lib-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 + }, + "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" + } + }, + "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.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", + "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0" + } + }, + "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.5.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.5.0.tgz", + "integrity": "sha512-nCeAiw37MIMA9w9IXso7bRaLl+c/ef3wnxsoSAlYrzS+Ot0zTG6nU8G/cIfGkqpkjX2wNaIW9RFG0TwIFnG6bA==", + "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" + } + } + } + }, + "jquery": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.1.tgz", + "integrity": "sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg==" + }, + "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.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "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-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "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==", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "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.5.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.5.0.tgz", + "integrity": "sha512-WRtu7TPCmYePR1nazfrtuF216cIVon/3GWOvHS9QR5bIwSbnxtdpma6un3jyGGNhHsKCSzn5Ypk+EkDRvTGiFA==", + "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.3.0", + "resolved": "https://registry.npmjs.org/karma/-/karma-4.3.0.tgz", + "integrity": "sha512-NSPViHOt+RW38oJklvYxQC4BSQsv737oQlr/r06pCM+slDOr4myuI1ivkRmp+3dVpJDfZt2DmaPJ2wkx+ZZuMQ==", + "dev": true, + "requires": { + "bluebird": "^3.3.0", + "body-parser": "^1.16.1", + "braces": "^3.0.2", + "chokidar": "^3.0.0", + "colors": "^1.1.0", + "connect": "^3.6.0", + "core-js": "^3.1.3", + "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.14", + "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": { + "mime": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", + "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" + } + }, + "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 + } + } + }, + "karma-chrome-launcher": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz", + "integrity": "sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg==", + "dev": true, + "requires": { + "which": "^1.2.1" + } + }, + "karma-coverage-istanbul-reporter": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.1.1.tgz", + "integrity": "sha512-CH8lTi8+kKXGvrhy94+EkEMldLCiUA0xMOiL31vvli9qK0T+qcXJAwWBRVJWnVWxYkTmyWar8lPz63dxX6/z1A==", + "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.5.4", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.5.4.tgz", + "integrity": "sha512-PtilRLno5O6wH3lDihRnz0Ba8oSn0YUJqKjjux1peoYGwo0AQqrWRbdWk/RLzcGlb+onTyXAnHl6M+Hu3UxG/Q==", + "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.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "less": { + "version": "3.10.3", + "resolved": "https://registry.npmjs.org/less/-/less-3.10.3.tgz", + "integrity": "sha512-vz32vqfgmoxF1h3K4J+yKCtajH0PWmjkIFgbs5d78E/c/e+UQTnI+lWK+1eQRE95PXM2mC3rJlLSSP9VQHnaow==", + "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.3", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.1.3.tgz", + "integrity": "sha512-vTSY5r9HOq4sxR2BIxdIXWKI+9n3b+DoQkhKHedB3TdSxTfXUDRxKXdAj5iejR+qNXprXsxvEu9W+zOhgGIkAw==", + "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.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "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 + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2" + } + }, + "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.7.0", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.0.tgz", + "integrity": "sha512-i2sY04nal5jDcagM3FMfG++T69GEEM8CYuOfeOIvmXzOIcwE9a/CJPR0MFM97pYMj/u10lzz7/zd7+qwhrBTqQ==", + "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" + }, + "dependencies": { + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "magic-string": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.4.tgz", + "integrity": "sha512-oycWO9nEVAP2RVPbIoDoA4Y7LFIJ3xRYov93gAyJhZkET1tNuB0u7uWkZS2LpBWTJUWnmau/To8ECWRC+jKNfw==", + "dev": true, + "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.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "make-fetch-happen": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz", + "integrity": "sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag==", + "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.3", + "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" + }, + "dependencies": { + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "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" + } + }, + "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" + } + }, + "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" + } + } + } + }, + "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" + } + }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true + }, + "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.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "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" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "mime": { + "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.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "dev": true + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "dev": true, + "requires": { + "mime-db": "1.44.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "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" + }, + "dependencies": { + "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" + } + } + } + }, + "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.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "requires": { + "minipass": "^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" + }, + "dependencies": { + "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" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "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.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "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" + }, + "dependencies": { + "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" + } + } + } + }, + "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 + }, + "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.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "ngx-countdown": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/ngx-countdown/-/ngx-countdown-11.0.0.tgz", + "integrity": "sha512-1ACzAkYExshs24D2RkHjX2iyP1DPhegHkLvr7o8fVhHD+7p7X5Ww08lpg9gpYUxLjSsz/txKATPAozXEx4717g==", + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + } + } + }, + "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.4", + "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz", + "integrity": "sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg==", + "dev": true, + "requires": { + "encoding": "^0.1.11", + "json-parse-better-errors": "^1.0.0", + "safe-buffer": "^5.1.1" + } + }, + "node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "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.65", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.65.tgz", + "integrity": "sha512-YpzJOe2WFIW0V4ZkJQd/DGR/zdVwc/pI4Nl1CZrBO19FdRcSTmsuhdttw9rsTzzJLrNcSloLiBbEYx1C4f6gpA==", + "dev": true + }, + "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": { + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "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": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "dev": true + }, + "npm-bundled": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "dev": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "dev": true + }, + "npm-package-arg": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", + "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", + "dev": true, + "requires": { + "hosted-git-info": "^2.7.1", + "osenv": "^0.1.5", + "semver": "^5.6.0", + "validate-npm-package-name": "^3.0.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "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.8", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", + "dev": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^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.7", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.7.tgz", + "integrity": "sha512-cny9v0+Mq6Tjz+e0erFAB+RYJ/AVGzkjnISiobqP8OWj9c9FLoZZu8/SPSKJWE17F1tk4018wfjV+ZbIbqC7fQ==", + "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.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "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" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "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.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "dev": true + }, + "object-is": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.3.tgz", + "integrity": "sha512-teyqLvFWzLkq5B9ki8FVWA902UER2qkxmdA4nLf+wjOLAWgxzCWZNCxpDq9MvE8MmhWNr+I8w3BN49Vx36Y6Xg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/open/-/open-7.0.0.tgz", + "integrity": "sha512-K6EKzYqnwQzk+/dzJAQSBORub3xlBTxMz+ntpZpH/LyCa1o6KjXhuN+2npAaI9jaSmU3R1Q8NWf4KUWcyytGsQ==", + "dev": true, + "requires": { + "is-wsl": "^2.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" + }, + "dependencies": { + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + } + } + }, + "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 + } + } + }, + "ora": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/ora/-/ora-4.0.2.tgz", + "integrity": "sha512-YUOZbamht5mfLxPmk4M35CD/5DuOkAacxlEUbStVXpBAt4fyhBf+vZHI/HRkI++QUp3sNoeA2Gw4C+hi4eGSig==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.2.0", + "is-interactive": "^1.0.0", + "log-symbols": "^3.0.0", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "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.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "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": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-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.8", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.8.tgz", + "integrity": "sha512-0Tl8Oi/K0Lo4MZmH0/6IsT3gpGf9eEAznLXEQPKgPq7FscnbUOyopnVpwXlnQdIbCUaojWy1Wd7VMyqfVsRrIw==", + "dev": true, + "requires": { + "bluebird": "^3.5.3", + "cacache": "^12.0.2", + "chownr": "^1.1.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": "^3.0.0", + "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.10", + "unique-filename": "^1.1.1", + "which": "^1.3.1" + }, + "dependencies": { + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "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" + } + }, + "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" + } + }, + "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" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "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" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "parallel-transform": { + "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.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "requires": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.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 + }, + "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.1.1", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", + "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "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.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "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.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dev": true, + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "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" + } + } + } + }, + "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.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", + "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==", + "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-calc": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", + "dev": true, + "requires": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "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-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "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-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "dev": true, + "requires": { + "postcss": "^7.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.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", + "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", + "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-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "dev": true, + "requires": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "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-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "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-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "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-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "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-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "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-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "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-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "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-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "dev": true, + "requires": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "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-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "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-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "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-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "dev": true, + "requires": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "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-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "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-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "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-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "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-selector-parser": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", + "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1", + "util-deprecate": "^1.0.2" + } + }, + "postcss-svgo": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", + "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", + "dev": true, + "requires": { + "is-svg": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "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-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + } + }, + "postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "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.4", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.4.4.tgz", + "integrity": "sha512-BaL4vePgu3Vfa/whvTUAlgaCAId4uNSGxIFSCXMgj7LMYENPWLp85h5RBi9pdpX/bWQ8SF6flP7afmi2TC4eHw==", + "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", + "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", + "yargs": "^12.0.5" + }, + "dependencies": { + "@types/q": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", + "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "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 + }, + "q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", + "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" + } + }, + "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.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "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.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "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" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "pump": { + "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==", + "dev": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "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.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "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": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.2.tgz", + "integrity": "sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA==", + "dev": true, + "requires": { + "glob": "^7.1.1", + "json-parse-even-better-errors": "^2.3.0", + "normalize-package-data": "^2.0.0", + "npm-normalize-package-bin": "^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.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "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.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "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.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "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.3.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true + }, + "regjsparser": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "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 + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "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.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "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.18.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", + "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", + "dev": true, + "requires": { + "is-core-module": "^2.0.0", + "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 + }, + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", + "dev": true + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", + "dev": true + }, + "rimraf": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz", + "integrity": "sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==", + "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" + } + }, + "rollup": { + "version": "1.25.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.25.2.tgz", + "integrity": "sha512-+7z6Wab/L45QCPcfpuTZKwKiB0tynj05s/+s2U3F2Bi7rOLPr9UcjUwO7/xpjlPNXA/hwnth6jBExFRGyf3tMg==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/node": "*", + "acorn": "^7.1.0" + } + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "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.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", + "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", + "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.23.3", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.23.3.tgz", + "integrity": "sha512-1DKRZxJMOh4Bme16AbWTyYeJAjTlrvw2+fWshHHaepeJfGq2soFZTnt0YhWit+bohtDu4LdyPoEj6VFD4APHog==", + "dev": true, + "requires": { + "chokidar": ">=2.0.0 <4.0.0" + } + }, + "sass-loader": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.0.tgz", + "integrity": "sha512-+qeMu563PN7rPdit2+n5uuYVR0SSVwm0JsOUsaJXzgYcClWSlmX0iHDnmeOobPkf5kUglVot3QS6SyLyaQoJ4w==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "loader-utils": "^1.2.3", + "neo-async": "^2.6.1", + "schema-utils": "^2.1.0", + "semver": "^6.3.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "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": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "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": { + "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" + } + }, + "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.8", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", + "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", + "dev": true, + "requires": { + "node-forge": "^0.10.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": "2.1.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", + "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", + "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.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dev": true, + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "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.1.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", + "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", + "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.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", + "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", + "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.4.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", + "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", + "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.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", + "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", + "dev": true, + "requires": { + "ip": "1.1.5", + "smart-buffer": "^4.1.0" + } + }, + "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==", + "dev": true + }, + "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.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "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.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "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.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz", + "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==", + "dev": true + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "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.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "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": "7.1.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz", + "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "minipass": "^3.1.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "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.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "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" + } + }, + "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" + } + } + } + }, + "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.trimend": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.2.tgz", + "integrity": "sha512-8oAG/hi14Z4nOVP0z6mdiVZ/wqjDtWSLygMigTzAb+7aPEDTleeFf+WrF+alzecxIRkckkJVn+dTlwzJXORATw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } + } + }, + "string.prototype.trimstart": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.2.tgz", + "integrity": "sha512-7F6CdBTl5zyu30BJFdzSTlSlLPwODC23Od+iLoVH8X6+3fvDPPuBVVj9iaB1GOsSTSIgVfsfm27R2FGrAPznWg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.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": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "stylus": { + "version": "0.54.7", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.7.tgz", + "integrity": "sha512-Yw3WMTzVwevT6ZTrLCYNHAFmanMxdylelL3hkWNgPMeTCpMwpV3nXjpOHuBXtFv7aiO2xRuQS6OoAdgkNcSNug==", + "dev": true, + "requires": { + "css-parse": "~2.0.0", + "debug": "~3.1.0", + "glob": "^7.1.3", + "mkdirp": "~0.5.x", + "safer-buffer": "^2.1.2", + "sax": "~1.2.4", + "semver": "^6.0.0", + "source-map": "^0.7.3" + }, + "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 + } + } + }, + "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" + } + }, + "svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.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" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "terser": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.5.1.tgz", + "integrity": "sha512-lH9zLIbX8PRBEFCTvfHGCy0s9HEKnNso1Dx9swSopF3VUnFLB8DpQ61tHxoofovNC/sG0spajJM3EIIRSTByiQ==", + "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": "2.3.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.3.tgz", + "integrity": "sha512-gWHkaGzGYjmDoYxksFZynWTzvXOAjQ5dd7xuTMYlv4zpWlLSb6v0QLSZjELzP5dMs1ox30O1BIPs9dgqlMHuLQ==", + "dev": true, + "requires": { + "cacache": "^13.0.1", + "find-cache-dir": "^3.2.0", + "jest-worker": "^25.1.0", + "p-limit": "^2.2.2", + "schema-utils": "^2.6.4", + "serialize-javascript": "^2.1.2", + "source-map": "^0.6.1", + "terser": "^4.4.3", + "webpack-sources": "^1.4.3" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-worker": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.5.0.tgz", + "integrity": "sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==", + "dev": true, + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^7.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.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "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" + } + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.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 + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "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.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", + "dev": true + }, + "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.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true + }, + "ts-node": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.3.0.tgz", + "integrity": "sha512-dyNS/RqyVTDcmNM4NIBAeDMpsAdaQ+ojdf0GOLqE6nwJOgzEkdRNzJywhDfwnuvB10oa6NLVG1rUJQCpRN7qoQ==", + "dev": true, + "requires": { + "arg": "^4.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.6", + "yn": "^3.0.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "tslint": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.18.0.tgz", + "integrity": "sha512-Q3kXkuDEijQ37nXZZLKErssQVnwCV/+23gFEMROi8IlbaBG6tXqLPQJ5Wjcyt/yHPKBC+hD5SzuGaMora+ZS6w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.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.1", + "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": { + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "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.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "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.7.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.5.tgz", + "integrity": "sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw==", + "dev": true + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "dev": true + }, + "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.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "dev": true + }, + "union-value": { + "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" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.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.23", + "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.23.tgz", + "integrity": "sha512-lgMIH7XBI6OgYn1woDEmxhGdj8yDefMKg7GkWdeATAlQZFrMrNyxSkpDzY57iY0/6fdlzTbBV03OawvvzG+q7A==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "request": "^2.88.2", + "uuid": "^3.0.0" + } + }, + "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 + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "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.4.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "dev": true, + "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.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + } + }, + "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.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "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 + }, + "vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "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.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "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.7.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz", + "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==", + "dev": true, + "requires": { + "chokidar": "^3.4.1", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.0" + } + }, + "watchpack-chokidar2": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", + "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", + "dev": true, + "optional": true, + "requires": { + "chokidar": "^2.1.8" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "optional": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "optional": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "optional": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "optional": 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, + "optional": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "optional": true, + "requires": { + "is-extendable": "^0.1.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, + "optional": 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.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "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, + "optional": 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, + "optional": 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, + "optional": 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, + "optional": 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, + "optional": 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" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "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.41.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.2.tgz", + "integrity": "sha512-Zhw69edTGfbz9/8JJoyRQ/pq8FYUoY0diOXqW0T6yhgdhCv6wr0hra5DwwWexNRns2Z2+gsnrNcbe9hbGBgk/A==", + "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" + }, + "dependencies": { + "acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "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" + } + }, + "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" + } + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "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" + } + }, + "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" + } + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "requires": { + "randombytes": "^2.1.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 + }, + "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" + } + }, + "terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "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": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + } + } + } + }, + "webpack-dev-middleware": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", + "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", + "dev": true, + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "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" + } + }, + "mime": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", + "dev": true + } + } + }, + "webpack-dev-server": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.9.0.tgz", + "integrity": "sha512-E6uQ4kRrTX9URN9s/lIbqTAztwEPdvzVrcmHE8EQ9YnuT9J8Es5Wrd8n9BKg1a0oZ5EgEke/EQFgUsp18dSTBw==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "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.3", + "killable": "^1.0.1", + "loglevel": "^1.6.4", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.25", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.7", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "0.3.19", + "sockjs-client": "1.4.0", + "spdy": "^4.0.1", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "12.0.5" + }, + "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.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": 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-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.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "dev": true, + "requires": { + "lodash": "^4.17.15" + } + }, + "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.3.4", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.3.4.tgz", + "integrity": "sha512-6XbGYzjh30cGQT/NsC+9IAkJP8IL7/t47sbwR5DLSsamiD56Rwv4/+hsgEHsviPvrEFZ0JRAQtCRN3UsR2Pw9g==", + "dev": true, + "requires": { + "webpack-sources": "^1.3.0" + } + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true + }, + "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.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, + "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": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "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": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + }, + "zone.js": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.10.3.tgz", + "integrity": "sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg==" + } + } +} diff --git a/jumpthequeue-angular/package.json b/jumpthequeue-angular/package.json new file mode 100644 index 0000000..f4f9dc8 --- /dev/null +++ b/jumpthequeue-angular/package.json @@ -0,0 +1,51 @@ +{ + "name": "jumpthequeue-angular", + "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": "^9.0.7", + "@angular/cdk": "^9.2.4", + "@angular/common": "~9.0.1", + "@angular/compiler": "~9.0.1", + "@angular/core": "~9.0.1", + "@angular/forms": "~9.0.1", + "@angular/material": "^9.2.4", + "@angular/platform-browser": "~9.0.1", + "@angular/platform-browser-dynamic": "~9.0.1", + "@angular/router": "~9.0.1", + "jquery": "^3.5.1", + "ngx-countdown": "^11.0.0", + "rxjs": "~6.5.4", + "tslib": "^1.10.0", + "zone.js": "~0.10.2" + }, + "devDependencies": { + "@angular-devkit/build-angular": "~0.900.2", + "@angular/cli": "~9.0.2", + "@angular/compiler-cli": "~9.0.1", + "@angular/language-service": "~9.0.1", + "@types/node": "^12.11.1", + "@types/jasmine": "~3.5.0", + "@types/jasminewd2": "~2.0.3", + "codelyzer": "^5.1.2", + "jasmine-core": "~3.5.0", + "jasmine-spec-reporter": "~4.2.1", + "karma": "~4.3.0", + "karma-chrome-launcher": "~3.1.0", + "karma-coverage-istanbul-reporter": "~2.1.0", + "karma-jasmine": "~2.0.1", + "karma-jasmine-html-reporter": "^1.4.2", + "protractor": "~5.4.3", + "ts-node": "~8.3.0", + "tslint": "~5.18.0", + "typescript": "~3.7.5" + } +} diff --git a/jumpthequeue-angular/src/app/app-routing.module.ts b/jumpthequeue-angular/src/app/app-routing.module.ts new file mode 100644 index 0000000..53d8b1f --- /dev/null +++ b/jumpthequeue-angular/src/app/app-routing.module.ts @@ -0,0 +1,42 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; +import { UserComponent } from './user/user.component'; +import { LoginComponent } from './auth/login/login.component'; +import { RegisterComponent } from './auth/register/register.component'; +import { ViewQueueComponent } from './user/view-queue/view-queue.component'; +import { HomeComponent } from './user/home/home.component'; +import { AuthComponent } from './auth/auth.component'; +import { AuthGuard } from './auth/auth.guard'; + + +const routes: Routes = [ {path: '', redirectTo: '/auth/login', pathMatch: 'full'}, +{path: 'auth', component: AuthComponent, +children: [ + {path: '', redirectTo: 'login', pathMatch: 'full'}, + { + path: 'login', + component: LoginComponent + }, + { + path: 'register', + component: RegisterComponent + }, +] +}, + +{path: 'user', component: UserComponent, canActivate: [AuthGuard], +children: [ + {path: '', redirectTo: 'home', pathMatch: 'full'}, + {path: 'queue/:id', component: ViewQueueComponent }, + {path: 'home', component: HomeComponent } +] +}, +{ path: '**', redirectTo: '/auth/login' } +] + +@NgModule({ + imports: [RouterModule.forRoot(routes)], + exports: [RouterModule], + providers: [AuthGuard] +}) +export class AppRoutingModule { } diff --git a/jumpthequeue-angular/src/app/app.component.css b/jumpthequeue-angular/src/app/app.component.css new file mode 100644 index 0000000..14e2561 --- /dev/null +++ b/jumpthequeue-angular/src/app/app.component.css @@ -0,0 +1,4 @@ +.bg{ + background-color: rgb(240,240,240); + height: 100%; +} \ No newline at end of file diff --git a/jumpthequeue-angular/src/app/app.component.html b/jumpthequeue-angular/src/app/app.component.html new file mode 100644 index 0000000..feeea3a --- /dev/null +++ b/jumpthequeue-angular/src/app/app.component.html @@ -0,0 +1,3 @@ +
+ +
diff --git a/jumpthequeue-angular/src/app/app.component.spec.ts b/jumpthequeue-angular/src/app/app.component.spec.ts new file mode 100644 index 0000000..c3eab0c --- /dev/null +++ b/jumpthequeue-angular/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.componentInstance; + expect(app).toBeTruthy(); + }); + + it(`should have as title 'jumpthequeue-angular'`, () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.componentInstance; + expect(app.title).toEqual('jumpthequeue-angular'); + }); + + it('should render title', () => { + const fixture = TestBed.createComponent(AppComponent); + fixture.detectChanges(); + const compiled = fixture.nativeElement; + expect(compiled.querySelector('.content span').textContent).toContain('jumpthequeue-angular app is running!'); + }); +}); diff --git a/jumpthequeue-angular/src/app/app.component.ts b/jumpthequeue-angular/src/app/app.component.ts new file mode 100644 index 0000000..8ef03c5 --- /dev/null +++ b/jumpthequeue-angular/src/app/app.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; +import { EventService } from './shared/services/event.service'; + +@Component({ + selector: 'app-root', + templateUrl: './app.component.html', + styleUrls: ['./app.component.css'] +}) +export class AppComponent implements OnInit { + title = 'jumpthequeue-angular'; + constructor(private eventService: EventService) {} + ngOnInit() { + this.eventService.userCheck(); + } +} diff --git a/jumpthequeue-angular/src/app/app.module.ts b/jumpthequeue-angular/src/app/app.module.ts new file mode 100644 index 0000000..60da99d --- /dev/null +++ b/jumpthequeue-angular/src/app/app.module.ts @@ -0,0 +1,42 @@ +import { BrowserModule } from '@angular/platform-browser'; +import { NgModule } from '@angular/core'; +import {MatSnackBarModule} from '@angular/material/snack-bar'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; + +import { HttpClientModule } from '@angular/common/http'; + +import { AppRoutingModule } from './app-routing.module'; +import { AppComponent } from './app.component'; +import { AuthComponent } from './auth/auth.component'; +import { UserComponent } from './user/user.component'; +import { LoginComponent } from './auth/login/login.component'; +import { RegisterComponent } from './auth/register/register.component'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { ViewQueueComponent } from './user/view-queue/view-queue.component'; +import { HomeComponent } from './user/home/home.component'; +import { CountdownModule } from 'ngx-countdown'; +@NgModule({ + declarations: [ + AppComponent, + AuthComponent, + UserComponent, + LoginComponent, + RegisterComponent, + ViewQueueComponent, + HomeComponent + ], + imports: [ + BrowserModule, + AppRoutingModule, + BrowserAnimationsModule, + FormsModule, + ReactiveFormsModule, + AppRoutingModule, + MatSnackBarModule, + HttpClientModule, + CountdownModule + ], + providers: [], + bootstrap: [AppComponent] +}) +export class AppModule { } diff --git a/jumpthequeue-angular/src/app/auth/auth.component.css b/jumpthequeue-angular/src/app/auth/auth.component.css new file mode 100644 index 0000000..a7bd363 --- /dev/null +++ b/jumpthequeue-angular/src/app/auth/auth.component.css @@ -0,0 +1,7 @@ +a +{ + text-decoration: none; + color:white; + cursor: pointer; + +} \ No newline at end of file diff --git a/jumpthequeue-angular/src/app/auth/auth.component.html b/jumpthequeue-angular/src/app/auth/auth.component.html new file mode 100644 index 0000000..3f4b531 --- /dev/null +++ b/jumpthequeue-angular/src/app/auth/auth.component.html @@ -0,0 +1,10 @@ + + \ No newline at end of file diff --git a/jumpthequeue-angular/src/app/auth/auth.component.spec.ts b/jumpthequeue-angular/src/app/auth/auth.component.spec.ts new file mode 100644 index 0000000..884576c --- /dev/null +++ b/jumpthequeue-angular/src/app/auth/auth.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { AuthComponent } from './auth.component'; + +describe('AuthComponent', () => { + let component: AuthComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ AuthComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AuthComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/jumpthequeue-angular/src/app/auth/auth.component.ts b/jumpthequeue-angular/src/app/auth/auth.component.ts new file mode 100644 index 0000000..3eb7b8d --- /dev/null +++ b/jumpthequeue-angular/src/app/auth/auth.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-auth', + templateUrl: './auth.component.html', + styleUrls: ['./auth.component.css'] +}) +export class AuthComponent implements OnInit { + + constructor() { } + + ngOnInit(): void { + } + +} diff --git a/jumpthequeue-angular/src/app/auth/auth.guard.ts b/jumpthequeue-angular/src/app/auth/auth.guard.ts new file mode 100644 index 0000000..c8631a7 --- /dev/null +++ b/jumpthequeue-angular/src/app/auth/auth.guard.ts @@ -0,0 +1,25 @@ +import { Injectable } from '@angular/core'; +import { + CanActivate, + ActivatedRouteSnapshot, + RouterStateSnapshot, + Router +} from '@angular/router'; + +import { AuthService } from './auth.service'; + +@Injectable() +export class AuthGuard implements CanActivate { + constructor(private authService: AuthService, private router: Router) { } + + canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { + if (this.authService.isAuth()) { + return true; + } else { + this.router.navigate(['auth/login']); + console.log('logged out from auth gaurd - else part of auth gaurd'); + return false; + + } + } +} diff --git a/jumpthequeue-angular/src/app/auth/auth.service.spec.ts b/jumpthequeue-angular/src/app/auth/auth.service.spec.ts new file mode 100644 index 0000000..f1251ca --- /dev/null +++ b/jumpthequeue-angular/src/app/auth/auth.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { AuthService } from './auth.service'; + +describe('AuthService', () => { + let service: AuthService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(AuthService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/jumpthequeue-angular/src/app/auth/auth.service.ts b/jumpthequeue-angular/src/app/auth/auth.service.ts new file mode 100644 index 0000000..d698c6d --- /dev/null +++ b/jumpthequeue-angular/src/app/auth/auth.service.ts @@ -0,0 +1,117 @@ +import { Injectable } from '@angular/core'; +import { Router } from '@angular/router'; +import { Visitor } from './models/visitor.model'; +import { HttpClient } from '@angular/common/http'; +import { FilterVisitor } from './models/filter-visitor.model'; +import { Pageable } from './models/pageable.model'; +import {MatSnackBar} from '@angular/material/snack-bar'; +import { QueueDetailCTO } from '../shared/modals/queue-detail-cto.model'; +import { QueueDetail } from '../shared/modals/queue-detail.model'; + +@Injectable({ + providedIn: 'root' +}) +export class AuthService { + + isAuthenticated = true; + userMail: string; + userId: string; + queuesDetail: QueueDetail; + url = 'http://localhost:8081/services/rest'; + + constructor(private route: Router, private http: HttpClient, private snackBar: MatSnackBar) { } + + registerVisitor(visitor: Visitor) { + return this.http.post(this.url + '/visitormanagement/v1/visitor', visitor); + } + + getVisitorByUsername(username: string) { + const filters: FilterVisitor = new FilterVisitor(); + const pageable: Pageable = new Pageable(); + + pageable.pageNumber = 0; + pageable.pageSize = 1; + pageable.sort = []; + filters.username = username; + filters.pageable = pageable; + return this.http.post(this.url + '/visitormanagement/v1/visitor/search', filters); + } + + visitorLogin(username: string, password: string){ + // Checks if given username and password are the ones aved in the database + this.getVisitorByUsername(username).subscribe( + (visitor) => { + console.log(visitor['content'][0]); + if (visitor['content'][0].username === username && visitor['content'][0].password === password) { + + this.login(visitor['content'][0].id, visitor['content'][0].username); + this.snackBar.open('Logged In', 'Successfully', { + duration: 2000, + }); + + } else { + this.snackBar.open('access denied', 'OK', { + duration: 2000, + }); + } + }, + (err: any) => { + this.snackBar.open('access error', 'OK', { + duration: 2000, + }); + }, + ); + } + + fetchJoinedEvents() + { + const filters: FilterVisitor = new FilterVisitor(); + const pageable: Pageable = new Pageable(); + + pageable.pageNumber = 0; + pageable.pageSize = 20; + pageable.sort = []; + filters.visitorId = this.userId; + filters.pageable = pageable; + return this.http.post(this.url+ '/queuedetailmanagement/v1/queuedetail/search', filters); + } + + login(userId: number, userMail: string) { + this.userMail = userMail; + this.userId = userId.toString(); + console.log(this.userMail); + this.isAuthenticated = true; + localStorage.setItem('LoggedInUserMail', userMail + '#' + userId); + this.route.navigate(['user/home']); + } + + logOut() { + this.isAuthenticated = false; + localStorage.removeItem('LoggedInUserMail'); + this.route.navigate(['auth']); + } + + isAuth() { + return this.isAuthenticated; + } + + + userCheck() { + + const user = localStorage.getItem('LoggedInUserMail'); + console.log(user); + if (user != null) { + const x = user.split('#'); + this.userMail = x[0]; + this.userId = x[1]; + this.isAuthenticated = true; + this.route.navigate(['user']); + } else { + this.isAuthenticated = false; + } + console.log(this.userId); + console.log(this.userMail); + } + + +} diff --git a/jumpthequeue-angular/src/app/auth/login/login.component.css b/jumpthequeue-angular/src/app/auth/login/login.component.css new file mode 100644 index 0000000..b4244ff --- /dev/null +++ b/jumpthequeue-angular/src/app/auth/login/login.component.css @@ -0,0 +1,12 @@ +.container{ + width: 25%; +} +@media screen and (max-width: 768px) { + .container{ + width: 100%; + } +} + +.black-snackbar{ + background: black; +} \ No newline at end of file diff --git a/jumpthequeue-angular/src/app/auth/login/login.component.html b/jumpthequeue-angular/src/app/auth/login/login.component.html new file mode 100644 index 0000000..591fb12 --- /dev/null +++ b/jumpthequeue-angular/src/app/auth/login/login.component.html @@ -0,0 +1,29 @@ +
+
+
+ + + +
+
+ + + +
+ +
+ +
+
+
\ No newline at end of file diff --git a/jumpthequeue-angular/src/app/auth/login/login.component.spec.ts b/jumpthequeue-angular/src/app/auth/login/login.component.spec.ts new file mode 100644 index 0000000..d6d85a8 --- /dev/null +++ b/jumpthequeue-angular/src/app/auth/login/login.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { LoginComponent } from './login.component'; + +describe('LoginComponent', () => { + let component: LoginComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ LoginComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(LoginComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/jumpthequeue-angular/src/app/auth/login/login.component.ts b/jumpthequeue-angular/src/app/auth/login/login.component.ts new file mode 100644 index 0000000..13a1638 --- /dev/null +++ b/jumpthequeue-angular/src/app/auth/login/login.component.ts @@ -0,0 +1,44 @@ +import { Component, OnInit } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { Router } from '@angular/router'; +import {MatSnackBar} from '@angular/material/snack-bar'; +import { AuthService } from '../auth.service'; + +@Component({ + selector: 'app-login', + templateUrl: './login.component.html', + styleUrls: ['./login.component.css'] +}) +export class LoginComponent implements OnInit { + + loginForm: FormGroup; + + // tslint:disable-next-line: variable-name + constructor(private fb: FormBuilder, private route: Router, private _snackBar: MatSnackBar, private authService: AuthService) { } + + ngOnInit(): void { + + this.loginForm = this.fb.group({ + email: ['', [Validators.required, Validators.email]], + password: [''] + }); + } + + openSnackBar(message: string, action: string) { + this._snackBar.open(message, action, { + duration: 2000, + panelClass: ['mat-toolbar', 'mat-accent'] + }); + } + + onSubmit() { + + this.authService.visitorLogin(this.loginForm.controls.email.value,this.loginForm.controls.password.value); + + } + + onRegisterClick() { + this.route.navigate(['register']); + } + +} diff --git a/jumpthequeue-angular/src/app/auth/models/filter-visitor.model.ts b/jumpthequeue-angular/src/app/auth/models/filter-visitor.model.ts new file mode 100644 index 0000000..e01d5dd --- /dev/null +++ b/jumpthequeue-angular/src/app/auth/models/filter-visitor.model.ts @@ -0,0 +1,8 @@ +import { Pageable } from './pageable.model'; + +export class FilterVisitor { + pageable: Pageable; + username?: string; + password?: string; + visitorId?: string; +} diff --git a/jumpthequeue-angular/src/app/auth/models/pageable.model.ts b/jumpthequeue-angular/src/app/auth/models/pageable.model.ts new file mode 100644 index 0000000..ff0e6a8 --- /dev/null +++ b/jumpthequeue-angular/src/app/auth/models/pageable.model.ts @@ -0,0 +1,7 @@ +import { Sort } from './sort.model'; + +export class Pageable { + pageSize: number; + pageNumber: number; + sort?: Sort[]; +} diff --git a/jumpthequeue-angular/src/app/auth/models/sort.model.ts b/jumpthequeue-angular/src/app/auth/models/sort.model.ts new file mode 100644 index 0000000..460dc0e --- /dev/null +++ b/jumpthequeue-angular/src/app/auth/models/sort.model.ts @@ -0,0 +1,4 @@ +export class Sort { + property: string; + direction: string; +} diff --git a/jumpthequeue-angular/src/app/auth/models/visitor.model.ts b/jumpthequeue-angular/src/app/auth/models/visitor.model.ts new file mode 100644 index 0000000..64d9e8d --- /dev/null +++ b/jumpthequeue-angular/src/app/auth/models/visitor.model.ts @@ -0,0 +1,10 @@ +export class Visitor { + id?: number; + username: string; + name: string; + password: string; + phoneNumber: string; + acceptedCommercial: boolean; + acceptedTerms: boolean; + userType: boolean; +} diff --git a/jumpthequeue-angular/src/app/auth/register/register.component.css b/jumpthequeue-angular/src/app/auth/register/register.component.css new file mode 100644 index 0000000..fbbedef --- /dev/null +++ b/jumpthequeue-angular/src/app/auth/register/register.component.css @@ -0,0 +1,8 @@ +.container{ + width: 25%; +} +@media screen and (max-width: 768px) { + .container{ + width: 100%; + } +} \ No newline at end of file diff --git a/jumpthequeue-angular/src/app/auth/register/register.component.html b/jumpthequeue-angular/src/app/auth/register/register.component.html new file mode 100644 index 0000000..e58394a --- /dev/null +++ b/jumpthequeue-angular/src/app/auth/register/register.component.html @@ -0,0 +1,87 @@ +
+
+
+ + +
+
+ + + +
+
+ + + +
+
+ + + +
+
+ + + +
+
+ + + +
+ +
+ + + +
+
+ + + +
+
+ +
+
+
\ No newline at end of file diff --git a/jumpthequeue-angular/src/app/auth/register/register.component.spec.ts b/jumpthequeue-angular/src/app/auth/register/register.component.spec.ts new file mode 100644 index 0000000..6c19551 --- /dev/null +++ b/jumpthequeue-angular/src/app/auth/register/register.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { RegisterComponent } from './register.component'; + +describe('RegisterComponent', () => { + let component: RegisterComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ RegisterComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(RegisterComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/jumpthequeue-angular/src/app/auth/register/register.component.ts b/jumpthequeue-angular/src/app/auth/register/register.component.ts new file mode 100644 index 0000000..d01f1b2 --- /dev/null +++ b/jumpthequeue-angular/src/app/auth/register/register.component.ts @@ -0,0 +1,86 @@ +import { Component, OnInit } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { Router } from '@angular/router'; +import { AuthService } from '../auth.service'; +import { Visitor } from '../models/visitor.model'; + +@Component({ + selector: 'app-register', + templateUrl: './register.component.html', + styleUrls: ['./register.component.css'] +}) +export class RegisterComponent implements OnInit { + + registerForm: FormGroup; + registeredUser: Visitor; + + constructor(private fb: FormBuilder, private snackBar: MatSnackBar, private route: Router, private authService: AuthService) { } + + ngOnInit(): void { + this.registerForm = this.fb.group({ + username: ['', Validators.required], + email: ['', [Validators.required, Validators.email]], + name: ['', [Validators.required, Validators.pattern('^[a-zA-Z ]*$')]], + phoneNumber: ['', [Validators.required, Validators.pattern('^((\\+91-?)|0)?[0-9]{10}$')]], + password: ['', [Validators.required, Validators.minLength(6)]], + confirmPassword: ['', Validators.required], + acceptedCommercial: [false, Validators.requiredTrue], + acceptedTerms: [false, Validators.requiredTrue], + userType: [false] + }, { + validator: this.MustMatch('password', 'confirmPassword') + } + ); + } + + openSnackBar(message: string, action: string) { + this.snackBar.open(message, action, { + duration: 3000, + panelClass: ['mat-toolbar', 'mat-accent'] + }); + } + + onSubmit() { + const visitorObj: any = {}; + visitorObj.username = this.registerForm.controls.email.value; + visitorObj.name = this.registerForm.controls.name.value; + visitorObj.password = this.registerForm.controls.password.value; + visitorObj.phoneNumber = this.registerForm.controls.phoneNumber.value; + visitorObj.acceptedCommercial = this.registerForm.controls.acceptedCommercial.value; + visitorObj.acceptedTerms = this.registerForm.controls.acceptedTerms.value; + visitorObj.userType = false; + this.authService.registerVisitor(visitorObj).subscribe(data => + { + console.log(data); + this.registeredUser = data; + this.authService.login(this.registeredUser.id,this.registeredUser.username); + this.openSnackBar(' Successfully Registred ', ' Moving to Login '); + } + ); + //console.log(this.registeredUser); + + // this.route.navigate(['auth/login']); + } + + MustMatch(controlName: string, matchingControlName: string) { + return (formGroup: FormGroup) => { + const control = formGroup.controls[controlName]; + const matchingControl = formGroup.controls[matchingControlName]; + + if (matchingControl.errors && !matchingControl.errors.mustMatch) { + // return if another validator has already found an error on the matchingControl + return; + } + + // set error on matchingControl if validation fails + if (control.value !== matchingControl.value) { + matchingControl.setErrors({ mustMatch: true }); + } else { + matchingControl.setErrors(null); + } + }; +} + + +} diff --git a/jumpthequeue-angular/src/app/shared/modals/event.modal.ts b/jumpthequeue-angular/src/app/shared/modals/event.modal.ts new file mode 100644 index 0000000..cb094ed --- /dev/null +++ b/jumpthequeue-angular/src/app/shared/modals/event.modal.ts @@ -0,0 +1,16 @@ +export class Events { + id: string; + eventName: string; + location: string; + description: string; + visitorCount: number; + startDate: Date; + endDate: Date; + attentionTime: Date; + logo: string; + // tslint:disable-next-line: no-inferrable-types + isJoined: boolean = false; + + +} + diff --git a/jumpthequeue-angular/src/app/shared/modals/queue-detail-cto.model.ts b/jumpthequeue-angular/src/app/shared/modals/queue-detail-cto.model.ts new file mode 100644 index 0000000..531c9ba --- /dev/null +++ b/jumpthequeue-angular/src/app/shared/modals/queue-detail-cto.model.ts @@ -0,0 +1,13 @@ +import { Visitor } from 'src/app/auth/models/visitor.model'; +import { Events } from './event.modal'; + +export class QueueDetailCTO { + id: string; + queueNumber: string; + creationTime: Date; + startTime: Date; + endTime: Date; + minEstimatedTime: Date; + visitor: Visitor; + event: Events; +} \ No newline at end of file diff --git a/jumpthequeue-angular/src/app/shared/modals/queue-detail.model.ts b/jumpthequeue-angular/src/app/shared/modals/queue-detail.model.ts new file mode 100644 index 0000000..63ed0da --- /dev/null +++ b/jumpthequeue-angular/src/app/shared/modals/queue-detail.model.ts @@ -0,0 +1,10 @@ +export class QueueDetail { + id: string; + queueNumber: string; + creationTime: Date; + startTime: Date; + endTime: Date; + minEstimatedTime: string; + visitorId: string; + eventId: string; +} \ No newline at end of file diff --git a/jumpthequeue-angular/src/app/shared/services/event.service.spec.ts b/jumpthequeue-angular/src/app/shared/services/event.service.spec.ts new file mode 100644 index 0000000..df6b168 --- /dev/null +++ b/jumpthequeue-angular/src/app/shared/services/event.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { EventService } from './event.service'; + +describe('EventService', () => { + let service: EventService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(EventService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/jumpthequeue-angular/src/app/shared/services/event.service.ts b/jumpthequeue-angular/src/app/shared/services/event.service.ts new file mode 100644 index 0000000..2e1ed67 --- /dev/null +++ b/jumpthequeue-angular/src/app/shared/services/event.service.ts @@ -0,0 +1,91 @@ +import { Injectable } from '@angular/core'; +import { AuthService } from 'src/app/auth/auth.service'; +import { Events } from '../modals/event.modal'; +import { HttpClient } from '@angular/common/http'; +import { FilterVisitor } from 'src/app/auth/models/filter-visitor.model'; +import { Pageable } from 'src/app/auth/models/pageable.model'; +import { QueueDetail } from '../modals/queue-detail.model'; + +@Injectable({ + providedIn: 'root' +}) +export class EventService { + + isDisable = false; + joinedEvents: any[] = []; + url = 'http://localhost:8081/services/rest'; + queuesDetail: QueueDetail[] = []; + eventDetails: Events[]; + constructor(private authService: AuthService, private http: HttpClient) { } + + + getAllEvent() { + const filters: FilterVisitor = new FilterVisitor(); + const pageable: Pageable = new Pageable(); + + pageable.pageNumber = 0; + pageable.pageSize = 20; + pageable.sort = []; + filters.pageable = pageable; + this.http.post(this.url + '/eventmanagement/v1/event/search', filters).subscribe(data => { + this.eventDetails = data['content']; + for (let i = 0; i < this.eventDetails.length; i++) { + if (this.joinedEvents.includes(this.eventDetails[i].id)) { + this.eventDetails[i].isJoined = true; + } + else { + this.eventDetails[i].isJoined = false; + } + } + + localStorage.setItem('eventList', JSON.stringify(this.eventDetails)); + console.log(this.eventDetails); + });; + } + + + fetchJoinedEvents() { + this.authService.fetchJoinedEvents().subscribe(data => { + this.queuesDetail = data['content']; + for (let i = 0; i < this.queuesDetail.length; i++) { + if (!this.joinedEvents.includes(this.queuesDetail[i].eventId)) { + this.joinedEvents.push(this.queuesDetail[i].eventId); + } + } + console.log(this.queuesDetail); + console.log(this.joinedEvents); + }); + } + + getEventById(id: string) { + return this.http.get(this.url + '/eventmanagement/v1/event/' + id); + } + + joinEvent(eventId: string) { + const queueObj: any = {}; + queueObj.eventId = eventId; + queueObj.visitorId = this.authService.userId; + return this.http.post(this.url + '/queuedetailmanagement/v1/queuedetail', queueObj); + + } + + leaveEvent(id: string, eventId: string) { + const joinedEventIndex = this.joinedEvents.indexOf(eventId); + this.queuesDetail = []; + if (joinedEventIndex !== -1) { + this.joinedEvents.splice(joinedEventIndex, 1); + } + return this.http.delete(this.url + '/queuedetailmanagement/v1/queuedetail/' + id); + } + + logOut() { + this.isDisable = false; + this.joinedEvents = []; + this.queuesDetail = []; + this.authService.logOut(); + } + + userCheck() { + this.authService.userCheck(); + } +} diff --git a/jumpthequeue-angular/src/app/user/home/home.component.css b/jumpthequeue-angular/src/app/user/home/home.component.css new file mode 100644 index 0000000..49d107c --- /dev/null +++ b/jumpthequeue-angular/src/app/user/home/home.component.css @@ -0,0 +1,39 @@ +.card { + box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2); + max-width: 300px; + margin: auto; + text-align: center; + font-family: arial; + } + + .title { + color: grey; + font-size: 18px; + } + + .brdr{ + border: 2px solid rgba(230,230,230,0.6); + } + + button { + border: none; + outline: 0; + display: inline-block; + padding: 8px; + color: white; + background-color: #000; + text-align: center; + cursor: pointer; + width: 100%; + font-size: 18px; + } + + a { + text-decoration: none; + font-size: 22px; + color: black; + } + + button:hover, a:hover { + opacity: 0.7; + } \ No newline at end of file diff --git a/jumpthequeue-angular/src/app/user/home/home.component.html b/jumpthequeue-angular/src/app/user/home/home.component.html new file mode 100644 index 0000000..12e4648 --- /dev/null +++ b/jumpthequeue-angular/src/app/user/home/home.component.html @@ -0,0 +1,11 @@ +
+ Jump the queue + +
+

Welcome In Jump The Queue

+
+
+ +
+ +
\ No newline at end of file diff --git a/jumpthequeue-angular/src/app/user/home/home.component.spec.ts b/jumpthequeue-angular/src/app/user/home/home.component.spec.ts new file mode 100644 index 0000000..490e81b --- /dev/null +++ b/jumpthequeue-angular/src/app/user/home/home.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HomeComponent } from './home.component'; + +describe('HomeComponent', () => { + let component: HomeComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ HomeComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HomeComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/jumpthequeue-angular/src/app/user/home/home.component.ts b/jumpthequeue-angular/src/app/user/home/home.component.ts new file mode 100644 index 0000000..7446113 --- /dev/null +++ b/jumpthequeue-angular/src/app/user/home/home.component.ts @@ -0,0 +1,25 @@ +import { EventEmitter, Inject } from '@angular/core'; +import { Component, OnInit, Output } from '@angular/core'; +import { EventService } from 'src/app/shared/services/event.service'; +import { UserComponent } from '../user.component'; + +@Component({ + selector: 'app-home', + templateUrl: './home.component.html', + styleUrls: ['./home.component.css'] +}) +export class HomeComponent implements OnInit { + + constructor(@Inject(UserComponent) private parent: UserComponent, private eventService: EventService) { } + + ngOnInit(): void { + + this.eventService.getAllEvent(); + } + + + show() { + this.parent.openNav(); + } + +} diff --git a/jumpthequeue-angular/src/app/user/user.component.css b/jumpthequeue-angular/src/app/user/user.component.css new file mode 100644 index 0000000..e9453ae --- /dev/null +++ b/jumpthequeue-angular/src/app/user/user.component.css @@ -0,0 +1,71 @@ +a +{ + text-decoration: none; + color:white; + cursor: pointer; + +} + +.bg{ + background-image: url('/assets/image/undraw_Taken_re_yn20.svg'); + background-position: right bottom; + background-repeat: no-repeat; + background-size: 25%; +} + +.sidenav { + height: 100%; + width: 0; + position: fixed; + z-index: 1; + top: 0; + left: 0; + background-color: #111; + overflow-x: hidden; + transition: 0.5s; + padding-top: 60px; + } + + .sidenav a { + padding: 8px 8px 8px 55px; + text-decoration: none; + font-size: 25px; + color: #818181; + display: block; + transition: 0.3s; + } + + .sidenav a:hover { + color: #f1f1f1; + } + + .sidenav .closebtn { + position: absolute; + top: 0; + right: 25px; + font-size: 36px; + margin-left: 50px; + padding-top: 15px; + } + + @media screen and (max-height: 450px) { + .sidenav {padding-top: 15px;} + .sidenav a {font-size: 18px;} + } + + .float{ + position:fixed; + width:60px; + height:60px; + bottom:40px; + right:40px; + + color:#FFF; + border-radius:50px; + text-align:center; + box-shadow: 2px 2px 3px #999; +} + +.my-float{ + margin-top:22px; +} \ No newline at end of file diff --git a/jumpthequeue-angular/src/app/user/user.component.html b/jumpthequeue-angular/src/app/user/user.component.html new file mode 100644 index 0000000..b316455 --- /dev/null +++ b/jumpthequeue-angular/src/app/user/user.component.html @@ -0,0 +1,30 @@ + + + + +
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/jumpthequeue-angular/src/app/user/user.component.spec.ts b/jumpthequeue-angular/src/app/user/user.component.spec.ts new file mode 100644 index 0000000..dd3b1d7 --- /dev/null +++ b/jumpthequeue-angular/src/app/user/user.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { UserComponent } from './user.component'; + +describe('UserComponent', () => { + let component: UserComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ UserComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(UserComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/jumpthequeue-angular/src/app/user/user.component.ts b/jumpthequeue-angular/src/app/user/user.component.ts new file mode 100644 index 0000000..2ea3c30 --- /dev/null +++ b/jumpthequeue-angular/src/app/user/user.component.ts @@ -0,0 +1,63 @@ +import { Component, Inject, OnInit } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { Router } from '@angular/router'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { EventService } from '../shared/services/event.service'; +import { Events } from '../shared/modals/event.modal'; + +@Component({ + selector: 'app-user', + templateUrl: './user.component.html', + styleUrls: ['./user.component.css'] +}) +export class UserComponent implements OnInit { + + toggle = false; + events: Events[] = []; + eventDetails: Events[]; + + constructor(@Inject(DOCUMENT) document, private route: Router, private snackBar: MatSnackBar, public eventService: EventService) { } + + ngOnInit(): void { + + this.fetchJoinedEvents(); + this.eventService.isDisable = false; + } + + logOut() { + this.eventService.logOut(); + } + + fetchJoinedEvents() { + this.eventService.fetchJoinedEvents(); + } + + getAllEvents() { + this.eventDetails = JSON.parse(localStorage.getItem('eventList')); + } + + openSnackBar(message: string, action: string) { + this.snackBar.open(message, action, { + duration: 4000, + panelClass: ['mat-toolbar', 'mat-accent'] + }); + } + + viewQueue(id: string) { + this.closeNav(); + this.openSnackBar('Showing queue of ', id); + this.route.navigate(['user/queue', id]); + } + + openNav() { + this.getAllEvents(); + this.toggle = true; + document.getElementById('mySidenav').style.width = '250px'; + } + + closeNav() { + this.toggle = false; + document.getElementById('mySidenav').style.width = '0'; + } + +} diff --git a/jumpthequeue-angular/src/app/user/view-queue/view-queue.component.css b/jumpthequeue-angular/src/app/user/view-queue/view-queue.component.css new file mode 100644 index 0000000..cb94d5e --- /dev/null +++ b/jumpthequeue-angular/src/app/user/view-queue/view-queue.component.css @@ -0,0 +1,50 @@ +.card { + box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2); + max-width: 300px; + margin: auto; + text-align: center; + font-family: arial; + } + + .size{ + font-size: large; + } + + .details{ + font-weight: 900; + } + .title { + color: grey; + font-size: 18px; + } + + .style-bold{ + font-weight: 700; + } + + .brdr{ + border: 2px solid rgba(230,230,230,0.6); + } + + button { + border: none; + outline: 0; + display: inline-block; + padding: 8px; + color: white; + background-color: #000; + text-align: center; + cursor: pointer; + width: 100%; + font-size: 18px; + } + + a { + text-decoration: none; + font-size: 22px; + color: black; + } + + button:hover, a:hover { + opacity: 0.7; + } \ No newline at end of file diff --git a/jumpthequeue-angular/src/app/user/view-queue/view-queue.component.html b/jumpthequeue-angular/src/app/user/view-queue/view-queue.component.html new file mode 100644 index 0000000..19f8d39 --- /dev/null +++ b/jumpthequeue-angular/src/app/user/view-queue/view-queue.component.html @@ -0,0 +1,28 @@ +
+ Jump the queue +
+

{{eventDetails.eventName}}

+
+
+
+

Access Code

+
+

{{queue[0].queueNumber}}

+
+

Estimated Time:

+ +
+
+
+

Currently Being Attended

+

Q001

+
+
+ +

+
+ +

+
+ +
\ No newline at end of file diff --git a/jumpthequeue-angular/src/app/user/view-queue/view-queue.component.spec.ts b/jumpthequeue-angular/src/app/user/view-queue/view-queue.component.spec.ts new file mode 100644 index 0000000..764c27b --- /dev/null +++ b/jumpthequeue-angular/src/app/user/view-queue/view-queue.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ViewQueueComponent } from './view-queue.component'; + +describe('ViewQueueComponent', () => { + let component: ViewQueueComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ViewQueueComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ViewQueueComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/jumpthequeue-angular/src/app/user/view-queue/view-queue.component.ts b/jumpthequeue-angular/src/app/user/view-queue/view-queue.component.ts new file mode 100644 index 0000000..6c3887a --- /dev/null +++ b/jumpthequeue-angular/src/app/user/view-queue/view-queue.component.ts @@ -0,0 +1,90 @@ +import { Component, OnInit } from '@angular/core'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { ActivatedRoute, Router } from '@angular/router'; +import { Events } from 'src/app/shared/modals/event.modal'; +import { QueueDetail } from 'src/app/shared/modals/queue-detail.model'; +import { EventService } from 'src/app/shared/services/event.service'; + +@Component({ + selector: 'app-view-queue', + templateUrl: './view-queue.component.html', + styleUrls: ['./view-queue.component.css'] +}) +export class ViewQueueComponent implements OnInit { + + + joined = false; + id: string; + eventDetails: any; + mail: string; + queueNo: string; + queue: QueueDetail[]; + events: Events[] = []; + + constructor(private route: ActivatedRoute, private eventService: EventService, private snackBar: MatSnackBar) { } + + ngOnInit() { + + this.route.params.subscribe(routeParams => { + this.getDetails(routeParams.id); + }); + } + + + + getDetails(id: string) { + this.eventService.getEventById(id).subscribe(event => { + console.log(event); + this.eventDetails = event; + this.queue = this.eventService.queuesDetail.filter(e => e.eventId == this.eventDetails.id); + if (this.eventService.joinedEvents.includes(this.eventDetails.id)) { + this.eventDetails.isJoined = true; + } + console.log(this.eventDetails); + }); + } + + updateEventList(join: boolean) { + this.events = JSON.parse(localStorage.getItem('eventList')); + for (let i = 0; i < this.events.length; i++) { + if (this.events[i].id == this.eventDetails.id) { + this.events[i].isJoined = join; + } + } + localStorage.setItem('eventList', JSON.stringify(this.events)); + } + + join(eventId: string) { + this.updateEventList(true); + this.joined = true; + this.eventDetails.isJoined = true; + this.eventService.joinEvent(eventId).subscribe(data => { + this.queue[0] = data; + console.log(data); + this.openSnackBar('Joined The Queue', 'Success'); + this.eventService.fetchJoinedEvents(); + }); + } + + leave() { + this.updateEventList(false); + this.joined = false; + this.eventDetails.isJoined = false; + this.eventService.leaveEvent(this.queue[0].id, this.eventDetails.id).subscribe(data => { + this.eventService.fetchJoinedEvents(); + this.getDetails(this.eventDetails.id); + this.openSnackBar('Leaved The Queue', 'Success'); + }, + err => { + this.openSnackBar('access denied', 'OK'); + }); + } + + openSnackBar(message: string, action: string) { + this.snackBar.open(message, action, { + duration: 4000, + panelClass: ['mat-toolbar', 'mat-accent'] + }); + } + +} diff --git a/jumpthequeue-angular/src/assets/.gitkeep b/jumpthequeue-angular/src/assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/jumpthequeue-angular/src/assets/image/candle (1).png b/jumpthequeue-angular/src/assets/image/candle (1).png new file mode 100644 index 0000000000000000000000000000000000000000..dacde750cda3f7ceb724121332b5320b5db37bdc GIT binary patch literal 1035 zcmV+m1oZofP)N4^eNMF2U_rKR&nUdwUd;u|#h{&OSwYL{EKiI~*V8fBf%uBVjs)>takQn2VS|wo zl>QY+f-+)s6y%x&ue_u4+Ak^TsfqGHsI^pBc|zN08?9rlh`A{^U*|H}6KAe14PtJ! zKPfw^oXIJ@xV7l}C%-^I^HGvBV??7iTejRqGO=dm z7|i+p6T1)C08XuX-1E$k_D$*9)`x8l_q8L^&QCv1b9Hc*O`CQi2)6C;M;Ksxv z$%M<_e`Z)%ej}D`N?AP7-+$-7u&NK%)a{{gvLUdHeDc`X0{002ovPDHLk FV1kLyW_T!eu*j^Jym77>DcIMv1;rmvnxN(0199qRKHPw{!6dngXM5nGRn+b zo;_QYS_MXjl^^~P%Iw7%_u@ot_s$FD)j0qGn64jsH>tk86x%59%6OaoPo!RJ2lpkO zYGf2xPA!t=cc%L%j{?}K?ayowUz}^jvM*=^;N(lUsTUE`R|V6V(pi|l&}~=^73&U6 zlsisIv08f-*y4#j$E~hSy0L>5ippMnuUg02O&C`0)G9 zw3h-}-a=!OOaHX_`lq6oFT{13E;%urSA|`5%ifXDaX>izjpOkh3jEE#*D_P%9fPEX zzZNRAO2C-&5(D1?p z0~AK6SRq)8HHN`jx^ms;6R_qlOxF(V+}&8XY7C}KkzE6W#GElkvBnZ|!ijJ%$i0h~ zhxVLl{c^ptuP$cWzg=_4n?B_-W@YhilaLcxA>;&#w!FC_DII)Jysm?__-gX$Pf?Do j3mQHW$Z9;B;s2T00000NkvXXu0mjf!$WSE literal 0 HcmV?d00001 diff --git a/jumpthequeue-angular/src/assets/image/diya.svg b/jumpthequeue-angular/src/assets/image/diya.svg new file mode 100644 index 0000000..7a1e4c5 --- /dev/null +++ b/jumpthequeue-angular/src/assets/image/diya.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/jumpthequeue-angular/src/assets/image/jumptheq.png b/jumpthequeue-angular/src/assets/image/jumptheq.png new file mode 100644 index 0000000000000000000000000000000000000000..1c642dfa5e2ffa7d39b1b76a246dcb386a24a24e GIT binary patch literal 15841 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 iO%;d&FrRQ!ZCD3;I7O+C&)u literal 0 HcmV?d00001 diff --git a/jumpthequeue-angular/src/assets/image/screen.png b/jumpthequeue-angular/src/assets/image/screen.png new file mode 100644 index 0000000000000000000000000000000000000000..f0418c9bc018453cd61b06d53aae593a372cd201 GIT binary patch literal 93059 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 SH_Pm=S}Dm@5~59t6AxDPc4n^6q@ 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 Gf&ULFJ$rTl literal 0 HcmV?d00001 diff --git a/jumpthequeue-angular/src/assets/image/undraw_Taken_re_yn20.svg b/jumpthequeue-angular/src/assets/image/undraw_Taken_re_yn20.svg new file mode 100644 index 0000000..bb56183 --- /dev/null +++ b/jumpthequeue-angular/src/assets/image/undraw_Taken_re_yn20.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/jumpthequeue-angular/src/environments/environment.prod.ts b/jumpthequeue-angular/src/environments/environment.prod.ts new file mode 100644 index 0000000..3612073 --- /dev/null +++ b/jumpthequeue-angular/src/environments/environment.prod.ts @@ -0,0 +1,3 @@ +export const environment = { + production: true +}; diff --git a/jumpthequeue-angular/src/environments/environment.ts b/jumpthequeue-angular/src/environments/environment.ts new file mode 100644 index 0000000..7b4f817 --- /dev/null +++ b/jumpthequeue-angular/src/environments/environment.ts @@ -0,0 +1,16 @@ +// 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 +}; + +/* + * 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/jumpthequeue-angular/src/favicon.ico b/jumpthequeue-angular/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 + + + + JumpthequeueAngular + + + + + + + + + + + + + + + diff --git a/jumpthequeue-angular/src/main.ts b/jumpthequeue-angular/src/main.ts new file mode 100644 index 0000000..c7b673c --- /dev/null +++ b/jumpthequeue-angular/src/main.ts @@ -0,0 +1,12 @@ +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/jumpthequeue-angular/src/polyfills.ts b/jumpthequeue-angular/src/polyfills.ts new file mode 100644 index 0000000..03711e5 --- /dev/null +++ b/jumpthequeue-angular/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'; + * + * 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/jumpthequeue-angular/src/styles.css b/jumpthequeue-angular/src/styles.css new file mode 100644 index 0000000..7e7239a --- /dev/null +++ b/jumpthequeue-angular/src/styles.css @@ -0,0 +1,4 @@ +/* You can add global styles to this file, and also import other style files */ + +html, body { height: 100%; } +body { margin: 0; font-family: Roboto, "Helvetica Neue", sans-serif; } diff --git a/jumpthequeue-angular/src/test.ts b/jumpthequeue-angular/src/test.ts new file mode 100644 index 0000000..50193eb --- /dev/null +++ b/jumpthequeue-angular/src/test.ts @@ -0,0 +1,25 @@ +// 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: { + context(path: string, deep?: boolean, filter?: RegExp): { + keys(): string[]; + (id: string): T; + }; +}; + +// 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/jumpthequeue-angular/tsconfig.app.json b/jumpthequeue-angular/tsconfig.app.json new file mode 100644 index 0000000..f758d98 --- /dev/null +++ b/jumpthequeue-angular/tsconfig.app.json @@ -0,0 +1,14 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": [] + }, + "files": [ + "src/main.ts", + "src/polyfills.ts" + ], + "include": [ + "src/**/*.d.ts" + ] +} diff --git a/jumpthequeue-angular/tsconfig.json b/jumpthequeue-angular/tsconfig.json new file mode 100644 index 0000000..30956ae --- /dev/null +++ b/jumpthequeue-angular/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/jumpthequeue-angular/tsconfig.spec.json b/jumpthequeue-angular/tsconfig.spec.json new file mode 100644 index 0000000..6400fde --- /dev/null +++ b/jumpthequeue-angular/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/jumpthequeue-angular/tslint.json b/jumpthequeue-angular/tslint.json new file mode 100644 index 0000000..c8d70f1 --- /dev/null +++ b/jumpthequeue-angular/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 diff --git a/jumpthequeue-java/jtqjava/.gitignore b/jumpthequeue-java/jtqjava/.gitignore new file mode 100644 index 0000000..1b64d26 --- /dev/null +++ b/jumpthequeue-java/jtqjava/.gitignore @@ -0,0 +1,21 @@ +.* +!.github +!.gitignore +!.mvn +!.travis.yml +*.bak +*.log +*.class +*.diff +*.patch +*.iml +*.jar +*.war +*.ear +hs_err_pid* + +target +eclipse-target +war +**/src/generated/ +**/tmp/ diff --git a/jumpthequeue-java/jtqjava/api/pom.xml b/jumpthequeue-java/jtqjava/api/pom.xml new file mode 100644 index 0000000..ec9133c --- /dev/null +++ b/jumpthequeue-java/jtqjava/api/pom.xml @@ -0,0 +1,45 @@ + + + 4.0.0 + + com.devonfw.java.jtqjava + jtqjava + 0.0.1 + + jtqjava-api + jar + ${project.artifactId} + API of the server for the jtqjava application (containing datatypes, transfer-objects, and service interfaces). + + + + org.springframework.data + spring-data-commons + + + com.devonfw.java.modules + devon4j-rest + + + com.devonfw.java.modules + devon4j-logging + + + com.devonfw.java.modules + devon4j-security + + + + javax.servlet + javax.servlet-api + provided + + + + com.devonfw.java.modules + devon4j-test + test + + + diff --git a/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/eventmanagement/common/api/Event.java b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/eventmanagement/common/api/Event.java new file mode 100644 index 0000000..3d015cc --- /dev/null +++ b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/eventmanagement/common/api/Event.java @@ -0,0 +1,89 @@ +package com.devonfw.application.jtqjava.eventmanagement.common.api; + +import java.sql.Timestamp; + +import com.devonfw.application.jtqjava.general.common.api.ApplicationEntity; + +public interface Event extends ApplicationEntity { + + /** + * @return eventNameId + */ + public String getEventName(); + + /** + * @param eventName setter for eventName attribute + */ + public void setEventName(String eventName); + + /** + * @return startDateId + */ + public Timestamp getStartDate(); + + /** + * @param startDate setter for startDate attribute + */ + public void setStartDate(Timestamp startDate); + + /** + * @return endDateId + */ + public Timestamp getEndDate(); + + /** + * @param endDate setter for endDate attribute + */ + public void setEndDate(Timestamp endDate); + + /** + * @return locationId + */ + public String getLocation(); + + /** + * @param location setter for location attribute + */ + public void setLocation(String location); + + /** + * @return descriptionId + */ + public String getDescription(); + + /** + * @param description setter for description attribute + */ + public void setDescription(String description); + + /** + * @return logoId + */ + public String getLogo(); + + /** + * @param logo setter for logo attribute + */ + public void setLogo(String logo); + + /** + * @return attentionTimeId + */ + public Timestamp getAttentionTime(); + + /** + * @param attentionTime setter for attentionTime attribute + */ + public void setAttentionTime(Timestamp attentionTime); + + /** + * @return visitorCountId + */ + public int getVisitorCount(); + + /** + * @param visitorCount setter for visitorCount attribute + */ + public void setVisitorCount(int visitorCount); + +} diff --git a/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/api/Eventmanagement.java b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/api/Eventmanagement.java new file mode 100644 index 0000000..bc1f0fe --- /dev/null +++ b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/api/Eventmanagement.java @@ -0,0 +1,11 @@ +package com.devonfw.application.jtqjava.eventmanagement.logic.api; + +import com.devonfw.application.jtqjava.eventmanagement.logic.api.usecase.UcFindEvent; +import com.devonfw.application.jtqjava.eventmanagement.logic.api.usecase.UcManageEvent; + +/** + * Interface for Eventmanagement component. + */ +public interface Eventmanagement extends UcFindEvent, UcManageEvent { + +} diff --git a/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/api/to/EventEto.java b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/api/to/EventEto.java new file mode 100644 index 0000000..df9f7e9 --- /dev/null +++ b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/api/to/EventEto.java @@ -0,0 +1,208 @@ +package com.devonfw.application.jtqjava.eventmanagement.logic.api.to; + +import java.sql.Timestamp; + +import com.devonfw.application.jtqjava.eventmanagement.common.api.Event; +import com.devonfw.module.basic.common.api.to.AbstractEto; + +/** + * Entity transport object of Event + */ +public class EventEto extends AbstractEto implements Event { + + private static final long serialVersionUID = 1L; + + private String eventName; + + private Timestamp startDate; + + private Timestamp endDate; + + private String location; + + private String description; + + private String logo; + + private Timestamp attentionTime; + + private int visitorCount; + + @Override + public String getEventName() { + + return this.eventName; + } + + @Override + public void setEventName(String eventName) { + + this.eventName = eventName; + } + + @Override + public Timestamp getStartDate() { + + return this.startDate; + } + + @Override + public void setStartDate(Timestamp startDate) { + + this.startDate = startDate; + } + + @Override + public Timestamp getEndDate() { + + return this.endDate; + } + + @Override + public void setEndDate(Timestamp endDate) { + + this.endDate = endDate; + } + + @Override + public String getLocation() { + + return this.location; + } + + @Override + public void setLocation(String location) { + + this.location = location; + } + + @Override + public String getDescription() { + + return this.description; + } + + @Override + public void setDescription(String description) { + + this.description = description; + } + + @Override + public String getLogo() { + + return this.logo; + } + + @Override + public void setLogo(String logo) { + + this.logo = logo; + } + + @Override + public Timestamp getAttentionTime() { + + return this.attentionTime; + } + + @Override + public void setAttentionTime(Timestamp attentionTime) { + + this.attentionTime = attentionTime; + } + + @Override + public int hashCode() { + + final int prime = 31; + int result = super.hashCode(); + result = prime * result + ((this.eventName == null) ? 0 : this.eventName.hashCode()); + result = prime * result + ((this.startDate == null) ? 0 : this.startDate.hashCode()); + result = prime * result + ((this.endDate == null) ? 0 : this.endDate.hashCode()); + result = prime * result + ((this.location == null) ? 0 : this.location.hashCode()); + result = prime * result + ((this.description == null) ? 0 : this.description.hashCode()); + result = prime * result + ((this.logo == null) ? 0 : this.logo.hashCode()); + result = prime * result + ((this.attentionTime == null) ? 0 : this.attentionTime.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + // class check will be done by super type EntityTo! + if (!super.equals(obj)) { + return false; + } + EventEto other = (EventEto) obj; + if (this.eventName == null) { + if (other.eventName != null) { + return false; + } + } else if (!this.eventName.equals(other.eventName)) { + return false; + } + if (this.startDate == null) { + if (other.startDate != null) { + return false; + } + } else if (!this.startDate.equals(other.startDate)) { + return false; + } + if (this.endDate == null) { + if (other.endDate != null) { + return false; + } + } else if (!this.endDate.equals(other.endDate)) { + return false; + } + if (this.location == null) { + if (other.location != null) { + return false; + } + } else if (!this.location.equals(other.location)) { + return false; + } + if (this.description == null) { + if (other.description != null) { + return false; + } + } else if (!this.description.equals(other.description)) { + return false; + } + if (this.logo == null) { + if (other.logo != null) { + return false; + } + } else if (!this.logo.equals(other.logo)) { + return false; + } + if (this.attentionTime == null) { + if (other.attentionTime != null) { + return false; + } + } else if (!this.attentionTime.equals(other.attentionTime)) { + return false; + } + return true; + } + + @Override + public int getVisitorCount() { + + return visitorCount; + } + + @Override + public void setVisitorCount(int visitorCount) { + + this.visitorCount = visitorCount; + } + +} diff --git a/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/api/to/EventSearchCriteriaTo.java b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/api/to/EventSearchCriteriaTo.java new file mode 100644 index 0000000..aceae60 --- /dev/null +++ b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/api/to/EventSearchCriteriaTo.java @@ -0,0 +1,232 @@ +package com.devonfw.application.jtqjava.eventmanagement.logic.api.to; + +import java.sql.Timestamp; + +import com.devonfw.application.jtqjava.general.common.api.to.AbstractSearchCriteriaTo; +import com.devonfw.module.basic.common.api.query.StringSearchConfigTo; + +/** + * {@link SearchCriteriaTo} to find instances of + * {@link com.devonfw.application.jtqjava.eventmanagement.common.api.Event}s. + */ +public class EventSearchCriteriaTo extends AbstractSearchCriteriaTo { + + private static final long serialVersionUID = 1L; + + private String eventName; + + private Timestamp startDate; + + private Timestamp endDate; + + private String location; + + private String description; + + private String logo; + + private Timestamp attentionTime; + + private StringSearchConfigTo eventNameOption; + + private StringSearchConfigTo locationOption; + + private StringSearchConfigTo descriptionOption; + + private StringSearchConfigTo logoOption; + + private Integer visitorCount; + + /** + * @return eventNameId + */ + public String getEventName() { + + return this.eventName; + } + + /** + * @param eventName setter for eventName attribute + */ + public void setEventName(String eventName) { + + this.eventName = eventName; + } + + /** + * @return startDateId + */ + public Timestamp getStartDate() { + + return this.startDate; + } + + /** + * @param startDate setter for startDate attribute + */ + public void setStartDate(Timestamp startDate) { + + this.startDate = startDate; + } + + /** + * @return endDateId + */ + public Timestamp getEndDate() { + + return this.endDate; + } + + /** + * @param endDate setter for endDate attribute + */ + public void setEndDate(Timestamp endDate) { + + this.endDate = endDate; + } + + /** + * @return locationId + */ + public String getLocation() { + + return this.location; + } + + /** + * @param location setter for location attribute + */ + public void setLocation(String location) { + + this.location = location; + } + + /** + * @return descriptionId + */ + public String getDescription() { + + return this.description; + } + + /** + * @param description setter for description attribute + */ + public void setDescription(String description) { + + this.description = description; + } + + /** + * @return logoId + */ + public String getLogo() { + + return this.logo; + } + + /** + * @param logo setter for logo attribute + */ + public void setLogo(String logo) { + + this.logo = logo; + } + + /** + * @return attentionTimeId + */ + public Timestamp getAttentionTime() { + + return this.attentionTime; + } + + /** + * @param attentionTime setter for attentionTime attribute + */ + public void setAttentionTime(Timestamp attentionTime) { + + this.attentionTime = attentionTime; + } + + /** + * @return the {@link StringSearchConfigTo} used to search for {@link #getEventName() eventName}. + */ + public StringSearchConfigTo getEventNameOption() { + + return this.eventNameOption; + } + + /** + * @param eventNameOption new value of {@link #getEventNameOption()}. + */ + public void setEventNameOption(StringSearchConfigTo eventNameOption) { + + this.eventNameOption = eventNameOption; + } + + /** + * @return the {@link StringSearchConfigTo} used to search for {@link #getLocation() location}. + */ + public StringSearchConfigTo getLocationOption() { + + return this.locationOption; + } + + /** + * @param locationOption new value of {@link #getLocationOption()}. + */ + public void setLocationOption(StringSearchConfigTo locationOption) { + + this.locationOption = locationOption; + } + + /** + * @return the {@link StringSearchConfigTo} used to search for {@link #getDescription() description}. + */ + public StringSearchConfigTo getDescriptionOption() { + + return this.descriptionOption; + } + + /** + * @param descriptionOption new value of {@link #getDescriptionOption()}. + */ + public void setDescriptionOption(StringSearchConfigTo descriptionOption) { + + this.descriptionOption = descriptionOption; + } + + /** + * @return the {@link StringSearchConfigTo} used to search for {@link #getLogo() logo}. + */ + public StringSearchConfigTo getLogoOption() { + + return this.logoOption; + } + + /** + * @param logoOption new value of {@link #getLogoOption()}. + */ + public void setLogoOption(StringSearchConfigTo logoOption) { + + this.logoOption = logoOption; + } + + /** + * @return visitorCountId + */ + public Integer getVisitorCount() { + + return visitorCount; + } + + /** + * @param visitorCount setter for visitorCount attribute + */ + public void setVisitorCount(Integer visitorCount) { + + this.visitorCount = visitorCount; + } + +} diff --git a/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/api/usecase/UcFindEvent.java b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/api/usecase/UcFindEvent.java new file mode 100644 index 0000000..e6a306e --- /dev/null +++ b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/api/usecase/UcFindEvent.java @@ -0,0 +1,28 @@ +package com.devonfw.application.jtqjava.eventmanagement.logic.api.usecase; + +import java.util.List; + +import org.springframework.data.domain.Page; + +import com.devonfw.application.jtqjava.eventmanagement.logic.api.to.EventEto; +import com.devonfw.application.jtqjava.eventmanagement.logic.api.to.EventSearchCriteriaTo; + +public interface UcFindEvent { + + /** + * Returns a Event by its id 'id'. + * + * @param id The id 'id' of the Event. + * @return The {@link EventEto} with id 'id' + */ + EventEto findEvent(long id); + + /** + * Returns a paginated list of Events matching the search criteria. + * + * @param criteria the {@link EventSearchCriteriaTo}. + * @return the {@link List} of matching {@link EventEto}s. + */ + Page findEvents(EventSearchCriteriaTo criteria); + +} diff --git a/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/api/usecase/UcManageEvent.java b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/api/usecase/UcManageEvent.java new file mode 100644 index 0000000..9b9859b --- /dev/null +++ b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/api/usecase/UcManageEvent.java @@ -0,0 +1,42 @@ +package com.devonfw.application.jtqjava.eventmanagement.logic.api.usecase; + +import com.devonfw.application.jtqjava.eventmanagement.logic.api.to.EventEto; + +/** + * Interface of UcManageEvent to centralize documentation and signatures of methods. + */ +public interface UcManageEvent { + + /** + * Deletes a event from the database by its id 'eventId'. + * + * @param eventId Id of the event to delete + * @return boolean true if the event can be deleted, false otherwise + */ + boolean deleteEvent(long eventId); + + /** + * Saves a event and store it in the database. + * + * @param event the {@link EventEto} to create. + * @return the new {@link EventEto} that has been saved with ID and version. + */ + EventEto saveEvent(EventEto event); + + /** + * Decrease number of customers of the queue and update the queue. + * + * @param queueId id of the queue to decrease customer. + */ + void decreaseVisitorCount(long eventId); + + /** + * Increase number of customers of the queue and update the queue. + * + * @param queueId id of the queue to increase customer. + */ + void increaseVisitorCount(long eventId); + + EventEto eventById(long eventId); + +} diff --git a/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/eventmanagement/service/api/rest/EventmanagementRestService.java b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/eventmanagement/service/api/rest/EventmanagementRestService.java new file mode 100644 index 0000000..2d4efc8 --- /dev/null +++ b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/eventmanagement/service/api/rest/EventmanagementRestService.java @@ -0,0 +1,65 @@ +package com.devonfw.application.jtqjava.eventmanagement.service.api.rest; + +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; + +import org.springframework.data.domain.Page; + +import com.devonfw.application.jtqjava.eventmanagement.logic.api.Eventmanagement; +import com.devonfw.application.jtqjava.eventmanagement.logic.api.to.EventEto; +import com.devonfw.application.jtqjava.eventmanagement.logic.api.to.EventSearchCriteriaTo; + +/** + * The service interface for REST calls in order to execute the logic of component {@link Eventmanagement}. + */ +@Path("/eventmanagement/v1") +@Consumes(MediaType.APPLICATION_JSON) +@Produces(MediaType.APPLICATION_JSON) +public interface EventmanagementRestService { + + /** + * Delegates to {@link Eventmanagement#findEvent}. + * + * @param id the ID of the {@link EventEto} + * @return the {@link EventEto} + */ + @GET + @Path("/event/{id}/") + public EventEto getEvent(@PathParam("id") long id); + + /** + * Delegates to {@link Eventmanagement#saveEvent}. + * + * @param event the {@link EventEto} to be saved + * @return the recently created {@link EventEto} + */ + @POST + @Path("/event/") + public EventEto saveEvent(EventEto event); + + /** + * Delegates to {@link Eventmanagement#deleteEvent}. + * + * @param id ID of the {@link EventEto} to be deleted + */ + @DELETE + @Path("/event/{id}/") + public void deleteEvent(@PathParam("id") long id); + + /** + * Delegates to {@link Eventmanagement#findEventEtos}. + * + * @param searchCriteriaTo the pagination and search criteria to be used for finding events. + * @return the {@link Page list} of matching {@link EventEto}s. + */ + @Path("/event/search") + @POST + public Page findEvents(EventSearchCriteriaTo searchCriteriaTo); + +} diff --git a/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/general/common/api/ApplicationEntity.java b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/general/common/api/ApplicationEntity.java new file mode 100644 index 0000000..d6f39ce --- /dev/null +++ b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/general/common/api/ApplicationEntity.java @@ -0,0 +1,11 @@ +package com.devonfw.application.jtqjava.general.common.api; + +import com.devonfw.module.basic.common.api.entity.GenericEntity; + +/** + * This is the abstract interface for a {@link GenericEntity} of this application. We are using {@link Long} for + * all {@link #getId() primary keys}. + */ +public abstract interface ApplicationEntity extends GenericEntity { + +} diff --git a/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/general/common/api/to/AbstractSearchCriteriaTo.java b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/general/common/api/to/AbstractSearchCriteriaTo.java new file mode 100644 index 0000000..c248bce --- /dev/null +++ b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/general/common/api/to/AbstractSearchCriteriaTo.java @@ -0,0 +1,32 @@ +package com.devonfw.application.jtqjava.general.common.api.to; + +import org.springframework.data.domain.Pageable; + +import com.devonfw.module.basic.common.api.to.AbstractTo; + +/** + * Abstract {@link AbstractTo TO} for search criteria. + */ +public abstract class AbstractSearchCriteriaTo extends AbstractTo { + + private static final long serialVersionUID = 1L; + + private Pageable pageable; + + /** + * @return the {@link Pageable} containing the optional pagination information or {@code null}. + */ + public Pageable getPageable() { + + return this.pageable; + } + + /** + * @param pageable new value of {@link #getPageable()}. + */ + public void setPageable(Pageable pageable) { + + this.pageable = pageable; + } + +} diff --git a/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/common/api/QueueDetail.java b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/common/api/QueueDetail.java new file mode 100644 index 0000000..6aeb4b3 --- /dev/null +++ b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/common/api/QueueDetail.java @@ -0,0 +1,83 @@ +package com.devonfw.application.jtqjava.queuedetailmanagement.common.api; + +import java.sql.Timestamp; + +import com.devonfw.application.jtqjava.general.common.api.ApplicationEntity; + +public interface QueueDetail extends ApplicationEntity { + + /** + * @return queueNumberId + */ + public String getQueueNumber(); + + /** + * @param queueNumber setter for queueNumber attribute + */ + public void setQueueNumber(String queueNumber); + + /** + * @return creationTimeId + */ + public Timestamp getCreationTime(); + + /** + * @param creationTime setter for creationTime attribute + */ + public void setCreationTime(Timestamp creationTime); + + /** + * @return startTimeId + */ + public Timestamp getStartTime(); + + /** + * @param startTime setter for startTime attribute + */ + public void setStartTime(Timestamp startTime); + + /** + * @return endTimeId + */ + public Timestamp getEndTime(); + + /** + * @param endTime setter for endTime attribute + */ + public void setEndTime(Timestamp endTime); + + /** + * @return minEstimatedTimeId + */ + public String getMinEstimatedTime(); + + /** + * @param minEstimatedTime setter for minEstimatedTime attribute + */ + public void setMinEstimatedTime(String minEstimatedTime); + + /** + * getter for visitorId attribute + * + * @return visitorId + */ + public Long getVisitorId(); + + /** + * @param visitor setter for visitor attribute + */ + public void setVisitorId(Long visitorId); + + /** + * getter for EventId attribute + * + * @return EventId + */ + public Long getEventId(); + + /** + * @param Event setter for Event attribute + */ + public void setEventId(Long EventId); + +} diff --git a/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/api/Queuedetailmanagement.java b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/api/Queuedetailmanagement.java new file mode 100644 index 0000000..06bb922 --- /dev/null +++ b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/api/Queuedetailmanagement.java @@ -0,0 +1,11 @@ +package com.devonfw.application.jtqjava.queuedetailmanagement.logic.api; + +import com.devonfw.application.jtqjava.queuedetailmanagement.logic.api.usecase.UcFindQueueDetail; +import com.devonfw.application.jtqjava.queuedetailmanagement.logic.api.usecase.UcManageQueueDetail; + +/** + * Interface for Queuedetailmanagement component. + */ +public interface Queuedetailmanagement extends UcFindQueueDetail, UcManageQueueDetail { + +} diff --git a/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/api/to/QueueDetailCto.java b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/api/to/QueueDetailCto.java new file mode 100644 index 0000000..78e2cb5 --- /dev/null +++ b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/api/to/QueueDetailCto.java @@ -0,0 +1,50 @@ +package com.devonfw.application.jtqjava.queuedetailmanagement.logic.api.to; + +import com.devonfw.application.jtqjava.eventmanagement.logic.api.to.EventEto; +import com.devonfw.application.jtqjava.visitormanagement.logic.api.to.VisitorEto; +import com.devonfw.module.basic.common.api.to.AbstractCto; + +/** + * Composite transport object of QueueDetail + */ +public class QueueDetailCto extends AbstractCto { + + private static final long serialVersionUID = 1L; + + private QueueDetailEto queueDetail; + + private VisitorEto visitor; + + private EventEto Event; + + public QueueDetailEto getQueueDetail() { + + return queueDetail; + } + + public void setQueueDetail(QueueDetailEto queueDetail) { + + this.queueDetail = queueDetail; + } + + public VisitorEto getVisitor() { + + return visitor; + } + + public void setVisitor(VisitorEto visitor) { + + this.visitor = visitor; + } + + public EventEto getEvent() { + + return Event; + } + + public void setEvent(EventEto Event) { + + this.Event = Event; + } + +} diff --git a/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/api/to/QueueDetailEto.java b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/api/to/QueueDetailEto.java new file mode 100644 index 0000000..d00ef8e --- /dev/null +++ b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/api/to/QueueDetailEto.java @@ -0,0 +1,198 @@ +package com.devonfw.application.jtqjava.queuedetailmanagement.logic.api.to; + +import java.sql.Timestamp; + +import com.devonfw.application.jtqjava.queuedetailmanagement.common.api.QueueDetail; +import com.devonfw.module.basic.common.api.to.AbstractEto; + +/** + * Entity transport object of QueueDetail + */ +public class QueueDetailEto extends AbstractEto implements QueueDetail { + + private static final long serialVersionUID = 1L; + + private String queueNumber; + + private Timestamp creationTime; + + private Timestamp startTime; + + private Timestamp endTime; + + private String minEstimatedTime; + + private Long visitorId; + + private Long EventId; + + @Override + public String getQueueNumber() { + + return this.queueNumber; + } + + @Override + public void setQueueNumber(String queueNumber) { + + this.queueNumber = queueNumber; + } + + @Override + public Timestamp getCreationTime() { + + return this.creationTime; + } + + @Override + public void setCreationTime(Timestamp creationTime) { + + this.creationTime = creationTime; + } + + @Override + public Timestamp getStartTime() { + + return this.startTime; + } + + @Override + public void setStartTime(Timestamp startTime) { + + this.startTime = startTime; + } + + @Override + public Timestamp getEndTime() { + + return this.endTime; + } + + @Override + public void setEndTime(Timestamp endTime) { + + this.endTime = endTime; + } + + @Override + public String getMinEstimatedTime() { + + return this.minEstimatedTime; + } + + @Override + public void setMinEstimatedTime(String minEstimatedTime) { + + this.minEstimatedTime = minEstimatedTime; + } + + @Override + public Long getVisitorId() { + + return this.visitorId; + } + + @Override + public void setVisitorId(Long visitorId) { + + this.visitorId = visitorId; + } + + @Override + public Long getEventId() { + + return this.EventId; + } + + @Override + public void setEventId(Long EventId) { + + this.EventId = EventId; + } + + @Override + public int hashCode() { + + final int prime = 31; + int result = super.hashCode(); + result = prime * result + ((this.queueNumber == null) ? 0 : this.queueNumber.hashCode()); + result = prime * result + ((this.creationTime == null) ? 0 : this.creationTime.hashCode()); + result = prime * result + ((this.startTime == null) ? 0 : this.startTime.hashCode()); + result = prime * result + ((this.endTime == null) ? 0 : this.endTime.hashCode()); + result = prime * result + ((this.minEstimatedTime == null) ? 0 : this.minEstimatedTime.hashCode()); + + result = prime * result + ((this.visitorId == null) ? 0 : this.visitorId.hashCode()); + + result = prime * result + ((this.EventId == null) ? 0 : this.EventId.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + // class check will be done by super type EntityTo! + if (!super.equals(obj)) { + return false; + } + QueueDetailEto other = (QueueDetailEto) obj; + if (this.queueNumber == null) { + if (other.queueNumber != null) { + return false; + } + } else if (!this.queueNumber.equals(other.queueNumber)) { + return false; + } + if (this.creationTime == null) { + if (other.creationTime != null) { + return false; + } + } else if (!this.creationTime.equals(other.creationTime)) { + return false; + } + if (this.startTime == null) { + if (other.startTime != null) { + return false; + } + } else if (!this.startTime.equals(other.startTime)) { + return false; + } + if (this.endTime == null) { + if (other.endTime != null) { + return false; + } + } else if (!this.endTime.equals(other.endTime)) { + return false; + } + if (this.minEstimatedTime == null) { + if (other.minEstimatedTime != null) { + return false; + } + } else if (!this.minEstimatedTime.equals(other.minEstimatedTime)) { + return false; + } + + if (this.visitorId == null) { + if (other.visitorId != null) { + return false; + } + } else if (!this.visitorId.equals(other.visitorId)) { + return false; + } + + if (this.EventId == null) { + if (other.EventId != null) { + return false; + } + } else if (!this.EventId.equals(other.EventId)) { + return false; + } + return true; + } + +} diff --git a/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/api/to/QueueDetailSearchCriteriaTo.java b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/api/to/QueueDetailSearchCriteriaTo.java new file mode 100644 index 0000000..5d2171d --- /dev/null +++ b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/api/to/QueueDetailSearchCriteriaTo.java @@ -0,0 +1,182 @@ +package com.devonfw.application.jtqjava.queuedetailmanagement.logic.api.to; + +import java.sql.Timestamp; + +import com.devonfw.application.jtqjava.general.common.api.to.AbstractSearchCriteriaTo; +import com.devonfw.module.basic.common.api.query.StringSearchConfigTo; + +/** + * {@link SearchCriteriaTo} to find instances of + * {@link com.devonfw.application.jtqjava.queuedetailmanagement.common.api.QueueDetail}s. + */ +public class QueueDetailSearchCriteriaTo extends AbstractSearchCriteriaTo { + + private static final long serialVersionUID = 1L; + + private String queueNumber; + + private Timestamp creationTime; + + private Timestamp startTime; + + private Timestamp endTime; + + private String minEstimatedTime; + + private Long visitorId; + + private Long EventId; + + private StringSearchConfigTo queueNumberOption; + + private StringSearchConfigTo minEstimatedTimeOption; + + /** + * @return queueNumberId + */ + public String getQueueNumber() { + + return this.queueNumber; + } + + /** + * @param queueNumber setter for queueNumber attribute + */ + public void setQueueNumber(String queueNumber) { + + this.queueNumber = queueNumber; + } + + /** + * @return creationTimeId + */ + public Timestamp getCreationTime() { + + return this.creationTime; + } + + /** + * @param creationTime setter for creationTime attribute + */ + public void setCreationTime(Timestamp creationTime) { + + this.creationTime = creationTime; + } + + /** + * @return startTimeId + */ + public Timestamp getStartTime() { + + return this.startTime; + } + + /** + * @param startTime setter for startTime attribute + */ + public void setStartTime(Timestamp startTime) { + + this.startTime = startTime; + } + + /** + * @return endTimeId + */ + public Timestamp getEndTime() { + + return this.endTime; + } + + /** + * @param endTime setter for endTime attribute + */ + public void setEndTime(Timestamp endTime) { + + this.endTime = endTime; + } + + /** + * @return minEstimatedTimeId + */ + public String getMinEstimatedTime() { + + return this.minEstimatedTime; + } + + /** + * @param minEstimatedTime setter for minEstimatedTime attribute + */ + public void setMinEstimatedTime(String minEstimatedTime) { + + this.minEstimatedTime = minEstimatedTime; + } + + /** + * getter for visitorId attribute + * + * @return visitorId + */ + public Long getVisitorId() { + + return this.visitorId; + } + + /** + * @param visitor setter for visitor attribute + */ + public void setVisitorId(Long visitorId) { + + this.visitorId = visitorId; + } + + /** + * getter for EventId attribute + * + * @return EventId + */ + public Long getEventId() { + + return this.EventId; + } + + /** + * @param Event setter for Event attribute + */ + public void setEventId(Long EventId) { + + this.EventId = EventId; + } + + /** + * @return the {@link StringSearchConfigTo} used to search for {@link #getQueueNumber() queueNumber}. + */ + public StringSearchConfigTo getQueueNumberOption() { + + return this.queueNumberOption; + } + + /** + * @param queueNumberOption new value of {@link #getQueueNumberOption()}. + */ + public void setQueueNumberOption(StringSearchConfigTo queueNumberOption) { + + this.queueNumberOption = queueNumberOption; + } + + /** + * @return the {@link StringSearchConfigTo} used to search for {@link #getMinEstimatedTime() minEstimatedTime}. + */ + public StringSearchConfigTo getMinEstimatedTimeOption() { + + return this.minEstimatedTimeOption; + } + + /** + * @param minEstimatedTimeOption new value of {@link #getMinEstimatedTimeOption()}. + */ + public void setMinEstimatedTimeOption(StringSearchConfigTo minEstimatedTimeOption) { + + this.minEstimatedTimeOption = minEstimatedTimeOption; + } + +} diff --git a/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/api/usecase/UcFindQueueDetail.java b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/api/usecase/UcFindQueueDetail.java new file mode 100644 index 0000000..00de662 --- /dev/null +++ b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/api/usecase/UcFindQueueDetail.java @@ -0,0 +1,53 @@ +package com.devonfw.application.jtqjava.queuedetailmanagement.logic.api.usecase; + +import java.util.List; + +import org.springframework.data.domain.Page; + +import com.devonfw.application.jtqjava.queuedetailmanagement.logic.api.to.QueueDetailCto; +import com.devonfw.application.jtqjava.queuedetailmanagement.logic.api.to.QueueDetailEto; +import com.devonfw.application.jtqjava.queuedetailmanagement.logic.api.to.QueueDetailSearchCriteriaTo; + +public interface UcFindQueueDetail { + + /** + * Returns a QueueDetail by its id 'id'. + * + * @param id The id 'id' of the QueueDetail. + * @return The {@link QueueDetailEto} with id 'id' + */ + QueueDetailEto findQueueDetail(long id); + + /** + * Returns a paginated list of QueueDetails matching the search criteria. + * + * @param criteria the {@link QueueDetailSearchCriteriaTo}. + * @return the {@link List} of matching {@link QueueDetailEto}s. + */ + Page findQueueDetails(QueueDetailSearchCriteriaTo criteria); + + /** + * Returns a composite QueueDetail by its id 'id'. + * + * @param id The id 'id' of the QueueDetail. + * @return The {@link QueueDetailCto} with id 'id' + */ + QueueDetailCto findQueueDetailCto(long id); + + /** + * Returns a paginated list of composite QueueDetails matching the search criteria. + * + * @param criteria the {@link QueueDetailSearchCriteriaTo}. + * @return the {@link List} of matching {@link QueueDetailCto}s. + */ + Page findQueueDetailCtos(QueueDetailSearchCriteriaTo criteria); + + /** + * Returns a paginated list of AccessCodeEto matching the search criteria. + * + * @param criteria the {@link AccessCodeSearchCriteriaTo}. + * @return the {@link List} of matching {@link AccessCodeEto}s. + */ + Page findQueueDetailEtos(QueueDetailSearchCriteriaTo criteria); + +} diff --git a/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/api/usecase/UcManageQueueDetail.java b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/api/usecase/UcManageQueueDetail.java new file mode 100644 index 0000000..03d59a8 --- /dev/null +++ b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/api/usecase/UcManageQueueDetail.java @@ -0,0 +1,26 @@ +package com.devonfw.application.jtqjava.queuedetailmanagement.logic.api.usecase; + +import com.devonfw.application.jtqjava.queuedetailmanagement.logic.api.to.QueueDetailEto; + +/** + * Interface of UcManageQueueDetail to centralize documentation and signatures of methods. + */ +public interface UcManageQueueDetail { + + /** + * Deletes a queueDetail from the database by its id 'queueDetailId'. + * + * @param queueDetailId Id of the queueDetail to delete + * @return boolean true if the queueDetail can be deleted, false otherwise + */ + void deleteQueueDetail(long queueDetailId); + + /** + * Saves a queueDetail and store it in the database. + * + * @param queueDetail the {@link QueueDetailEto} to create. + * @return the new {@link QueueDetailEto} that has been saved with ID and version. + */ + QueueDetailEto saveQueueDetail(QueueDetailEto queueDetail); + +} diff --git a/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/service/api/rest/QueuedetailmanagementRestService.java b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/service/api/rest/QueuedetailmanagementRestService.java new file mode 100644 index 0000000..5737406 --- /dev/null +++ b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/service/api/rest/QueuedetailmanagementRestService.java @@ -0,0 +1,90 @@ +package com.devonfw.application.jtqjava.queuedetailmanagement.service.api.rest; + +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; + +import org.springframework.data.domain.Page; + +import com.devonfw.application.jtqjava.queuedetailmanagement.logic.api.Queuedetailmanagement; +import com.devonfw.application.jtqjava.queuedetailmanagement.logic.api.to.QueueDetailCto; +import com.devonfw.application.jtqjava.queuedetailmanagement.logic.api.to.QueueDetailEto; +import com.devonfw.application.jtqjava.queuedetailmanagement.logic.api.to.QueueDetailSearchCriteriaTo; + +/** + * The service interface for REST calls in order to execute the logic of component {@link Queuedetailmanagement}. + */ +@Path("/queuedetailmanagement/v1") +@Consumes(MediaType.APPLICATION_JSON) +@Produces(MediaType.APPLICATION_JSON) +public interface QueuedetailmanagementRestService { + + /** + * Delegates to {@link Queuedetailmanagement#findQueueDetail}. + * + * @param id the ID of the {@link QueueDetailEto} + * @return the {@link QueueDetailEto} + */ + @GET + @Path("/queuedetail/{id}/") + public QueueDetailEto getQueueDetail(@PathParam("id") long id); + + /** + * Delegates to {@link Queuedetailmanagement#saveQueueDetail}. + * + * @param queuedetail the {@link QueueDetailEto} to be saved + * @return the recently created {@link QueueDetailEto} + */ + @POST + @Path("/queuedetail/") + public QueueDetailEto saveQueueDetail(QueueDetailEto queuedetail); + + @POST + @Path("/queuedetail/join") + public QueueDetailEto joinTheQueue(long visitorId, long eventId); + + /** + * Delegates to {@link Queuedetailmanagement#deleteQueueDetail}. + * + * @param id ID of the {@link QueueDetailEto} to be deleted + */ + @DELETE + @Path("/queuedetail/{id}/") + public void deleteQueueDetail(@PathParam("id") long id); + + /** + * Delegates to {@link Queuedetailmanagement#findQueueDetailEtos}. + * + * @param searchCriteriaTo the pagination and search criteria to be used for finding queuedetails. + * @return the {@link Page list} of matching {@link QueueDetailEto}s. + */ + @Path("/queuedetail/search") + @POST + public Page findQueueDetails(QueueDetailSearchCriteriaTo searchCriteriaTo); + + /** + * Delegates to {@link Queuedetailmanagement#findQueueDetailCto}. + * + * @param id the ID of the {@link QueueDetailCto} + * @return the {@link QueueDetailCto} + */ + @GET + @Path("/queuedetail/cto/{id}/") + public QueueDetailCto getQueueDetailCto(@PathParam("id") long id); + + /** + * Delegates to {@link Queuedetailmanagement#findQueueDetailCtos}. + * + * @param searchCriteriaTo the pagination and search criteria to be used for finding queuedetails. + * @return the {@link Page list} of matching {@link QueueDetailCto}s. + */ + @Path("/queuedetail/cto/search") + @POST + public Page findQueueDetailCtos(QueueDetailSearchCriteriaTo searchCriteriaTo); + +} diff --git a/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/visitormanagement/common/api/Visitor.java b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/visitormanagement/common/api/Visitor.java new file mode 100644 index 0000000..dd9eaa9 --- /dev/null +++ b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/visitormanagement/common/api/Visitor.java @@ -0,0 +1,91 @@ +package com.devonfw.application.jtqjava.visitormanagement.common.api; + +import com.devonfw.application.jtqjava.general.common.api.ApplicationEntity; + +public interface Visitor extends ApplicationEntity { + + /** + * @return usernameId + */ + + public String getUsername(); + + /** + * @param username setter for username attribute + */ + + public void setUsername(String username); + + /** + * @return nameId + */ + + public String getName(); + + /** + * @param name setter for name attribute + */ + + public void setName(String name); + + /** + * @return phoneNumberId + */ + + public String getPhoneNumber(); + + /** + * @param phoneNumber setter for phoneNumber attribute + */ + + public void setPhoneNumber(String phoneNumber); + + /** + * @return passwordId + */ + + public String getPassword(); + + /** + * @param password setter for password attribute + */ + + public void setPassword(String password); + + /** + * @return acceptedCommercialId + */ + + public Boolean getAcceptedCommercial(); + + /** + * @param acceptedCommercial setter for acceptedCommercial attribute + */ + + public void setAcceptedCommercial(Boolean acceptedCommercial); + + /** + * @return acceptedTermsId + */ + + public Boolean getAcceptedTerms(); + + /** + * @param acceptedTerms setter for acceptedTerms attribute + */ + + public void setAcceptedTerms(Boolean acceptedTerms); + + /** + * @return userTypeId + */ + + public Boolean getUserType(); + + /** + * @param userType setter for userType attribute + */ + + public void setUserType(Boolean userType); + +} diff --git a/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/visitormanagement/logic/api/Visitormanagement.java b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/visitormanagement/logic/api/Visitormanagement.java new file mode 100644 index 0000000..f0055ac --- /dev/null +++ b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/visitormanagement/logic/api/Visitormanagement.java @@ -0,0 +1,11 @@ +package com.devonfw.application.jtqjava.visitormanagement.logic.api; + +import com.devonfw.application.jtqjava.visitormanagement.logic.api.usecase.UcFindVisitor; +import com.devonfw.application.jtqjava.visitormanagement.logic.api.usecase.UcManageVisitor; + +/** + * Interface for Visitormanagement component. + */ +public interface Visitormanagement extends UcFindVisitor, UcManageVisitor { + +} diff --git a/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/visitormanagement/logic/api/to/VisitorEto.java b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/visitormanagement/logic/api/to/VisitorEto.java new file mode 100644 index 0000000..6917452 --- /dev/null +++ b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/visitormanagement/logic/api/to/VisitorEto.java @@ -0,0 +1,191 @@ +package com.devonfw.application.jtqjava.visitormanagement.logic.api.to; + +import com.devonfw.application.jtqjava.visitormanagement.common.api.Visitor; +import com.devonfw.module.basic.common.api.to.AbstractEto; + +/** + * Entity transport object of Visitor + */ +public class VisitorEto extends AbstractEto implements Visitor { + + private static final long serialVersionUID = 1L; + + private String username; + + private String name; + + private String phoneNumber; + + private String password; + + private Boolean acceptedCommercial; + + private Boolean acceptedTerms; + + private Boolean userType; + + @Override + public String getUsername() { + + return username; + } + + @Override + public void setUsername(String username) { + + this.username = username; + } + + @Override + public String getName() { + + return name; + } + + @Override + public void setName(String name) { + + this.name = name; + } + + @Override + public String getPhoneNumber() { + + return phoneNumber; + } + + @Override + public void setPhoneNumber(String phoneNumber) { + + this.phoneNumber = phoneNumber; + } + + @Override + public String getPassword() { + + return password; + } + + @Override + public void setPassword(String password) { + + this.password = password; + } + + @Override + public Boolean getAcceptedCommercial() { + + return acceptedCommercial; + } + + @Override + public void setAcceptedCommercial(Boolean acceptedCommercial) { + + this.acceptedCommercial = acceptedCommercial; + } + + @Override + public Boolean getAcceptedTerms() { + + return acceptedTerms; + } + + @Override + public void setAcceptedTerms(Boolean acceptedTerms) { + + this.acceptedTerms = acceptedTerms; + } + + @Override + public Boolean getUserType() { + + return userType; + } + + @Override + public void setUserType(Boolean userType) { + + this.userType = userType; + } + + @Override + public int hashCode() { + + final int prime = 31; + int result = super.hashCode(); + result = prime * result + ((this.username == null) ? 0 : this.username.hashCode()); + result = prime * result + ((this.name == null) ? 0 : this.name.hashCode()); + result = prime * result + ((this.phoneNumber == null) ? 0 : this.phoneNumber.hashCode()); + result = prime * result + ((this.password == null) ? 0 : this.password.hashCode()); + result = prime * result + ((this.acceptedCommercial == null) ? 0 : this.acceptedCommercial.hashCode()); + result = prime * result + ((this.acceptedTerms == null) ? 0 : this.acceptedTerms.hashCode()); + result = prime * result + ((this.userType == null) ? 0 : this.userType.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + // class check will be done by super type EntityTo! + if (!super.equals(obj)) { + return false; + } + VisitorEto other = (VisitorEto) obj; + if (this.username == null) { + if (other.username != null) { + return false; + } + } else if (!this.username.equals(other.username)) { + return false; + } + if (this.name == null) { + if (other.name != null) { + return false; + } + } else if (!this.name.equals(other.name)) { + return false; + } + if (this.phoneNumber == null) { + if (other.phoneNumber != null) { + return false; + } + } else if (!this.phoneNumber.equals(other.phoneNumber)) { + return false; + } + if (this.password == null) { + if (other.password != null) { + return false; + } + } else if (!this.password.equals(other.password)) { + return false; + } + if (this.acceptedCommercial == null) { + if (other.acceptedCommercial != null) { + return false; + } + } else if (!this.acceptedCommercial.equals(other.acceptedCommercial)) { + return false; + } + if (this.acceptedTerms == null) { + if (other.acceptedTerms != null) { + return false; + } + } else if (!this.acceptedTerms.equals(other.acceptedTerms)) { + return false; + } + if (this.userType == null) { + if (other.userType != null) { + return false; + } + } else if (!this.userType.equals(other.userType)) { + return false; + } + return true; + } +} diff --git a/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/visitormanagement/logic/api/to/VisitorSearchCriteriaTo.java b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/visitormanagement/logic/api/to/VisitorSearchCriteriaTo.java new file mode 100644 index 0000000..02f7b3e --- /dev/null +++ b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/visitormanagement/logic/api/to/VisitorSearchCriteriaTo.java @@ -0,0 +1,226 @@ +package com.devonfw.application.jtqjava.visitormanagement.logic.api.to; + +import com.devonfw.application.jtqjava.general.common.api.to.AbstractSearchCriteriaTo; +import com.devonfw.module.basic.common.api.query.StringSearchConfigTo; + +/** + * {@link SearchCriteriaTo} to find instances of + * {@link com.devonfw.application.jtqjava.visitormanagement.common.api.Visitor}s. + */ +public class VisitorSearchCriteriaTo extends AbstractSearchCriteriaTo { + + private static final long serialVersionUID = 1L; + + private String username; + + private String name; + + private String phoneNumber; + + private String password; + + private Boolean acceptedCommercial; + + private Boolean acceptedTerms; + + private Boolean userType; + + private StringSearchConfigTo usernameOption; + + private StringSearchConfigTo nameOption; + + private StringSearchConfigTo phoneNumberOption; + + private StringSearchConfigTo passwordOption; + + /** + * @return usernameId + */ + + public String getUsername() { + + return username; + } + + /** + * @param username setter for username attribute + */ + + public void setUsername(String username) { + + this.username = username; + } + + /** + * @return nameId + */ + + public String getName() { + + return name; + } + + /** + * @param name setter for name attribute + */ + + public void setName(String name) { + + this.name = name; + } + + /** + * @return phoneNumberId + */ + + public String getPhoneNumber() { + + return phoneNumber; + } + + /** + * @param phoneNumber setter for phoneNumber attribute + */ + + public void setPhoneNumber(String phoneNumber) { + + this.phoneNumber = phoneNumber; + } + + /** + * @return passwordId + */ + + public String getPassword() { + + return password; + } + + /** + * @param password setter for password attribute + */ + + public void setPassword(String password) { + + this.password = password; + } + + /** + * @return acceptedCommercialId + */ + + public Boolean getAcceptedCommercial() { + + return acceptedCommercial; + } + + /** + * @param acceptedCommercial setter for acceptedCommercial attribute + */ + + public void setAcceptedCommercial(Boolean acceptedCommercial) { + + this.acceptedCommercial = acceptedCommercial; + } + + /** + * @return acceptedTermsId + */ + + public Boolean getAcceptedTerms() { + + return acceptedTerms; + } + + /** + * @param acceptedTerms setter for acceptedTerms attribute + */ + + public void setAcceptedTerms(Boolean acceptedTerms) { + + this.acceptedTerms = acceptedTerms; + } + + /** + * @return userTypeId + */ + + public Boolean getUserType() { + + return userType; + } + + /** + * @param userType setter for userType attribute + */ + + public void setUserType(Boolean userType) { + + this.userType = userType; + } + + /** + * @return the {@link StringSearchConfigTo} used to search for {@link #getUsername() username}. + */ + public StringSearchConfigTo getUsernameOption() { + + return this.usernameOption; + } + + /** + * @param usernameOption new value of {@link #getUsernameOption()}. + */ + public void setUsernameOption(StringSearchConfigTo usernameOption) { + + this.usernameOption = usernameOption; + } + + /** + * @return the {@link StringSearchConfigTo} used to search for {@link #getName() name}. + */ + public StringSearchConfigTo getNameOption() { + + return this.nameOption; + } + + /** + * @param nameOption new value of {@link #getNameOption()}. + */ + public void setNameOption(StringSearchConfigTo nameOption) { + + this.nameOption = nameOption; + } + + /** + * @return the {@link StringSearchConfigTo} used to search for {@link #getPhoneNumber() phoneNumber}. + */ + public StringSearchConfigTo getPhoneNumberOption() { + + return this.phoneNumberOption; + } + + /** + * @param phoneNumberOption new value of {@link #getPhoneNumberOption()}. + */ + public void setPhoneNumberOption(StringSearchConfigTo phoneNumberOption) { + + this.phoneNumberOption = phoneNumberOption; + } + + /** + * @return the {@link StringSearchConfigTo} used to search for {@link #getPassword() password}. + */ + public StringSearchConfigTo getPasswordOption() { + + return this.passwordOption; + } + + /** + * @param passwordOption new value of {@link #getPasswordOption()}. + */ + public void setPasswordOption(StringSearchConfigTo passwordOption) { + + this.passwordOption = passwordOption; + } + +} diff --git a/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/visitormanagement/logic/api/usecase/UcFindVisitor.java b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/visitormanagement/logic/api/usecase/UcFindVisitor.java new file mode 100644 index 0000000..82e9185 --- /dev/null +++ b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/visitormanagement/logic/api/usecase/UcFindVisitor.java @@ -0,0 +1,28 @@ +package com.devonfw.application.jtqjava.visitormanagement.logic.api.usecase; + +import java.util.List; + +import org.springframework.data.domain.Page; + +import com.devonfw.application.jtqjava.visitormanagement.logic.api.to.VisitorEto; +import com.devonfw.application.jtqjava.visitormanagement.logic.api.to.VisitorSearchCriteriaTo; + +public interface UcFindVisitor { + + /** + * Returns a Visitor by its id 'id'. + * + * @param id The id 'id' of the Visitor. + * @return The {@link VisitorEto} with id 'id' + */ + VisitorEto findVisitor(long id); + + /** + * Returns a paginated list of Visitors matching the search criteria. + * + * @param criteria the {@link VisitorSearchCriteriaTo}. + * @return the {@link List} of matching {@link VisitorEto}s. + */ + Page findVisitors(VisitorSearchCriteriaTo criteria); + +} diff --git a/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/visitormanagement/logic/api/usecase/UcManageVisitor.java b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/visitormanagement/logic/api/usecase/UcManageVisitor.java new file mode 100644 index 0000000..56f7f19 --- /dev/null +++ b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/visitormanagement/logic/api/usecase/UcManageVisitor.java @@ -0,0 +1,26 @@ +package com.devonfw.application.jtqjava.visitormanagement.logic.api.usecase; + +import com.devonfw.application.jtqjava.visitormanagement.logic.api.to.VisitorEto; + +/** + * Interface of UcManageVisitor to centralize documentation and signatures of methods. + */ +public interface UcManageVisitor { + + /** + * Deletes a visitor from the database by its id 'visitorId'. + * + * @param visitorId Id of the visitor to delete + * @return boolean true if the visitor can be deleted, false otherwise + */ + boolean deleteVisitor(long visitorId); + + /** + * Saves a visitor and store it in the database. + * + * @param visitor the {@link VisitorEto} to create. + * @return the new {@link VisitorEto} that has been saved with ID and version. + */ + VisitorEto saveVisitor(VisitorEto visitor); + +} diff --git a/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/visitormanagement/service/api/rest/VisitormanagementRestService.java b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/visitormanagement/service/api/rest/VisitormanagementRestService.java new file mode 100644 index 0000000..5aa3e84 --- /dev/null +++ b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/visitormanagement/service/api/rest/VisitormanagementRestService.java @@ -0,0 +1,65 @@ +package com.devonfw.application.jtqjava.visitormanagement.service.api.rest; + +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; + +import org.springframework.data.domain.Page; + +import com.devonfw.application.jtqjava.visitormanagement.logic.api.Visitormanagement; +import com.devonfw.application.jtqjava.visitormanagement.logic.api.to.VisitorEto; +import com.devonfw.application.jtqjava.visitormanagement.logic.api.to.VisitorSearchCriteriaTo; + +/** + * The service interface for REST calls in order to execute the logic of component {@link Visitormanagement}. + */ +@Path("/visitormanagement/v1") +@Consumes(MediaType.APPLICATION_JSON) +@Produces(MediaType.APPLICATION_JSON) +public interface VisitormanagementRestService { + + /** + * Delegates to {@link Visitormanagement#findVisitor}. + * + * @param id the ID of the {@link VisitorEto} + * @return the {@link VisitorEto} + */ + @GET + @Path("/visitor/{id}/") + public VisitorEto getVisitor(@PathParam("id") long id); + + /** + * Delegates to {@link Visitormanagement#saveVisitor}. + * + * @param visitor the {@link VisitorEto} to be saved + * @return the recently created {@link VisitorEto} + */ + @POST + @Path("/visitor/") + public VisitorEto saveVisitor(VisitorEto visitor); + + /** + * Delegates to {@link Visitormanagement#deleteVisitor}. + * + * @param id ID of the {@link VisitorEto} to be deleted + */ + @DELETE + @Path("/visitor/{id}/") + public void deleteVisitor(@PathParam("id") long id); + + /** + * Delegates to {@link Visitormanagement#findVisitorEtos}. + * + * @param searchCriteriaTo the pagination and search criteria to be used for finding visitors. + * @return the {@link Page list} of matching {@link VisitorEto}s. + */ + @Path("/visitor/search") + @POST + public Page findVisitors(VisitorSearchCriteriaTo searchCriteriaTo); + +} \ No newline at end of file diff --git a/jumpthequeue-java/jtqjava/api/src/test/java/com/devonfw/application/jtqjava/ToTest.java b/jumpthequeue-java/jtqjava/api/src/test/java/com/devonfw/application/jtqjava/ToTest.java new file mode 100644 index 0000000..cf99a8f --- /dev/null +++ b/jumpthequeue-java/jtqjava/api/src/test/java/com/devonfw/application/jtqjava/ToTest.java @@ -0,0 +1,323 @@ +package com.devonfw.application.jtqjava; + +import java.io.Serializable; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.sql.Timestamp; +import java.time.Instant; +import java.time.Year; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; + +import org.assertj.core.api.SoftAssertions; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider; +import org.springframework.core.type.filter.AssignableTypeFilter; +import org.springframework.util.ReflectionUtils; + +import com.devonfw.module.basic.common.api.reference.IdRef; +import com.devonfw.module.basic.common.api.reflect.Devon4jPackage; +import com.devonfw.module.basic.common.api.to.AbstractTo; +import com.devonfw.module.test.common.base.ModuleTest; + +import nl.jqno.equalsverifier.EqualsVerifier; +import nl.jqno.equalsverifier.EqualsVerifierApi; +import nl.jqno.equalsverifier.Warning; + +public class ToTest extends ModuleTest { + + private static final ToExclusions EXCLUSIONS = new ToExclusions(); + + static { + // EXCLUSIONS.add(MyBusinessEto.class).ignoreEquals().ignoreProperties("foo", "bar"); + } + + /** + * Finds all {@link AbstractTo Transportobjekte} of this app via reflection and tests all getters/setters as well as equals and hashCode. + */ + @Test + public void testTos() { + + List> toClasses = getToClasses(); + SoftAssertions assertion = new SoftAssertions(); + for (Class toClass : toClasses) { + ToExclusion exclusion = EXCLUSIONS.get(toClass.getName()); + testGetSet(toClass, assertion, exclusion); + testEqualsAndHashcode(toClass, assertion, exclusion); + } + assertion.assertAll(); + } + + /** + * Checks if a certain class has a custom equals method + * @param clazz class to be checked + * @return boolean value if the class to be checked has a custom equals() + * method or not + */ + private boolean hasCustomEquals(Class clazz) { + + try { + clazz.getDeclaredMethod("equals", new Class[] {}); + } catch (NoSuchMethodException noCustomEquals) { + return false; + } + + return true; + } + + /** + * Checks if a certain class has a custom hashCode method + * + * @param clazz class to be checked + * @return boolean value if the class to be checked has a custom hashCode() + * method or not + */ + private boolean hasCustomHashCode(Class clazz) { + + try { + clazz.getDeclaredMethod("hashCode", new Class[] { Object.class }); + } catch (NoSuchMethodException noCustomHashCode) { + return false; + } + + return true; + } + + private void testEqualsAndHashcode(Class clazz, SoftAssertions assertion, ToExclusion exclusion) { + + if(!hasCustomEquals(clazz) && !hasCustomHashCode(clazz)) { + return; + } + + if ((exclusion != null) && (exclusion.ignoreEquals)) { + return; + } + EqualsVerifierApi verifier = EqualsVerifier.forClass(clazz).withRedefinedSuperclass().usingGetClass().suppress(Warning.NONFINAL_FIELDS, Warning.INHERITED_DIRECTLY_FROM_OBJECT); + try { + verifier.verify(); + } catch (AssertionError e) { + assertion.fail(e.getMessage(), e); + } + } + + private void testGetSet(Class clazz, SoftAssertions assertion, ToExclusion exclusion) { + + if (!Modifier.isAbstract(clazz.getModifiers())) { + ReflectionUtils.doWithLocalFields(clazz, field -> { + try { + if (isCheckable(clazz, field, exclusion)) { + Object testInstance = clazz.newInstance(); + Method getMethod = null; + Method setMethod = null; + + if (Boolean.class.equals(field.getType()) || boolean.class.equals(field.getType())) { + getMethod = findMethod("is", clazz, field); + if (getMethod == null) { + getMethod = findMethod("get", clazz, field); + } + } else { + getMethod = findMethod("get", clazz, field); + } + setMethod = findMethod("set", clazz, field); + + if (getMethod == null) { + assertion.fail("Getter of field " + clazz.getSimpleName() + "." + field.getName() + " has not been found."); + } else if (setMethod == null) { + assertion.fail("Setter of field " + clazz.getSimpleName() + "." + field.getName() + " has not been found."); + } else { + getMethod.setAccessible(true); + setMethod.setAccessible(true); + + Object value = createTestObject(field); + setMethod.invoke(testInstance, value); + Object value2 = getMethod.invoke(testInstance); + assertion.assertThat(value2).as("Value from getter of field " + clazz.getSimpleName() + "." + field.getName()).isEqualTo(value); + } + } + } catch (Exception e) { + assertion.fail("Error with getter/setter of field " + clazz.getSimpleName() + "." + field.getName() + ": " + + e.getClass().getSimpleName() + ": " + e.getMessage(), e); + } + }); + } + } + + private boolean isCheckable(Class clazz, Field field, ToExclusion exclusion) { + + if (field.getName().startsWith("$") || Modifier.isFinal(field.getModifiers())) { + return false; + } + if (Optional.class.isAssignableFrom(field.getType())) { + return false; + } + if (Modifier.isTransient(field.getModifiers())) { + return false; + } + if ((exclusion != null) && (exclusion.properties.contains(field.getName()))) { + return false; + } + return true; + } + + private Object createTestObject(Field field) throws InstantiationException, IllegalAccessException { + + Class type = field.getType(); + return createInstance(type); + } + + private Object createInstance(Class type) throws InstantiationException, IllegalAccessException { + + Object o = null; + if (type.isEnum()) { + o = type.getEnumConstants()[0]; + } else if (List.class.isAssignableFrom(type)) { + o = new ArrayList<>(); + } else if (Set.class.isAssignableFrom(type)) { + o = new HashSet<>(); + } else if (Map.class.isAssignableFrom(type)) { + o = new HashMap<>(); + } else if (Integer.class.isAssignableFrom(type) || int.class.isAssignableFrom(type)) { + o = Integer.valueOf(1); + } else if (Long.class.isAssignableFrom(type) || long.class.isAssignableFrom(type)) { + o = Long.valueOf(2); + } else if (Boolean.class.isAssignableFrom(type) || boolean.class.isAssignableFrom(type)) { + o = Boolean.TRUE; + } else if (String.class.isAssignableFrom(type)) { + o = "hello world"; + } else if (Year.class.isAssignableFrom(type)) { + o = Year.of(1999); + } else if (Instant.class.isAssignableFrom(type)) { + o = Instant.now(); + } else if (Timestamp.class.isAssignableFrom(type)) { + o = Timestamp.from(Instant.now()); + } else if (type == byte[].class) { + o = "test".getBytes(); + } else if (Serializable.class.equals(type)) { + o = Integer.valueOf(1); + } else if (type == BigDecimal.class) { + o = BigDecimal.ZERO; + } else if (type == BigInteger.class) { + o = BigInteger.ZERO; + } else if (type == Integer.class) { + o = Integer.valueOf(0); + } else if ((type == Long.class) || (type == Number.class)) { + o = Long.valueOf(0); + } else if (type == Double.class) { + o = Double.valueOf(0); + } else if (type == IdRef.class) { + o = IdRef.of(0); + } + return o; + } + + private static Method findMethod(String prefix, Class clazz, Field field) { + + String methodname = prefix + field.getName(); + + return Arrays.asList(ReflectionUtils.getAllDeclaredMethods(clazz)).stream() + .filter(m -> m.getName().equalsIgnoreCase(methodname)).findFirst().orElse(null); + } + + private List> getToClasses() { + + ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false); + provider.addIncludeFilter(new AssignableTypeFilter(AbstractTo.class)); + + Devon4jPackage pkg = Devon4jPackage.of(ToTest.class); + Set toSet = provider.findCandidateComponents(pkg.getRoot()); + List> toList = new ArrayList<>(toSet.size()); + for (BeanDefinition beanDefinition : toSet) { + String className = beanDefinition.getBeanClassName(); + try { + Class toClass = Class.forName(className); + toList.add(toClass); + } catch (ClassNotFoundException e) { + fail("Class " + className + " could not been found."); + } + } + return toList; + } + + public static class ToExclusions { + + private final Map exclusions; + + public ToExclusions() { + + super(); + this.exclusions = new HashMap<>(); + } + + public ToExclusion add(Class toClass) { + + return add(toClass.getName()); + } + + public ToExclusion add(String toClassQualifiedName) { + + ToExclusion exclusion = new ToExclusion(); + ToExclusion duplicate = this.exclusions.put(toClassQualifiedName, exclusion); + if (duplicate != null) { + throw new IllegalStateException("Doppelte ToExclusion von " + toClassQualifiedName); + } + return exclusion; + } + + public ToExclusion get(String toClassQualifiedName) { + + return this.exclusions.get(toClassQualifiedName); + } + + } + + public static class ToExclusion { + + private Set properties; + + private boolean ignoreEquals; + + public ToExclusion() { + + super(); + this.properties = new HashSet<>(); + this.ignoreEquals = false; + } + + /** + * Ignores the given properties for testing of getters/setters. + * + * @return this + */ + public ToExclusion ignoreProperties(String... props) { + + if (this.properties == null) { + this.properties = new HashSet<>(); + } + for (String property : props) { + this.properties.add(property); + } + return this; + } + + /** + * Ignores this transfer-object for testing of equals and hashCode with {@link EqualsVerifier}. + * + * @return this + */ + public ToExclusion ignoreEquals() { + + this.ignoreEquals = true; + return this; + } + } +} \ No newline at end of file diff --git a/jumpthequeue-java/jtqjava/core/pom.xml b/jumpthequeue-java/jtqjava/core/pom.xml new file mode 100644 index 0000000..9c40939 --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/pom.xml @@ -0,0 +1,217 @@ + + + 4.0.0 + + com.devonfw.java.jtqjava + jtqjava + 0.0.1 + + jtqjava-core + jar + ${project.artifactId} + Core of the server for the jtqjava application - a simple example based on devon4j. + + + + ${project.groupId} + jtqjava-api + ${project.version} + + + + + com.devonfw.java.modules + devon4j-beanmapping-orika + + + + + com.devonfw.java.modules + devon4j-security + + + + com.devonfw.java.modules + devon4j-web + + + + + com.devonfw.java.starters + devon4j-starter-cxf-client-rest + + + + com.devonfw.java.starters + devon4j-starter-cxf-client-ws + + + + + com.devonfw.java.starters + devon4j-starter-cxf-server-rest + + + + com.devonfw.java.starters + devon4j-starter-cxf-server-ws + + + + + com.devonfw.java.starters + devon4j-starter-spring-data-jpa + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + + javax.persistence + javax.persistence-api + + + + + org.hibernate + hibernate-entitymanager + + + + + com.querydsl + querydsl-jpa + + + com.querydsl + querydsl-apt + provided + + + + + org.hibernate.validator + hibernate-validator + + + + + javax.servlet + javax.servlet-api + provided + + + + + javax.el + javax.el-api + + + + + org.springframework + spring-webmvc + + + + + com.h2database + h2 + + + + + org.flywaydb + flyway-core + + + + + org.apache.cxf + cxf-rt-rs-service-description + + + + + org.springframework.boot + spring-boot-starter-actuator + + + + + org.springframework + spring-aop + + + + + cglib + cglib + + + + + net.logstash.logback + logstash-logback-encoder + + + + + com.devonfw.java.modules + devon4j-test-jpa + test + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-validation + + + + + + + + embedded + + true + + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + + + + + org.apache.maven.plugins + maven-jar-plugin + + + config/application.properties + + + + + + + \ No newline at end of file diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/SpringBootApp.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/SpringBootApp.java new file mode 100644 index 0000000..0071b8e --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/SpringBootApp.java @@ -0,0 +1,29 @@ +package com.devonfw.application.jtqjava; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; + +import com.devonfw.module.jpa.dataaccess.api.AdvancedRevisionEntity; +import com.devonfw.module.jpa.dataaccess.impl.data.GenericRepositoryFactoryBean; + +/** + * Main entry point of this {@link SpringBootApplication}. Simply run this class to start this app. + */ +@SpringBootApplication +@EnableJpaRepositories(repositoryFactoryBeanClass = GenericRepositoryFactoryBean.class) +@EnableGlobalMethodSecurity(jsr250Enabled = true) +public class SpringBootApp { + + /** + * Entry point for spring-boot based app + * + * @param args - arguments + */ + public static void main(String[] args) { + + SpringApplication.run(SpringBootApp.class, args); + } +} diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/eventmanagement/dataaccess/api/EventEntity.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/eventmanagement/dataaccess/api/EventEntity.java new file mode 100644 index 0000000..037107c --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/eventmanagement/dataaccess/api/EventEntity.java @@ -0,0 +1,183 @@ +package com.devonfw.application.jtqjava.eventmanagement.dataaccess.api; + +import java.sql.Timestamp; + +import javax.persistence.Entity; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; + +import com.devonfw.application.jtqjava.eventmanagement.common.api.Event; +import com.devonfw.application.jtqjava.general.dataaccess.api.ApplicationPersistenceEntity; + +/** + * @author kragarwa + */ +@Entity +@Table(name = "Event") +public class EventEntity extends ApplicationPersistenceEntity implements Event { + + private String eventName; + + @Temporal(TemporalType.TIMESTAMP) + private Timestamp startDate; + + @Temporal(TemporalType.TIMESTAMP) + private Timestamp endDate; + + private String location; + + private String description; + + private String logo; + + private int visitorCount; + + @Temporal(TemporalType.TIMESTAMP) + private Timestamp attentionTime; + + private static final long serialVersionUID = 1L; + + /** + * @return visitorCount + */ + public int getVisitorCount() { + + return this.visitorCount; + } + + /** + * @param visitorCount new value of {@link #getvisitorCount}. + */ + public void setVisitorCount(int visitorCount) { + + this.visitorCount = visitorCount; + } + + /** + * @return eventName + */ + @Override + public String getEventName() { + + return this.eventName; + } + + /** + * @param eventName new value of {@link #geteventName}. + */ + @Override + public void setEventName(String eventName) { + + this.eventName = eventName; + } + + /** + * @return startDate + */ + @Override + public Timestamp getStartDate() { + + return this.startDate; + } + + /** + * @param startDate new value of {@link #getstartDate}. + */ + @Override + public void setStartDate(Timestamp startDate) { + + this.startDate = startDate; + } + + /** + * @return endDate + */ + @Override + public Timestamp getEndDate() { + + return this.endDate; + } + + /** + * @param endDate new value of {@link #getendDate}. + */ + @Override + public void setEndDate(Timestamp endDate) { + + this.endDate = endDate; + } + + /** + * @return location + */ + @Override + public String getLocation() { + + return this.location; + } + + /** + * @param location new value of {@link #getlocation}. + */ + @Override + public void setLocation(String location) { + + this.location = location; + } + + /** + * @return description + */ + @Override + public String getDescription() { + + return this.description; + } + + /** + * @param description new value of {@link #getdescription}. + */ + @Override + public void setDescription(String description) { + + this.description = description; + } + + /** + * @return logo + */ + @Override + public String getLogo() { + + return this.logo; + } + + /** + * @param logo new value of {@link #getlogo}. + */ + @Override + public void setLogo(String logo) { + + this.logo = logo; + } + + /** + * @return attentionTime + */ + @Override + public Timestamp getAttentionTime() { + + return this.attentionTime; + } + + /** + * @param attentionTime new value of {@link #getattentionTime}. + */ + @Override + public void setAttentionTime(Timestamp attentionTime) { + + this.attentionTime = attentionTime; + } + +} diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/eventmanagement/dataaccess/api/repo/EventRepository.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/eventmanagement/dataaccess/api/repo/EventRepository.java new file mode 100644 index 0000000..fc46c23 --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/eventmanagement/dataaccess/api/repo/EventRepository.java @@ -0,0 +1,141 @@ +package com.devonfw.application.jtqjava.eventmanagement.dataaccess.api.repo; + +import static com.querydsl.core.alias.Alias.$; + +import java.sql.Timestamp; +import java.util.Iterator; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; +import org.springframework.data.domain.Sort.Order; + +import com.devonfw.application.jtqjava.eventmanagement.dataaccess.api.EventEntity; +import com.devonfw.application.jtqjava.eventmanagement.logic.api.to.EventSearchCriteriaTo; +import com.devonfw.module.jpa.dataaccess.api.QueryUtil; +import com.devonfw.module.jpa.dataaccess.api.data.DefaultRepository; +import com.querydsl.jpa.impl.JPAQuery; + +/** + * {@link DefaultRepository} for {@link EventEntity} + */ +public interface EventRepository extends DefaultRepository { + + /** + * @param criteria the {@link EventSearchCriteriaTo} with the criteria to search. + * @return the {@link Page} of the {@link EventEntity} objects that matched the search. If no pageable is set, it will + * return a unique page with all the objects that matched the search. + */ + default Page findByCriteria(EventSearchCriteriaTo criteria) { + + EventEntity alias = newDslAlias(); + JPAQuery query = newDslQuery(alias); + + String eventName = criteria.getEventName(); + if (eventName != null && !eventName.isEmpty()) { + QueryUtil.get().whereString(query, $(alias.getEventName()), eventName, criteria.getEventNameOption()); + } + Timestamp startDate = criteria.getStartDate(); + if (startDate != null) { + query.where($(alias.getStartDate()).eq(startDate)); + } + Timestamp endDate = criteria.getEndDate(); + if (endDate != null) { + query.where($(alias.getEndDate()).eq(endDate)); + } + String location = criteria.getLocation(); + if (location != null && !location.isEmpty()) { + QueryUtil.get().whereString(query, $(alias.getLocation()), location, criteria.getLocationOption()); + } + String description = criteria.getDescription(); + if (description != null && !description.isEmpty()) { + QueryUtil.get().whereString(query, $(alias.getDescription()), description, criteria.getDescriptionOption()); + } + String logo = criteria.getLogo(); + if (logo != null && !logo.isEmpty()) { + QueryUtil.get().whereString(query, $(alias.getLogo()), logo, criteria.getLogoOption()); + } + Timestamp attentionTime = criteria.getAttentionTime(); + if (attentionTime != null) { + query.where($(alias.getAttentionTime()).eq(attentionTime)); + } + if (criteria.getPageable() == null) { + criteria.setPageable(PageRequest.of(0, Integer.MAX_VALUE)); + } else { + addOrderBy(query, alias, criteria.getPageable().getSort()); + } + + return QueryUtil.get().findPaginated(criteria.getPageable(), query, true); + } + + /** + * Add sorting to the given query on the given alias + * + * @param query to add sorting to + * @param alias to retrieve columns from for sorting + * @param sort specification of sorting + */ + public default void addOrderBy(JPAQuery query, EventEntity alias, Sort sort) { + + if (sort != null && sort.isSorted()) { + Iterator it = sort.iterator(); + while (it.hasNext()) { + Order next = it.next(); + switch (next.getProperty()) { + case "eventName": + if (next.isAscending()) { + query.orderBy($(alias.getEventName()).asc()); + } else { + query.orderBy($(alias.getEventName()).desc()); + } + break; + case "startDate": + if (next.isAscending()) { + query.orderBy($(alias.getStartDate()).asc()); + } else { + query.orderBy($(alias.getStartDate()).desc()); + } + break; + case "endDate": + if (next.isAscending()) { + query.orderBy($(alias.getEndDate()).asc()); + } else { + query.orderBy($(alias.getEndDate()).desc()); + } + break; + case "location": + if (next.isAscending()) { + query.orderBy($(alias.getLocation()).asc()); + } else { + query.orderBy($(alias.getLocation()).desc()); + } + break; + case "description": + if (next.isAscending()) { + query.orderBy($(alias.getDescription()).asc()); + } else { + query.orderBy($(alias.getDescription()).desc()); + } + break; + case "logo": + if (next.isAscending()) { + query.orderBy($(alias.getLogo()).asc()); + } else { + query.orderBy($(alias.getLogo()).desc()); + } + break; + case "attentionTime": + if (next.isAscending()) { + query.orderBy($(alias.getAttentionTime()).asc()); + } else { + query.orderBy($(alias.getAttentionTime()).desc()); + } + break; + default: + throw new IllegalArgumentException("Sorted by the unknown property '" + next.getProperty() + "'"); + } + } + } + } + +} diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/base/usecase/AbstractEventUc.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/base/usecase/AbstractEventUc.java new file mode 100644 index 0000000..b027bec --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/base/usecase/AbstractEventUc.java @@ -0,0 +1,27 @@ +package com.devonfw.application.jtqjava.eventmanagement.logic.base.usecase; + +import javax.inject.Inject; + +import com.devonfw.application.jtqjava.eventmanagement.dataaccess.api.repo.EventRepository; +import com.devonfw.application.jtqjava.general.logic.base.AbstractUc; + +/** + * Abstract use case for Events, which provides access to the commonly necessary data access objects. + */ +public class AbstractEventUc extends AbstractUc { + + /** @see #getEventRepository() */ + @Inject + private EventRepository eventRepository; + + /** + * Returns the field 'eventRepository'. + * + * @return the {@link EventRepository} instance. + */ + public EventRepository getEventRepository() { + + return this.eventRepository; + } + +} diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/impl/EventmanagementImpl.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/impl/EventmanagementImpl.java new file mode 100644 index 0000000..5b7df59 --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/impl/EventmanagementImpl.java @@ -0,0 +1,73 @@ +package com.devonfw.application.jtqjava.eventmanagement.logic.impl; + +import javax.inject.Inject; +import javax.inject.Named; + +import org.springframework.data.domain.Page; + +import com.devonfw.application.jtqjava.eventmanagement.logic.api.Eventmanagement; +import com.devonfw.application.jtqjava.eventmanagement.logic.api.to.EventEto; +import com.devonfw.application.jtqjava.eventmanagement.logic.api.to.EventSearchCriteriaTo; +import com.devonfw.application.jtqjava.eventmanagement.logic.api.usecase.UcFindEvent; +import com.devonfw.application.jtqjava.eventmanagement.logic.api.usecase.UcManageEvent; +import com.devonfw.application.jtqjava.general.logic.base.AbstractComponentFacade; + +/** + * Implementation of component interface of eventmanagement + */ +@Named +public class EventmanagementImpl extends AbstractComponentFacade implements Eventmanagement { + + @Inject + private UcFindEvent ucFindEvent; + + @Inject + private UcManageEvent ucManageEvent; + + @Override + public EventEto findEvent(long id) { + + return this.ucFindEvent.findEvent(id); + } + + @Override + public Page findEvents(EventSearchCriteriaTo criteria) { + + return this.ucFindEvent.findEvents(criteria); + } + + @Override + public EventEto saveEvent(EventEto event) { + + return this.ucManageEvent.saveEvent(event); + } + + @Override + public boolean deleteEvent(long id) { + + return this.ucManageEvent.deleteEvent(id); + } + + @Override + public void decreaseVisitorCount(long eventId) { + + // TODO Auto-generated method stub + this.ucManageEvent.decreaseVisitorCount(eventId); + + } + + @Override + public void increaseVisitorCount(long eventId) { + + // TODO Auto-generated method stub + this.ucManageEvent.increaseVisitorCount(eventId); + + } + + @Override + public EventEto eventById(long eventId) { + + return this.ucManageEvent.eventById(eventId); + } + +} diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/impl/usecase/UcFindEventImpl.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/impl/usecase/UcFindEventImpl.java new file mode 100644 index 0000000..9e85198 --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/impl/usecase/UcFindEventImpl.java @@ -0,0 +1,50 @@ +package com.devonfw.application.jtqjava.eventmanagement.logic.impl.usecase; + +import java.util.Optional; + +import javax.inject.Named; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.domain.Page; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import com.devonfw.application.jtqjava.eventmanagement.dataaccess.api.EventEntity; +import com.devonfw.application.jtqjava.eventmanagement.logic.api.to.EventEto; +import com.devonfw.application.jtqjava.eventmanagement.logic.api.to.EventSearchCriteriaTo; +import com.devonfw.application.jtqjava.eventmanagement.logic.api.usecase.UcFindEvent; +import com.devonfw.application.jtqjava.eventmanagement.logic.base.usecase.AbstractEventUc; + +/** + * Use case implementation for searching, filtering and getting Events + */ +@Named +@Validated +@Transactional +public class UcFindEventImpl extends AbstractEventUc implements UcFindEvent { + + /** + * Logger instance. + */ + private static final Logger LOG = LoggerFactory.getLogger(UcFindEventImpl.class); + + @Override + public EventEto findEvent(long id) { + + LOG.debug("Get Event with id {} from database.", id); + Optional foundEntity = getEventRepository().findById(id); + if (foundEntity.isPresent()) + return getBeanMapper().map(foundEntity.get(), EventEto.class); + else + return null; + } + + @Override + public Page findEvents(EventSearchCriteriaTo criteria) { + + Page events = getEventRepository().findByCriteria(criteria); + return mapPaginatedEntityList(events, EventEto.class); + } + +} diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/impl/usecase/UcManageEventImpl.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/impl/usecase/UcManageEventImpl.java new file mode 100644 index 0000000..ed92faa --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/impl/usecase/UcManageEventImpl.java @@ -0,0 +1,92 @@ +package com.devonfw.application.jtqjava.eventmanagement.logic.impl.usecase; + +import java.util.Objects; + +import javax.inject.Named; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import com.devonfw.application.jtqjava.eventmanagement.dataaccess.api.EventEntity; +import com.devonfw.application.jtqjava.eventmanagement.logic.api.to.EventEto; +import com.devonfw.application.jtqjava.eventmanagement.logic.api.usecase.UcManageEvent; +import com.devonfw.application.jtqjava.eventmanagement.logic.base.usecase.AbstractEventUc; + +/** + * Use case implementation for modifying and deleting Events + */ +@Named +@Validated +@Transactional +public class UcManageEventImpl extends AbstractEventUc implements UcManageEvent { + + /** + * Logger instance. + */ + private static final Logger LOG = LoggerFactory.getLogger(UcManageEventImpl.class); + + @Override + public boolean deleteEvent(long eventId) { + + EventEntity event = getEventRepository().find(eventId); + getEventRepository().delete(event); + LOG.debug("The event with id '{}' has been deleted.", eventId); + return true; + } + + @Override + public EventEto saveEvent(EventEto event) { + + Objects.requireNonNull(event, "event"); + + EventEntity eventEntity = getBeanMapper().map(event, EventEntity.class); + + // initialize, validate eventEntity here if necessary + EventEntity resultEntity = getEventRepository().save(eventEntity); + LOG.debug("Event with id '{}' has been created.", resultEntity.getId()); + return getBeanMapper().map(resultEntity, EventEto.class); + } + + @Override + public void decreaseVisitorCount(long eventId) { + + // TODO Auto-generated method stub + // the event is found by using the repository find method and eventId paremeter + EventEntity eventEntity = getEventRepository().find(eventId); + + // the visitors gets decreased by one + if (eventEntity.getVisitorCount() > 0) { + eventEntity.setVisitorCount(eventEntity.getVisitorCount() - 1); + } + // Based on Hibernate, the command save(Entity) is not strictly required, but it improves readability. + // the eventEntity gets saved + getEventRepository().save(eventEntity); + + } + + @Override + public void increaseVisitorCount(long eventId) { + + // TODO Auto-generated method stub + // the event is found by using the repository find method and eventId paremeter + EventEntity eventEntity = getEventRepository().find(eventId); + + // the visitors gets increased by one + eventEntity.setVisitorCount(eventEntity.getVisitorCount() + 1); + + // Based on Hibernate, the command save(Entity) is not strictly required, but it improves readability. + // the eventEntity gets saved + getEventRepository().save(eventEntity); + + } + + @Override + public EventEto eventById(long eventId) { + + EventEntity eventEntity = getEventRepository().find(eventId); + return getBeanMapper().map(eventEntity, EventEto.class); + } + +} diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/eventmanagement/service/impl/rest/EventmanagementRestServiceImpl.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/eventmanagement/service/impl/rest/EventmanagementRestServiceImpl.java new file mode 100644 index 0000000..4971b72 --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/eventmanagement/service/impl/rest/EventmanagementRestServiceImpl.java @@ -0,0 +1,46 @@ +package com.devonfw.application.jtqjava.eventmanagement.service.impl.rest; + +import javax.inject.Inject; +import javax.inject.Named; + +import org.springframework.data.domain.Page; + +import com.devonfw.application.jtqjava.eventmanagement.logic.api.Eventmanagement; +import com.devonfw.application.jtqjava.eventmanagement.logic.api.to.EventEto; +import com.devonfw.application.jtqjava.eventmanagement.logic.api.to.EventSearchCriteriaTo; +import com.devonfw.application.jtqjava.eventmanagement.service.api.rest.EventmanagementRestService; + +/** + * The service implementation for REST calls in order to execute the logic of component {@link Eventmanagement}. + */ +@Named("EventmanagementRestService") +public class EventmanagementRestServiceImpl implements EventmanagementRestService { + + @Inject + private Eventmanagement eventmanagement; + + @Override + public EventEto getEvent(long id) { + + return this.eventmanagement.findEvent(id); + } + + @Override + public EventEto saveEvent(EventEto event) { + + return this.eventmanagement.saveEvent(event); + } + + @Override + public void deleteEvent(long id) { + + this.eventmanagement.deleteEvent(id); + } + + @Override + public Page findEvents(EventSearchCriteriaTo searchCriteriaTo) { + + return this.eventmanagement.findEvents(searchCriteriaTo); + } + +} diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/common/api/ApplicationEntity.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/common/api/ApplicationEntity.java new file mode 100644 index 0000000..cd042b4 --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/common/api/ApplicationEntity.java @@ -0,0 +1,11 @@ +package com.devonfw.application.jtqjava.general.common.api; + +import com.devonfw.module.basic.common.api.entity.GenericEntity; + +/** + * This is the abstract interface for a {@link GenericEntity}. We are using {@link Long} for all {@link #getId() primary + * keys}. + */ +public abstract interface ApplicationEntity extends GenericEntity { + +} diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/common/api/security/ApplicationAccessControlConfig.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/common/api/security/ApplicationAccessControlConfig.java new file mode 100644 index 0000000..a728952 --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/common/api/security/ApplicationAccessControlConfig.java @@ -0,0 +1,32 @@ +package com.devonfw.application.jtqjava.general.common.api.security; + +import javax.inject.Named; + +import com.devonfw.module.security.common.api.accesscontrol.AccessControlGroup; +import com.devonfw.module.security.common.base.accesscontrol.AccessControlConfig; + +/** + * Example of {@link AccessControlConfig} that used for testing. + */ +@Named +public class ApplicationAccessControlConfig extends AccessControlConfig { + + public static final String APP_ID = "jtqjava"; + + private static final String PREFIX = APP_ID + "."; + + public static final String GROUP_READ_MASTER_DATA = PREFIX + "ReadMasterData"; + + public static final String GROUP_ADMIN = PREFIX + "Admin"; + + /** + * The constructor. + */ + public ApplicationAccessControlConfig() { + + super(); + AccessControlGroup readMasterData = group(GROUP_READ_MASTER_DATA); + group(GROUP_ADMIN, readMasterData); + } + +} \ No newline at end of file diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/common/base/AbstractBeanMapperSupport.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/common/base/AbstractBeanMapperSupport.java new file mode 100644 index 0000000..1118ece --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/common/base/AbstractBeanMapperSupport.java @@ -0,0 +1,31 @@ +package com.devonfw.application.jtqjava.general.common.base; + +import com.devonfw.module.beanmapping.common.api.BeanMapper; + +import javax.inject.Inject; + +/** + * This abstract class provides {@link #getBeanMapper() access} to the {@link BeanMapper}. + */ +public abstract class AbstractBeanMapperSupport { + + private BeanMapper beanMapper; + + /** + * @param beanMapper is the {@link BeanMapper} to {@link Inject} + */ + @Inject + public void setBeanMapper(BeanMapper beanMapper) { + + this.beanMapper = beanMapper; + } + + /** + * @return the {@link BeanMapper} instance. + */ + protected BeanMapper getBeanMapper() { + + return this.beanMapper; + } + +} diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/common/impl/config/ApplicationObjectMapperFactory.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/common/impl/config/ApplicationObjectMapperFactory.java new file mode 100644 index 0000000..03e7584 --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/common/impl/config/ApplicationObjectMapperFactory.java @@ -0,0 +1,51 @@ +package com.devonfw.application.jtqjava.general.common.impl.config; + +import javax.inject.Named; + +import org.springframework.security.web.csrf.CsrfToken; + +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.module.SimpleModule; +import com.devonfw.module.json.common.base.ObjectMapperFactory; + + +/** + * The MappingFactory class to resolve polymorphic conflicts within the jtqjava application. + */ +@Named("ApplicationObjectMapperFactory") +public class ApplicationObjectMapperFactory extends ObjectMapperFactory { + + /** + * The constructor. + */ + public ApplicationObjectMapperFactory() { + + super(); + // see https://github.com/devonfw/devon4j/blob/develop/documentation/guide-json.asciidoc#json-and-inheritance + SimpleModule module = getExtensionModule(); + module.addAbstractTypeMapping(CsrfToken.class, CsrfTokenImpl.class); + } + + /** + * override createInstance method. + */ + @Override + public ObjectMapper createInstance() { + + ObjectMapper objectMapper = super.createInstance(); + // omit properties in JSON that are null + objectMapper.setSerializationInclusion(Include.NON_NULL); + // Write legacy date/calendar as readable text instead of numeric value + // See + // https://fasterxml.github.io/jackson-databind/javadoc/2.6/com/fasterxml/jackson/databind/SerializationFeature.html#WRITE_DATES_AS_TIMESTAMPS + objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); + // ignore unknown properties in JSON to prevent errors + // e.g. when the service has been updated/extended but the calling REST client is not yet updated + // see https://github.com/devonfw/devon4j/blob/develop/documentation/guide-service-layer.asciidoc#versioning + objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + return objectMapper; + } +} diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/common/impl/config/BeansOrikaConfig.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/common/impl/config/BeansOrikaConfig.java new file mode 100644 index 0000000..7173282 --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/common/impl/config/BeansOrikaConfig.java @@ -0,0 +1,14 @@ +package com.devonfw.application.jtqjava.general.common.impl.config; + +import org.springframework.context.annotation.Configuration; + +import com.devonfw.module.beanmapping.common.base.BaseOrikaConfig; + +/** + * Java bean configuration for Orika. The method {@link #configureCustomMapping(MapperFactory)} from + * {@link BaseOrikaConfig} can be overridden as per requirements. + */ +@Configuration +public class BeansOrikaConfig extends BaseOrikaConfig { + +} diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/common/impl/config/CsrfTokenImpl.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/common/impl/config/CsrfTokenImpl.java new file mode 100644 index 0000000..9b43180 --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/common/impl/config/CsrfTokenImpl.java @@ -0,0 +1,60 @@ +package com.devonfw.application.jtqjava.general.common.impl.config; + +import org.springframework.security.web.csrf.CsrfToken; + +/** + * Implementation of {@link CsrfToken} as Java bean for JSON deserialization. + */ +public class CsrfTokenImpl implements CsrfToken { + + private static final long serialVersionUID = 1L; + + private String headerName; + + private String parameterName; + + private String token; + + @Override + public String getHeaderName() { + + return this.headerName; + } + + @Override + public String getParameterName() { + + return this.parameterName; + } + + @Override + public String getToken() { + + return this.token; + } + + /** + * @param headerName new value of {@link #getHeaderName()}. + */ + public void setHeaderName(String headerName) { + + this.headerName = headerName; + } + + /** + * @param parameterName new value of {@link #getParameterName()}. + */ + public void setParameterName(String parameterName) { + + this.parameterName = parameterName; + } + + /** + * @param token new value of {@link #getToken()}. + */ + public void setToken(String token) { + + this.token = token; + } + +} diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/common/impl/security/BaseUserDetailsService.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/common/impl/security/BaseUserDetailsService.java new file mode 100644 index 0000000..dbff49e --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/common/impl/security/BaseUserDetailsService.java @@ -0,0 +1,123 @@ +package com.devonfw.application.jtqjava.general.common.impl.security; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; + +import javax.inject.Inject; +import javax.inject.Named; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; + +import com.devonfw.module.security.common.api.accesscontrol.AccessControl; +import com.devonfw.module.security.common.api.accesscontrol.AccessControlProvider; +import com.devonfw.module.security.common.base.accesscontrol.AccessControlGrantedAuthority; + +/** + * Custom implementation of {@link UserDetailsService}.
+ * + * @see com.devonfw.application.jtqjava.general.service.impl.config.BaseWebSecurityConfig + */ +@Named +public class BaseUserDetailsService implements UserDetailsService { + + /** Logger instance. */ + private static final Logger LOG = LoggerFactory.getLogger(BaseUserDetailsService.class); + + private AuthenticationManagerBuilder amBuilder; + + private AccessControlProvider accessControlProvider; + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + + Set authorities = getAuthorities(username); + UserDetails user; + try { + user = getAmBuilder().getDefaultUserDetailsService().loadUserByUsername(username); + User userData = new User(user.getUsername(), user.getPassword(), authorities); + return userData; + } catch (Exception e) { + e.printStackTrace(); + UsernameNotFoundException exception = new UsernameNotFoundException("Authentication failed.", e); + LOG.warn("Failed to get user {}.", username, exception); + throw exception; + } + } + + /** + * @param username the login of the user + * @return the associated {@link GrantedAuthority}s + * @throws AuthenticationException if no principal is retrievable for the given {@code username} + */ + protected Set getAuthorities(String username) throws AuthenticationException { + + Objects.requireNonNull(username, "username"); + // determine granted authorities for spring-security... + Set authorities = new HashSet<>(); + Collection accessControlIds = getRoles(username); + Set accessControlSet = new HashSet<>(); + for (String id : accessControlIds) { + boolean success = this.accessControlProvider.collectAccessControls(id, accessControlSet); + if (!success) { + LOG.warn("Undefined access control {}.", id); + } + } + for (AccessControl accessControl : accessControlSet) { + authorities.add(new AccessControlGrantedAuthority(accessControl)); + } + return authorities; + } + + private Collection getRoles(String username) { + + Collection roles = new ArrayList<>(); + // TODO for a reasonable application you need to retrieve the roles of the user from a central IAM system + roles.add(username); + return roles; + } + + /** + * @return amBuilder + */ + public AuthenticationManagerBuilder getAmBuilder() { + + return this.amBuilder; + } + + /** + * @param amBuilder new value of {@link #getAmBuilder}. + */ + @Inject + public void setAmBuilder(AuthenticationManagerBuilder amBuilder) { + + this.amBuilder = amBuilder; + } + + /** + * @return accessControlProvider + */ + public AccessControlProvider getAccessControlProvider() { + + return this.accessControlProvider; + } + + /** + * @param accessControlProvider new value of {@link #getAccessControlProvider}. + */ + @Inject + public void setAccessControlProvider(AccessControlProvider accessControlProvider) { + + this.accessControlProvider = accessControlProvider; + } +} diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/common/impl/security/CsrfRequestMatcher.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/common/impl/security/CsrfRequestMatcher.java new file mode 100644 index 0000000..9852692 --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/common/impl/security/CsrfRequestMatcher.java @@ -0,0 +1,54 @@ +package com.devonfw.application.jtqjava.general.common.impl.security; + +import java.util.regex.Pattern; + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.security.web.util.matcher.RequestMatcher; + +/** + * This is the implementation of {@link RequestMatcher}, which decides which {@link HttpServletRequest Requests} require + * a correct CSRF token. + * + * @see
Cross-site request forgery + */ +public class CsrfRequestMatcher implements RequestMatcher { + + private static final Pattern HTTP_METHOD_PATTERN = Pattern.compile("^GET$"); + + private static final String[] PATH_PREFIXES_WITHOUT_CSRF_PROTECTION = + { "/login", "/logout", "/services/rest/login", "/websocket" }; + + @Override + public boolean matches(HttpServletRequest request) { + + // GET requests are read-only and therefore do not need CSRF protection + if (HTTP_METHOD_PATTERN.matcher(request.getMethod()).matches()) { + + return false; + } + + // There are specific URLs which can not be protected from CSRF. For example, in case of the the login page, + // the CSRF token can only be accessed after a successful authentication ("login"). + String requestPath = getRequestPath(request); + for (String path : PATH_PREFIXES_WITHOUT_CSRF_PROTECTION) { + if (requestPath.startsWith(path)) { + return false; + } + } + + return true; + } + + private String getRequestPath(HttpServletRequest request) { + + String url = request.getServletPath(); + String pathInfo = request.getPathInfo(); + + if (pathInfo != null) { + url += pathInfo; + } + + return url; + } +} diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/dataaccess/api/ApplicationPersistenceEntity.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/dataaccess/api/ApplicationPersistenceEntity.java new file mode 100644 index 0000000..dd3354c --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/dataaccess/api/ApplicationPersistenceEntity.java @@ -0,0 +1,86 @@ +package com.devonfw.application.jtqjava.general.dataaccess.api; + +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.MappedSuperclass; +import javax.persistence.Transient; +import javax.persistence.Version; + +import com.devonfw.application.jtqjava.general.common.api.ApplicationEntity; +import com.devonfw.module.basic.common.api.entity.PersistenceEntity; + +/** + * Abstract base class for all {@link PersistenceEntity persistence entities} with an {@link #getId() id} and a + * {@link #getModificationCounter() modificationCounter} (version) field. All persistence entities of this application + * should inherit from this class. It is using JPA annotations at the getters what has several advantages but also + * implies that you have to annotate transient getter methods with the {@link Transient} annotation. + */ +@MappedSuperclass +public abstract class ApplicationPersistenceEntity implements ApplicationEntity, PersistenceEntity { + + private static final long serialVersionUID = 1L; + + private Long id; + + private int modificationCounter; + + /** + * The constructor. + */ + public ApplicationPersistenceEntity() { + + super(); + } + + @Override + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + public Long getId() { + + return this.id; + } + + @Override + public void setId(Long id) { + + this.id = id; + } + + @Override + @Version + public int getModificationCounter() { + + return this.modificationCounter; + } + + @Override + public void setModificationCounter(int version) { + + this.modificationCounter = version; + } + + @Override + public String toString() { + + StringBuilder buffer = new StringBuilder(); + toString(buffer); + return buffer.toString(); + } + + /** + * Method to extend {@link #toString()} logic. + * + * @param buffer is the {@link StringBuilder} where to {@link StringBuilder#append(Object) append} the string + * representation. + */ + protected void toString(StringBuilder buffer) { + + buffer.append(getClass().getSimpleName()); + if (this.id != null) { + buffer.append("[id="); + buffer.append(this.id); + buffer.append("]"); + } + } +} \ No newline at end of file diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/dataaccess/impl/JpaConfig.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/dataaccess/impl/JpaConfig.java new file mode 100644 index 0000000..78fc7f8 --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/dataaccess/impl/JpaConfig.java @@ -0,0 +1,27 @@ +package com.devonfw.application.jtqjava.general.dataaccess.impl; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; + +import com.devonfw.module.basic.common.api.config.SpringProfileConstants; +import com.devonfw.module.jpa.dataaccess.api.JpaInitializer; + +/** + * Spring {@link Configuration} for JPA. + */ +@Configuration +@Profile(SpringProfileConstants.NOT_JUNIT) +public class JpaConfig { + + /** + * @return the {@link JpaInitializer} to register the {@link javax.persistence.EntityManager} and make + * {@link com.devonfw.module.jpa.dataaccess.api.JpaHelper} functional. + */ + @Bean + public JpaInitializer jpaInitializer() { + + return new JpaInitializer(); + } + +} diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/logic/base/AbstractComponentFacade.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/logic/base/AbstractComponentFacade.java new file mode 100644 index 0000000..736cb2e --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/logic/base/AbstractComponentFacade.java @@ -0,0 +1,16 @@ +package com.devonfw.application.jtqjava.general.logic.base; + +/** + * Abstract base class for any component implementation class in this application. + */ +public abstract class AbstractComponentFacade extends AbstractLogic { + + /** + * The constructor. + */ + public AbstractComponentFacade() { + + super(); + } + +} diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/logic/base/AbstractLogic.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/logic/base/AbstractLogic.java new file mode 100644 index 0000000..461c393 --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/logic/base/AbstractLogic.java @@ -0,0 +1,127 @@ +package com.devonfw.application.jtqjava.general.logic.base; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; + +import com.devonfw.application.jtqjava.general.common.base.AbstractBeanMapperSupport; +import com.devonfw.module.basic.common.api.entity.GenericEntity; +import com.devonfw.module.basic.common.api.entity.PersistenceEntity; +import com.devonfw.module.basic.common.api.to.AbstractEto; +import com.devonfw.module.basic.common.api.to.MasterCto; + +/** + * Abstract base class for implementations of business logic in this application. Actual implementations need + * to be annotated with {@link javax.inject.Named}. + * + * @see AbstractUc + * @see AbstractComponentFacade + */ +public abstract class AbstractLogic extends AbstractBeanMapperSupport { + + /** + * The constructor. + */ + public AbstractLogic() { + + super(); + } + + /** + * Creates a {@link Map} with all {@link MasterCto}s from the given {@link Collection} using their + * {@link MasterCto#getEto() main ETO} {@link AbstractEto#getId() ID} as key. All {@link AbstractEto ETO}s being + * {@code null} or without an {@link AbstractEto#getId() ID} will be ignored. + * + * @param is the generic type of the {@link MasterCto}s. + * @param entities is the {@link Collection} of {@link MasterCto}s. + * @return a {@link Map} mapping from {@link AbstractEto#getId() ID} to {@link MasterCto}. + */ + protected static > Map getCtoMap(Collection ctos) { + + Map id2CtoMap = new HashMap<>(); + for (C cto : ctos) { + AbstractEto eto = cto.getEto(); + if (eto != null) { + Long id = eto.getId(); + if (id != null) { + id2CtoMap.put(id, cto); + } + } + } + return id2CtoMap; + } + + /** + * Creates a {@link Map} with all {@link GenericEntity entities} from the given {@link Collection} using their + * {@link GenericEntity#getId() ID} as key. All {@link GenericEntity entities} without an {@link GenericEntity#getId() + * ID} ({@code null}) will be ignored. + * + * @param is the generic type of the {@link GenericEntity#getId() ID}. + * @param is the generic type of the {@link GenericEntity entity}. + * @param entities is the {@link Collection} of {@link GenericEntity entities}. + * @return a {@link Map} mapping from {@link GenericEntity#getId() ID} to {@link GenericEntity entity}. + */ + protected static > Map getEntityMap(Collection entities) { + + Map id2EntityMap = new HashMap<>(); + for (E entity : entities) { + ID id = entity.getId(); + if (id != null) { + id2EntityMap.put(id, entity); + } + } + return id2EntityMap; + } + + /** + * Determines the {@link GenericEntity entities} to delete if currentList is the current list from the + * persistence and listToSave is the new list that shall be saved. In other words this method selects the + * {@link GenericEntity entities} from currentList that are not contained in listToSave. + * + * @param is the generic type of the {@link GenericEntity#getId() ID}. + * @param is the generic type of the {@link GenericEntity entity}. + * @param currentEntities is the {@link Collection} of the {@link GenericEntity entities} currently persisted. We + * assume that all objects in this list have an {@link GenericEntity#getId() ID} value (that is not + * {@code null}). + * @param entitiesToSave is the {@link Collection} that contains the {@link GenericEntity entities} that shall be + * saved. It may contain {@link GenericEntity entities} that have no {@link GenericEntity#getId() ID} that + * shall be newly created. + * @return the {@link List} with the {@link GenericEntity entities} to delete. + */ + protected static > List getEntities2Delete(Collection currentEntities, + Collection entitiesToSave) { + + List result = new ArrayList<>(currentEntities.size()); + Map entityMap = getEntityMap(entitiesToSave); + for (E entity : currentEntities) { + if (!entityMap.containsKey(entity.getId())) { + // entity from currentList is not contained in listToSave... + result.add(entity); + } + } + return result; + } + + /** + * Maps a {@link Page paginated list} of persistent entities to a {@link Page paginated list} of transfer objects. + * + * @param is the generic type of the {@link AbstractTransferObject transfer object}. + * @param is the generic type of the {@link PersistenceEntity entity}. + * @param page is the paginated list to map from. + * @param clazz is the target class to map the paginated entities to. + * @return a {@link Page paginated list of entity transfer objects}. + */ + protected > Page mapPaginatedEntityList(Page page, + Class clazz) { + + List etoList = getBeanMapper().mapList(page.getContent(), clazz); + return new PageImpl<>(etoList, page.getPageable(), page.getTotalElements()); + } + +} diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/logic/base/AbstractUc.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/logic/base/AbstractUc.java new file mode 100644 index 0000000..d491618 --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/logic/base/AbstractUc.java @@ -0,0 +1,18 @@ +package com.devonfw.application.jtqjava.general.logic.base; + +/** + * Abstract base class for any use case in this application. Actual implementations need to be annotated with + * {@link javax.inject.Named}. + * + */ +public abstract class AbstractUc extends AbstractLogic { + + /** + * The constructor. + */ + public AbstractUc() { + + super(); + } + +} diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/logic/impl/config/DefaultRolesPrefixPostProcessor.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/logic/impl/config/DefaultRolesPrefixPostProcessor.java new file mode 100644 index 0000000..7b99ef1 --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/logic/impl/config/DefaultRolesPrefixPostProcessor.java @@ -0,0 +1,61 @@ +package com.devonfw.application.jtqjava.general.logic.impl.config; + +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.core.PriorityOrdered; +import org.springframework.security.access.annotation.Jsr250MethodSecurityMetadataSource; +import org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler; +import org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler; +import org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter; + +/** + * This is an implementation of {@link BeanPostProcessor} that allows to change the role prefix of spring-security. By + * default spring-security is magically adding a strange prefix called "ROLE_" to your granted authorities. In order to + * prevent this we use this class with an empty prefix. + */ +public class DefaultRolesPrefixPostProcessor implements BeanPostProcessor, PriorityOrdered { + + private final String rolePrefix; + + /** + * Der Konstruktor. + * + * @param rolePrefix das gewünschte Rollen-Präfix (z.B. der leere String). + */ + public DefaultRolesPrefixPostProcessor(String rolePrefix) { + super(); + this.rolePrefix = rolePrefix; + } + + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { + + // remove this if you are not using JSR-250 + if (bean instanceof Jsr250MethodSecurityMetadataSource) { + ((Jsr250MethodSecurityMetadataSource) bean).setDefaultRolePrefix(this.rolePrefix); + } + + if (bean instanceof DefaultMethodSecurityExpressionHandler) { + ((DefaultMethodSecurityExpressionHandler) bean).setDefaultRolePrefix(this.rolePrefix); + } + if (bean instanceof DefaultWebSecurityExpressionHandler) { + ((DefaultWebSecurityExpressionHandler) bean).setDefaultRolePrefix(this.rolePrefix); + } + if (bean instanceof SecurityContextHolderAwareRequestFilter) { + ((SecurityContextHolderAwareRequestFilter) bean).setRolePrefix(this.rolePrefix); + } + return bean; + } + + @Override + public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { + + return bean; + } + + @Override + public int getOrder() { + + return PriorityOrdered.HIGHEST_PRECEDENCE; + } +} diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/service/impl/config/BaseWebSecurityConfig.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/service/impl/config/BaseWebSecurityConfig.java new file mode 100644 index 0000000..0fc3a76 --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/service/impl/config/BaseWebSecurityConfig.java @@ -0,0 +1,119 @@ +package com.devonfw.application.jtqjava.general.service.impl.config; + +import javax.inject.Inject; +import javax.servlet.Filter; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler; +import org.springframework.security.web.authentication.logout.LogoutFilter; +import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler; +import org.springframework.security.web.csrf.CsrfFilter; +import org.springframework.security.web.util.matcher.AntPathRequestMatcher; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; + +import com.devonfw.module.security.common.impl.rest.AuthenticationSuccessHandlerSendingOkHttpStatusCode; +import com.devonfw.module.security.common.impl.rest.JsonUsernamePasswordAuthenticationFilter; +import com.devonfw.module.security.common.impl.rest.LogoutSuccessHandlerReturningOkHttpStatusCode; + +/** + * This type serves as a base class for extensions of the {@code WebSecurityConfigurerAdapter} and provides a default + * configuration.
+ * Security configuration is based on {@link WebSecurityConfigurerAdapter}. This configuration is by purpose designed + * most simple for two channels of authentication: simple login form and rest-url. + */ +public abstract class BaseWebSecurityConfig extends WebSecurityConfigurerAdapter { + + @Value("${security.cors.enabled}") + boolean corsEnabled = false; + + @Inject + private UserDetailsService userDetailsService; + + @Inject + private PasswordEncoder passwordEncoder; + + private CorsFilter getCorsFilter() { + + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + CorsConfiguration config = new CorsConfiguration(); + config.setAllowCredentials(true); + config.addAllowedOrigin("*"); + config.addAllowedHeader("*"); + config.addAllowedMethod("OPTIONS"); + config.addAllowedMethod("HEAD"); + config.addAllowedMethod("GET"); + config.addAllowedMethod("PUT"); + config.addAllowedMethod("POST"); + config.addAllowedMethod("DELETE"); + config.addAllowedMethod("PATCH"); + source.registerCorsConfiguration("/**", config); + return new CorsFilter(source); + } + + /** + * Configure spring security to enable a simple webform-login + a simple rest login. + */ + @Override + public void configure(HttpSecurity http) throws Exception { + + http.authorizeRequests().anyRequest().permitAll().and().csrf().disable(); + + if (this.corsEnabled) { + http.addFilterBefore(getCorsFilter(), CsrfFilter.class); + } + } + + /** + * Create a simple filter that allows logout on a REST Url /services/rest/logout and returns a simple HTTP status 200 + * ok. + * + * @return the filter. + */ + protected Filter getSimpleRestLogoutFilter() { + + LogoutFilter logoutFilter = new LogoutFilter(new LogoutSuccessHandlerReturningOkHttpStatusCode(), + new SecurityContextLogoutHandler()); + + // configure logout for rest logouts + logoutFilter.setLogoutRequestMatcher(new AntPathRequestMatcher("/services/rest/logout")); + + return logoutFilter; + } + + /** + * Create a simple authentication filter for REST logins that reads user-credentials from a json-parameter and returns + * status 200 instead of redirect after login. + * + * @return the {@link JsonUsernamePasswordAuthenticationFilter}. + * @throws Exception if something goes wrong. + */ + protected JsonUsernamePasswordAuthenticationFilter getSimpleRestAuthenticationFilter() throws Exception { + + JsonUsernamePasswordAuthenticationFilter jsonFilter = new JsonUsernamePasswordAuthenticationFilter( + new AntPathRequestMatcher("/services/rest/login")); + jsonFilter.setPasswordParameter("j_password"); + jsonFilter.setUsernameParameter("j_username"); + jsonFilter.setAuthenticationManager(authenticationManager()); + // set failurehandler that uses no redirect in case of login failure; just HTTP-status: 401 + jsonFilter.setAuthenticationManager(authenticationManagerBean()); + jsonFilter.setAuthenticationFailureHandler(new SimpleUrlAuthenticationFailureHandler()); + // set successhandler that uses no redirect in case of login success; just HTTP-status: 200 + jsonFilter.setAuthenticationSuccessHandler(new AuthenticationSuccessHandlerSendingOkHttpStatusCode()); + return jsonFilter; + } + + @SuppressWarnings("javadoc") + @Inject + public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { + + auth.inMemoryAuthentication().withUser("admin").password(this.passwordEncoder.encode("admin")).roles("Admin"); + } + +} diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/service/impl/config/ServletInitializer.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/service/impl/config/ServletInitializer.java new file mode 100644 index 0000000..9202bb3 --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/service/impl/config/ServletInitializer.java @@ -0,0 +1,23 @@ +package com.devonfw.application.jtqjava.general.service.impl.config; + +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; +import org.springframework.context.annotation.Configuration; + +import com.devonfw.application.jtqjava.SpringBootApp; + +/** + * This auto configuration will be used by spring boot to enable traditional deployment to a servlet container. You may + * remove this class if you run your application with embedded tomcat only. Tomcat startup will be twice as fast. + */ +@Configuration +@EnableAutoConfiguration +public class ServletInitializer extends SpringBootServletInitializer { + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + + return application.sources(SpringBootApp.class); + } +} diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/service/impl/config/WebConfig.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/service/impl/config/WebConfig.java new file mode 100644 index 0000000..bd73cc0 --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/service/impl/config/WebConfig.java @@ -0,0 +1,80 @@ +package com.devonfw.application.jtqjava.general.service.impl.config; + +import javax.servlet.Filter; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.AutowireCapableBeanFactory; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.filter.CharacterEncodingFilter; + +import com.devonfw.module.logging.common.api.DiagnosticContextFacade; +import com.devonfw.module.logging.common.impl.DiagnosticContextFacadeImpl; +import com.devonfw.module.logging.common.impl.DiagnosticContextFilter; +import com.devonfw.module.logging.common.impl.PerformanceLogFilter; +import com.devonfw.module.service.common.api.constants.ServiceConstants; + +/** + * Registers a number of filters for web requests. + */ +@Configuration +public class WebConfig { + + private @Autowired AutowireCapableBeanFactory beanFactory; + + /** + * @return the {@link FilterRegistrationBean} to register the {@link PerformanceLogFilter} that will log all requests + * with their duration and status code. + */ + @Bean + public FilterRegistrationBean performanceLogFilter() { + + FilterRegistrationBean registration = new FilterRegistrationBean(); + Filter performanceLogFilter = new PerformanceLogFilter(); + this.beanFactory.autowireBean(performanceLogFilter); + registration.setFilter(performanceLogFilter); + registration.addUrlPatterns("/*"); + return registration; + } + + /** + * @return the {@link DiagnosticContextFacade} implementation. + */ + @Bean(name = "DiagnosticContextFacade") + public DiagnosticContextFacade diagnosticContextFacade() { + + return new DiagnosticContextFacadeImpl(); + } + + /** + * @return the {@link FilterRegistrationBean} to register the {@link DiagnosticContextFilter} that adds the + * correlation id as MDC so it will be included in all associated logs. + */ + @Bean + public FilterRegistrationBean diagnosticContextFilter() { + + FilterRegistrationBean registration = new FilterRegistrationBean(); + Filter diagnosticContextFilter = new DiagnosticContextFilter(); + this.beanFactory.autowireBean(diagnosticContextFilter); + registration.setFilter(diagnosticContextFilter); + registration.addUrlPatterns(ServiceConstants.URL_PATH_SERVICES + "/*"); + return registration; + } + + /** + * @return the {@link FilterRegistrationBean} to register the {@link CharacterEncodingFilter} to set the encoding. + */ + @Bean + public FilterRegistrationBean setCharacterEncodingFilter() { + + FilterRegistrationBean registration = new FilterRegistrationBean(); + CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter(); + characterEncodingFilter.setEncoding("UTF-8"); + characterEncodingFilter.setForceEncoding(false); + this.beanFactory.autowireBean(characterEncodingFilter); + registration.setFilter(characterEncodingFilter); + registration.addUrlPatterns("/*"); + return registration; + } +} \ No newline at end of file diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/service/impl/config/WebSecurityBeansConfig.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/service/impl/config/WebSecurityBeansConfig.java new file mode 100644 index 0000000..cf5f23c --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/service/impl/config/WebSecurityBeansConfig.java @@ -0,0 +1,52 @@ +package com.devonfw.application.jtqjava.general.service.impl.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.crypto.factory.PasswordEncoderFactories; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.csrf.CsrfTokenRepository; +import org.springframework.security.web.csrf.HttpSessionCsrfTokenRepository; + +import com.devonfw.application.jtqjava.general.logic.impl.config.DefaultRolesPrefixPostProcessor; + +/** + * This configuration class provides factory methods for several Spring security related beans. + */ +@Configuration +public class WebSecurityBeansConfig { + + /** + * This method provides a new instance of {@code CsrfTokenRepository} + * + * @return the newly created {@code CsrfTokenRepository} + */ + @Bean + public CsrfTokenRepository csrfTokenRepository() { + + return new HttpSessionCsrfTokenRepository(); + } + + /** + * This method provides a new instance of {@code DefaultRolesPrefixPostProcessor} + * + * @return the newly create {@code DefaultRolesPrefixPostProcessor} + */ + @Bean + public static DefaultRolesPrefixPostProcessor defaultRolesPrefixPostProcessor() { + + // By default Spring-Security is setting the prefix "ROLE_" for all permissions/authorities. + // We disable this undesired behavior here... + return new DefaultRolesPrefixPostProcessor(""); + } + + /** + * This method provide a new instance of {@code DelegatingPasswordEncoder} + * + * @return the newly create {@code DelegatingPasswordEncoder} + */ + @Bean + public PasswordEncoder passwordEncoder() { + + return PasswordEncoderFactories.createDelegatingPasswordEncoder(); + } +} diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/service/impl/config/WebSecurityConfig.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/service/impl/config/WebSecurityConfig.java new file mode 100644 index 0000000..d2e1d5a --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/service/impl/config/WebSecurityConfig.java @@ -0,0 +1,21 @@ +package com.devonfw.application.jtqjava.general.service.impl.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; + +import com.devonfw.module.basic.common.api.config.SpringProfileConstants; + +/** + * Security configuration based on {@link WebSecurityConfigurerAdapter}. This configuration is by purpose designed most + * simple for two channels of authentication: simple login form and rest-url. (Copied from + * {@link com.devonfw.application.jtqjava.general.service.impl.config.BaseWebSecurityConfig} + * + */ +@Configuration +@EnableWebSecurity +@Profile(SpringProfileConstants.NOT_JUNIT) +public class WebSecurityConfig extends BaseWebSecurityConfig { + +} diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/service/impl/rest/ApplicationAccessDeniedHandler.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/service/impl/rest/ApplicationAccessDeniedHandler.java new file mode 100644 index 0000000..b7d81a1 --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/general/service/impl/rest/ApplicationAccessDeniedHandler.java @@ -0,0 +1,46 @@ +package com.devonfw.application.jtqjava.general.service.impl.rest; + +import com.devonfw.module.rest.service.impl.RestServiceExceptionFacade; + +import java.io.IOException; + +import javax.inject.Inject; +import javax.inject.Named; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.ws.rs.core.Response; + +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.web.access.AccessDeniedHandler; + +/** + * Implementation of {@link AccessDeniedHandler}. + */ +@Named("ApplicationAccessDeniedHandler") +public class ApplicationAccessDeniedHandler implements AccessDeniedHandler { + + private RestServiceExceptionFacade exceptionFacade; + + @Override + public void handle(HttpServletRequest request, HttpServletResponse response, + AccessDeniedException accessDeniedException) throws IOException, ServletException { + + Response restResponse = this.exceptionFacade.toResponse(accessDeniedException); + Object entity = restResponse.getEntity(); + response.setStatus(restResponse.getStatus()); + if (entity != null) { + response.getWriter().write(entity.toString()); + } + } + + /** + * @param exceptionFacade the {@link RestServiceExceptionFacade} to inject. + */ + @Inject + public void setExceptionFacade(RestServiceExceptionFacade exceptionFacade) { + + this.exceptionFacade = exceptionFacade; + } + +} diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/dataaccess/api/QueueDetailEntity.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/dataaccess/api/QueueDetailEntity.java new file mode 100644 index 0000000..17b6b3d --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/dataaccess/api/QueueDetailEntity.java @@ -0,0 +1,218 @@ +package com.devonfw.application.jtqjava.queuedetailmanagement.dataaccess.api; + +import java.sql.Timestamp; + +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import javax.persistence.Transient; +import javax.validation.constraints.Size; + +import com.devonfw.application.jtqjava.eventmanagement.dataaccess.api.EventEntity; +import com.devonfw.application.jtqjava.general.dataaccess.api.ApplicationPersistenceEntity; +import com.devonfw.application.jtqjava.queuedetailmanagement.common.api.QueueDetail; +import com.devonfw.application.jtqjava.visitormanagement.dataaccess.api.VisitorEntity; + +/** + * @author kragarwa + */ +@Entity +@Table(name = "QueueDetail") +public class QueueDetailEntity extends ApplicationPersistenceEntity implements QueueDetail { + + @Size(min = 2, max = 5) + private String queueNumber; + + @Temporal(TemporalType.TIMESTAMP) + private Timestamp creationTime; + + @Temporal(TemporalType.TIMESTAMP) + private Timestamp startTime; + + @Temporal(TemporalType.TIMESTAMP) + private Timestamp endTime; + + private String minEstimatedTime; + + private VisitorEntity visitor; + + private EventEntity Event; + + private static final long serialVersionUID = 1L; + + /** + * @return visitor + */ + @ManyToOne(cascade = CascadeType.DETACH, fetch = FetchType.EAGER) + @JoinColumn(name = "idVisitor") + public VisitorEntity getVisitor() { + + return this.visitor; + } + + /** + * @param visitor new value of {@link #getvisitor}. + */ + public void setVisitor(VisitorEntity visitor) { + + this.visitor = visitor; + } + + /** + * @return event + */ + @ManyToOne(cascade = CascadeType.DETACH, fetch = FetchType.EAGER) + @JoinColumn(name = "idEvent") + public EventEntity getEvent() { + + return this.Event; + } + + /** + * @param event new value of {@link #getevent}. + */ + public void setEvent(EventEntity event) { + + this.Event = event; + } + + /** + * @return queueNumber + */ + @Override + public String getQueueNumber() { + + return this.queueNumber; + } + + /** + * @param queueNumber new value of {@link #getqueueNumber}. + */ + @Override + public void setQueueNumber(String queueNumber) { + + this.queueNumber = queueNumber; + } + + /** + * @return creationTime + */ + @Override + public Timestamp getCreationTime() { + + return this.creationTime; + } + + /** + * @param creationTime new value of {@link #getcreationTime}. + */ + @Override + public void setCreationTime(Timestamp creationTime) { + + this.creationTime = creationTime; + } + + /** + * @return startTime + */ + @Override + public Timestamp getStartTime() { + + return this.startTime; + } + + /** + * @param startTime new value of {@link #getstartTime}. + */ + @Override + public void setStartTime(Timestamp startTime) { + + this.startTime = startTime; + } + + /** + * @return endTime + */ + @Override + public Timestamp getEndTime() { + + return this.endTime; + } + + /** + * @param endTime new value of {@link #getendTime}. + */ + @Override + public void setEndTime(Timestamp endTime) { + + this.endTime = endTime; + } + + @Override + @Transient + public Long getVisitorId() { + + if (this.visitor == null) { + return null; + } + return this.visitor.getId(); + } + + @Override + public void setVisitorId(Long visitorId) { + + if (visitorId == null) { + this.visitor = null; + } else { + VisitorEntity visitorEntity = new VisitorEntity(); + visitorEntity.setId(visitorId); + this.visitor = visitorEntity; + } + } + + @Override + @Transient + public Long getEventId() { + + if (this.Event == null) { + return null; + } + return this.Event.getId(); + } + + @Override + public void setEventId(Long EventId) { + + if (EventId == null) { + this.Event = null; + } else { + EventEntity eventEntity = new EventEntity(); + eventEntity.setId(EventId); + this.Event = eventEntity; + } + } + + /** + * @return minEstimatedTime + */ + @Override + public String getMinEstimatedTime() { + + return this.minEstimatedTime; + } + + /** + * @param minEstimatedTime new value of {@link #getminEstimatedTime}. + */ + @Override + public void setMinEstimatedTime(String minEstimatedTime) { + + this.minEstimatedTime = minEstimatedTime; + } + +} diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/dataaccess/api/repo/QueueDetailRepository.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/dataaccess/api/repo/QueueDetailRepository.java new file mode 100644 index 0000000..f31d0fc --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/dataaccess/api/repo/QueueDetailRepository.java @@ -0,0 +1,141 @@ +package com.devonfw.application.jtqjava.queuedetailmanagement.dataaccess.api.repo; + +import static com.querydsl.core.alias.Alias.$; + +import java.sql.Timestamp; +import java.util.Iterator; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; +import org.springframework.data.domain.Sort.Order; + +import com.devonfw.application.jtqjava.queuedetailmanagement.dataaccess.api.QueueDetailEntity; +import com.devonfw.application.jtqjava.queuedetailmanagement.logic.api.to.QueueDetailSearchCriteriaTo; +import com.devonfw.module.jpa.dataaccess.api.QueryUtil; +import com.devonfw.module.jpa.dataaccess.api.data.DefaultRepository; +import com.querydsl.jpa.impl.JPAQuery; + +/** + * {@link DefaultRepository} for {@link QueueDetailEntity} + */ +public interface QueueDetailRepository extends DefaultRepository { + + /** + * @param criteria the {@link QueueDetailSearchCriteriaTo} with the criteria to search. + * @return the {@link Page} of the {@link QueueDetailEntity} objects that matched the search. If no pageable is set, + * it will return a unique page with all the objects that matched the search. + */ + default Page findByCriteria(QueueDetailSearchCriteriaTo criteria) { + + QueueDetailEntity alias = newDslAlias(); + JPAQuery query = newDslQuery(alias); + + String queueNumber = criteria.getQueueNumber(); + if (queueNumber != null && !queueNumber.isEmpty()) { + QueryUtil.get().whereString(query, $(alias.getQueueNumber()), queueNumber, criteria.getQueueNumberOption()); + } + Timestamp creationTime = criteria.getCreationTime(); + if (creationTime != null) { + query.where($(alias.getCreationTime()).eq(creationTime)); + } + Timestamp startTime = criteria.getStartTime(); + if (startTime != null) { + query.where($(alias.getStartTime()).eq(startTime)); + } + Timestamp endTime = criteria.getEndTime(); + if (endTime != null) { + query.where($(alias.getEndTime()).eq(endTime)); + } + String minEstimatedTime = criteria.getMinEstimatedTime(); + if (minEstimatedTime != null) { + query.where($(alias.getMinEstimatedTime()).eq(minEstimatedTime)); + } + Long visitor = criteria.getVisitorId(); + if (visitor != null) { + query.where($(alias.getVisitor().getId()).eq(visitor)); + } + Long Event = criteria.getEventId(); + if (Event != null) { + query.where($(alias.getEvent().getId()).eq(Event)); + } + if (criteria.getPageable() == null) { + criteria.setPageable(PageRequest.of(0, Integer.MAX_VALUE)); + } else { + addOrderBy(query, alias, criteria.getPageable().getSort()); + } + + return QueryUtil.get().findPaginated(criteria.getPageable(), query, true); + } + + /** + * Add sorting to the given query on the given alias + * + * @param query to add sorting to + * @param alias to retrieve columns from for sorting + * @param sort specification of sorting + */ + public default void addOrderBy(JPAQuery query, QueueDetailEntity alias, Sort sort) { + + if (sort != null && sort.isSorted()) { + Iterator it = sort.iterator(); + while (it.hasNext()) { + Order next = it.next(); + switch (next.getProperty()) { + case "queueNumber": + if (next.isAscending()) { + query.orderBy($(alias.getQueueNumber()).asc()); + } else { + query.orderBy($(alias.getQueueNumber()).desc()); + } + break; + case "creationTime": + if (next.isAscending()) { + query.orderBy($(alias.getCreationTime()).asc()); + } else { + query.orderBy($(alias.getCreationTime()).desc()); + } + break; + case "startTime": + if (next.isAscending()) { + query.orderBy($(alias.getStartTime()).asc()); + } else { + query.orderBy($(alias.getStartTime()).desc()); + } + break; + case "endTime": + if (next.isAscending()) { + query.orderBy($(alias.getEndTime()).asc()); + } else { + query.orderBy($(alias.getEndTime()).desc()); + } + break; + case "minEstimatedTime": + if (next.isAscending()) { + query.orderBy($(alias.getMinEstimatedTime()).asc()); + } else { + query.orderBy($(alias.getMinEstimatedTime()).desc()); + } + break; + case "visitor": + if (next.isAscending()) { + query.orderBy($(alias.getVisitor().getId().toString()).asc()); + } else { + query.orderBy($(alias.getVisitor().getId().toString()).desc()); + } + break; + case "Event": + if (next.isAscending()) { + query.orderBy($(alias.getEvent().getId().toString()).asc()); + } else { + query.orderBy($(alias.getEvent().getId().toString()).desc()); + } + break; + default: + throw new IllegalArgumentException("Sorted by the unknown property '" + next.getProperty() + "'"); + } + } + } + } + +} diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/base/usecase/AbstractQueueDetailUc.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/base/usecase/AbstractQueueDetailUc.java new file mode 100644 index 0000000..84e2c00 --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/base/usecase/AbstractQueueDetailUc.java @@ -0,0 +1,27 @@ +package com.devonfw.application.jtqjava.queuedetailmanagement.logic.base.usecase; + +import javax.inject.Inject; + +import com.devonfw.application.jtqjava.general.logic.base.AbstractUc; +import com.devonfw.application.jtqjava.queuedetailmanagement.dataaccess.api.repo.QueueDetailRepository; + +/** + * Abstract use case for QueueDetails, which provides access to the commonly necessary data access objects. + */ +public class AbstractQueueDetailUc extends AbstractUc { + + /** @see #getQueueDetailRepository() */ + @Inject + private QueueDetailRepository queueDetailRepository; + + /** + * Returns the field 'queueDetailRepository'. + * + * @return the {@link QueueDetailRepository} instance. + */ + public QueueDetailRepository getQueueDetailRepository() { + + return this.queueDetailRepository; + } + +} diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/impl/QueuedetailmanagementImpl.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/impl/QueuedetailmanagementImpl.java new file mode 100644 index 0000000..866ed7b --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/impl/QueuedetailmanagementImpl.java @@ -0,0 +1,70 @@ +package com.devonfw.application.jtqjava.queuedetailmanagement.logic.impl; + +import javax.inject.Inject; +import javax.inject.Named; + +import org.springframework.data.domain.Page; + +import com.devonfw.application.jtqjava.general.logic.base.AbstractComponentFacade; +import com.devonfw.application.jtqjava.queuedetailmanagement.logic.api.Queuedetailmanagement; +import com.devonfw.application.jtqjava.queuedetailmanagement.logic.api.to.QueueDetailCto; +import com.devonfw.application.jtqjava.queuedetailmanagement.logic.api.to.QueueDetailEto; +import com.devonfw.application.jtqjava.queuedetailmanagement.logic.api.to.QueueDetailSearchCriteriaTo; +import com.devonfw.application.jtqjava.queuedetailmanagement.logic.api.usecase.UcFindQueueDetail; +import com.devonfw.application.jtqjava.queuedetailmanagement.logic.api.usecase.UcManageQueueDetail; + +/** + * Implementation of component interface of queuedetailmanagement + */ +@Named +public class QueuedetailmanagementImpl extends AbstractComponentFacade implements Queuedetailmanagement { + + @Inject + private UcFindQueueDetail ucFindQueueDetail; + + @Inject + private UcManageQueueDetail ucManageQueueDetail; + + @Override + public QueueDetailEto findQueueDetail(long id) { + + return this.ucFindQueueDetail.findQueueDetail(id); + } + + @Override + public Page findQueueDetails(QueueDetailSearchCriteriaTo criteria) { + + return this.ucFindQueueDetail.findQueueDetails(criteria); + } + + @Override + public QueueDetailEto saveQueueDetail(QueueDetailEto queuedetail) { + + return this.ucManageQueueDetail.saveQueueDetail(queuedetail); + } + + @Override + public void deleteQueueDetail(long id) { + + this.ucManageQueueDetail.deleteQueueDetail(id); + } + + @Override + public QueueDetailCto findQueueDetailCto(long id) { + + return this.ucFindQueueDetail.findQueueDetailCto(id); + } + + @Override + public Page findQueueDetailCtos(QueueDetailSearchCriteriaTo criteria) { + + return this.ucFindQueueDetail.findQueueDetailCtos(criteria); + } + + @Override + public Page findQueueDetailEtos(QueueDetailSearchCriteriaTo criteria) { + + return this.ucFindQueueDetail.findQueueDetailEtos(criteria); + } + +} diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/impl/usecase/UcFindQueueDetailImpl.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/impl/usecase/UcFindQueueDetailImpl.java new file mode 100644 index 0000000..a65ac72 --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/impl/usecase/UcFindQueueDetailImpl.java @@ -0,0 +1,97 @@ +package com.devonfw.application.jtqjava.queuedetailmanagement.logic.impl.usecase; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +import javax.inject.Named; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import com.devonfw.application.jtqjava.eventmanagement.logic.api.to.EventEto; +import com.devonfw.application.jtqjava.queuedetailmanagement.dataaccess.api.QueueDetailEntity; +import com.devonfw.application.jtqjava.queuedetailmanagement.logic.api.to.QueueDetailCto; +import com.devonfw.application.jtqjava.queuedetailmanagement.logic.api.to.QueueDetailEto; +import com.devonfw.application.jtqjava.queuedetailmanagement.logic.api.to.QueueDetailSearchCriteriaTo; +import com.devonfw.application.jtqjava.queuedetailmanagement.logic.api.usecase.UcFindQueueDetail; +import com.devonfw.application.jtqjava.queuedetailmanagement.logic.base.usecase.AbstractQueueDetailUc; +import com.devonfw.application.jtqjava.visitormanagement.logic.api.to.VisitorEto; + +/** + * Use case implementation for searching, filtering and getting QueueDetails + */ +@Named +@Validated +@Transactional +public class UcFindQueueDetailImpl extends AbstractQueueDetailUc implements UcFindQueueDetail { + + /** + * Logger instance. + */ + private static final Logger LOG = LoggerFactory.getLogger(UcFindQueueDetailImpl.class); + + @Override + public QueueDetailEto findQueueDetail(long id) { + + LOG.debug("Get QueueDetail with id {} from database.", id); + Optional foundEntity = getQueueDetailRepository().findById(id); + if (foundEntity.isPresent()) + return getBeanMapper().map(foundEntity.get(), QueueDetailEto.class); + else + return null; + } + + @Override + public Page findQueueDetails(QueueDetailSearchCriteriaTo criteria) { + + Page queuedetails = getQueueDetailRepository().findByCriteria(criteria); + return mapPaginatedEntityList(queuedetails, QueueDetailEto.class); + } + + @Override + public QueueDetailCto findQueueDetailCto(long id) { + + LOG.debug("Get QueueDetailCto with id {} from database.", id); + QueueDetailEntity entity = getQueueDetailRepository().find(id); + QueueDetailCto cto = new QueueDetailCto(); + cto.setQueueDetail(getBeanMapper().map(entity, QueueDetailEto.class)); + cto.setVisitor(getBeanMapper().map(entity.getVisitor(), VisitorEto.class)); + cto.setEvent(getBeanMapper().map(entity.getEvent(), EventEto.class)); + + return cto; + } + + @Override + public Page findQueueDetailCtos(QueueDetailSearchCriteriaTo criteria) { + + Page queuedetails = getQueueDetailRepository().findByCriteria(criteria); + List ctos = new ArrayList<>(); + for (QueueDetailEntity entity : queuedetails.getContent()) { + QueueDetailCto cto = new QueueDetailCto(); + cto.setQueueDetail(getBeanMapper().map(entity, QueueDetailEto.class)); + cto.setVisitor(getBeanMapper().map(entity.getVisitor(), VisitorEto.class)); + cto.setEvent(getBeanMapper().map(entity.getEvent(), EventEto.class)); + ctos.add(cto); + } + Pageable pagResultTo = PageRequest.of(criteria.getPageable().getPageNumber(), criteria.getPageable().getPageSize()); + + return new PageImpl<>(ctos, pagResultTo, queuedetails.getTotalElements()); + } + + @Override + public Page findQueueDetailEtos(QueueDetailSearchCriteriaTo criteria) { + + // TODO Auto-generated method stub + Page queueDetail = getQueueDetailRepository().findByCriteria(criteria); + + return mapPaginatedEntityList(queueDetail, QueueDetailEto.class); + } + +} diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/impl/usecase/UcManageQueueDetailImpl.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/impl/usecase/UcManageQueueDetailImpl.java new file mode 100644 index 0000000..14dc687 --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/impl/usecase/UcManageQueueDetailImpl.java @@ -0,0 +1,150 @@ +package com.devonfw.application.jtqjava.queuedetailmanagement.logic.impl.usecase; + +import java.sql.Timestamp; +import java.time.Instant; +import java.util.List; +import java.util.Objects; + +import javax.inject.Inject; +import javax.inject.Named; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import com.devonfw.application.jtqjava.eventmanagement.logic.api.Eventmanagement; +import com.devonfw.application.jtqjava.eventmanagement.logic.api.to.EventEto; +import com.devonfw.application.jtqjava.queuedetailmanagement.dataaccess.api.QueueDetailEntity; +import com.devonfw.application.jtqjava.queuedetailmanagement.logic.api.Queuedetailmanagement; +import com.devonfw.application.jtqjava.queuedetailmanagement.logic.api.to.QueueDetailEto; +import com.devonfw.application.jtqjava.queuedetailmanagement.logic.api.to.QueueDetailSearchCriteriaTo; +import com.devonfw.application.jtqjava.queuedetailmanagement.logic.api.usecase.UcManageQueueDetail; +import com.devonfw.application.jtqjava.queuedetailmanagement.logic.base.usecase.AbstractQueueDetailUc; + +/** + * Use case implementation for modifying and deleting QueueDetails + */ +@Named +@Validated +@Transactional +public class UcManageQueueDetailImpl extends AbstractQueueDetailUc implements UcManageQueueDetail { + + @Inject + private Eventmanagement eventManagement; + + @Inject + private Queuedetailmanagement queueDetailManagement; + + /** + * Logger instance. + */ + private static final Logger LOG = LoggerFactory.getLogger(UcManageQueueDetailImpl.class); + + @Override + public void deleteQueueDetail(long queueDetailId) { + + QueueDetailEntity queueDetail = getQueueDetailRepository().find(queueDetailId); + this.eventManagement.decreaseVisitorCount(queueDetail.getEventId()); + getQueueDetailRepository().delete(queueDetail); + LOG.debug("The queueDetail with id '{}' has been deleted.", queueDetailId); + + } + + @Override + public QueueDetailEto saveQueueDetail(QueueDetailEto queueDetailEto) { + + Objects.requireNonNull(queueDetailEto, "UcManageQueueDetailImpl queueDetail null"); + + QueueDetailEntity queueDetailEntity = getBeanMapper().map(queueDetailEto, QueueDetailEntity.class); + + long eventId = queueDetailEntity.getEventId(); + long visitorId = queueDetailEntity.getVisitorId(); + + QueueDetailSearchCriteriaTo queueDetailSearchCriteriaTo = new QueueDetailSearchCriteriaTo(); + queueDetailSearchCriteriaTo.setEventId(eventId); + queueDetailSearchCriteriaTo.setVisitorId(visitorId); + Pageable pageable = PageRequest.of(0, 1000); + queueDetailSearchCriteriaTo.setPageable(pageable); + + /** + * Calling the parent with the queueDetailManagement (injected) we use the method findQueueDetailEtos() that will + * call the implementation of the method inside (UcFindQueueDetailImpl) through the interface. This allows us to use + * the {@link UcFindQueueDetailImpl}. + */ + List queueDetailEtosInQueue = this.queueDetailManagement + .findQueueDetailEtos(queueDetailSearchCriteriaTo).getContent(); + + if (queueDetailEtosInQueue.isEmpty()) { + + QueueDetailSearchCriteriaTo queueDetailEventSearchCriteriaTo = new QueueDetailSearchCriteriaTo(); + queueDetailEventSearchCriteriaTo.setEventId(eventId); + Pageable pageable1 = PageRequest.of(0, 1000); + queueDetailEventSearchCriteriaTo.setPageable(pageable1); + + List queueDetailEventEtosInQueue = this.queueDetailManagement + .findQueueDetailEtos(queueDetailEventSearchCriteriaTo).getContent(); + + EventEto event = this.eventManagement.eventById(eventId); + + if (queueDetailEventEtosInQueue.isEmpty()) { + + queueDetailEntity.setQueueNumber("Q001"); + queueDetailEntity.setMinEstimatedTime(String.valueOf(event.getAttentionTime().getTime() / 1000)); + + } else { + + int lastIndex = queueDetailEventEtosInQueue.size() - 1; + QueueDetailEto lastQueueNumber = queueDetailEventEtosInQueue.get(lastIndex); + int lastTicketDigit = Integer.parseInt(lastQueueNumber.getQueueNumber().substring(1)); + queueDetailEntity.setQueueNumber(generateTicketCode(lastTicketDigit)); + queueDetailEntity.setMinEstimatedTime(calculateEstimatedTime(event, lastTicketDigit + 1)); + System.out.println(calculateEstimatedTime(event, lastTicketDigit + 1)); + } + + // set the creation time, startTime and endTime + queueDetailEntity.setCreationTime(Timestamp.from(Instant.now())); + queueDetailEntity.setStartTime(event.getStartDate()); + queueDetailEntity.setEndTime(event.getEndDate()); + + // save the queueDetail & increment visitor count + this.eventManagement.increaseVisitorCount(eventId); + QueueDetailEntity queueDetailEntitySaved = getQueueDetailRepository().save(queueDetailEntity); + LOG.debug("The queueDetail with id '{}' has been saved.", queueDetailEntitySaved.getId()); + + return getBeanMapper().map(queueDetailEntitySaved, QueueDetailEto.class); + } else { + return null; + } + } + + /** + * Generates a new ticked code using the ticket digit of the last Queue Number created. + * + * @param lastTicketDigit the int of the last queueNumber created. + * @return the String with the new ticket code (example: 'Q005'). + */ + public String generateTicketCode(int lastTicketDigit) { + + int newTicketDigit = lastTicketDigit + 1; + String newTicketCode = ""; + + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append(newTicketDigit); + while (stringBuilder.length() < 3) { + stringBuilder.insert(0, "0"); + } + stringBuilder.insert(0, "Q"); + newTicketCode = stringBuilder.toString(); + return newTicketCode; + } + + public String calculateEstimatedTime(EventEto event, int queueNumber) { + + long time = event.getAttentionTime().getTime(); + long queueTime = time * queueNumber / 1000; + return String.valueOf(queueTime); + } +} diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/service/impl/rest/QueuedetailmanagementRestServiceImpl.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/service/impl/rest/QueuedetailmanagementRestServiceImpl.java new file mode 100644 index 0000000..ebfbfa8 --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/service/impl/rest/QueuedetailmanagementRestServiceImpl.java @@ -0,0 +1,66 @@ +package com.devonfw.application.jtqjava.queuedetailmanagement.service.impl.rest; + +import javax.inject.Inject; +import javax.inject.Named; + +import org.springframework.data.domain.Page; + +import com.devonfw.application.jtqjava.queuedetailmanagement.logic.api.Queuedetailmanagement; +import com.devonfw.application.jtqjava.queuedetailmanagement.logic.api.to.QueueDetailCto; +import com.devonfw.application.jtqjava.queuedetailmanagement.logic.api.to.QueueDetailEto; +import com.devonfw.application.jtqjava.queuedetailmanagement.logic.api.to.QueueDetailSearchCriteriaTo; +import com.devonfw.application.jtqjava.queuedetailmanagement.service.api.rest.QueuedetailmanagementRestService; + +/** + * The service implementation for REST calls in order to execute the logic of component {@link Queuedetailmanagement}. + */ +@Named("QueuedetailmanagementRestService") +public class QueuedetailmanagementRestServiceImpl implements QueuedetailmanagementRestService { + + @Inject + private Queuedetailmanagement queuedetailmanagement; + + @Override + public QueueDetailEto getQueueDetail(long id) { + + return this.queuedetailmanagement.findQueueDetail(id); + } + + @Override + public QueueDetailEto saveQueueDetail(QueueDetailEto queuedetail) { + + return this.queuedetailmanagement.saveQueueDetail(queuedetail); + } + + @Override + public void deleteQueueDetail(long id) { + + this.queuedetailmanagement.deleteQueueDetail(id); + } + + @Override + public Page findQueueDetails(QueueDetailSearchCriteriaTo searchCriteriaTo) { + + return this.queuedetailmanagement.findQueueDetails(searchCriteriaTo); + } + + @Override + public QueueDetailEto joinTheQueue(long visitorId, long eventId) { + + // TODO Auto-generated method stub + return null; + } + + @Override + public QueueDetailCto getQueueDetailCto(long id) { + + return this.queuedetailmanagement.findQueueDetailCto(id); + } + + @Override + public Page findQueueDetailCtos(QueueDetailSearchCriteriaTo searchCriteriaTo) { + + return this.queuedetailmanagement.findQueueDetailCtos(searchCriteriaTo); + } + +} diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/visitormanagement/dataaccess/api/VisitorEntity.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/visitormanagement/dataaccess/api/VisitorEntity.java new file mode 100644 index 0000000..91915de --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/visitormanagement/dataaccess/api/VisitorEntity.java @@ -0,0 +1,144 @@ +package com.devonfw.application.jtqjava.visitormanagement.dataaccess.api; + +import javax.persistence.Entity; +import javax.persistence.Table; + +import com.devonfw.application.jtqjava.general.dataaccess.api.ApplicationPersistenceEntity; +import com.devonfw.application.jtqjava.visitormanagement.common.api.Visitor; + +/** + * @author kragarwa + */ +@Entity +@Table(name = "Visitor") +public class VisitorEntity extends ApplicationPersistenceEntity implements Visitor { + + private String username; + + private String name; + + private String phoneNumber; + + private String password; + + private Boolean acceptedCommercial; + + private Boolean acceptedTerms; + + private Boolean userType; + + private static final long serialVersionUID = 1L; + + /** + * @return username + */ + public String getUsername() { + + return this.username; + } + + /** + * @param username new value of {@link #getusername}. + */ + public void setUsername(String username) { + + this.username = username; + } + + /** + * @return name + */ + public String getName() { + + return this.name; + } + + /** + * @param name new value of {@link #getname}. + */ + public void setName(String name) { + + this.name = name; + } + + /** + * @return phoneNumber + */ + public String getPhoneNumber() { + + return this.phoneNumber; + } + + /** + * @param phoneNumber new value of {@link #getphoneNumber}. + */ + public void setPhoneNumber(String phoneNumber) { + + this.phoneNumber = phoneNumber; + } + + /** + * @return password + */ + public String getPassword() { + + return this.password; + } + + /** + * @param password new value of {@link #getpassword}. + */ + public void setPassword(String password) { + + this.password = password; + } + + /** + * @return acceptedCommercial + */ + public Boolean getAcceptedCommercial() { + + return this.acceptedCommercial; + } + + /** + * @param acceptedCommercial new value of {@link #getacceptedCommercial}. + */ + public void setAcceptedCommercial(Boolean acceptedCommercial) { + + this.acceptedCommercial = acceptedCommercial; + } + + /** + * @return acceptedTerms + */ + public Boolean getAcceptedTerms() { + + return this.acceptedTerms; + } + + /** + * @param acceptedTerms new value of {@link #getacceptedTerms}. + */ + public void setAcceptedTerms(Boolean acceptedTerms) { + + this.acceptedTerms = acceptedTerms; + } + + /** + * @return userType + */ + public Boolean getUserType() { + + return this.userType; + } + + /** + * @param userType new value of {@link #getuserType}. + */ + public void setUserType(Boolean userType) { + + this.userType = userType; + } + +} diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/visitormanagement/dataaccess/api/repo/VisitorRepository.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/visitormanagement/dataaccess/api/repo/VisitorRepository.java new file mode 100644 index 0000000..85b0d84 --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/visitormanagement/dataaccess/api/repo/VisitorRepository.java @@ -0,0 +1,140 @@ +package com.devonfw.application.jtqjava.visitormanagement.dataaccess.api.repo; + +import static com.querydsl.core.alias.Alias.$; + +import java.util.Iterator; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; +import org.springframework.data.domain.Sort.Order; + +import com.devonfw.application.jtqjava.visitormanagement.dataaccess.api.VisitorEntity; +import com.devonfw.application.jtqjava.visitormanagement.logic.api.to.VisitorSearchCriteriaTo; +import com.devonfw.module.jpa.dataaccess.api.QueryUtil; +import com.devonfw.module.jpa.dataaccess.api.data.DefaultRepository; +import com.querydsl.jpa.impl.JPAQuery; + +/** + * {@link DefaultRepository} for {@link VisitorEntity} + */ +public interface VisitorRepository extends DefaultRepository { + + /** + * @param criteria the {@link VisitorSearchCriteriaTo} with the criteria to search. + * @return the {@link Page} of the {@link VisitorEntity} objects that matched the search. If no pageable is set, it + * will return a unique page with all the objects that matched the search. + */ + default Page findByCriteria(VisitorSearchCriteriaTo criteria) { + + VisitorEntity alias = newDslAlias(); + JPAQuery query = newDslQuery(alias); + + String username = criteria.getUsername(); + if (username != null && !username.isEmpty()) { + QueryUtil.get().whereString(query, $(alias.getUsername()), username, criteria.getUsernameOption()); + } + String name = criteria.getName(); + if (name != null && !name.isEmpty()) { + QueryUtil.get().whereString(query, $(alias.getName()), name, criteria.getNameOption()); + } + String phoneNumber = criteria.getPhoneNumber(); + if (phoneNumber != null && !phoneNumber.isEmpty()) { + QueryUtil.get().whereString(query, $(alias.getPhoneNumber()), phoneNumber, criteria.getPhoneNumberOption()); + } + String password = criteria.getPassword(); + if (password != null && !password.isEmpty()) { + QueryUtil.get().whereString(query, $(alias.getPassword()), password, criteria.getPasswordOption()); + } + Boolean acceptedCommercial = criteria.getAcceptedCommercial(); + if (acceptedCommercial != null) { + query.where($(alias.getAcceptedCommercial()).eq(acceptedCommercial)); + } + Boolean acceptedTerms = criteria.getAcceptedTerms(); + if (acceptedTerms != null) { + query.where($(alias.getAcceptedTerms()).eq(acceptedTerms)); + } + Boolean userType = criteria.getUserType(); + if (userType != null) { + query.where($(alias.getUserType()).eq(userType)); + } + if (criteria.getPageable() == null) { + criteria.setPageable(PageRequest.of(0, Integer.MAX_VALUE)); + } else { + addOrderBy(query, alias, criteria.getPageable().getSort()); + } + + return QueryUtil.get().findPaginated(criteria.getPageable(), query, true); + } + + /** + * Add sorting to the given query on the given alias + * + * @param query to add sorting to + * @param alias to retrieve columns from for sorting + * @param sort specification of sorting + */ + public default void addOrderBy(JPAQuery query, VisitorEntity alias, Sort sort) { + + if (sort != null && sort.isSorted()) { + Iterator it = sort.iterator(); + while (it.hasNext()) { + Order next = it.next(); + switch (next.getProperty()) { + case "username": + if (next.isAscending()) { + query.orderBy($(alias.getUsername()).asc()); + } else { + query.orderBy($(alias.getUsername()).desc()); + } + break; + case "name": + if (next.isAscending()) { + query.orderBy($(alias.getName()).asc()); + } else { + query.orderBy($(alias.getName()).desc()); + } + break; + case "phoneNumber": + if (next.isAscending()) { + query.orderBy($(alias.getPhoneNumber()).asc()); + } else { + query.orderBy($(alias.getPhoneNumber()).desc()); + } + break; + case "password": + if (next.isAscending()) { + query.orderBy($(alias.getPassword()).asc()); + } else { + query.orderBy($(alias.getPassword()).desc()); + } + break; + case "acceptedCommercial": + if (next.isAscending()) { + query.orderBy($(alias.getAcceptedCommercial()).asc()); + } else { + query.orderBy($(alias.getAcceptedCommercial()).desc()); + } + break; + case "acceptedTerms": + if (next.isAscending()) { + query.orderBy($(alias.getAcceptedTerms()).asc()); + } else { + query.orderBy($(alias.getAcceptedTerms()).desc()); + } + break; + case "userType": + if (next.isAscending()) { + query.orderBy($(alias.getUserType()).asc()); + } else { + query.orderBy($(alias.getUserType()).desc()); + } + break; + default: + throw new IllegalArgumentException("Sorted by the unknown property '" + next.getProperty() + "'"); + } + } + } + } + +} \ No newline at end of file diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/visitormanagement/logic/base/usecase/AbstractVisitorUc.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/visitormanagement/logic/base/usecase/AbstractVisitorUc.java new file mode 100644 index 0000000..6686e70 --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/visitormanagement/logic/base/usecase/AbstractVisitorUc.java @@ -0,0 +1,27 @@ +package com.devonfw.application.jtqjava.visitormanagement.logic.base.usecase; + +import javax.inject.Inject; + +import com.devonfw.application.jtqjava.general.logic.base.AbstractUc; +import com.devonfw.application.jtqjava.visitormanagement.dataaccess.api.repo.VisitorRepository; + +/** + * Abstract use case for Visitors, which provides access to the commonly necessary data access objects. + */ +public class AbstractVisitorUc extends AbstractUc { + + /** @see #getVisitorRepository() */ + @Inject + private VisitorRepository visitorRepository; + + /** + * Returns the field 'visitorRepository'. + * + * @return the {@link VisitorRepository} instance. + */ + public VisitorRepository getVisitorRepository() { + + return this.visitorRepository; + } + +} diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/visitormanagement/logic/impl/VisitormanagementImpl.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/visitormanagement/logic/impl/VisitormanagementImpl.java new file mode 100644 index 0000000..4f67056 --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/visitormanagement/logic/impl/VisitormanagementImpl.java @@ -0,0 +1,50 @@ +package com.devonfw.application.jtqjava.visitormanagement.logic.impl; + +import javax.inject.Inject; +import javax.inject.Named; + +import org.springframework.data.domain.Page; + +import com.devonfw.application.jtqjava.general.logic.base.AbstractComponentFacade; +import com.devonfw.application.jtqjava.visitormanagement.logic.api.Visitormanagement; +import com.devonfw.application.jtqjava.visitormanagement.logic.api.to.VisitorEto; +import com.devonfw.application.jtqjava.visitormanagement.logic.api.to.VisitorSearchCriteriaTo; +import com.devonfw.application.jtqjava.visitormanagement.logic.api.usecase.UcFindVisitor; +import com.devonfw.application.jtqjava.visitormanagement.logic.api.usecase.UcManageVisitor; + +/** + * Implementation of component interface of visitormanagement + */ +@Named +public class VisitormanagementImpl extends AbstractComponentFacade implements Visitormanagement { + + @Inject + private UcFindVisitor ucFindVisitor; + + @Inject + private UcManageVisitor ucManageVisitor; + + @Override + public VisitorEto findVisitor(long id) { + + return this.ucFindVisitor.findVisitor(id); + } + + @Override + public Page findVisitors(VisitorSearchCriteriaTo criteria) { + + return this.ucFindVisitor.findVisitors(criteria); + } + + @Override + public VisitorEto saveVisitor(VisitorEto visitor) { + + return this.ucManageVisitor.saveVisitor(visitor); + } + + @Override + public boolean deleteVisitor(long id) { + + return this.ucManageVisitor.deleteVisitor(id); + } +} diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/visitormanagement/logic/impl/usecase/UcFindVisitorImpl.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/visitormanagement/logic/impl/usecase/UcFindVisitorImpl.java new file mode 100644 index 0000000..b37840a --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/visitormanagement/logic/impl/usecase/UcFindVisitorImpl.java @@ -0,0 +1,48 @@ +package com.devonfw.application.jtqjava.visitormanagement.logic.impl.usecase; + +import java.util.Optional; + +import javax.inject.Named; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.domain.Page; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import com.devonfw.application.jtqjava.visitormanagement.dataaccess.api.VisitorEntity; +import com.devonfw.application.jtqjava.visitormanagement.logic.api.to.VisitorEto; +import com.devonfw.application.jtqjava.visitormanagement.logic.api.to.VisitorSearchCriteriaTo; +import com.devonfw.application.jtqjava.visitormanagement.logic.api.usecase.UcFindVisitor; +import com.devonfw.application.jtqjava.visitormanagement.logic.base.usecase.AbstractVisitorUc; + +/** + * Use case implementation for searching, filtering and getting Visitors + */ +@Named +@Validated +@Transactional +public class UcFindVisitorImpl extends AbstractVisitorUc implements UcFindVisitor { + + /** Logger instance. */ + private static final Logger LOG = LoggerFactory.getLogger(UcFindVisitorImpl.class); + + @Override + public VisitorEto findVisitor(long id) { + + LOG.debug("Get Visitor with id {} from database.", id); + Optional foundEntity = getVisitorRepository().findById(id); + if (foundEntity.isPresent()) + return getBeanMapper().map(foundEntity.get(), VisitorEto.class); + else + return null; + } + + @Override + public Page findVisitors(VisitorSearchCriteriaTo criteria) { + + Page visitors = getVisitorRepository().findByCriteria(criteria); + return mapPaginatedEntityList(visitors, VisitorEto.class); + } + +} diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/visitormanagement/logic/impl/usecase/UcManageVisitorImpl.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/visitormanagement/logic/impl/usecase/UcManageVisitorImpl.java new file mode 100644 index 0000000..340b2c6 --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/visitormanagement/logic/impl/usecase/UcManageVisitorImpl.java @@ -0,0 +1,49 @@ +package com.devonfw.application.jtqjava.visitormanagement.logic.impl.usecase; + +import java.util.Objects; + +import javax.inject.Named; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import com.devonfw.application.jtqjava.visitormanagement.dataaccess.api.VisitorEntity; +import com.devonfw.application.jtqjava.visitormanagement.logic.api.to.VisitorEto; +import com.devonfw.application.jtqjava.visitormanagement.logic.api.usecase.UcManageVisitor; +import com.devonfw.application.jtqjava.visitormanagement.logic.base.usecase.AbstractVisitorUc; + +/** + * Use case implementation for modifying and deleting Visitors + */ +@Named +@Validated +@Transactional +public class UcManageVisitorImpl extends AbstractVisitorUc implements UcManageVisitor { + + /** Logger instance. */ + private static final Logger LOG = LoggerFactory.getLogger(UcManageVisitorImpl.class); + + @Override + public boolean deleteVisitor(long visitorId) { + + VisitorEntity visitor = getVisitorRepository().find(visitorId); + getVisitorRepository().delete(visitor); + LOG.debug("The visitor with id '{}' has been deleted.", visitorId); + return true; + } + + @Override + public VisitorEto saveVisitor(VisitorEto visitor) { + + Objects.requireNonNull(visitor, "visitor"); + + VisitorEntity visitorEntity = getBeanMapper().map(visitor, VisitorEntity.class); + + // initialize, validate visitorEntity here if necessary + VisitorEntity resultEntity = getVisitorRepository().save(visitorEntity); + LOG.debug("Visitor with id '{}' has been created.", resultEntity.getId()); + return getBeanMapper().map(resultEntity, VisitorEto.class); + } +} diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/visitormanagement/service/impl/rest/VisitormanagementRestServiceImpl.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/visitormanagement/service/impl/rest/VisitormanagementRestServiceImpl.java new file mode 100644 index 0000000..d3b6395 --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/visitormanagement/service/impl/rest/VisitormanagementRestServiceImpl.java @@ -0,0 +1,46 @@ +package com.devonfw.application.jtqjava.visitormanagement.service.impl.rest; + +import javax.inject.Inject; +import javax.inject.Named; + +import org.springframework.data.domain.Page; + +import com.devonfw.application.jtqjava.visitormanagement.logic.api.Visitormanagement; +import com.devonfw.application.jtqjava.visitormanagement.logic.api.to.VisitorEto; +import com.devonfw.application.jtqjava.visitormanagement.logic.api.to.VisitorSearchCriteriaTo; +import com.devonfw.application.jtqjava.visitormanagement.service.api.rest.VisitormanagementRestService; + +/** + * The service implementation for REST calls in order to execute the logic of component {@link Visitormanagement}. + */ +@Named("VisitormanagementRestService") +public class VisitormanagementRestServiceImpl implements VisitormanagementRestService { + + @Inject + private Visitormanagement visitormanagement; + + @Override + public VisitorEto getVisitor(long id) { + + System.out.println(this.visitormanagement.findVisitor(id)); + return this.visitormanagement.findVisitor(id); + } + + @Override + public VisitorEto saveVisitor(VisitorEto visitor) { + + return this.visitormanagement.saveVisitor(visitor); + } + + @Override + public void deleteVisitor(long id) { + + this.visitormanagement.deleteVisitor(id); + } + + @Override + public Page findVisitors(VisitorSearchCriteriaTo searchCriteriaTo) { + + return this.visitormanagement.findVisitors(searchCriteriaTo); + } +} \ No newline at end of file diff --git a/jumpthequeue-java/jtqjava/core/src/main/resources/META-INF/cxf/org.apache.cxf.Logger b/jumpthequeue-java/jtqjava/core/src/main/resources/META-INF/cxf/org.apache.cxf.Logger new file mode 100644 index 0000000..27dd788 --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/resources/META-INF/cxf/org.apache.cxf.Logger @@ -0,0 +1 @@ +org.apache.cxf.common.logging.Slf4jLogger \ No newline at end of file diff --git a/jumpthequeue-java/jtqjava/core/src/main/resources/application.properties b/jumpthequeue-java/jtqjava/core/src/main/resources/application.properties new file mode 100644 index 0000000..cee418c --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/resources/application.properties @@ -0,0 +1,36 @@ +# This is the configuration file shipped with the application that contains reasonable defaults. +# Environment specific configurations are configured in config/application.properties. +# If you are running in a servlet container you may add this to lib/config/application.properties in case you do not +# want to touch the WAR file. + +# server.port=8080 + +spring.application.name=jtqjava +server.servlet.context-path=/ + +security.expose.error.details=false +security.cors.enabled=true +spring.jpa.hibernate.ddl-auto=validate + +# Datasource for accessing the database +# https://github.com/spring-projects/spring-boot/blob/d3c34ee3d1bfd3db4a98678c524e145ef9bca51c/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/DatabaseDriver.java +spring.jpa.database=h2 +# spring.jpa.database-platform=org.hibernate.dialect.H2Dialect +# spring.datasource.driver-class-name=org.h2.Driver +spring.datasource.username=sa + +# Hibernate NamingStrategy has been deprecated and then removed in favor of two step naming strategy ImplicitNamingStrategy and PhysicalNamingStrategy +spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl +spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl + +# https://github.com/devonfw/devon4j/issues/65 +# https://vladmihalcea.com/the-open-session-in-view-anti-pattern/ +spring.jpa.open-in-view=false + +# to prevent that Spring Boot launches batch jobs on startup +# might otherwise lead to errors if job parameters are needed (or lead to unwanted modifications and longer startup times) +# see http://stackoverflow.com/questions/22318907/how-to-stop-spring-batch-scheduled-jobs-from-running-at-first-time-when-executin +spring.batch.job.enabled=false + +# Flyway for Database Setup and Migrations +spring.flyway.locations=classpath:db/migration diff --git a/jumpthequeue-java/jtqjava/core/src/main/resources/config/application.properties b/jumpthequeue-java/jtqjava/core/src/main/resources/config/application.properties new file mode 100644 index 0000000..a552651 --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/resources/config/application.properties @@ -0,0 +1,27 @@ +# This is the spring boot configuration file for development. It will not be included into the application. +# In order to set specific configurations in a regular installed environment create an according file +# config/application.properties in the server. If you are deploying the application to a servlet container as untouched +# WAR file you can locate this config folder in ${symbol_dollar}{CATALINA_BASE}/lib. If you want to deploy multiple applications to +# the same container (not recommended by default) you need to ensure the WARs are extracted in webapps folder and locate +# the config folder inside the WEB-INF/classes folder of the webapplication. + +server.port=8081 +server.servlet.context-path=/ + +# Datasource for accessing the database +# See https://github.com/devonfw/devon4j/blob/develop/documentation/guide-configuration.asciidoc#security-configuration +#jasypt.encryptor.password=none +#spring.datasource.password=ENC(7CnHiadYc0Wh2FnWADNjJg==) +spring.datasource.password= +spring.datasource.url=jdbc:h2:./.jtqjava; + +# print SQL to console for debugging (e.g. detect N+1 issues) +spring.jpa.show-sql=true +spring.jpa.properties.hibernate.format_sql=true + +# Enable JSON pretty printing +spring.jackson.serialization.INDENT_OUTPUT=true + +# Flyway for Database Setup and Migrations +spring.flyway.enabled=true +spring.flyway.clean-on-validation-error=true diff --git a/jumpthequeue-java/jtqjava/core/src/main/resources/db/migration/1.0/V0001__Create_Sequence.sql b/jumpthequeue-java/jtqjava/core/src/main/resources/db/migration/1.0/V0001__Create_Sequence.sql new file mode 100644 index 0000000..6bf006b --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/resources/db/migration/1.0/V0001__Create_Sequence.sql @@ -0,0 +1,3 @@ +-- Leave a large ID space reserved for master-data and test-data +CREATE SEQUENCE HIBERNATE_SEQUENCE START WITH 1000000; + diff --git a/jumpthequeue-java/jtqjava/core/src/main/resources/db/migration/1.0/V0005__Create_Visitor.sql b/jumpthequeue-java/jtqjava/core/src/main/resources/db/migration/1.0/V0005__Create_Visitor.sql new file mode 100644 index 0000000..9214d2b --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/resources/db/migration/1.0/V0005__Create_Visitor.sql @@ -0,0 +1,4 @@ +create table Visitor( id BIGINT NOT NULL AUTO_INCREMENT, modificationCounter INTEGER NOT NULL, +username VARCHAR(255), name VARCHAR(255), password VARCHAR(255), phoneNumber VARCHAR(255), +acceptedCommercial BOOL DEFAULT '0', acceptedTerms BOOL NOT NULL DEFAULT '0', userType BOOL DEFAULT '0', +CONSTRAINT PK_Visitor PRIMARY KEY(id) ); \ No newline at end of file diff --git a/jumpthequeue-java/jtqjava/core/src/main/resources/db/migration/1.0/V0006__Create_Event.sql b/jumpthequeue-java/jtqjava/core/src/main/resources/db/migration/1.0/V0006__Create_Event.sql new file mode 100644 index 0000000..e97eaf6 --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/resources/db/migration/1.0/V0006__Create_Event.sql @@ -0,0 +1,3 @@ +create table Event( id BIGINT NOT NULL AUTO_INCREMENT, modificationCounter INTEGER NOT NULL, +eventName VARCHAR(255), location VARCHAR(255), description VARCHAR(255), logo VARCHAR(255), visitorCount INTEGER, attentionTime TIMESTAMP, +startDate TIMESTAMP,endDate TIMESTAMP, CONSTRAINT PK_Event PRIMARY KEY(id) ); \ No newline at end of file diff --git a/jumpthequeue-java/jtqjava/core/src/main/resources/db/migration/1.0/V0007__Create_Queue_Detail.sql b/jumpthequeue-java/jtqjava/core/src/main/resources/db/migration/1.0/V0007__Create_Queue_Detail.sql new file mode 100644 index 0000000..fad4ffc --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/resources/db/migration/1.0/V0007__Create_Queue_Detail.sql @@ -0,0 +1,5 @@ +CREATE TABLE QueueDetail( id BIGINT NOT NULL AUTO_INCREMENT, modificationCounter INTEGER NOT NULL, +queueNumber VARCHAR(5), creationTime TIMESTAMP, startTime TIMESTAMP, endTime TIMESTAMP, minEstimatedTime VARCHAR(20), +idVisitor BIGINT NOT NULL, idEvent BIGINT NOT NULL, CONSTRAINT PK_AccessCode PRIMARY KEY(id), +CONSTRAINT FK_QueueDetail_idVisitor FOREIGN KEY(idVisitor) REFERENCES Visitor(id), +CONSTRAINT FK_QueueDetail_idEvent FOREIGN KEY(idEvent) REFERENCES Event(id)); \ No newline at end of file diff --git a/jumpthequeue-java/jtqjava/core/src/main/resources/db/migration/1.0/V0008__Master_data.sql b/jumpthequeue-java/jtqjava/core/src/main/resources/db/migration/1.0/V0008__Master_data.sql new file mode 100644 index 0000000..980dd21 --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/resources/db/migration/1.0/V0008__Master_data.sql @@ -0,0 +1,25 @@ +INSERT INTO Visitor (id, modificationCounter, username, name, password, phoneNumber, acceptedCommercial, +acceptedTerms, userType) VALUES (0, 1, 'mike@mail.com', 'test', '1', '123456789', '0', '1', '1'); +INSERT INTO Visitor (id, modificationCounter, username, name, password, phoneNumber, acceptedCommercial, +acceptedTerms, userType) VALUES (1, 1, 'peter@mail.com', 'test', '1', '123456789', '1', '1', '0'); +INSERT INTO Visitor (id, modificationCounter, username, name, password, phoneNumber, acceptedCommercial, +acceptedTerms, userType) VALUES (2, 1, 'krishna@mail.com', 'test', '1', '123456789', '1', '1', '0'); + +INSERT INTO Event (id, modificationCounter, +eventName, location, description, logo,visitorCount, attentionTime, +startDate,endDate) VALUES (1, 1, 'Indigo','Banglore','Biggest Color Fest', NULL,2, '2021-02-01 00:01:00', +'2021-01-01 00:01:00','2021-02-01 00:01:00'); +INSERT INTO Event (id, modificationCounter, +eventName, location, description, logo,visitorCount, attentionTime, +startDate,endDate) VALUES (2, 1, 'Food Fest','Banglore','Biggest Food Fest', NULL,0, '2021-02-01 00:01:00', +'2021-01-01 00:01:00','2021-02-01 00:01:00'); + + +INSERT INTO QueueDetail (id, modificationCounter, +queueNumber, creationTime, startTime, endTime, minEstimatedTime, +idVisitor, idEvent) +VALUES (1, 1, 'Q001', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, NULL, '2', 1,1); +INSERT INTO QueueDetail (id, modificationCounter, +queueNumber, creationTime, startTime, endTime, minEstimatedTime, +idVisitor, idEvent) +VALUES (2, 1, 'Q002', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, NULL, '2', 0,1); \ No newline at end of file diff --git a/jumpthequeue-java/jtqjava/core/src/main/resources/static/index.html b/jumpthequeue-java/jtqjava/core/src/main/resources/static/index.html new file mode 100644 index 0000000..88b7063 --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/main/resources/static/index.html @@ -0,0 +1,18 @@ + + + +Welcome + + +

Welcome

+ This is a test! +
+ Services Overview (CXF) +
+
+ +
+ +
+ + \ No newline at end of file diff --git a/jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/eventmanagement/logic/impl/EventmanagementTest.java b/jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/eventmanagement/logic/impl/EventmanagementTest.java new file mode 100644 index 0000000..6312695 --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/eventmanagement/logic/impl/EventmanagementTest.java @@ -0,0 +1,67 @@ +package com.devonfw.application.jtqjava.eventmanagement.logic.impl; + +import java.sql.Timestamp; +import java.time.Instant; + +import javax.inject.Inject; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +import com.devonfw.application.jtqjava.SpringBootApp; +import com.devonfw.application.jtqjava.eventmanagement.logic.api.Eventmanagement; +import com.devonfw.application.jtqjava.eventmanagement.logic.api.to.EventEto; +import com.devonfw.module.test.common.base.ComponentTest; + +/** + * @author kragarwa + * + */ +@SpringBootTest(classes = SpringBootApp.class) +public class EventmanagementTest extends ComponentTest { + + private EventEto eventEto = new EventEto(); + + @Inject + private Eventmanagement eventmanagement; + + @Override + protected void doSetUp() { + + this.eventEto.setEventName("December Fest"); + this.eventEto.setStartDate(Timestamp.from(Instant.now())); + this.eventEto.setEndDate(Timestamp.from(Instant.now())); + this.eventEto.setLocation("Banglore"); + this.eventEto.setDescription("Biggest december eve is here"); + this.eventEto.setLogo(""); + this.eventEto.setVisitorCount(1); + this.eventEto.setAttentionTime(Timestamp.from(Instant.now())); + } + + @Test + public void saveEventTest() { + + EventEto eventEtoResult = this.eventmanagement.saveEvent(this.eventEto); + + assertThat(eventEtoResult.getId()).isNotNull(); + this.eventmanagement.deleteEvent(eventEtoResult.getId()); + } + + @Test + public void increaseVisitorCountTest() { + + EventEto eventEtoResult = this.eventmanagement.saveEvent(this.eventEto); + this.eventmanagement.increaseVisitorCount(eventEtoResult.getId()); + EventEto event = this.eventmanagement.eventById(eventEtoResult.getId()); + assertThat(event.getVisitorCount()).isEqualTo(this.eventEto.getVisitorCount() + 1); + } + + @Test + public void decreaseVisitorCountTest() { + + EventEto eventEtoResult = this.eventmanagement.saveEvent(this.eventEto); + this.eventmanagement.decreaseVisitorCount(eventEtoResult.getId()); + EventEto event = this.eventmanagement.eventById(eventEtoResult.getId()); + assertThat(event.getVisitorCount()).isEqualTo(this.eventEto.getVisitorCount() - 1); + } +} diff --git a/jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/general/common/base/Devon4jPackageCheckTest.java b/jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/general/common/base/Devon4jPackageCheckTest.java new file mode 100644 index 0000000..8ea39be --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/general/common/base/Devon4jPackageCheckTest.java @@ -0,0 +1,66 @@ +package com.devonfw.application.jtqjava.general.common.base; + +import java.util.HashSet; +import java.util.Set; + +import net.sf.mmm.util.reflect.api.ReflectionUtil; +import net.sf.mmm.util.reflect.base.ReflectionUtilImpl; + +import org.assertj.core.api.SoftAssertions; +import org.junit.jupiter.api.Test; + +import com.devonfw.module.basic.common.api.reflect.Devon4jPackage; +import com.devonfw.module.test.common.base.ModuleTest; + +/** + * This test verifies that the entire code of your code-base is located in {@link Devon4jPackage#isValid() valid Devon4j + * packages}. + */ +public class Devon4jPackageCheckTest extends ModuleTest { + + /** + * Scans all the packages of this application root pacakge namespace. Will verify that these are + * {@link Devon4jPackage#isValid() valid Devon4j packages}. + */ + @Test + public void testPackages() { + + Devon4jPackage pkg = Devon4jPackage.of(Devon4jPackageCheckTest.class); + assertThat(pkg.isValid()).isTrue(); + + ReflectionUtil ru = ReflectionUtilImpl.getInstance(); + Set classNames = ru.findClassNames(getRootPackage2Scan(pkg), true); + String appPackage = pkg.getRoot() + "." + pkg.getApplication(); + Set packages = new HashSet<>(128); + packages.add(appPackage); // allow SpringBootApp, etc. in application package + SoftAssertions assertion = new SoftAssertions(); + for (String className : classNames) { + int lastDot = className.lastIndexOf('.'); + if (lastDot > 0) { + String packageName = className.substring(0, lastDot); + boolean added = packages.add(packageName); + if (added) { + pkg = Devon4jPackage.of(packageName); + if (!pkg.isValid()) { + assertion.assertThat(pkg.isValid()) + .as("package " + packageName + " is invalid (component: " + pkg.getComponent() + ", layer: " + + pkg.getLayer() + ", scope: " + pkg.getScope() + "). Hint contains e.g. " + + className.substring(lastDot + 1)) + .isTrue(); + } + } + } + } + assertion.assertAll(); + } + + /** + * @param pkg the {@link Devon4jPackage} of this test. + * @return the root package to scan for {@link Class}es to get the actual packages to check. + */ + protected String getRootPackage2Scan(Devon4jPackage pkg) { + + return pkg.getRoot() + "." + pkg.getApplication(); + } + +} diff --git a/jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/general/common/base/PermissionCheckTest.java b/jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/general/common/base/PermissionCheckTest.java new file mode 100644 index 0000000..85731e2 --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/general/common/base/PermissionCheckTest.java @@ -0,0 +1,67 @@ +package com.devonfw.application.jtqjava.general.common.base; + +import com.devonfw.module.test.common.base.ModuleTest; + +import java.lang.reflect.Method; +import java.util.Set; + +import javax.annotation.security.DenyAll; +import javax.annotation.security.PermitAll; +import javax.annotation.security.RolesAllowed; + +import net.sf.mmm.util.filter.api.Filter; +import net.sf.mmm.util.reflect.api.ReflectionUtil; +import net.sf.mmm.util.reflect.base.ReflectionUtilImpl; + +import org.assertj.core.api.SoftAssertions; +import org.junit.jupiter.api.Test; + +/** + * Tests the permission check in logic layer. + */ +public class PermissionCheckTest extends ModuleTest { + + /** + * Check if all relevant methods in use case implementations have permission checks i.e. {@link RolesAllowed}, + * {@link DenyAll} or {@link PermitAll} annotation is applied. This is only checked for methods that are declared in + * the corresponding interface and thus have the {@link Override} annotations applied. + */ + @Test + public void permissionCheckAnnotationPresent() { + + String packageName = "com.devonfw.application.jtqjava"; + Filter filter = new Filter() { + + @Override + public boolean accept(String value) { + + return value.contains(".logic.impl.usecase.Uc") && value.endsWith("Impl"); + } + + }; + ReflectionUtil ru = ReflectionUtilImpl.getInstance(); + Set classNames = ru.findClassNames(packageName, true, filter); + Set> classes = ru.loadClasses(classNames); + SoftAssertions assertions = new SoftAssertions(); + for (Class clazz : classes) { + Method[] methods = clazz.getDeclaredMethods(); + for (Method method : methods) { + Method parentMethod = ru.getParentMethod(method); + if (parentMethod != null) { + Class declaringClass = parentMethod.getDeclaringClass(); + if (declaringClass.isInterface() && declaringClass.getSimpleName().startsWith("Uc")) { + boolean hasAnnotation = false; + if (method.getAnnotation(RolesAllowed.class) != null || method.getAnnotation(DenyAll.class) != null + || method.getAnnotation(PermitAll.class) != null) { + hasAnnotation = true; + } + assertions.assertThat(hasAnnotation) + .as("Method " + method.getName() + " in Class " + clazz.getSimpleName() + " is missing access control") + .isTrue(); + } + } + } + } + assertions.assertAll(); + } +} diff --git a/jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/general/common/base/test/ApplicationComponentTest.java b/jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/general/common/base/test/ApplicationComponentTest.java new file mode 100644 index 0000000..5c99543 --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/general/common/base/test/ApplicationComponentTest.java @@ -0,0 +1,22 @@ +package com.devonfw.application.jtqjava.general.common.base.test; + +import com.devonfw.module.test.common.base.ComponentTest; + +import com.devonfw.application.jtqjava.SpringBootApp; + +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; + +/** + * Abstract base class for {@link ComponentTest}s of this application. + */ +@SpringBootTest(classes = { SpringBootApp.class }, webEnvironment = WebEnvironment.MOCK) +public abstract class ApplicationComponentTest extends ComponentTest { + + @Override + protected void doTearDown() { + super.doTearDown(); + TestUtil.logout(); + } + +} diff --git a/jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/general/common/base/test/ApplicationSubsystemTest.java b/jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/general/common/base/test/ApplicationSubsystemTest.java new file mode 100644 index 0000000..f521f5e --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/general/common/base/test/ApplicationSubsystemTest.java @@ -0,0 +1,16 @@ +package com.devonfw.application.jtqjava.general.common.base.test; + +import com.devonfw.module.test.common.base.SubsystemTest; + +import com.devonfw.application.jtqjava.SpringBootApp; + +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; + +/** + * Abstract base class for {@link SubsystemTest}s of this application. + */ +@SpringBootTest(classes = { SpringBootApp.class }, webEnvironment = WebEnvironment.RANDOM_PORT) +public abstract class ApplicationSubsystemTest extends SubsystemTest { + +} diff --git a/jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/general/common/base/test/DbTestHelper.java b/jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/general/common/base/test/DbTestHelper.java new file mode 100644 index 0000000..c1c48fb --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/general/common/base/test/DbTestHelper.java @@ -0,0 +1,44 @@ +package com.devonfw.application.jtqjava.general.common.base.test; + +import javax.inject.Named; + +import org.flywaydb.core.Flyway; + +/** + * This class provides methods for handling the database during testing where resets (and other operations) may be + * necessary. + */ +@Named +public class DbTestHelper { + + private Flyway flyway; + + /** + * The constructor. + * + * @param flyway an instance of type {@link Flyway}. + */ + public DbTestHelper(Flyway flyway) { + super(); + this.flyway = flyway; + } + + /** + * Drops the whole database. + */ + public void dropDatabase() { + + this.flyway.clean(); + } + + /** + * Calls {@link #dropDatabase()} internally, and migrates to the highest available migration (default) or to the + * {@code migrationVersion} specified by {@link #setMigrationVersion(String)}. + */ + public void resetDatabase() { + + dropDatabase(); + this.flyway.migrate(); + } + +} diff --git a/jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/general/common/base/test/TestUtil.java b/jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/general/common/base/test/TestUtil.java new file mode 100644 index 0000000..8908f49 --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/general/common/base/test/TestUtil.java @@ -0,0 +1,29 @@ +package com.devonfw.application.jtqjava.general.common.base.test; + +import org.springframework.security.authentication.TestingAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; + +/** + * This is a utility for testing. It allows to simulate authentication for component testing. + */ +public class TestUtil { + + /** + * @param login the id of the user to run the test as. + * @param permissions the permissions for the test. + */ + public static void login(String login, String... permissions) { + + Authentication authentication = new TestingAuthenticationToken(login, login, permissions); + SecurityContextHolder.getContext().setAuthentication(authentication); + } + + /** + * Logs off any previously logged on user. + */ + public static void logout() { + + SecurityContextHolder.getContext().setAuthentication(null); + } +} diff --git a/jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/general/common/impl/config/TestDbConfig.java b/jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/general/common/impl/config/TestDbConfig.java new file mode 100644 index 0000000..e6843c6 --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/general/common/impl/config/TestDbConfig.java @@ -0,0 +1,35 @@ +package com.devonfw.application.jtqjava.general.common.impl.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import com.devonfw.module.test.common.base.clean.TestCleaner; +import com.devonfw.module.test.common.base.clean.TestCleanerImpl; +import com.devonfw.module.test.common.base.clean.TestCleanerPlugin; +import com.devonfw.module.test.common.base.clean.TestCleanerPluginFlyway; + +/** + * {@link Configuration} for Database in JUnit tests. + */ +@Configuration +public class TestDbConfig { + + /** + * @return the {@link TestCleaner}. + */ + @Bean + public TestCleaner testCleaner() { + + return new TestCleanerImpl(); + } + + /** + * @return the {@link TestCleanerPluginFlyway}. + */ + @Bean + public TestCleanerPlugin testCleanerPluginFlyway() { + + return new TestCleanerPluginFlyway(); + } + +} diff --git a/jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/general/common/impl/config/TestWebSecurityConfig.java b/jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/general/common/impl/config/TestWebSecurityConfig.java new file mode 100644 index 0000000..34bc4c7 --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/general/common/impl/config/TestWebSecurityConfig.java @@ -0,0 +1,54 @@ +package com.devonfw.application.jtqjava.general.common.impl.config; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; +import org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint; +import org.springframework.security.web.authentication.www.BasicAuthenticationFilter; + +import com.devonfw.application.jtqjava.general.service.impl.config.BaseWebSecurityConfig; +import com.devonfw.module.basic.common.api.config.SpringProfileConstants; + +/** + * This type provides web security configuration for testing purposes. + */ +@Configuration +@EnableWebSecurity +@Profile(SpringProfileConstants.JUNIT) +public class TestWebSecurityConfig extends BaseWebSecurityConfig { + private static Logger LOG = LoggerFactory.getLogger(TestWebSecurityConfig.class); + + /** + * Configure spring security to enable a simple webform-login + a simple rest login. + */ + @Override + public void configure(HttpSecurity http) throws Exception { + + super.configure(http); + http.addFilterBefore(basicAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class); + + // Disable CSRF protection in tests for simpler testing of REST services + http.csrf().disable(); + LOG.debug("*** CSRF disabled - this config should only be used in development environment ***"); + } + + /** + * @return {@link BasicAuthenticationFilter}. + * @throws Exception on initialization error. + */ + @Bean + protected BasicAuthenticationFilter basicAuthenticationFilter() throws Exception { + + AuthenticationEntryPoint authenticationEntryPoint = new BasicAuthenticationEntryPoint(); + BasicAuthenticationFilter basicAuthenticationFilter = + new BasicAuthenticationFilter(authenticationManagerBean(), authenticationEntryPoint); + return basicAuthenticationFilter; + } + +} diff --git a/jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/general/service/base/test/RestServiceTest.java b/jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/general/service/base/test/RestServiceTest.java new file mode 100644 index 0000000..454e685 --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/general/service/base/test/RestServiceTest.java @@ -0,0 +1,67 @@ +package com.devonfw.application.jtqjava.general.service.base.test; + +import javax.inject.Inject; + +import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; + +import com.devonfw.application.jtqjava.SpringBootApp; +import com.devonfw.application.jtqjava.general.common.base.test.DbTestHelper; +import com.devonfw.application.jtqjava.general.common.base.test.TestUtil; + +import com.devonfw.module.test.common.base.SubsystemTest; +import com.devonfw.module.test.common.base.SubsystemDbTest; +import com.devonfw.module.service.common.api.client.ServiceClientFactory; + +/** + * Abstract base class for {@link SubsystemTest}s which runs the tests within a local server.
+ *
+ * The local server's port is randomly assigned. + */ +@SpringBootTest(classes = { SpringBootApp.class }, webEnvironment = WebEnvironment.RANDOM_PORT) +public abstract class RestServiceTest extends SubsystemDbTest { + + /** + * The port of the web server during the test. + */ + @LocalServerPort + protected int port; + + @Inject + private ServiceClientFactory serviceClientFactory; + + @Inject + private DbTestHelper dbTestHelper; + + @Override + protected void doSetUp() { + + super.doSetUp(); + } + + @Override + protected void doTearDown() { + + super.doTearDown(); + TestUtil.logout(); + } + + /** + * @return the {@link DbTestHelper} + */ + protected DbTestHelper getDbTestHelper() { + + return this.dbTestHelper; + } + + + /** + * @return the {@link ServiceClientFactory} + */ + protected ServiceClientFactory getServiceClientFactory() { + + return this.serviceClientFactory; + } + +} diff --git a/jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/visitormanagement/logic/impl/VisitormanagementTest.java b/jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/visitormanagement/logic/impl/VisitormanagementTest.java new file mode 100644 index 0000000..53f55ec --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/visitormanagement/logic/impl/VisitormanagementTest.java @@ -0,0 +1,63 @@ +package com.devonfw.application.jtqjava.visitormanagement.logic.impl; + +import javax.inject.Inject; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; + +import com.devonfw.application.jtqjava.SpringBootApp; +import com.devonfw.application.jtqjava.visitormanagement.logic.api.Visitormanagement; +import com.devonfw.application.jtqjava.visitormanagement.logic.api.to.VisitorEto; +import com.devonfw.application.jtqjava.visitormanagement.logic.api.to.VisitorSearchCriteriaTo; +import com.devonfw.module.test.common.base.ComponentTest; + +/** + * @author kragarwa + * + */ +@SpringBootTest(classes = SpringBootApp.class) +public class VisitormanagementTest extends ComponentTest { + + private VisitorEto visitorEto = new VisitorEto(); + + @Inject + private Visitormanagement visitormanagement; + + @Override + protected void doSetUp() { + + this.visitorEto.setName("Mary"); + this.visitorEto.setUsername("mary@mary.com"); + this.visitorEto.setPhoneNumber("123456789"); + this.visitorEto.setPassword("test"); + this.visitorEto.setUserType(false); + this.visitorEto.setAcceptedTerms(true); + this.visitorEto.setAcceptedCommercial(true); + } + + @Test + public void saveVisitorTest() { + + VisitorEto visitorEtoResult = this.visitormanagement.saveVisitor(this.visitorEto); + + assertThat(visitorEtoResult.getId()).isNotNull(); + assertThat(visitorEtoResult.getName()).isEqualTo("Mary"); + + this.visitormanagement.deleteVisitor(visitorEtoResult.getId()); + } + + @Test + public void findVisitorsTest() { + + VisitorSearchCriteriaTo criteria = new VisitorSearchCriteriaTo(); + Pageable pageable = PageRequest.of(0, 100); + criteria.setPageable(pageable); + Page result = this.visitormanagement.findVisitors(criteria); + + assertThat(result).isNotNull(); + } + +} diff --git a/jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjavaqueuedetailmanagement/logic/impl/QueueDetailmanagementTest.java b/jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjavaqueuedetailmanagement/logic/impl/QueueDetailmanagementTest.java new file mode 100644 index 0000000..0179a55 --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjavaqueuedetailmanagement/logic/impl/QueueDetailmanagementTest.java @@ -0,0 +1,75 @@ +package com.devonfw.application.jtqjavaqueuedetailmanagement.logic.impl; + +import java.sql.Timestamp; +import java.time.Instant; + +import javax.inject.Inject; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +import com.devonfw.application.jtqjava.SpringBootApp; +import com.devonfw.application.jtqjava.eventmanagement.logic.api.Eventmanagement; +import com.devonfw.application.jtqjava.eventmanagement.logic.api.to.EventEto; +import com.devonfw.application.jtqjava.queuedetailmanagement.logic.api.Queuedetailmanagement; +import com.devonfw.application.jtqjava.queuedetailmanagement.logic.api.to.QueueDetailEto; +import com.devonfw.application.jtqjava.visitormanagement.logic.api.Visitormanagement; +import com.devonfw.application.jtqjava.visitormanagement.logic.api.to.VisitorEto; +import com.devonfw.module.test.common.base.ComponentTest; + +/** + * @author kragarwa + * + */ +@SpringBootTest(classes = SpringBootApp.class) +public class QueueDetailmanagementTest extends ComponentTest { + + private QueueDetailEto queueDetailEto = new QueueDetailEto(); + + private VisitorEto visitorEto = new VisitorEto(); + + private EventEto eventEto = new EventEto(); + + @Inject + private Eventmanagement eventmanagement; + + @Inject + private Visitormanagement visitormanagement; + + @Inject + private Queuedetailmanagement queueDetailmanagement; + + @Override + protected void doSetUp() { + + this.visitorEto.setName("Mary"); + this.visitorEto.setUsername("mary@mary.com"); + this.visitorEto.setPhoneNumber("123456789"); + this.visitorEto.setPassword("test"); + this.visitorEto.setUserType(false); + this.visitorEto.setAcceptedTerms(true); + this.visitorEto.setAcceptedCommercial(true); + + this.eventEto.setEventName("December Fest"); + this.eventEto.setStartDate(Timestamp.from(Instant.now())); + this.eventEto.setEndDate(Timestamp.from(Instant.now())); + this.eventEto.setLocation("Banglore"); + this.eventEto.setDescription("Biggest december eve is here"); + this.eventEto.setLogo(""); + this.eventEto.setVisitorCount(1); + this.eventEto.setAttentionTime(Timestamp.from(Instant.now())); + + } + + @Test + public void saveQueueDetailTest() { + + EventEto eventEtoResult = this.eventmanagement.saveEvent(this.eventEto); + VisitorEto visitorEtoResult = this.visitormanagement.saveVisitor(this.visitorEto); + this.queueDetailEto.setEventId(eventEtoResult.getId()); + this.queueDetailEto.setVisitorId(visitorEtoResult.getId()); + QueueDetailEto queueDetailEtoResult = this.queueDetailmanagement.saveQueueDetail(this.queueDetailEto); + + assertThat(queueDetailEtoResult.getId()).isNotNull(); + } +} diff --git a/jumpthequeue-java/jtqjava/core/src/test/resources/config/application.properties b/jumpthequeue-java/jtqjava/core/src/test/resources/config/application.properties new file mode 100644 index 0000000..921492c --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/test/resources/config/application.properties @@ -0,0 +1,13 @@ +# This is the spring boot configuration file for JUnit tests. It will only affect JUnits and is not included into the application. +spring.profiles.active=junit + +# Database and JPA +spring.jpa.database=h2 +spring.datasource.url=jdbc:h2:mem:app; +spring.datasource.password= +spring.datasource.username=sa +spring.jpa.hibernate.ddl-auto=none + +# Flyway for Database Setup and Migrations +spring.flyway.enabled=true +spring.flyway.locations=classpath:db/migration diff --git a/jumpthequeue-java/jtqjava/core/src/test/resources/db/test/V0001__InitDb.sql b/jumpthequeue-java/jtqjava/core/src/test/resources/db/test/V0001__InitDb.sql new file mode 100644 index 0000000..2210438 --- /dev/null +++ b/jumpthequeue-java/jtqjava/core/src/test/resources/db/test/V0001__InitDb.sql @@ -0,0 +1,2 @@ +-- Leave a large ID space reserved for master-data and test-data +CREATE SEQUENCE HIBERNATE_SEQUENCE START WITH 1000000; diff --git a/jumpthequeue-java/jtqjava/pom.xml b/jumpthequeue-java/jtqjava/pom.xml new file mode 100644 index 0000000..bb878d5 --- /dev/null +++ b/jumpthequeue-java/jtqjava/pom.xml @@ -0,0 +1,488 @@ + + + 4.0.0 + jtqjava + com.devonfw.java.jtqjava + 0.0.1 + pom + ${project.artifactId} + Application based on the devon4j. + + + 2.2.7.RELEASE + 2020.08.001 + 1.8 + 5.6.1 + UTF-8 + UTF-8 + 2.10.3 + 28.1-jre + system + + + + api + core + server + + + + + + + com.fasterxml.jackson + jackson-bom + ${jackson.version} + pom + import + + + + org.junit + junit-bom + ${junit.version} + pom + import + + + + com.google.guava + guava + ${guava.version} + + + + org.springframework.boot + spring-boot-dependencies + ${spring.boot.version} + pom + import + + + + com.devonfw.java.boms + devon4j-bom + ${devon4j.version} + pom + import + + + + + + + org.slf4j + slf4j-api + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + ${project.build.sourceEncoding} + ${java.version} + ${java.version} + + + + + maven-surefire-plugin + + ${devonfw.test.excluded.groups} + + + + + + org.jacoco + jacoco-maven-plugin + + + default-prepare-agent + + prepare-agent + + + + default-report + + report + + + + + + + + + org.apache.maven.plugins + maven-resources-plugin + 3.1.0 + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + + org.apache.maven.plugins + maven-install-plugin + 2.5.2 + + + org.apache.maven.plugins + maven-deploy-plugin + 2.8.2 + + + org.apache.maven.plugins + maven-clean-plugin + 3.1.0 + + + org.apache.maven.plugins + maven-jar-plugin + 3.1.2 + + + org.apache.maven.plugins + maven-source-plugin + 3.1.0 + + + org.apache.maven.plugins + maven-site-plugin + 3.7.1 + + + org.apache.maven.plugins + maven-checkstyle-plugin + 3.1.0 + + + org.apache.maven.plugins + maven-changes-plugin + 2.12.1 + + + org.apache.maven.plugins + maven-changelog-plugin + 2.3 + + + org.apache.maven.plugins + maven-project-info-reports-plugin + 3.0.0 + + + org.apache.maven.plugins + maven-jxr-plugin + 3.0.0 + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.1.1 + + + + true + protected + ${project.reporting.outputEncoding} + ${project.build.sourceEncoding} + true + ${user.dir}/src/main/javadoc/stylesheet.css + none + ${java.version} + JavaDocs for ${project.name} ${project.version} + JavaDocs for ${project.name} ${project.version} + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.22.2 + + + ${basedir} + + + + org.apache.maven.plugins + maven-surefire-report-plugin + 2.22.2 + + + org.apache.maven.plugins + maven-pmd-plugin + 3.9.0 + + ${java.version} + + + + org.apache.maven.plugins + maven-war-plugin + 3.2.3 + + + org.apache.maven.plugins + maven-antrun-plugin + 1.8 + + + org.apache.maven.plugins + maven-help-plugin + 3.2.0 + + + org.apache.maven.plugins + maven-gpg-plugin + 1.6 + + + org.apache.maven.plugins + maven-archetype-plugin + 3.1.2 + + + org.apache.maven.archetype + archetype-packaging + 3.1.2 + + + org.codehaus.mojo + taglist-maven-plugin + 2.4 + + + org.codehaus.mojo + cobertura-maven-plugin + 2.7 + + + org.codehaus.mojo + flatten-maven-plugin + 1.2.2 + + + org.codehaus.mojo + license-maven-plugin + 1.20 + + ${project.build.directory}/generated-resources + true + true + true + true + + Apache Software License, Version 2.0|The Apache Software License, Version 2.0|Apache 2.0|Apache License, Version 2.0 + + + + + org.codehaus.mojo + servicedocgen-maven-plugin + 1.0.0-beta-3 + + + org.sonarsource.scanner.maven + sonar-maven-plugin + 3.7.0.1746 + + + org.jacoco + jacoco-maven-plugin + 0.8.5 + + + org.owasp + dependency-check-maven + 5.2.2 + + + com.github.spotbugs + spotbugs-maven-plugin + 3.1.12.2 + + + org.springframework.boot + spring-boot-maven-plugin + ${spring.boot.version} + + + + + + + + moduletest + + component,subsystem,system + + + + componenttest + + subsystem,system + + + + subsystemtest + + system + + + + systemtest + + none + + + + security + + + + org.owasp + dependency-check-maven + + 8 + + + + + check + + + + + + + + + licenses + + + + org.codehaus.mojo + license-maven-plugin + + + aggregate-add-third-party + generate-resources + + aggregate-add-third-party + + + + + aggregate-download-licenses + generate-resources + + aggregate-download-licenses + + + + + + + + + + eclipse + + + eclipse.application + + + + eclipse-target + + + + + + + + org.apache.maven.plugins + maven-project-info-reports-plugin + + false + + + + org.apache.maven.plugins + maven-jxr-plugin + + + org.apache.maven.plugins + maven-javadoc-plugin + + + org.codehaus.mojo + taglist-maven-plugin + + + TODO + @todo + FIXME + @deprecated + REVIEW + + + + + org.owasp + dependency-check-maven + + false + + + + + aggregate + check + + + + + + org.codehaus.mojo + servicedocgen-maven-plugin + + + + ${servicedoc.info.title} + ${servicedoc.info.description} + + ${servicedoc.host} + ${servicedoc.port} + ${servicedoc.basePath} + + http + + + + + + org.codehaus.mojo + license-maven-plugin + + + + third-party-report + aggregate-third-party-report + + + + + + + + diff --git a/jumpthequeue-java/jtqjava/server/pom.xml b/jumpthequeue-java/jtqjava/server/pom.xml new file mode 100644 index 0000000..cd6911f --- /dev/null +++ b/jumpthequeue-java/jtqjava/server/pom.xml @@ -0,0 +1,145 @@ + + + 4.0.0 + + com.devonfw.java.jtqjava + jtqjava + 0.0.1 + + jtqjava-server + war + ${project.artifactId} + Server for the jtqjava application - a simple example based on devon4j. + + + + ${project.groupId} + jtqjava-core + ${project.version} + + + + com.devonfw.java.modules + devon4j-test-jpa + test + + + + + + jsclient + + + false + + + + + org.codehaus.mojo + exec-maven-plugin + + + npm-install + generate-sources + + exec + + + npm + + install + + ${js.client.dir} + + + + gulp-clean + generate-sources + + exec + + + gulp + + clean + + ${js.client.dir} + + + + gulp-build + generate-sources + + exec + + + gulp + + build:dist + + ${js.client.dir} + + + + gulp-test + test + + exec + + + gulp + + test + + ${js.client.dir} + + + + + + org.apache.maven.plugins + maven-war-plugin + + WEB-INF/classes/config/application.properties + ${project.artifactId} + false + + + + + + + + + + + ${project.basedir}/src/main/resources + + + ${js.client.dir}/dist + static + + + + + org.springframework.boot + spring-boot-maven-plugin + + com.devonfw.application.jtqjava.SpringBootApp + bootified + ${project.artifactId} + + + + + repackage + + + + + + + + + diff --git a/jumpthequeue-java/jtqjava/server/src/main/resources/logback.xml b/jumpthequeue-java/jtqjava/server/src/main/resources/logback.xml new file mode 100644 index 0000000..01465d1 --- /dev/null +++ b/jumpthequeue-java/jtqjava/server/src/main/resources/logback.xml @@ -0,0 +1,32 @@ + + + + + + false + correlationId + + timestamp + [ignore] + [ignore] + +      {"appname":"jtqjava"} + UTC + + + + + + + + + + + + + + + + + + diff --git a/jumpthequeue-java/jtqjava/src/main/java/com/devonfw/application/jtqjava/SpringBootBatchApp.java b/jumpthequeue-java/jtqjava/src/main/java/com/devonfw/application/jtqjava/SpringBootBatchApp.java new file mode 100644 index 0000000..d0de265 --- /dev/null +++ b/jumpthequeue-java/jtqjava/src/main/java/com/devonfw/application/jtqjava/SpringBootBatchApp.java @@ -0,0 +1,29 @@ +package com.devonfw.application.jtqjava; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.actuate.autoconfigure.endpoint.EndpointAutoConfiguration; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; +import org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; + +import com.devonfw.module.jpa.dataaccess.api.AdvancedRevisionEntity; + +/** + * {@link SpringBootApplication} for running this batch. + */ +@SpringBootApplication +@EntityScan(basePackages = { "com.devonfw.application.jtqjava" }, basePackageClasses = { AdvancedRevisionEntity.class }) +public class SpringBootBatchApp { + + /** + * Entry point for spring-boot based app + * + * @param args - arguments + */ + public static void main(String[] args) { + + SpringApplication.run(SpringBootBatchApp.class, args); + } +} diff --git a/jumpthequeue-java/jtqjava/src/main/java/com/devonfw/application/jtqjava/general/batch/impl/config/BeansBatchConfig.java b/jumpthequeue-java/jtqjava/src/main/java/com/devonfw/application/jtqjava/general/batch/impl/config/BeansBatchConfig.java new file mode 100644 index 0000000..e871dc7 --- /dev/null +++ b/jumpthequeue-java/jtqjava/src/main/java/com/devonfw/application/jtqjava/general/batch/impl/config/BeansBatchConfig.java @@ -0,0 +1,193 @@ +package com.devonfw.application.jtqjava.general.batch.impl.config; + +import javax.inject.Inject; +import javax.sql.DataSource; + +import org.springframework.batch.core.configuration.support.JobRegistryBeanPostProcessor; +import org.springframework.batch.core.configuration.support.MapJobRegistry; +import org.springframework.batch.core.explore.support.JobExplorerFactoryBean; +import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.launch.support.SimpleJobOperator; +import org.springframework.batch.core.repository.support.JobRepositoryFactoryBean; +import org.springframework.beans.factory.BeanCreationException; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.DependsOn; +import org.springframework.transaction.PlatformTransactionManager; + +/** + * This class contains the configuration like jobLauncher,Jobrepository etc. + */ +import com.devonfw.module.batch.common.impl.JobLauncherWithAdditionalRestartCapabilities; + +/** + * This class contains configuration of batch beans. + */ +@Configuration +public class BeansBatchConfig { + + private JobRepositoryFactoryBean jobRepository; + + private MapJobRegistry jobRegistry; + + private JobLauncherWithAdditionalRestartCapabilities jobLauncher; + + private JobExplorerFactoryBean jobExplorer; + + private DataSource dataSource; + + private PlatformTransactionManager transactionManager; + + @Value("ISOLATION_DEFAULT") + private String isolationLevelForCreate; + + /** + * This method is creating joboperator bean + * + * @return SimpleJobOperator + */ + @Bean + @DependsOn({ "jobRepository", "jobExplorer", "jobRegistry", "jobLauncher" }) + public SimpleJobOperator jobOperator() { + + SimpleJobOperator jobOperator = new SimpleJobOperator(); + try { + jobOperator.setJobExplorer(this.jobExplorer.getObject()); + } catch (Exception e) { + throw new BeanCreationException("Could not create BatchJobOperator", e); + } + + jobOperator.setJobLauncher(this.jobLauncher); + jobOperator.setJobRegistry(this.jobRegistry); + + try { + jobOperator.setJobRepository(this.jobRepository.getObject()); + } catch (Exception e) { + throw new BeanCreationException("Could not create BatchJobOperator", e); + } + + return jobOperator; + } + + /** + * This method is creating jobrepository + * + * @return JobRepositoryFactoryBean + */ + @Bean(name = "jobRepository") + public JobRepositoryFactoryBean jobRepository() { + + this.jobRepository = new JobRepositoryFactoryBean(); + this.jobRepository.setDataSource(this.dataSource); + this.jobRepository.setTransactionManager(this.transactionManager); + this.jobRepository.setIsolationLevelForCreate(this.isolationLevelForCreate); + return this.jobRepository; + } + + /** + * This method is creating jobLauncher bean + * + * @return SimpleJobLauncher + */ + @Bean + @DependsOn("jobRepository") + public JobLauncherWithAdditionalRestartCapabilities jobLauncher() { + + this.jobLauncher = new JobLauncherWithAdditionalRestartCapabilities(); + + try { + this.jobLauncher.setJobRepository(this.jobRepository.getObject()); + } catch (Exception e) { + throw new BeanCreationException("Could not create BatchJobOperator", e); + } + + return this.jobLauncher; + } + + /** + * This method is creating jobExplorer bean + * + * @return JobExplorerFactoryBean + */ + @Bean + @DependsOn("dataSource") + public JobExplorerFactoryBean jobExplorer() { + + this.jobExplorer = new JobExplorerFactoryBean(); + this.jobExplorer.setDataSource(this.dataSource); + return this.jobExplorer; + } + + /** + * This method is creating jobRegistry bean + * + * @return MapJobRegistry + */ + @Bean + public MapJobRegistry jobRegistry() { + + this.jobRegistry = new MapJobRegistry(); + return this.jobRegistry; + } + + /** + * This method is creating JobRegistryBeanPostProcessor + * + * @return JobRegistryBeanPostProcessor + */ + @Bean + @DependsOn("jobRegistry") + public JobRegistryBeanPostProcessor jobRegistryBeanPostProcessor() { + + JobRegistryBeanPostProcessor postProcessor = new JobRegistryBeanPostProcessor(); + postProcessor.setJobRegistry(this.jobRegistry); + return postProcessor; + } + + /** + * This method is creating incrementer + * + * @return RunIdIncrementer + */ + @Bean + public RunIdIncrementer incrementer() { + + return new RunIdIncrementer(); + } + + /** + * @return datasource + */ + public DataSource getDataSource() { + + return this.dataSource; + } + + /** + * @param datasource the datasource to set + */ + @Inject + public void setDataSource(DataSource datasource) { + + this.dataSource = datasource; + } + + /** + * @return transactionManager + */ + public PlatformTransactionManager getTransactionManager() { + + return this.transactionManager; + } + + /** + * @param transactionManager the transactionManager to set + */ + @Inject + public void setTransactionManager(PlatformTransactionManager transactionManager) { + + this.transactionManager = transactionManager; + } + +} diff --git a/jumpthequeue-java/jtqjava/src/main/resources/db/migration/h2/V0005__Add_batch_tables.sql b/jumpthequeue-java/jtqjava/src/main/resources/db/migration/h2/V0005__Add_batch_tables.sql new file mode 100644 index 0000000..980d37d --- /dev/null +++ b/jumpthequeue-java/jtqjava/src/main/resources/db/migration/h2/V0005__Add_batch_tables.sql @@ -0,0 +1,81 @@ +-- Autogenerated: do not edit this file + +CREATE TABLE BATCH_JOB_INSTANCE ( + JOB_INSTANCE_ID BIGINT IDENTITY NOT NULL PRIMARY KEY , + VERSION BIGINT , + JOB_NAME VARCHAR(100) NOT NULL, + JOB_KEY VARCHAR(32) NOT NULL, + constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY) +) ; + +CREATE TABLE BATCH_JOB_EXECUTION ( + JOB_EXECUTION_ID BIGINT IDENTITY NOT NULL PRIMARY KEY , + VERSION BIGINT , + JOB_INSTANCE_ID BIGINT NOT NULL, + CREATE_TIME TIMESTAMP NOT NULL, + START_TIME TIMESTAMP DEFAULT NULL , + END_TIME TIMESTAMP DEFAULT NULL , + STATUS VARCHAR(10) , + EXIT_CODE VARCHAR(2500) , + EXIT_MESSAGE VARCHAR(2500) , + LAST_UPDATED TIMESTAMP, + JOB_CONFIGURATION_LOCATION VARCHAR(2500) NULL, + constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID) + references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID) +) ; + +CREATE TABLE BATCH_JOB_EXECUTION_PARAMS ( + JOB_EXECUTION_ID BIGINT NOT NULL , + TYPE_CD VARCHAR(6) NOT NULL , + KEY_NAME VARCHAR(100) NOT NULL , + STRING_VAL VARCHAR(250) , + DATE_VAL TIMESTAMP DEFAULT NULL , + LONG_VAL BIGINT , + DOUBLE_VAL DOUBLE PRECISION , + IDENTIFYING CHAR(1) NOT NULL , + constraint JOB_EXEC_PARAMS_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) ; + +CREATE TABLE BATCH_STEP_EXECUTION ( + STEP_EXECUTION_ID BIGINT IDENTITY NOT NULL PRIMARY KEY , + VERSION BIGINT NOT NULL, + STEP_NAME VARCHAR(100) NOT NULL, + JOB_EXECUTION_ID BIGINT NOT NULL, + START_TIME TIMESTAMP NOT NULL , + END_TIME TIMESTAMP DEFAULT NULL , + STATUS VARCHAR(10) , + COMMIT_COUNT BIGINT , + READ_COUNT BIGINT , + FILTER_COUNT BIGINT , + WRITE_COUNT BIGINT , + READ_SKIP_COUNT BIGINT , + WRITE_SKIP_COUNT BIGINT , + PROCESS_SKIP_COUNT BIGINT , + ROLLBACK_COUNT BIGINT , + EXIT_CODE VARCHAR(2500) , + EXIT_MESSAGE VARCHAR(2500) , + LAST_UPDATED TIMESTAMP, + constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) ; + +CREATE TABLE BATCH_STEP_EXECUTION_CONTEXT ( + STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, + SHORT_CONTEXT VARCHAR(2500) NOT NULL, + SERIALIZED_CONTEXT LONGVARCHAR , + constraint STEP_EXEC_CTX_FK foreign key (STEP_EXECUTION_ID) + references BATCH_STEP_EXECUTION(STEP_EXECUTION_ID) +) ; + +CREATE TABLE BATCH_JOB_EXECUTION_CONTEXT ( + JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, + SHORT_CONTEXT VARCHAR(2500) NOT NULL, + SERIALIZED_CONTEXT LONGVARCHAR , + constraint JOB_EXEC_CTX_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) ; + +CREATE SEQUENCE BATCH_STEP_EXECUTION_SEQ; +CREATE SEQUENCE BATCH_JOB_EXECUTION_SEQ; +CREATE SEQUENCE BATCH_JOB_SEQ; diff --git a/jumpthequeue-java/jtqjava/src/test/java/com/devonfw/application/jtqjava/general/batch/base/test/SpringBatchIntegrationTest.java b/jumpthequeue-java/jtqjava/src/test/java/com/devonfw/application/jtqjava/general/batch/base/test/SpringBatchIntegrationTest.java new file mode 100644 index 0000000..79b1dd4 --- /dev/null +++ b/jumpthequeue-java/jtqjava/src/test/java/com/devonfw/application/jtqjava/general/batch/base/test/SpringBatchIntegrationTest.java @@ -0,0 +1,53 @@ +package com.devonfw.application.jtqjava.general.batch.base.test; + +import javax.inject.Inject; + +import org.flywaydb.core.Flyway; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.batch.core.Job; +import org.springframework.batch.core.launch.JobLauncher; +import org.springframework.batch.test.JobLauncherTestUtils; + +import com.devonfw.application.jtqjava.general.common.base.test.TestUtil; +import com.devonfw.module.test.common.base.ComponentTest; + +/** + * Base class for all spring batch integration tests. It helps to do End-to-End job tests. + */ +public abstract class SpringBatchIntegrationTest extends ComponentTest { + + @Inject + private JobLauncher jobLauncher; + + @Inject + private Flyway flyway; + + @Override + protected void doSetUp() { + + super.doSetUp(); + this.flyway.clean(); + this.flyway.migrate(); + } + + @Override + protected void doTearDown() { + + super.doTearDown(); + TestUtil.logout(); + } + + /** + * @param job job to configure + * @return jobLauncherTestUtils + */ + public JobLauncherTestUtils getJobLauncherTestUtils(Job job) { + + JobLauncherTestUtils jobLauncherTestUtils = new JobLauncherTestUtils(); + jobLauncherTestUtils.setJob(job); + jobLauncherTestUtils.setJobLauncher(this.jobLauncher); + + return jobLauncherTestUtils; + } +} diff --git a/jumpthequeue-java/jtqjava/src/test/java/com/devonfw/application/jtqjava/general/common/base/test/TestUtil.java b/jumpthequeue-java/jtqjava/src/test/java/com/devonfw/application/jtqjava/general/common/base/test/TestUtil.java new file mode 100644 index 0000000..8908f49 --- /dev/null +++ b/jumpthequeue-java/jtqjava/src/test/java/com/devonfw/application/jtqjava/general/common/base/test/TestUtil.java @@ -0,0 +1,29 @@ +package com.devonfw.application.jtqjava.general.common.base.test; + +import org.springframework.security.authentication.TestingAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; + +/** + * This is a utility for testing. It allows to simulate authentication for component testing. + */ +public class TestUtil { + + /** + * @param login the id of the user to run the test as. + * @param permissions the permissions for the test. + */ + public static void login(String login, String... permissions) { + + Authentication authentication = new TestingAuthenticationToken(login, login, permissions); + SecurityContextHolder.getContext().setAuthentication(authentication); + } + + /** + * Logs off any previously logged on user. + */ + public static void logout() { + + SecurityContextHolder.getContext().setAuthentication(null); + } +} From f9a4bd211d6ba71fc7b8e9abbc8f43e4ad0baffd Mon Sep 17 00:00:00 2001 From: krishnaCG-1997 <74300226+krishnaCG-1997@users.noreply.github.com> Date: Fri, 4 Dec 2020 19:55:30 +0530 Subject: [PATCH 02/10] updated readme --- README.md | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f1bce55..bc87fae 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,12 @@ -# JumpTheQueueGallery -Various implementations of JumpTheQueue +JUMP THE QUEUE +When visiting public (free) or private (paid) events there are often large queues creating significant waiting times. Ideally the organizer of the event would like to streamline the entry of people into the venue. If people were to arrive right on time they could get into line more efficiently. A website or application could support this process by assigning visitors a queue number. This document describes the design of such a website/application, appropriately named JumpTheQueue. + +Technical Architecture: +We have designed our application in 3 layered architecture. these are divided as follows:- +For front end we have used devon4ng in angular and for backend we have used devon4j in java. + +Execution: For the execution of front end 'devon ng serve' command has been used. For backend execution we have run the application in Eclipse.. + For checking the backend functionalities we have used Postman. + For checking the frontend functionalities we have used chrome. + +Integration: We have integrated backend and frontend using the REST API calls. From c7c6ba151dd44772c2ad43aa9c62c53b60605ba6 Mon Sep 17 00:00:00 2001 From: krishna agarwal <35657404+krishnaCG-1997@users.noreply.github.com> Date: Mon, 14 Dec 2020 16:11:29 +0530 Subject: [PATCH 03/10] updated functions --- jumpthequeue-angular/.vscode/launch.json | 15 +++ jumpthequeue-angular/src/app/app.module.ts | 4 +- .../src/app/auth/auth.service.ts | 33 ++--- .../src/app/auth/login/login.component.html | 2 +- .../app/auth/register/register.component.html | 7 - .../app/auth/register/register.component.ts | 3 +- .../src/app/shared/modals/event.modal.ts | 1 + .../modals}/filter-visitor.model.ts | 0 .../modals}/pageable.model.ts | 0 .../shared/modals/queue-detail-cto.model.ts | 2 +- .../app/shared/modals/queue-detail.model.ts | 2 +- .../models => shared/modals}/sort.model.ts | 0 .../models => shared/modals}/visitor.model.ts | 0 .../src/app/shared/services/event.service.ts | 7 +- .../src/app/user/user.component.html | 2 +- .../src/app/user/user.component.ts | 4 +- .../user/view-queue/view-queue.component.html | 11 +- .../user/view-queue/view-queue.component.ts | 49 ++++++- .../src/environments/environment.ts | 3 +- .../eventmanagement/common/api/Event.java | 14 +- .../logic/api/to/EventEto.java | 22 ++- .../logic/api/to/EventSearchCriteriaTo.java | 63 ++++++++- .../logic/api/usecase/UcManageEvent.java | 2 - .../common/api/QueueDetail.java | 4 +- .../logic/api/to/QueueDetailEto.java | 6 +- .../api/to/QueueDetailSearchCriteriaTo.java | 6 +- .../dataaccess/api/EventEntity.java | 29 +++- .../dataaccess/api/repo/EventRepository.java | 2 +- .../logic/impl/EventmanagementImpl.java | 6 - .../logic/impl/usecase/UcManageEventImpl.java | 15 --- .../dataaccess/api/QueueDetailEntity.java | 7 +- .../api/repo/QueueDetailRepository.java | 2 +- .../impl/usecase/UcManageQueueDetailImpl.java | 125 +++++++++++------- .../db/migration/1.0/V0006__Create_Event.sql | 2 +- .../1.0/V0007__Create_Queue_Detail.sql | 2 +- .../db/migration/1.0/V0008__Master_data.sql | 12 +- .../logic/impl/EventmanagementTest.java | 6 +- .../logic/impl/QueueDetailmanagementTest.java | 2 +- 38 files changed, 317 insertions(+), 155 deletions(-) create mode 100644 jumpthequeue-angular/.vscode/launch.json rename jumpthequeue-angular/src/app/{auth/models => shared/modals}/filter-visitor.model.ts (100%) rename jumpthequeue-angular/src/app/{auth/models => shared/modals}/pageable.model.ts (100%) rename jumpthequeue-angular/src/app/{auth/models => shared/modals}/sort.model.ts (100%) rename jumpthequeue-angular/src/app/{auth/models => shared/modals}/visitor.model.ts (100%) diff --git a/jumpthequeue-angular/.vscode/launch.json b/jumpthequeue-angular/.vscode/launch.json new file mode 100644 index 0000000..1348ba4 --- /dev/null +++ b/jumpthequeue-angular/.vscode/launch.json @@ -0,0 +1,15 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "chrome", + "request": "launch", + "name": "Launch Chrome against localhost", + "url": "http://localhost:4200", + "webRoot": "${workspaceFolder}" + } + ] +} \ No newline at end of file diff --git a/jumpthequeue-angular/src/app/app.module.ts b/jumpthequeue-angular/src/app/app.module.ts index 60da99d..fb8aef6 100644 --- a/jumpthequeue-angular/src/app/app.module.ts +++ b/jumpthequeue-angular/src/app/app.module.ts @@ -14,7 +14,6 @@ import { RegisterComponent } from './auth/register/register.component'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { ViewQueueComponent } from './user/view-queue/view-queue.component'; import { HomeComponent } from './user/home/home.component'; -import { CountdownModule } from 'ngx-countdown'; @NgModule({ declarations: [ AppComponent, @@ -33,8 +32,7 @@ import { CountdownModule } from 'ngx-countdown'; ReactiveFormsModule, AppRoutingModule, MatSnackBarModule, - HttpClientModule, - CountdownModule + HttpClientModule ], providers: [], bootstrap: [AppComponent] diff --git a/jumpthequeue-angular/src/app/auth/auth.service.ts b/jumpthequeue-angular/src/app/auth/auth.service.ts index d698c6d..b3f7fc6 100644 --- a/jumpthequeue-angular/src/app/auth/auth.service.ts +++ b/jumpthequeue-angular/src/app/auth/auth.service.ts @@ -1,12 +1,13 @@ import { Injectable } from '@angular/core'; import { Router } from '@angular/router'; -import { Visitor } from './models/visitor.model'; +import { Visitor } from '../shared/modals/visitor.model'; import { HttpClient } from '@angular/common/http'; -import { FilterVisitor } from './models/filter-visitor.model'; -import { Pageable } from './models/pageable.model'; +import { FilterVisitor } from '../shared/modals/filter-visitor.model'; +import { Pageable } from '../shared/modals/pageable.model'; import {MatSnackBar} from '@angular/material/snack-bar'; import { QueueDetailCTO } from '../shared/modals/queue-detail-cto.model'; import { QueueDetail } from '../shared/modals/queue-detail.model'; +import { environment } from 'src/environments/environment'; @Injectable({ providedIn: 'root' @@ -17,7 +18,7 @@ export class AuthService { userMail: string; userId: string; queuesDetail: QueueDetail; - url = 'http://localhost:8081/services/rest'; + url = environment.url; constructor(private route: Router, private http: HttpClient, private snackBar: MatSnackBar) { } @@ -42,27 +43,29 @@ export class AuthService { this.getVisitorByUsername(username).subscribe( (visitor) => { console.log(visitor['content'][0]); + if(visitor['content'][0]){ if (visitor['content'][0].username === username && visitor['content'][0].password === password) { this.login(visitor['content'][0].id, visitor['content'][0].username); - this.snackBar.open('Logged In', 'Successfully', { - duration: 2000, - }); - - } else { - this.snackBar.open('access denied', 'OK', { - duration: 2000, - }); + this.openSnackBar('Logged In', 'Successfully'); + + }} else { + this.openSnackBar('access denied', 'User Not Found'); } }, (err: any) => { - this.snackBar.open('access error', 'OK', { - duration: 2000, - }); + this.openSnackBar('access error', 'OK'); }, ); } + openSnackBar(message: string, action: string) { + this.snackBar.open(message, action, { + duration: 3000, + panelClass: ['mat-toolbar', 'mat-accent'] + }); + } + fetchJoinedEvents() { const filters: FilterVisitor = new FilterVisitor(); diff --git a/jumpthequeue-angular/src/app/auth/login/login.component.html b/jumpthequeue-angular/src/app/auth/login/login.component.html index 591fb12..d562c98 100644 --- a/jumpthequeue-angular/src/app/auth/login/login.component.html +++ b/jumpthequeue-angular/src/app/auth/login/login.component.html @@ -1,7 +1,7 @@
- +

Currently Being Attended

-

Q001

+
+ +

{{eventDetails.currentlyBeingAttended}}

+
+ +

--

+
+
diff --git a/jumpthequeue-angular/src/app/user/view-queue/view-queue.component.ts b/jumpthequeue-angular/src/app/user/view-queue/view-queue.component.ts index 6c3887a..7ba0c6f 100644 --- a/jumpthequeue-angular/src/app/user/view-queue/view-queue.component.ts +++ b/jumpthequeue-angular/src/app/user/view-queue/view-queue.component.ts @@ -12,14 +12,34 @@ import { EventService } from 'src/app/shared/services/event.service'; }) export class ViewQueueComponent implements OnInit { - - joined = false; id: string; eventDetails: any; mail: string; queueNo: string; queue: QueueDetail[]; events: Events[] = []; + timer: string; + + x = setInterval(() => { + if (this.queue[0] != null) { + const currentTime = new Date().getTime(); + const estimatedTime = new Date(this.queue[0].minEstimatedTime).getTime(); + const diff = estimatedTime - currentTime; + const hr = Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); + const min = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60)); + const sec = Math.floor((diff % (1000 * 60)) / (1000)); + + if (diff > 0) { + this.timer = hr + ':' + min + ':' + sec; + } + else { + this.timer = '00:00:00'; + } + } + else { + this.timer = '00:00:00'; + } + }, 1000); constructor(private route: ActivatedRoute, private eventService: EventService, private snackBar: MatSnackBar) { } @@ -56,8 +76,8 @@ export class ViewQueueComponent implements OnInit { join(eventId: string) { this.updateEventList(true); - this.joined = true; this.eventDetails.isJoined = true; + this.checkCount(this.eventDetails.isJoined); this.eventService.joinEvent(eventId).subscribe(data => { this.queue[0] = data; console.log(data); @@ -68,7 +88,6 @@ export class ViewQueueComponent implements OnInit { leave() { this.updateEventList(false); - this.joined = false; this.eventDetails.isJoined = false; this.eventService.leaveEvent(this.queue[0].id, this.eventDetails.id).subscribe(data => { this.eventService.fetchJoinedEvents(); @@ -76,15 +95,33 @@ export class ViewQueueComponent implements OnInit { this.openSnackBar('Leaved The Queue', 'Success'); }, err => { - this.openSnackBar('access denied', 'OK'); + this.openSnackBar('Leave The Queue', 'Error'); }); } + checkCount(isJoined: boolean) + { + if(isJoined===true){ + return true; + } + if(this.eventDetails.visitorCount===0) + { + return false; + } + else{ + return true; + } + } + openSnackBar(message: string, action: string) { this.snackBar.open(message, action, { - duration: 4000, + duration: 3000, panelClass: ['mat-toolbar', 'mat-accent'] }); } + ngOnDestroy() { + clearInterval(this.x); + } + } diff --git a/jumpthequeue-angular/src/environments/environment.ts b/jumpthequeue-angular/src/environments/environment.ts index 7b4f817..329fc47 100644 --- a/jumpthequeue-angular/src/environments/environment.ts +++ b/jumpthequeue-angular/src/environments/environment.ts @@ -3,7 +3,8 @@ // The list of file replacements can be found in `angular.json`. export const environment = { - production: false + production: false, + url: 'http://localhost:8081/services/rest' }; /* diff --git a/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/eventmanagement/common/api/Event.java b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/eventmanagement/common/api/Event.java index 3d015cc..29d7896 100644 --- a/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/eventmanagement/common/api/Event.java +++ b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/eventmanagement/common/api/Event.java @@ -69,12 +69,12 @@ public interface Event extends ApplicationEntity { /** * @return attentionTimeId */ - public Timestamp getAttentionTime(); + public String getAttentionTime(); /** * @param attentionTime setter for attentionTime attribute */ - public void setAttentionTime(Timestamp attentionTime); + public void setAttentionTime(String attentionTime); /** * @return visitorCountId @@ -86,4 +86,14 @@ public interface Event extends ApplicationEntity { */ public void setVisitorCount(int visitorCount); + /** + * @return currentlyBeingAttendedId + */ + public String getCurrentlyBeingAttended(); + + /** + * @param currentlyBeingAttended setter for currentlyBeingAttended attribute + */ + public void setCurrentlyBeingAttended(String currentlyBeingAttended); + } diff --git a/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/api/to/EventEto.java b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/api/to/EventEto.java index df9f7e9..4d957f5 100644 --- a/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/api/to/EventEto.java +++ b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/api/to/EventEto.java @@ -24,10 +24,12 @@ public class EventEto extends AbstractEto implements Event { private String logo; - private Timestamp attentionTime; + private String attentionTime; private int visitorCount; + private String currentlyBeingAttended; + @Override public String getEventName() { @@ -101,13 +103,13 @@ public void setLogo(String logo) { } @Override - public Timestamp getAttentionTime() { + public String getAttentionTime() { return this.attentionTime; } @Override - public void setAttentionTime(Timestamp attentionTime) { + public void setAttentionTime(String attentionTime) { this.attentionTime = attentionTime; } @@ -196,7 +198,7 @@ public boolean equals(Object obj) { @Override public int getVisitorCount() { - return visitorCount; + return this.visitorCount; } @Override @@ -205,4 +207,16 @@ public void setVisitorCount(int visitorCount) { this.visitorCount = visitorCount; } + @Override + public String getCurrentlyBeingAttended() { + + return this.currentlyBeingAttended; + } + + @Override + public void setCurrentlyBeingAttended(String currentlyBeingAttended) { + + this.currentlyBeingAttended = currentlyBeingAttended; + } + } diff --git a/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/api/to/EventSearchCriteriaTo.java b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/api/to/EventSearchCriteriaTo.java index aceae60..e99ff80 100644 --- a/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/api/to/EventSearchCriteriaTo.java +++ b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/api/to/EventSearchCriteriaTo.java @@ -25,7 +25,7 @@ public class EventSearchCriteriaTo extends AbstractSearchCriteriaTo { private String logo; - private Timestamp attentionTime; + private String attentionTime; private StringSearchConfigTo eventNameOption; @@ -37,6 +37,12 @@ public class EventSearchCriteriaTo extends AbstractSearchCriteriaTo { private Integer visitorCount; + private String currentlyBeingAttended; + + private StringSearchConfigTo currentlyBeingAttendedOption; + + private StringSearchConfigTo attentionTimeOption; + /** * @return eventNameId */ @@ -136,7 +142,7 @@ public void setLogo(String logo) { /** * @return attentionTimeId */ - public Timestamp getAttentionTime() { + public String getAttentionTime() { return this.attentionTime; } @@ -144,7 +150,7 @@ public Timestamp getAttentionTime() { /** * @param attentionTime setter for attentionTime attribute */ - public void setAttentionTime(Timestamp attentionTime) { + public void setAttentionTime(String attentionTime) { this.attentionTime = attentionTime; } @@ -218,7 +224,7 @@ public void setLogoOption(StringSearchConfigTo logoOption) { */ public Integer getVisitorCount() { - return visitorCount; + return this.visitorCount; } /** @@ -229,4 +235,53 @@ public void setVisitorCount(Integer visitorCount) { this.visitorCount = visitorCount; } + /** + * @return currentlyBeingAttendedId + */ + public String getCurrentlyBeingAttended() { + + return this.currentlyBeingAttended; + } + + /** + * @param currentlyBeingAttended setter for currentlyBeingAttended attribute + */ + public void setCurrentlyBeingAttended(String currentlyBeingAttended) { + + this.currentlyBeingAttended = currentlyBeingAttended; + } + + /** + * @return the {@link StringSearchConfigTo} used to search for {@link #getCurrentlyBeingAttended() + * currentlyBeingAttended}. + */ + public StringSearchConfigTo getCurrentlyBeingAttendedOption() { + + return this.currentlyBeingAttendedOption; + } + + /** + * @param currentlyBeingAttendedOption new value of {@link #getCurrentlyBeingAttendedOption()}. + */ + public void setCurrentlyBeingAttendedOption(StringSearchConfigTo currentlyBeingAttendedOption) { + + this.currentlyBeingAttendedOption = currentlyBeingAttendedOption; + } + + /** + * @return the {@link StringSearchConfigTo} used to search for {@link #getAttentionTime() attentionTime}. + */ + public StringSearchConfigTo getAttentionTimeOption() { + + return this.attentionTimeOption; + } + + /** + * @param attentionTimeOption new value of {@link #getAttentionTimeOption()}. + */ + public void setAttentionTimeOption(StringSearchConfigTo attentionTimeOption) { + + this.attentionTimeOption = attentionTimeOption; + } + } diff --git a/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/api/usecase/UcManageEvent.java b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/api/usecase/UcManageEvent.java index 9b9859b..f41259c 100644 --- a/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/api/usecase/UcManageEvent.java +++ b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/api/usecase/UcManageEvent.java @@ -37,6 +37,4 @@ public interface UcManageEvent { */ void increaseVisitorCount(long eventId); - EventEto eventById(long eventId); - } diff --git a/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/common/api/QueueDetail.java b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/common/api/QueueDetail.java index 6aeb4b3..bff3d61 100644 --- a/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/common/api/QueueDetail.java +++ b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/common/api/QueueDetail.java @@ -49,12 +49,12 @@ public interface QueueDetail extends ApplicationEntity { /** * @return minEstimatedTimeId */ - public String getMinEstimatedTime(); + public Timestamp getMinEstimatedTime(); /** * @param minEstimatedTime setter for minEstimatedTime attribute */ - public void setMinEstimatedTime(String minEstimatedTime); + public void setMinEstimatedTime(Timestamp minEstimatedTime); /** * getter for visitorId attribute diff --git a/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/api/to/QueueDetailEto.java b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/api/to/QueueDetailEto.java index d00ef8e..02e9852 100644 --- a/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/api/to/QueueDetailEto.java +++ b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/api/to/QueueDetailEto.java @@ -20,7 +20,7 @@ public class QueueDetailEto extends AbstractEto implements QueueDetail { private Timestamp endTime; - private String minEstimatedTime; + private Timestamp minEstimatedTime; private Long visitorId; @@ -75,13 +75,13 @@ public void setEndTime(Timestamp endTime) { } @Override - public String getMinEstimatedTime() { + public Timestamp getMinEstimatedTime() { return this.minEstimatedTime; } @Override - public void setMinEstimatedTime(String minEstimatedTime) { + public void setMinEstimatedTime(Timestamp minEstimatedTime) { this.minEstimatedTime = minEstimatedTime; } diff --git a/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/api/to/QueueDetailSearchCriteriaTo.java b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/api/to/QueueDetailSearchCriteriaTo.java index 5d2171d..10d9560 100644 --- a/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/api/to/QueueDetailSearchCriteriaTo.java +++ b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/api/to/QueueDetailSearchCriteriaTo.java @@ -21,7 +21,7 @@ public class QueueDetailSearchCriteriaTo extends AbstractSearchCriteriaTo { private Timestamp endTime; - private String minEstimatedTime; + private Timestamp minEstimatedTime; private Long visitorId; @@ -98,7 +98,7 @@ public void setEndTime(Timestamp endTime) { /** * @return minEstimatedTimeId */ - public String getMinEstimatedTime() { + public Timestamp getMinEstimatedTime() { return this.minEstimatedTime; } @@ -106,7 +106,7 @@ public String getMinEstimatedTime() { /** * @param minEstimatedTime setter for minEstimatedTime attribute */ - public void setMinEstimatedTime(String minEstimatedTime) { + public void setMinEstimatedTime(Timestamp minEstimatedTime) { this.minEstimatedTime = minEstimatedTime; } diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/eventmanagement/dataaccess/api/EventEntity.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/eventmanagement/dataaccess/api/EventEntity.java index 037107c..f025a22 100644 --- a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/eventmanagement/dataaccess/api/EventEntity.java +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/eventmanagement/dataaccess/api/EventEntity.java @@ -33,14 +33,34 @@ public class EventEntity extends ApplicationPersistenceEntity implements Event { private int visitorCount; - @Temporal(TemporalType.TIMESTAMP) - private Timestamp attentionTime; + private String attentionTime; + + private String currentlyBeingAttended; private static final long serialVersionUID = 1L; + /** + * @return currentlyBeingAttended + */ + @Override + public String getCurrentlyBeingAttended() { + + return this.currentlyBeingAttended; + } + + /** + * @param currentlyBeingAttended new value of {@link #getcurrentlyBeingAttended}. + */ + @Override + public void setCurrentlyBeingAttended(String currentlyBeingAttended) { + + this.currentlyBeingAttended = currentlyBeingAttended; + } + /** * @return visitorCount */ + @Override public int getVisitorCount() { return this.visitorCount; @@ -49,6 +69,7 @@ public int getVisitorCount() { /** * @param visitorCount new value of {@link #getvisitorCount}. */ + @Override public void setVisitorCount(int visitorCount) { this.visitorCount = visitorCount; @@ -166,7 +187,7 @@ public void setLogo(String logo) { * @return attentionTime */ @Override - public Timestamp getAttentionTime() { + public String getAttentionTime() { return this.attentionTime; } @@ -175,7 +196,7 @@ public Timestamp getAttentionTime() { * @param attentionTime new value of {@link #getattentionTime}. */ @Override - public void setAttentionTime(Timestamp attentionTime) { + public void setAttentionTime(String attentionTime) { this.attentionTime = attentionTime; } diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/eventmanagement/dataaccess/api/repo/EventRepository.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/eventmanagement/dataaccess/api/repo/EventRepository.java index fc46c23..a43c0c8 100644 --- a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/eventmanagement/dataaccess/api/repo/EventRepository.java +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/eventmanagement/dataaccess/api/repo/EventRepository.java @@ -55,7 +55,7 @@ default Page findByCriteria(EventSearchCriteriaTo criteria) { if (logo != null && !logo.isEmpty()) { QueryUtil.get().whereString(query, $(alias.getLogo()), logo, criteria.getLogoOption()); } - Timestamp attentionTime = criteria.getAttentionTime(); + String attentionTime = criteria.getAttentionTime(); if (attentionTime != null) { query.where($(alias.getAttentionTime()).eq(attentionTime)); } diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/impl/EventmanagementImpl.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/impl/EventmanagementImpl.java index 5b7df59..d065e51 100644 --- a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/impl/EventmanagementImpl.java +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/impl/EventmanagementImpl.java @@ -64,10 +64,4 @@ public void increaseVisitorCount(long eventId) { } - @Override - public EventEto eventById(long eventId) { - - return this.ucManageEvent.eventById(eventId); - } - } diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/impl/usecase/UcManageEventImpl.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/impl/usecase/UcManageEventImpl.java index ed92faa..300c9cb 100644 --- a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/impl/usecase/UcManageEventImpl.java +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/eventmanagement/logic/impl/usecase/UcManageEventImpl.java @@ -52,16 +52,12 @@ public EventEto saveEvent(EventEto event) { @Override public void decreaseVisitorCount(long eventId) { - // TODO Auto-generated method stub - // the event is found by using the repository find method and eventId paremeter EventEntity eventEntity = getEventRepository().find(eventId); // the visitors gets decreased by one if (eventEntity.getVisitorCount() > 0) { eventEntity.setVisitorCount(eventEntity.getVisitorCount() - 1); } - // Based on Hibernate, the command save(Entity) is not strictly required, but it improves readability. - // the eventEntity gets saved getEventRepository().save(eventEntity); } @@ -69,24 +65,13 @@ public void decreaseVisitorCount(long eventId) { @Override public void increaseVisitorCount(long eventId) { - // TODO Auto-generated method stub - // the event is found by using the repository find method and eventId paremeter EventEntity eventEntity = getEventRepository().find(eventId); // the visitors gets increased by one eventEntity.setVisitorCount(eventEntity.getVisitorCount() + 1); - // Based on Hibernate, the command save(Entity) is not strictly required, but it improves readability. - // the eventEntity gets saved getEventRepository().save(eventEntity); } - @Override - public EventEto eventById(long eventId) { - - EventEntity eventEntity = getEventRepository().find(eventId); - return getBeanMapper().map(eventEntity, EventEto.class); - } - } diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/dataaccess/api/QueueDetailEntity.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/dataaccess/api/QueueDetailEntity.java index 17b6b3d..9462683 100644 --- a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/dataaccess/api/QueueDetailEntity.java +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/dataaccess/api/QueueDetailEntity.java @@ -37,7 +37,8 @@ public class QueueDetailEntity extends ApplicationPersistenceEntity implements Q @Temporal(TemporalType.TIMESTAMP) private Timestamp endTime; - private String minEstimatedTime; + @Temporal(TemporalType.TIMESTAMP) + private Timestamp minEstimatedTime; private VisitorEntity visitor; @@ -201,7 +202,7 @@ public void setEventId(Long EventId) { * @return minEstimatedTime */ @Override - public String getMinEstimatedTime() { + public Timestamp getMinEstimatedTime() { return this.minEstimatedTime; } @@ -210,7 +211,7 @@ public String getMinEstimatedTime() { * @param minEstimatedTime new value of {@link #getminEstimatedTime}. */ @Override - public void setMinEstimatedTime(String minEstimatedTime) { + public void setMinEstimatedTime(Timestamp minEstimatedTime) { this.minEstimatedTime = minEstimatedTime; } diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/dataaccess/api/repo/QueueDetailRepository.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/dataaccess/api/repo/QueueDetailRepository.java index f31d0fc..8a5e4a5 100644 --- a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/dataaccess/api/repo/QueueDetailRepository.java +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/dataaccess/api/repo/QueueDetailRepository.java @@ -47,7 +47,7 @@ default Page findByCriteria(QueueDetailSearchCriteriaTo crite if (endTime != null) { query.where($(alias.getEndTime()).eq(endTime)); } - String minEstimatedTime = criteria.getMinEstimatedTime(); + Timestamp minEstimatedTime = criteria.getMinEstimatedTime(); if (minEstimatedTime != null) { query.where($(alias.getMinEstimatedTime()).eq(minEstimatedTime)); } diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/impl/usecase/UcManageQueueDetailImpl.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/impl/usecase/UcManageQueueDetailImpl.java index 14dc687..92f040e 100644 --- a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/impl/usecase/UcManageQueueDetailImpl.java +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/impl/usecase/UcManageQueueDetailImpl.java @@ -63,61 +63,81 @@ public QueueDetailEto saveQueueDetail(QueueDetailEto queueDetailEto) { long eventId = queueDetailEntity.getEventId(); long visitorId = queueDetailEntity.getVisitorId(); - QueueDetailSearchCriteriaTo queueDetailSearchCriteriaTo = new QueueDetailSearchCriteriaTo(); - queueDetailSearchCriteriaTo.setEventId(eventId); - queueDetailSearchCriteriaTo.setVisitorId(visitorId); - Pageable pageable = PageRequest.of(0, 1000); - queueDetailSearchCriteriaTo.setPageable(pageable); + List queueDetailEtosInQueue = getQueueDetailsByEventIdAndVisitorId(eventId, visitorId); - /** - * Calling the parent with the queueDetailManagement (injected) we use the method findQueueDetailEtos() that will - * call the implementation of the method inside (UcFindQueueDetailImpl) through the interface. This allows us to use - * the {@link UcFindQueueDetailImpl}. - */ - List queueDetailEtosInQueue = this.queueDetailManagement - .findQueueDetailEtos(queueDetailSearchCriteriaTo).getContent(); + if (!queueDetailEtosInQueue.isEmpty()) { + return null; + } + + List queueDetailEventEtosInQueue = getQueueDetailsByEventId(eventId); - if (queueDetailEtosInQueue.isEmpty()) { + EventEto event = this.eventManagement.findEvent(eventId); - QueueDetailSearchCriteriaTo queueDetailEventSearchCriteriaTo = new QueueDetailSearchCriteriaTo(); - queueDetailEventSearchCriteriaTo.setEventId(eventId); - Pageable pageable1 = PageRequest.of(0, 1000); - queueDetailEventSearchCriteriaTo.setPageable(pageable1); + if (queueDetailEventEtosInQueue.isEmpty()) { - List queueDetailEventEtosInQueue = this.queueDetailManagement - .findQueueDetailEtos(queueDetailEventSearchCriteriaTo).getContent(); + queueDetailEntity.setQueueNumber("Q001"); + queueDetailEntity.setMinEstimatedTime(calculateEstimatedTime(event, 1)); - EventEto event = this.eventManagement.eventById(eventId); + } else { - if (queueDetailEventEtosInQueue.isEmpty()) { + QueueDetailEto lastQueueNumber = queueDetailEventEtosInQueue.get(queueDetailEventEtosInQueue.size() - 1); + int lastTicketDigit = Integer.parseInt(lastQueueNumber.getQueueNumber().substring(1)); + queueDetailEntity.setQueueNumber(generateTicketCode(lastTicketDigit)); + queueDetailEntity.setMinEstimatedTime(calculateEstimatedTime(event, lastTicketDigit + 1)); + System.out.println(calculateEstimatedTime(event, lastTicketDigit + 1)); + } - queueDetailEntity.setQueueNumber("Q001"); - queueDetailEntity.setMinEstimatedTime(String.valueOf(event.getAttentionTime().getTime() / 1000)); + // set the creation time, startTime and endTime + queueDetailEntity.setCreationTime(Timestamp.from(Instant.now())); + queueDetailEntity.setStartTime(event.getStartDate()); + queueDetailEntity.setEndTime(event.getEndDate()); - } else { + // save the queueDetail & increment visitor count + this.eventManagement.increaseVisitorCount(eventId); + QueueDetailEntity queueDetailEntitySaved = getQueueDetailRepository().save(queueDetailEntity); + LOG.debug("The queueDetail with id '{}' has been saved.", queueDetailEntitySaved.getId()); - int lastIndex = queueDetailEventEtosInQueue.size() - 1; - QueueDetailEto lastQueueNumber = queueDetailEventEtosInQueue.get(lastIndex); - int lastTicketDigit = Integer.parseInt(lastQueueNumber.getQueueNumber().substring(1)); - queueDetailEntity.setQueueNumber(generateTicketCode(lastTicketDigit)); - queueDetailEntity.setMinEstimatedTime(calculateEstimatedTime(event, lastTicketDigit + 1)); - System.out.println(calculateEstimatedTime(event, lastTicketDigit + 1)); - } + return getBeanMapper().map(queueDetailEntitySaved, QueueDetailEto.class); + } - // set the creation time, startTime and endTime - queueDetailEntity.setCreationTime(Timestamp.from(Instant.now())); - queueDetailEntity.setStartTime(event.getStartDate()); - queueDetailEntity.setEndTime(event.getEndDate()); + /** + * Method return queueDetails By setting eventId & visitorId in Criteria. + * + * @param eventId + * @param visitorId + * @return List of QueueDetailETO + */ - // save the queueDetail & increment visitor count - this.eventManagement.increaseVisitorCount(eventId); - QueueDetailEntity queueDetailEntitySaved = getQueueDetailRepository().save(queueDetailEntity); - LOG.debug("The queueDetail with id '{}' has been saved.", queueDetailEntitySaved.getId()); + private List getQueueDetailsByEventIdAndVisitorId(long eventId, long visitorId) { - return getBeanMapper().map(queueDetailEntitySaved, QueueDetailEto.class); - } else { - return null; - } + QueueDetailSearchCriteriaTo queueDetailSearchCriteriaTo = new QueueDetailSearchCriteriaTo(); + queueDetailSearchCriteriaTo.setEventId(eventId); + queueDetailSearchCriteriaTo.setVisitorId(visitorId); + Pageable pageable = PageRequest.of(0, 1000); + queueDetailSearchCriteriaTo.setPageable(pageable); + + List queueDetailEtosInQueue = this.queueDetailManagement + .findQueueDetailEtos(queueDetailSearchCriteriaTo).getContent(); + return queueDetailEtosInQueue; + } + + /** + * Method return queueDetails By setting eventId in Criteria. + * + * @param eventId of type eventId + * @return List of QueueDetailETO + */ + + private List getQueueDetailsByEventId(long eventId) { + + QueueDetailSearchCriteriaTo queueDetailEventSearchCriteriaTo = new QueueDetailSearchCriteriaTo(); + queueDetailEventSearchCriteriaTo.setEventId(eventId); + Pageable pageable1 = PageRequest.of(0, 1000); + queueDetailEventSearchCriteriaTo.setPageable(pageable1); + + List queueDetailEventEtosInQueue = this.queueDetailManagement + .findQueueDetailEtos(queueDetailEventSearchCriteriaTo).getContent(); + return queueDetailEventEtosInQueue; } /** @@ -126,7 +146,7 @@ public QueueDetailEto saveQueueDetail(QueueDetailEto queueDetailEto) { * @param lastTicketDigit the int of the last queueNumber created. * @return the String with the new ticket code (example: 'Q005'). */ - public String generateTicketCode(int lastTicketDigit) { + private String generateTicketCode(int lastTicketDigit) { int newTicketDigit = lastTicketDigit + 1; String newTicketCode = ""; @@ -141,10 +161,19 @@ public String generateTicketCode(int lastTicketDigit) { return newTicketCode; } - public String calculateEstimatedTime(EventEto event, int queueNumber) { + /** + * Method calculates the estimated time with attention time and current time. + * + * @param event of type Event ETO + * @param queueNumber Of type Int + * @return estimated Time of type Timestamp + */ + private Timestamp calculateEstimatedTime(EventEto event, int queueNumber) { - long time = event.getAttentionTime().getTime(); - long queueTime = time * queueNumber / 1000; - return String.valueOf(queueTime); + long time = Integer.parseInt(event.getAttentionTime()) * 60000; + long currentTime = Timestamp.from(Instant.now()).getTime(); + Timestamp estimatedTime = new Timestamp(currentTime + (time * queueNumber)); + return estimatedTime; } + } diff --git a/jumpthequeue-java/jtqjava/core/src/main/resources/db/migration/1.0/V0006__Create_Event.sql b/jumpthequeue-java/jtqjava/core/src/main/resources/db/migration/1.0/V0006__Create_Event.sql index e97eaf6..b6b8b7d 100644 --- a/jumpthequeue-java/jtqjava/core/src/main/resources/db/migration/1.0/V0006__Create_Event.sql +++ b/jumpthequeue-java/jtqjava/core/src/main/resources/db/migration/1.0/V0006__Create_Event.sql @@ -1,3 +1,3 @@ create table Event( id BIGINT NOT NULL AUTO_INCREMENT, modificationCounter INTEGER NOT NULL, -eventName VARCHAR(255), location VARCHAR(255), description VARCHAR(255), logo VARCHAR(255), visitorCount INTEGER, attentionTime TIMESTAMP, +eventName VARCHAR(255), location VARCHAR(255), description VARCHAR(255), logo VARCHAR(255), visitorCount INTEGER, attentionTime VARCHAR(255),currentlyBeingAttended VARCHAR(255), startDate TIMESTAMP,endDate TIMESTAMP, CONSTRAINT PK_Event PRIMARY KEY(id) ); \ No newline at end of file diff --git a/jumpthequeue-java/jtqjava/core/src/main/resources/db/migration/1.0/V0007__Create_Queue_Detail.sql b/jumpthequeue-java/jtqjava/core/src/main/resources/db/migration/1.0/V0007__Create_Queue_Detail.sql index fad4ffc..cc213c8 100644 --- a/jumpthequeue-java/jtqjava/core/src/main/resources/db/migration/1.0/V0007__Create_Queue_Detail.sql +++ b/jumpthequeue-java/jtqjava/core/src/main/resources/db/migration/1.0/V0007__Create_Queue_Detail.sql @@ -1,5 +1,5 @@ CREATE TABLE QueueDetail( id BIGINT NOT NULL AUTO_INCREMENT, modificationCounter INTEGER NOT NULL, -queueNumber VARCHAR(5), creationTime TIMESTAMP, startTime TIMESTAMP, endTime TIMESTAMP, minEstimatedTime VARCHAR(20), +queueNumber VARCHAR(5), creationTime TIMESTAMP, startTime TIMESTAMP, endTime TIMESTAMP, minEstimatedTime TIMESTAMP, idVisitor BIGINT NOT NULL, idEvent BIGINT NOT NULL, CONSTRAINT PK_AccessCode PRIMARY KEY(id), CONSTRAINT FK_QueueDetail_idVisitor FOREIGN KEY(idVisitor) REFERENCES Visitor(id), CONSTRAINT FK_QueueDetail_idEvent FOREIGN KEY(idEvent) REFERENCES Event(id)); \ No newline at end of file diff --git a/jumpthequeue-java/jtqjava/core/src/main/resources/db/migration/1.0/V0008__Master_data.sql b/jumpthequeue-java/jtqjava/core/src/main/resources/db/migration/1.0/V0008__Master_data.sql index 980dd21..8129018 100644 --- a/jumpthequeue-java/jtqjava/core/src/main/resources/db/migration/1.0/V0008__Master_data.sql +++ b/jumpthequeue-java/jtqjava/core/src/main/resources/db/migration/1.0/V0008__Master_data.sql @@ -6,20 +6,20 @@ INSERT INTO Visitor (id, modificationCounter, username, name, password, phoneNum acceptedTerms, userType) VALUES (2, 1, 'krishna@mail.com', 'test', '1', '123456789', '1', '1', '0'); INSERT INTO Event (id, modificationCounter, -eventName, location, description, logo,visitorCount, attentionTime, -startDate,endDate) VALUES (1, 1, 'Indigo','Banglore','Biggest Color Fest', NULL,2, '2021-02-01 00:01:00', +eventName, location, description, logo,visitorCount, attentionTime, currentlyBeingAttended, +startDate,endDate) VALUES (1, 1, 'Indigo','Banglore','Biggest Color Fest', NULL,2, '5', 'Q001', '2021-01-01 00:01:00','2021-02-01 00:01:00'); INSERT INTO Event (id, modificationCounter, -eventName, location, description, logo,visitorCount, attentionTime, -startDate,endDate) VALUES (2, 1, 'Food Fest','Banglore','Biggest Food Fest', NULL,0, '2021-02-01 00:01:00', +eventName, location, description, logo,visitorCount, attentionTime, currentlyBeingAttended, +startDate,endDate) VALUES (2, 1, 'Food Fest','Banglore','Biggest Food Fest', NULL,0, '5', 'Q001', '2021-01-01 00:01:00','2021-02-01 00:01:00'); INSERT INTO QueueDetail (id, modificationCounter, queueNumber, creationTime, startTime, endTime, minEstimatedTime, idVisitor, idEvent) -VALUES (1, 1, 'Q001', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, NULL, '2', 1,1); +VALUES (1, 1, 'Q001', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, NULL, CURRENT_TIMESTAMP, 1,1); INSERT INTO QueueDetail (id, modificationCounter, queueNumber, creationTime, startTime, endTime, minEstimatedTime, idVisitor, idEvent) -VALUES (2, 1, 'Q002', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, NULL, '2', 0,1); \ No newline at end of file +VALUES (2, 1, 'Q002', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, NULL, CURRENT_TIMESTAMP, 0,1); \ No newline at end of file diff --git a/jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/eventmanagement/logic/impl/EventmanagementTest.java b/jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/eventmanagement/logic/impl/EventmanagementTest.java index 6312695..32b0af9 100644 --- a/jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/eventmanagement/logic/impl/EventmanagementTest.java +++ b/jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjava/eventmanagement/logic/impl/EventmanagementTest.java @@ -35,7 +35,7 @@ protected void doSetUp() { this.eventEto.setDescription("Biggest december eve is here"); this.eventEto.setLogo(""); this.eventEto.setVisitorCount(1); - this.eventEto.setAttentionTime(Timestamp.from(Instant.now())); + this.eventEto.setAttentionTime("5"); } @Test @@ -52,7 +52,7 @@ public void increaseVisitorCountTest() { EventEto eventEtoResult = this.eventmanagement.saveEvent(this.eventEto); this.eventmanagement.increaseVisitorCount(eventEtoResult.getId()); - EventEto event = this.eventmanagement.eventById(eventEtoResult.getId()); + EventEto event = this.eventmanagement.findEvent(eventEtoResult.getId()); assertThat(event.getVisitorCount()).isEqualTo(this.eventEto.getVisitorCount() + 1); } @@ -61,7 +61,7 @@ public void decreaseVisitorCountTest() { EventEto eventEtoResult = this.eventmanagement.saveEvent(this.eventEto); this.eventmanagement.decreaseVisitorCount(eventEtoResult.getId()); - EventEto event = this.eventmanagement.eventById(eventEtoResult.getId()); + EventEto event = this.eventmanagement.findEvent(eventEtoResult.getId()); assertThat(event.getVisitorCount()).isEqualTo(this.eventEto.getVisitorCount() - 1); } } diff --git a/jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjavaqueuedetailmanagement/logic/impl/QueueDetailmanagementTest.java b/jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjavaqueuedetailmanagement/logic/impl/QueueDetailmanagementTest.java index 0179a55..30fc854 100644 --- a/jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjavaqueuedetailmanagement/logic/impl/QueueDetailmanagementTest.java +++ b/jumpthequeue-java/jtqjava/core/src/test/java/com/devonfw/application/jtqjavaqueuedetailmanagement/logic/impl/QueueDetailmanagementTest.java @@ -57,7 +57,7 @@ protected void doSetUp() { this.eventEto.setDescription("Biggest december eve is here"); this.eventEto.setLogo(""); this.eventEto.setVisitorCount(1); - this.eventEto.setAttentionTime(Timestamp.from(Instant.now())); + this.eventEto.setAttentionTime("5"); } From b847a7b26f2f9a14c698b0c4e9abb88d0c2c6123 Mon Sep 17 00:00:00 2001 From: krishnaCG-1997 <35657404+krishnaCG-1997@users.noreply.github.com> Date: Mon, 21 Dec 2020 12:04:32 +0530 Subject: [PATCH 04/10] async await updated --- .../src/app/shared/services/event.service.ts | 37 ++++++------ .../src/app/user/home/home.component.ts | 4 +- .../user/view-queue/view-queue.component.html | 4 +- .../user/view-queue/view-queue.component.ts | 56 +++++++++---------- .../api/usecase/UcManageQueueDetail.java | 5 +- .../QueuedetailmanagementRestService.java | 6 +- .../impl/usecase/UcManageQueueDetailImpl.java | 5 +- .../QueuedetailmanagementRestServiceImpl.java | 7 --- 8 files changed, 55 insertions(+), 69 deletions(-) diff --git a/jumpthequeue-angular/src/app/shared/services/event.service.ts b/jumpthequeue-angular/src/app/shared/services/event.service.ts index c2b37b5..aa292e6 100644 --- a/jumpthequeue-angular/src/app/shared/services/event.service.ts +++ b/jumpthequeue-angular/src/app/shared/services/event.service.ts @@ -20,7 +20,7 @@ export class EventService { constructor(private authService: AuthService, private http: HttpClient) { } - getAllEvent() { + async getAllEvent() { const filters: FilterVisitor = new FilterVisitor(); const pageable: Pageable = new Pageable(); @@ -28,20 +28,19 @@ export class EventService { pageable.pageSize = 20; pageable.sort = []; filters.pageable = pageable; - this.http.post(this.url + '/eventmanagement/v1/event/search', filters).subscribe(data => { - this.eventDetails = data['content']; - for (let i = 0; i < this.eventDetails.length; i++) { - if (this.joinedEvents.includes(this.eventDetails[i].id)) { - this.eventDetails[i].isJoined = true; - } - else { - this.eventDetails[i].isJoined = false; - } + let data = await this.http.post(this.url + '/eventmanagement/v1/event/search', filters).toPromise(); + this.eventDetails = data['content']; + for (let i = 0; i < this.eventDetails.length; i++) { + if (this.joinedEvents.includes(this.eventDetails[i].id)) { + this.eventDetails[i].isJoined = true; } + else { + this.eventDetails[i].isJoined = false; + } + } - localStorage.setItem('eventList', JSON.stringify(this.eventDetails)); - console.log(this.eventDetails); - });; + localStorage.setItem('eventList', JSON.stringify(this.eventDetails)); + console.log(this.eventDetails); } @@ -58,25 +57,25 @@ export class EventService { }); } - getEventById(id: string) { - return this.http.get(this.url + '/eventmanagement/v1/event/' + id); + async getEventById(id: string) { + return await this.http.get(this.url + '/eventmanagement/v1/event/' + id).toPromise(); } - joinEvent(eventId: string) { + async joinEvent(eventId: string) { const queueObj: any = {}; queueObj.eventId = eventId; queueObj.visitorId = this.authService.userId; - return this.http.post(this.url + '/queuedetailmanagement/v1/queuedetail', queueObj); + return await this.http.post(this.url + '/queuedetailmanagement/v1/queuedetail', queueObj).toPromise(); } - leaveEvent(id: string, eventId: string) { + async leaveEvent(id: string, eventId: string) { const joinedEventIndex = this.joinedEvents.indexOf(eventId); this.queuesDetail = []; if (joinedEventIndex !== -1) { this.joinedEvents.splice(joinedEventIndex, 1); } - return this.http.delete(this.url + '/queuedetailmanagement/v1/queuedetail/' + id); + return await this.http.delete(this.url + '/queuedetailmanagement/v1/queuedetail/' + id).toPromise(); } logOut() { diff --git a/jumpthequeue-angular/src/app/user/home/home.component.ts b/jumpthequeue-angular/src/app/user/home/home.component.ts index 7446113..f61af3b 100644 --- a/jumpthequeue-angular/src/app/user/home/home.component.ts +++ b/jumpthequeue-angular/src/app/user/home/home.component.ts @@ -1,5 +1,5 @@ -import { EventEmitter, Inject } from '@angular/core'; -import { Component, OnInit, Output } from '@angular/core'; +import { Inject } from '@angular/core'; +import { Component, OnInit } from '@angular/core'; import { EventService } from 'src/app/shared/services/event.service'; import { UserComponent } from '../user.component'; diff --git a/jumpthequeue-angular/src/app/user/view-queue/view-queue.component.html b/jumpthequeue-angular/src/app/user/view-queue/view-queue.component.html index fb015ed..a554fee 100644 --- a/jumpthequeue-angular/src/app/user/view-queue/view-queue.component.html +++ b/jumpthequeue-angular/src/app/user/view-queue/view-queue.component.html @@ -15,7 +15,7 @@

Estimated Time: {{timer}}

Currently Being Attended

-
+

{{eventDetails.currentlyBeingAttended}}

@@ -24,7 +24,7 @@

--

-
+

diff --git a/jumpthequeue-angular/src/app/user/view-queue/view-queue.component.ts b/jumpthequeue-angular/src/app/user/view-queue/view-queue.component.ts index 7ba0c6f..c9df358 100644 --- a/jumpthequeue-angular/src/app/user/view-queue/view-queue.component.ts +++ b/jumpthequeue-angular/src/app/user/view-queue/view-queue.component.ts @@ -52,16 +52,14 @@ export class ViewQueueComponent implements OnInit { - getDetails(id: string) { - this.eventService.getEventById(id).subscribe(event => { - console.log(event); - this.eventDetails = event; - this.queue = this.eventService.queuesDetail.filter(e => e.eventId == this.eventDetails.id); - if (this.eventService.joinedEvents.includes(this.eventDetails.id)) { - this.eventDetails.isJoined = true; - } - console.log(this.eventDetails); - }); + async getDetails(id: string) { + let event = await this.eventService.getEventById(id); + this.eventDetails = event; + this.queue = this.eventService.queuesDetail.filter(e => e.eventId == this.eventDetails.id); + if (this.eventService.joinedEvents.includes(this.eventDetails.id)) { + this.eventDetails.isJoined = true; + } + console.log(this.eventDetails); } updateEventList(join: boolean) { @@ -74,29 +72,31 @@ export class ViewQueueComponent implements OnInit { localStorage.setItem('eventList', JSON.stringify(this.events)); } - join(eventId: string) { - this.updateEventList(true); - this.eventDetails.isJoined = true; - this.checkCount(this.eventDetails.isJoined); - this.eventService.joinEvent(eventId).subscribe(data => { - this.queue[0] = data; - console.log(data); + async join(eventId: string) { + + let data=await this.eventService.joinEvent(eventId); + if(data!=null) + { + this.updateEventList(true); + this.checkCount(true); + this.queue[0] =data; + this.eventDetails.isJoined = true; this.openSnackBar('Joined The Queue', 'Success'); this.eventService.fetchJoinedEvents(); - }); + } + else{ + this.openSnackBar('Error In Joining', 'Error'); + } } - leave() { + async leave() { + + let data= await this.eventService.leaveEvent(this.queue[0].id, this.eventDetails.id); this.updateEventList(false); this.eventDetails.isJoined = false; - this.eventService.leaveEvent(this.queue[0].id, this.eventDetails.id).subscribe(data => { - this.eventService.fetchJoinedEvents(); - this.getDetails(this.eventDetails.id); - this.openSnackBar('Leaved The Queue', 'Success'); - }, - err => { - this.openSnackBar('Leave The Queue', 'Error'); - }); + this.eventService.fetchJoinedEvents(); + this.getDetails(this.eventDetails.id); + this.openSnackBar('Leaved The Queue', 'Success'); } checkCount(isJoined: boolean) @@ -115,7 +115,7 @@ export class ViewQueueComponent implements OnInit { openSnackBar(message: string, action: string) { this.snackBar.open(message, action, { - duration: 3000, + duration: 2000, panelClass: ['mat-toolbar', 'mat-accent'] }); } diff --git a/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/api/usecase/UcManageQueueDetail.java b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/api/usecase/UcManageQueueDetail.java index 03d59a8..f0b097d 100644 --- a/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/api/usecase/UcManageQueueDetail.java +++ b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/api/usecase/UcManageQueueDetail.java @@ -10,8 +10,7 @@ public interface UcManageQueueDetail { /** * Deletes a queueDetail from the database by its id 'queueDetailId'. * - * @param queueDetailId Id of the queueDetail to delete - * @return boolean true if the queueDetail can be deleted, false otherwise + * @param queueDetailId Id of the queueDetail to delete. */ void deleteQueueDetail(long queueDetailId); @@ -19,7 +18,7 @@ public interface UcManageQueueDetail { * Saves a queueDetail and store it in the database. * * @param queueDetail the {@link QueueDetailEto} to create. - * @return the new {@link QueueDetailEto} that has been saved with ID and version. + * @return newly saved QueueDetailEto object if visitor is joining the event queue for the first time, Null otherwise. */ QueueDetailEto saveQueueDetail(QueueDetailEto queueDetail); diff --git a/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/service/api/rest/QueuedetailmanagementRestService.java b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/service/api/rest/QueuedetailmanagementRestService.java index 5737406..39ec517 100644 --- a/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/service/api/rest/QueuedetailmanagementRestService.java +++ b/jumpthequeue-java/jtqjava/api/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/service/api/rest/QueuedetailmanagementRestService.java @@ -35,7 +35,7 @@ public interface QueuedetailmanagementRestService { public QueueDetailEto getQueueDetail(@PathParam("id") long id); /** - * Delegates to {@link Queuedetailmanagement#saveQueueDetail}. + * Delegates to {@link Queuedetailmanagement#saveQueueDetail} which will implement Join the Queue. * * @param queuedetail the {@link QueueDetailEto} to be saved * @return the recently created {@link QueueDetailEto} @@ -44,10 +44,6 @@ public interface QueuedetailmanagementRestService { @Path("/queuedetail/") public QueueDetailEto saveQueueDetail(QueueDetailEto queuedetail); - @POST - @Path("/queuedetail/join") - public QueueDetailEto joinTheQueue(long visitorId, long eventId); - /** * Delegates to {@link Queuedetailmanagement#deleteQueueDetail}. * diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/impl/usecase/UcManageQueueDetailImpl.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/impl/usecase/UcManageQueueDetailImpl.java index 92f040e..b132c8e 100644 --- a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/impl/usecase/UcManageQueueDetailImpl.java +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/logic/impl/usecase/UcManageQueueDetailImpl.java @@ -66,7 +66,7 @@ public QueueDetailEto saveQueueDetail(QueueDetailEto queueDetailEto) { List queueDetailEtosInQueue = getQueueDetailsByEventIdAndVisitorId(eventId, visitorId); if (!queueDetailEtosInQueue.isEmpty()) { - return null; + return null; // try using optional } List queueDetailEventEtosInQueue = getQueueDetailsByEventId(eventId); @@ -84,7 +84,6 @@ public QueueDetailEto saveQueueDetail(QueueDetailEto queueDetailEto) { int lastTicketDigit = Integer.parseInt(lastQueueNumber.getQueueNumber().substring(1)); queueDetailEntity.setQueueNumber(generateTicketCode(lastTicketDigit)); queueDetailEntity.setMinEstimatedTime(calculateEstimatedTime(event, lastTicketDigit + 1)); - System.out.println(calculateEstimatedTime(event, lastTicketDigit + 1)); } // set the creation time, startTime and endTime @@ -154,7 +153,7 @@ private String generateTicketCode(int lastTicketDigit) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append(newTicketDigit); while (stringBuilder.length() < 3) { - stringBuilder.insert(0, "0"); + stringBuilder.insert(0, "0"); // 02,002 } stringBuilder.insert(0, "Q"); newTicketCode = stringBuilder.toString(); diff --git a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/service/impl/rest/QueuedetailmanagementRestServiceImpl.java b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/service/impl/rest/QueuedetailmanagementRestServiceImpl.java index ebfbfa8..03a74b8 100644 --- a/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/service/impl/rest/QueuedetailmanagementRestServiceImpl.java +++ b/jumpthequeue-java/jtqjava/core/src/main/java/com/devonfw/application/jtqjava/queuedetailmanagement/service/impl/rest/QueuedetailmanagementRestServiceImpl.java @@ -44,13 +44,6 @@ public Page findQueueDetails(QueueDetailSearchCriteriaTo searchC return this.queuedetailmanagement.findQueueDetails(searchCriteriaTo); } - @Override - public QueueDetailEto joinTheQueue(long visitorId, long eventId) { - - // TODO Auto-generated method stub - return null; - } - @Override public QueueDetailCto getQueueDetailCto(long id) { From 9a3528ee3a2b223bfdad665ca199b6782e1d6b0e Mon Sep 17 00:00:00 2001 From: krishnaCG-1997 <35657404+krishnaCG-1997@users.noreply.github.com> Date: Thu, 7 Jan 2021 14:07:19 +0530 Subject: [PATCH 05/10] node backend --- node-jtq/.eslintrc.js | 27 + node-jtq/.gitignore | 46 + node-jtq/.prettierrc | 12 + node-jtq/.vscode/extensions.json | 3 + node-jtq/.vscode/launch.json | 21 + node-jtq/.vscode/settings.json | 5 + node-jtq/README.md | 73 + node-jtq/docker-compose.yml | 2 + node-jtq/nest-cli.json | 9 + node-jtq/ormconfig.json | 21 + node-jtq/package-lock.json | 9798 +++++++++++++++++ node-jtq/package.json | 100 + node-jtq/src/app/app.controller.spec.ts | 22 + node-jtq/src/app/app.controller.ts | 12 + node-jtq/src/app/app.module.ts | 13 + node-jtq/src/app/app.service.ts | 8 + node-jtq/src/app/core/auth/auth.module.ts | 23 + .../auth/controllers/auth.controller.spec.ts | 96 + .../core/auth/controllers/auth.controller.ts | 35 + .../auth/decorators/get-user.decorator.ts | 11 + .../auth/decorators/roles.decorator.spec.ts | 24 + .../core/auth/decorators/roles.decorator.ts | 3 + .../app/core/auth/guards/roles.guard.spec.ts | 57 + .../src/app/core/auth/guards/roles.guard.ts | 21 + node-jtq/src/app/core/auth/model/login.dto.ts | 11 + .../src/app/core/auth/model/roles.enum.ts | 4 + .../core/auth/model/user-request.interface.ts | 7 + .../core/auth/services/auth.service.spec.ts | 105 + .../app/core/auth/services/auth.service.ts | 33 + .../core/auth/strategies/jwt.strategy.spec.ts | 16 + .../app/core/auth/strategies/jwt.strategy.ts | 20 + node-jtq/src/app/core/core.module.ts | 37 + .../core/user/model/dto/user-payload.dto.ts | 11 + .../core/user/model/entities/user.entity.ts | 29 + .../core/user/services/user.service.spec.ts | 66 + .../app/core/user/services/user.service.ts | 44 + node-jtq/src/app/core/user/user.module.ts | 12 + .../controllers/event.crud.controller.ts | 18 + node-jtq/src/app/event/event.module.ts | 12 + .../app/event/model/entities/event.entity.ts | 75 + .../app/event/services/event.crud.service.ts | 12 + .../queue-detail.crud.controller.ts | 27 + .../model/entities/queue-detail.entity.ts | 61 + .../app/queue-detail/queue-detail.module.ts | 14 + .../services/queue-detail.crud.service.ts | 71 + .../exceptions/business-logic.exception.ts | 27 + .../filters/business-logic.filter.spec.ts | 63 + .../shared/filters/business-logic.filter.ts | 28 + .../src/app/shared/logger/winston.logger.ts | 114 + .../app/shared/model/config/config.model.ts | 49 + .../model/entities/base-entity.entity.ts | 23 + node-jtq/src/config/default.ts | 24 + node-jtq/src/config/develop.ts | 38 + node-jtq/src/config/production.ts | 33 + node-jtq/src/config/test.ts | 36 + node-jtq/src/config/uat.ts | 33 + node-jtq/src/main.ts | 38 + .../migration/1609824133465-CreateTables.ts | 24 + .../src/migration/1609824210187-InsertData.ts | 47 + node-jtq/test/app.e2e-spec.ts | 24 + node-jtq/test/auth/auth.service.mock.ts | 34 + node-jtq/test/jest-e2e.json | 9 + node-jtq/test/user/user.repository.mock.ts | 38 + node-jtq/tsconfig.build.json | 4 + node-jtq/tsconfig.json | 21 + 65 files changed, 11834 insertions(+) create mode 100644 node-jtq/.eslintrc.js create mode 100644 node-jtq/.gitignore create mode 100644 node-jtq/.prettierrc create mode 100644 node-jtq/.vscode/extensions.json create mode 100644 node-jtq/.vscode/launch.json create mode 100644 node-jtq/.vscode/settings.json create mode 100644 node-jtq/README.md create mode 100644 node-jtq/docker-compose.yml create mode 100644 node-jtq/nest-cli.json create mode 100644 node-jtq/ormconfig.json create mode 100644 node-jtq/package-lock.json create mode 100644 node-jtq/package.json create mode 100644 node-jtq/src/app/app.controller.spec.ts create mode 100644 node-jtq/src/app/app.controller.ts create mode 100644 node-jtq/src/app/app.module.ts create mode 100644 node-jtq/src/app/app.service.ts create mode 100644 node-jtq/src/app/core/auth/auth.module.ts create mode 100644 node-jtq/src/app/core/auth/controllers/auth.controller.spec.ts create mode 100644 node-jtq/src/app/core/auth/controllers/auth.controller.ts create mode 100644 node-jtq/src/app/core/auth/decorators/get-user.decorator.ts create mode 100644 node-jtq/src/app/core/auth/decorators/roles.decorator.spec.ts create mode 100644 node-jtq/src/app/core/auth/decorators/roles.decorator.ts create mode 100644 node-jtq/src/app/core/auth/guards/roles.guard.spec.ts create mode 100644 node-jtq/src/app/core/auth/guards/roles.guard.ts create mode 100644 node-jtq/src/app/core/auth/model/login.dto.ts create mode 100644 node-jtq/src/app/core/auth/model/roles.enum.ts create mode 100644 node-jtq/src/app/core/auth/model/user-request.interface.ts create mode 100644 node-jtq/src/app/core/auth/services/auth.service.spec.ts create mode 100644 node-jtq/src/app/core/auth/services/auth.service.ts create mode 100644 node-jtq/src/app/core/auth/strategies/jwt.strategy.spec.ts create mode 100644 node-jtq/src/app/core/auth/strategies/jwt.strategy.ts create mode 100644 node-jtq/src/app/core/core.module.ts create mode 100644 node-jtq/src/app/core/user/model/dto/user-payload.dto.ts create mode 100644 node-jtq/src/app/core/user/model/entities/user.entity.ts create mode 100644 node-jtq/src/app/core/user/services/user.service.spec.ts create mode 100644 node-jtq/src/app/core/user/services/user.service.ts create mode 100644 node-jtq/src/app/core/user/user.module.ts create mode 100644 node-jtq/src/app/event/controllers/event.crud.controller.ts create mode 100644 node-jtq/src/app/event/event.module.ts create mode 100644 node-jtq/src/app/event/model/entities/event.entity.ts create mode 100644 node-jtq/src/app/event/services/event.crud.service.ts create mode 100644 node-jtq/src/app/queue-detail/controllers/queue-detail.crud.controller.ts create mode 100644 node-jtq/src/app/queue-detail/model/entities/queue-detail.entity.ts create mode 100644 node-jtq/src/app/queue-detail/queue-detail.module.ts create mode 100644 node-jtq/src/app/queue-detail/services/queue-detail.crud.service.ts create mode 100644 node-jtq/src/app/shared/exceptions/business-logic.exception.ts create mode 100644 node-jtq/src/app/shared/filters/business-logic.filter.spec.ts create mode 100644 node-jtq/src/app/shared/filters/business-logic.filter.ts create mode 100644 node-jtq/src/app/shared/logger/winston.logger.ts create mode 100644 node-jtq/src/app/shared/model/config/config.model.ts create mode 100644 node-jtq/src/app/shared/model/entities/base-entity.entity.ts create mode 100644 node-jtq/src/config/default.ts create mode 100644 node-jtq/src/config/develop.ts create mode 100644 node-jtq/src/config/production.ts create mode 100644 node-jtq/src/config/test.ts create mode 100644 node-jtq/src/config/uat.ts create mode 100644 node-jtq/src/main.ts create mode 100644 node-jtq/src/migration/1609824133465-CreateTables.ts create mode 100644 node-jtq/src/migration/1609824210187-InsertData.ts create mode 100644 node-jtq/test/app.e2e-spec.ts create mode 100644 node-jtq/test/auth/auth.service.mock.ts create mode 100644 node-jtq/test/jest-e2e.json create mode 100644 node-jtq/test/user/user.repository.mock.ts create mode 100644 node-jtq/tsconfig.build.json create mode 100644 node-jtq/tsconfig.json diff --git a/node-jtq/.eslintrc.js b/node-jtq/.eslintrc.js new file mode 100644 index 0000000..ab8444a --- /dev/null +++ b/node-jtq/.eslintrc.js @@ -0,0 +1,27 @@ +module.exports = { + parser: '@typescript-eslint/parser', + parserOptions: { + project: 'tsconfig.json', + sourceType: 'module', + }, + plugins: ['@typescript-eslint/eslint-plugin', 'prettier'], + extends: [ + 'plugin:@typescript-eslint/eslint-recommended', + 'plugin:@typescript-eslint/recommended', + 'prettier', + 'plugin:prettier/recommended', + 'prettier/@typescript-eslint', + ], + root: true, + env: { + node: true, + jest: true, + }, + rules: { + '@typescript-eslint/interface-name-prefix': 'error', + '@typescript-eslint/explicit-function-return-type': 'error', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-non-null-assertion': 'off', + 'prettier/prettier': 'error', + }, +}; diff --git a/node-jtq/.gitignore b/node-jtq/.gitignore new file mode 100644 index 0000000..86d943a --- /dev/null +++ b/node-jtq/.gitignore @@ -0,0 +1,46 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp +/out-tsc +# Only exists if Bazel was run +/bazel-out + +# dependencies +/node_modules + +# profiling files +chrome-profiler-events*.json +speed-measure-plugin*.json + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings + +# System Files +.DS_Store +Thumbs.db diff --git a/node-jtq/.prettierrc b/node-jtq/.prettierrc new file mode 100644 index 0000000..821dbb7 --- /dev/null +++ b/node-jtq/.prettierrc @@ -0,0 +1,12 @@ +{ + "singleQuote": true, + "trailingComma": "all", + "semi": true, + "printWidth": 120, + "tabWidth": 2, + "bracketSpacing": true, + "arrowParens": "avoid", + "endOfLine": "lf", + "quoteProps": "consistent", + "useTabs": false +} \ No newline at end of file diff --git a/node-jtq/.vscode/extensions.json b/node-jtq/.vscode/extensions.json new file mode 100644 index 0000000..ac9fdb3 --- /dev/null +++ b/node-jtq/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["devonfw.devonfw-extension-pack"] +} diff --git a/node-jtq/.vscode/launch.json b/node-jtq/.vscode/launch.json new file mode 100644 index 0000000..f6c05a8 --- /dev/null +++ b/node-jtq/.vscode/launch.json @@ -0,0 +1,21 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "pwa-node", + "request": "launch", + "name": "Launch Program", + "skipFiles": [ + "/**" + ], + "program": "${workspaceFolder}\\src\\app\\queue-detail\\controllers\\queue-detail.crud.controller.ts", + "preLaunchTask": "tsc: build - tsconfig.json", + "outFiles": [ + "${workspaceFolder}/dist/**/*.js" + ] + } + ] +} \ No newline at end of file diff --git a/node-jtq/.vscode/settings.json b/node-jtq/.vscode/settings.json new file mode 100644 index 0000000..e61ba6f --- /dev/null +++ b/node-jtq/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "typescript.preferences.importModuleSpecifier": "relative", + "typescript.preferences.quoteStyle": "single", + "editor.formatOnSave": true +} diff --git a/node-jtq/README.md b/node-jtq/README.md new file mode 100644 index 0000000..9fe8812 --- /dev/null +++ b/node-jtq/README.md @@ -0,0 +1,73 @@ +

+ Nest Logo +

+ +[circleci-image]: https://img.shields.io/circleci/build/github/nestjs/nest/master?token=abc123def456 +[circleci-url]: https://circleci.com/gh/nestjs/nest + +

A progressive Node.js framework for building efficient and scalable server-side applications.

+

+NPM Version +Package License +NPM Downloads +CircleCI +Coverage +Discord +Backers on Open Collective +Sponsors on Open Collective + + Support us + +

+ + +## Description + +[Nest](https://github.com/nestjs/nest) framework TypeScript starter repository. + +## Installation + +```bash +$ npm install +``` + +## Running the app + +```bash +# development +$ npm run start + +# watch mode +$ npm run start:dev + +# production mode +$ npm run start:prod +``` + +## Test + +```bash +# unit tests +$ npm run test + +# e2e tests +$ npm run test:e2e + +# test coverage +$ npm run test:cov +``` + +## Support + +Nest is an MIT-licensed open source project. It can grow thanks to the sponsors and support by the amazing backers. If you'd like to join them, please [read more here](https://docs.nestjs.com/support). + +## Stay in touch + +- Author - [Kamil Myśliwiec](https://kamilmysliwiec.com) +- Website - [https://nestjs.com](https://nestjs.com/) +- Twitter - [@nestframework](https://twitter.com/nestframework) + +## License + +Nest is [MIT licensed](LICENSE). diff --git a/node-jtq/docker-compose.yml b/node-jtq/docker-compose.yml new file mode 100644 index 0000000..5e29913 --- /dev/null +++ b/node-jtq/docker-compose.yml @@ -0,0 +1,2 @@ +version: '3' +services: diff --git a/node-jtq/nest-cli.json b/node-jtq/nest-cli.json new file mode 100644 index 0000000..c435f27 --- /dev/null +++ b/node-jtq/nest-cli.json @@ -0,0 +1,9 @@ +{ + "collection": "@devon4node/schematics", + "sourceRoot": "src", + "compilerOptions": { + "plugins": [ + "@nestjs/swagger/plugin" + ] + } +} \ No newline at end of file diff --git a/node-jtq/ormconfig.json b/node-jtq/ormconfig.json new file mode 100644 index 0000000..d5a74e9 --- /dev/null +++ b/node-jtq/ormconfig.json @@ -0,0 +1,21 @@ +{ + "type": "sqlite", + "database": ":memory:", + "synchronize": false, + "migrationsRun": true, + "logging": true, + "entities": [ + "dist/**/*.entity.js" + ], + "migrations": [ + "dist/migration/**/*.js" + ], + "subscribers": [ + "dist/subscriber/**/*.js" + ], + "cli": { + "entitiesDir": "src/entity", + "migrationsDir": "src/migration", + "subscribersDir": "src/subscriber" + } +} diff --git a/node-jtq/package-lock.json b/node-jtq/package-lock.json new file mode 100644 index 0000000..75244b5 --- /dev/null +++ b/node-jtq/package-lock.json @@ -0,0 +1,9798 @@ +{ + "name": "node-jtq", + "version": "0.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@angular-devkit/core": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-11.0.3.tgz", + "integrity": "sha512-gJRiBj0gWDR2VtIvLvwwc/GM2MZvg1xw69ZbBJ1VuUgDqPBHdC8q3UMW3B82wdhxK+RBYa7ZOJxtIVggaHkm9g==", + "dev": true, + "requires": { + "ajv": "6.12.6", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.3", + "source-map": "0.7.3" + } + }, + "@angular-devkit/schematics": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-11.0.3.tgz", + "integrity": "sha512-VZnqgnnfyzyMluIDvGp+ZlDU2P9BnjrhacBOdqBS/jNQ7oxyE0AWrUApGXcejOJ13Z7pEf31E64P3bImcjwP+A==", + "dev": true, + "requires": { + "@angular-devkit/core": "11.0.3", + "ora": "5.1.0", + "rxjs": "6.6.3" + } + }, + "@angular-devkit/schematics-cli": { + "version": "0.1100.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-0.1100.3.tgz", + "integrity": "sha512-dECFHCDTgWfSHosfKTeQoyTgUUqgJaftxg4DxA23sMsQtDb1U8ZsIIPpH+L4QhCDT2zlhv51ynd5RUgu28h2DQ==", + "dev": true, + "requires": { + "@angular-devkit/core": "11.0.3", + "@angular-devkit/schematics": "11.0.3", + "@schematics/schematics": "0.1100.3", + "ansi-colors": "4.1.1", + "inquirer": "7.3.3", + "minimist": "1.2.5", + "symbol-observable": "2.0.3" + } + }, + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/core": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.10.tgz", + "integrity": "sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.10", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.10", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.10", + "@babel/types": "^7.12.10", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "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 + }, + "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.12.11", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz", + "integrity": "sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.11", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-function-name": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", + "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.10", + "@babel/template": "^7.12.7", + "@babel/types": "^7.12.11" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", + "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", + "dev": true, + "requires": { + "@babel/types": "^7.12.10" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz", + "integrity": "sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==", + "dev": true, + "requires": { + "@babel/types": "^7.12.7" + } + }, + "@babel/helper-module-imports": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", + "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.5" + } + }, + "@babel/helper-module-transforms": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", + "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-simple-access": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/helper-validator-identifier": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "lodash": "^4.17.19" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz", + "integrity": "sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.10" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + }, + "@babel/helper-replace-supers": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.11.tgz", + "integrity": "sha512-q+w1cqmhL7R0FNzth/PLLp2N+scXEK/L2AHbXUyydxp828F4FEa5WcVoqui9vFRiHDQErj9Zof8azP32uGVTRA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.7", + "@babel/helper-optimise-call-expression": "^7.12.10", + "@babel/traverse": "^7.12.10", + "@babel/types": "^7.12.11" + } + }, + "@babel/helper-simple-access": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", + "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", + "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", + "dev": true, + "requires": { + "@babel/types": "^7.12.11" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/helpers": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", + "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", + "dev": true, + "requires": { + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "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 + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", + "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", + "dev": true + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", + "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", + "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/template": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", + "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.12.7", + "@babel/types": "^7.12.7" + } + }, + "@babel/traverse": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.12.tgz", + "integrity": "sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.11", + "@babel/generator": "^7.12.11", + "@babel/helper-function-name": "^7.12.11", + "@babel/helper-split-export-declaration": "^7.12.11", + "@babel/parser": "^7.12.11", + "@babel/types": "^7.12.12", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "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 + }, + "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 + } + } + }, + "@babel/types": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "dev": true, + "requires": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + } + }, + "@dabh/diagnostics": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.2.tgz", + "integrity": "sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q==", + "requires": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, + "@devon4node/common": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@devon4node/common/-/common-2.0.0.tgz", + "integrity": "sha512-msP7v7PeM7WxeXx6VK9Xi02mvL4Bvi9a3U3Kn/6qJBSEXiwCpvB91PAhFeHo5ecu3A12y6csiNXjz5cGWFyUlw==", + "requires": { + "lodash": "^4.17.15" + } + }, + "@devon4node/config": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@devon4node/config/-/config-2.0.0.tgz", + "integrity": "sha512-giw9DW4fe7uQkUzCM7x22ecb4B99wOY2vVT2eTakv6EOM27e6+Gc+DrE9YswcrJYKdjT2NpzpEEfsQMk/SSC/w==" + }, + "@eslint/eslintrc": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.2.tgz", + "integrity": "sha512-EfB5OHNYp1F4px/LI/FEnGylop7nOqkQ1LRzCM0KccA2U8tvV8w01KBv37LbO7nW4H+YhKyo2LcJhRwjjV17QQ==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "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 + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + } + } + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true + }, + "@jest/console": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", + "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^26.6.2", + "jest-util": "^26.6.2", + "slash": "^3.0.0" + } + }, + "@jest/core": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", + "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/reporters": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^26.6.2", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-resolve-dependencies": "^26.6.3", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "jest-watcher": "^26.6.2", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "@jest/environment": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", + "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", + "dev": true, + "requires": { + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2" + } + }, + "@jest/fake-timers": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", + "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@sinonjs/fake-timers": "^6.0.1", + "@types/node": "*", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + } + }, + "@jest/globals": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", + "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", + "dev": true, + "requires": { + "@jest/environment": "^26.6.2", + "@jest/types": "^26.6.2", + "expect": "^26.6.2" + } + }, + "@jest/reporters": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", + "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "node-notifier": "^8.0.0", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^7.0.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 + } + } + }, + "@jest/source-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", + "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "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 + } + } + }, + "@jest/test-result": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", + "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", + "dev": true, + "requires": { + "@jest/test-result": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3" + } + }, + "@jest/transform": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", + "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^26.6.2", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-util": "^26.6.2", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.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 + } + } + }, + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@nestjs/cli": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-7.5.4.tgz", + "integrity": "sha512-qKdniSA7NXO/5HqSxGaalMS7roIJXeT4yXTadBQ47Qv68DHh/0jfCcTzH6hqCuyRV7DV2k0bxob+rq4peMaZBw==", + "dev": true, + "requires": { + "@angular-devkit/core": "11.0.3", + "@angular-devkit/schematics": "11.0.3", + "@angular-devkit/schematics-cli": "0.1100.3", + "@nestjs/schematics": "^7.1.0", + "@types/webpack": "4.41.25", + "chalk": "3.0.0", + "chokidar": "3.4.3", + "cli-table3": "0.5.1", + "commander": "4.1.1", + "fork-ts-checker-webpack-plugin": "6.0.5", + "inquirer": "7.3.3", + "node-emoji": "1.10.0", + "ora": "5.1.0", + "os-name": "4.0.0", + "rimraf": "3.0.2", + "shelljs": "0.8.4", + "tree-kill": "1.2.2", + "tsconfig-paths": "3.9.0", + "tsconfig-paths-webpack-plugin": "3.3.0", + "typescript": "4.0.5", + "webpack": "5.9.0", + "webpack-node-externals": "2.5.2" + }, + "dependencies": { + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "typescript": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.5.tgz", + "integrity": "sha512-ywmr/VrTVCmNTJ6iV2LwIrfG1P+lv6luD8sUJs+2eI9NLGigaN+nUQc13iHqisq7bra9lnmUSYqbJvegraBOPQ==", + "dev": true + } + } + }, + "@nestjs/common": { + "version": "7.6.5", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-7.6.5.tgz", + "integrity": "sha512-WvBJd71ktaCRm9KTURVqn1YMyUzsOIkvezjP7WEpP9DVqQUOFVvn6/osJGZky/qL+zE4P7NBNyoXM94bpYvMwQ==", + "requires": { + "axios": "0.21.1", + "iterare": "1.2.1", + "tslib": "2.0.3", + "uuid": "8.3.2" + } + }, + "@nestjs/core": { + "version": "7.6.5", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-7.6.5.tgz", + "integrity": "sha512-syRpXT09RDMySs1BLQSXJfq1NXGfG4VmF9hZYGef+/QWqTRfSMEDEH5MsCCLt2lK3AZnOXE9BQwWKeNBhKLplA==", + "requires": { + "@nuxtjs/opencollective": "0.3.2", + "fast-safe-stringify": "2.0.7", + "iterare": "1.2.1", + "object-hash": "2.1.1", + "path-to-regexp": "3.2.0", + "tslib": "2.0.3", + "uuid": "8.3.2" + } + }, + "@nestjs/jwt": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-7.2.0.tgz", + "integrity": "sha512-uOTqYmWNpu+oS/MrdYjrWXtKGV4HkCYmAEVEFPP/KfiP/7K6fNy+boLllE6cnqESAXh9u0CLa1noAAavs+LHEQ==", + "requires": { + "@types/jsonwebtoken": "8.5.0", + "jsonwebtoken": "8.5.1" + } + }, + "@nestjs/mapped-types": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-0.1.1.tgz", + "integrity": "sha512-FROYmmZ2F+tLJP/aHasPMX40iUHQPtEAzOAcfAp21baebN5iLUrdyTuphoXjIqubfPFSwtnAGpVm9kLJjQ//ig==" + }, + "@nestjs/passport": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@nestjs/passport/-/passport-7.1.5.tgz", + "integrity": "sha512-Hu9hPxTdBZA0C4GrWTsSflzwsJ99oAk9jqAwpcszdFNqfjMjkPGuCM9QsVZbBP2bE8fxrVrPsNOILS6puY8e/A==" + }, + "@nestjs/platform-express": { + "version": "7.6.5", + "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-7.6.5.tgz", + "integrity": "sha512-A3UYYpDFih3WORBcOCiWfPOvKoEmS6Dk7YzrXyCh5KapatqX+XvLbObcjcvqzqonk4bT3IMceyhJp/ZBSwvEPA==", + "requires": { + "body-parser": "1.19.0", + "cors": "2.8.5", + "express": "4.17.1", + "multer": "1.4.2", + "tslib": "2.0.3" + } + }, + "@nestjs/schematics": { + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-7.2.6.tgz", + "integrity": "sha512-4geGO9pjYG4Sc4Qi+pkUVIbaxPEeySHi/z17po8nP9uaPPo8AUKP9rXjNL+mhMrXqFlB/hhN6xBBYtMyL5pB2Q==", + "dev": true, + "requires": { + "@angular-devkit/core": "11.0.5", + "@angular-devkit/schematics": "11.0.5", + "fs-extra": "9.0.1", + "pluralize": "8.0.0" + }, + "dependencies": { + "@angular-devkit/core": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-11.0.5.tgz", + "integrity": "sha512-hwV8fjF8JNPJkiVWw8MNzeIfDo01aD/OAOlC4L5rQnVHn+i2EiU3brSDmFqyeHPPV3h/QjuBkS3tkN7gSnVWaQ==", + "dev": true, + "requires": { + "ajv": "6.12.6", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.3", + "source-map": "0.7.3" + } + }, + "@angular-devkit/schematics": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-11.0.5.tgz", + "integrity": "sha512-0NKGC8Nf/4vvDpWKB7bwxIazvNnNHnZBX6XlyBXNl+fW8tpTef3PNMJMSErTz9LFnuv61vsKbc36u/Ek2YChWg==", + "dev": true, + "requires": { + "@angular-devkit/core": "11.0.5", + "ora": "5.1.0", + "rxjs": "6.6.3" + } + } + } + }, + "@nestjs/swagger": { + "version": "4.7.9", + "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-4.7.9.tgz", + "integrity": "sha512-5WjtrrbWriHCBN9eDCgr43eTU1S/adlF7RaXjS9YDY553vFABqESfs7riZZy4WhBJ35ldfpzgYoyZv3Z/+DyHQ==", + "requires": { + "@nestjs/mapped-types": "0.1.1", + "lodash": "4.17.20", + "path-to-regexp": "3.2.0" + } + }, + "@nestjs/testing": { + "version": "7.6.5", + "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-7.6.5.tgz", + "integrity": "sha512-CVjECV3pqy5+HlBSLBRitHgJ8WRW2jns3mKJpSBzUgbJbrGWCB7Y7JGYkP7CQ+29EDKfetnz3+z0q6GPdubfUQ==", + "dev": true, + "requires": { + "optional": "0.1.4", + "tslib": "2.0.3" + } + }, + "@nestjs/typeorm": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@nestjs/typeorm/-/typeorm-7.1.5.tgz", + "integrity": "sha512-utE1FkYM/gyCXUqw3zKYYS0YZ3DfkAnzsCx4T48cNnSDTCeWS+u3yt0FMDFjwSiQSaLrzpiSff/FaxJQvRlYow==", + "requires": { + "uuid": "8.3.1" + }, + "dependencies": { + "uuid": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz", + "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==" + } + } + }, + "@nestjsx/crud": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@nestjsx/crud/-/crud-4.6.2.tgz", + "integrity": "sha512-WWzPI7X2saxJ2No5vO4+zaSRP4CABqSM4NGVAE1VjGQ1ApdjDxj3dFu08Y7YSa5kz+vmrVRwh++Vh+xd9MixUQ==", + "requires": { + "@nestjsx/crud-request": "^4.6.2", + "@nestjsx/util": "^4.6.2", + "deepmerge": "^3.2.0" + } + }, + "@nestjsx/crud-request": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@nestjsx/crud-request/-/crud-request-4.6.2.tgz", + "integrity": "sha512-EqveTzR5JLMRBnxqJzo0mm7Ff05IzQ6dvfg1gj46q6nOwZ0hfXr0FBTChtciKtkZB/QOlWQ5B1scCap/QuNJWQ==", + "requires": { + "@nestjsx/util": "^4.6.2", + "qs": "^6.8.0" + }, + "dependencies": { + "qs": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", + "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==" + } + } + }, + "@nestjsx/crud-typeorm": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@nestjsx/crud-typeorm/-/crud-typeorm-4.6.2.tgz", + "integrity": "sha512-RHJlxz9QrLauaCtgRp0C2o38WVLbcZzvFWjHOpsSa8Pti74lUppphiAvlSaOnoMjOtlSCYcHJ954ynKcy0GwLA==", + "requires": { + "@zmotivat0r/o0": "^1.0.2" + } + }, + "@nestjsx/util": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@nestjsx/util/-/util-4.6.2.tgz", + "integrity": "sha512-YG2gQvSm7p8zBFaW6MFM5r1Ihk4Vr189SB2OTr7fV7qcjPS+02v7xILw2dTz2emdmu0t0AgCL2RU1V0lY8Aa9w==" + }, + "@nodelib/fs.scandir": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", + "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.4", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", + "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", + "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.4", + "fastq": "^1.6.0" + } + }, + "@nuxtjs/opencollective": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz", + "integrity": "sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==", + "requires": { + "chalk": "^4.1.0", + "consola": "^2.15.0", + "node-fetch": "^2.6.1" + } + }, + "@schematics/schematics": { + "version": "0.1100.3", + "resolved": "https://registry.npmjs.org/@schematics/schematics/-/schematics-0.1100.3.tgz", + "integrity": "sha512-tzjKnjD90FQ4LgRN9ALT2qCqgJYZrAKoy1embFJRuGKA8vv1hTG4JonVDqQEUoNwTc9r/Ok2Z1eenAI9TSUd1A==", + "dev": true, + "requires": { + "@angular-devkit/core": "11.0.3", + "@angular-devkit/schematics": "11.0.3" + } + }, + "@sinonjs/commons": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz", + "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@sqltools/formatter": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.2.tgz", + "integrity": "sha512-/5O7Fq6Vnv8L6ucmPjaWbVG1XkP4FO+w5glqfkIsq3Xw4oyNAdJddbnYodNDAfjVUvo/rrSCTom4kAND7T1o5Q==" + }, + "@types/anymatch": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", + "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==", + "dev": true + }, + "@types/babel__core": { + "version": "7.1.12", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.12.tgz", + "integrity": "sha512-wMTHiiTiBAAPebqaPiPDLFA4LYPKr6Ph0Xq/6rq1Ur3v66HXyG+clfR9CNETkD7MQS8ZHvpQOtA53DLws5WAEQ==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", + "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", + "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.0.tgz", + "integrity": "sha512-kSjgDMZONiIfSH1Nxcr5JIRMwUetDki63FSQfpTCz8ogF3Ulqm8+mr5f78dUYs6vMiB6gBusQqfQmBvHZj/lwg==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/bcrypt": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-3.0.0.tgz", + "integrity": "sha512-nohgNyv+1ViVcubKBh0+XiNJ3dO8nYu///9aJ4cgSqv70gBL+94SNy/iC2NLzKPT2Zt/QavrOkBVbZRLZmw6NQ==", + "dev": true + }, + "@types/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/connect": { + "version": "3.4.34", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.34.tgz", + "integrity": "sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==", + "dev": true + }, + "@types/eslint": { + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.6.tgz", + "integrity": "sha512-I+1sYH+NPQ3/tVqCeUSBwTE/0heyvtXqpIopUUArlBm0Kpocb8FbMa3AZ/ASKIFpN3rnEx932TTXDbt9OXsNDw==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.0.tgz", + "integrity": "sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.45", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.45.tgz", + "integrity": "sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g==", + "dev": true + }, + "@types/express": { + "version": "4.17.9", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.9.tgz", + "integrity": "sha512-SDzEIZInC4sivGIFY4Sz1GG6J9UObPwCInYJjko2jzOf/Imx/dlpume6Xxwj1ORL82tBbmN4cPDIDkLbWHk9hw==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "*", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.17.tgz", + "integrity": "sha512-YYlVaCni5dnHc+bLZfY908IG1+x5xuibKZMGv8srKkvtul3wUuanYvpIj9GXXoWkQbaAdR+kgX46IETKUALWNQ==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "@types/graceful-fs": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.4.tgz", + "integrity": "sha512-mWA/4zFQhfvOA8zWkXobwJvBD7vzcxgrOQ0J5CH1votGqdq9m7+FwtGaqyCZqC3NyyBkc9z4m+iry4LlqcMWJg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/helmet": { + "version": "0.0.45", + "resolved": "https://registry.npmjs.org/@types/helmet/-/helmet-0.0.45.tgz", + "integrity": "sha512-PsLZI1NqKpXvsMZxh66xAZtpKiTeW+swY8a8LnCNSBbM/mvwU41P3BYoEqkJM9RbITPsq4uhIH0NkIsL9fzPbg==", + "dev": true, + "requires": { + "@types/express": "*" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "26.0.19", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.19.tgz", + "integrity": "sha512-jqHoirTG61fee6v6rwbnEuKhpSKih0tuhqeFbCmMmErhtu3BYlOZaXWjffgOstMM4S/3iQD31lI5bGLTrs97yQ==", + "dev": true, + "requires": { + "jest-diff": "^26.0.0", + "pretty-format": "^26.0.0" + } + }, + "@types/json-schema": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", + "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", + "dev": true + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "@types/jsonwebtoken": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.0.tgz", + "integrity": "sha512-9bVao7LvyorRGZCw0VmH/dr7Og+NdjYSsKAxB43OQoComFbBgsEpoR9JW6+qSq/ogwVBg8GI2MfAlk4SYI4OLg==", + "requires": { + "@types/node": "*" + } + }, + "@types/lodash": { + "version": "4.14.167", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.167.tgz", + "integrity": "sha512-w7tQPjARrvdeBkX/Rwg95S592JwxqOjmms3zWQ0XZgSyxSLdzWaYH3vErBhdVS/lRBX7F8aBYcYJYTr5TMGOzw==", + "dev": true + }, + "@types/mime": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.3.tgz", + "integrity": "sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q==", + "dev": true + }, + "@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": "14.14.20", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.20.tgz", + "integrity": "sha512-Y93R97Ouif9JEOWPIUyU+eyIdyRqQR0I8Ez1dzku4hDx34NWh4HbtIc3WNzwB1Y9ULvNGeu5B8h8bVL5cAk4/A==" + }, + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "@types/passport": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.5.tgz", + "integrity": "sha512-wNL4kT/5rnZgyGkqX7V2qH/R/te+bklv+nXcvHzyX99vNggx9DGN+F8CEOW3P/gRi7Cjm991uidRgTHsYkSuMg==", + "dev": true, + "requires": { + "@types/express": "*" + } + }, + "@types/passport-jwt": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/passport-jwt/-/passport-jwt-3.0.3.tgz", + "integrity": "sha512-RlOCXiTitE8kazj9jZc6/BfGCSqnv2w/eYPDm3+3iNsquHn7ratu7oIUskZx9ZtnwMdpvdpy+Z/QYClocH5NvQ==", + "dev": true, + "requires": { + "@types/express": "*", + "@types/jsonwebtoken": "*", + "@types/passport-strategy": "*" + } + }, + "@types/passport-strategy": { + "version": "0.2.35", + "resolved": "https://registry.npmjs.org/@types/passport-strategy/-/passport-strategy-0.2.35.tgz", + "integrity": "sha512-o5D19Jy2XPFoX2rKApykY15et3Apgax00RRLf0RUotPDUsYrQa7x4howLYr9El2mlUApHmCMv5CZ1IXqKFQ2+g==", + "dev": true, + "requires": { + "@types/express": "*", + "@types/passport": "*" + } + }, + "@types/prettier": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.1.6.tgz", + "integrity": "sha512-6gOkRe7OIioWAXfnO/2lFiv+SJichKVSys1mSsgyrYHSEjk8Ctv4tSR/Odvnu+HWlH2C8j53dahU03XmQdd5fA==", + "dev": true + }, + "@types/qs": { + "version": "6.9.5", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.5.tgz", + "integrity": "sha512-/JHkVHtx/REVG0VVToGRGH2+23hsYLHdyG+GrvoUGlGAd0ErauXDyvHtRI/7H7mzLm+tBCKA7pfcpkQ1lf58iQ==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", + "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", + "dev": true + }, + "@types/serve-static": { + "version": "1.13.8", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.8.tgz", + "integrity": "sha512-MoJhSQreaVoL+/hurAZzIm8wafFR6ajiTM1m4A0kv6AGeVBl4r4pOV8bGFrjjq1sGxDTnCoF8i22o0/aE5XCyA==", + "dev": true, + "requires": { + "@types/mime": "*", + "@types/node": "*" + } + }, + "@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/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "dev": true + }, + "@types/superagent": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.10.tgz", + "integrity": "sha512-xAgkb2CMWUMCyVc/3+7iQfOEBE75NvuZeezvmixbUw3nmENf2tCnQkW5yQLTYqvXUQ+R6EXxdqKKbal2zM5V/g==", + "dev": true, + "requires": { + "@types/cookiejar": "*", + "@types/node": "*" + } + }, + "@types/supertest": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.10.tgz", + "integrity": "sha512-Xt8TbEyZTnD5Xulw95GLMOkmjGICrOQyJ2jqgkSjAUR3mm7pAIzSR0NFBaMcwlzVvlpCjNwbATcWWwjNiZiFrQ==", + "dev": true, + "requires": { + "@types/superagent": "*" + } + }, + "@types/tapable": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.6.tgz", + "integrity": "sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA==", + "dev": true + }, + "@types/uglify-js": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.11.1.tgz", + "integrity": "sha512-7npvPKV+jINLu1SpSYVWG8KvyJBhBa8tmzMMdDoVc2pWUYHN8KIXlPJhjJ4LT97c4dXJA2SHL/q6ADbDriZN+Q==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@types/validator": { + "version": "10.11.3", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-10.11.3.tgz", + "integrity": "sha512-GKF2VnEkMmEeEGvoo03ocrP9ySMuX1ypKazIYMlsjfslfBMhOAtC5dmEWKdJioW4lJN7MZRS88kalTsVClyQ9w==" + }, + "@types/webpack": { + "version": "4.41.25", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.25.tgz", + "integrity": "sha512-cr6kZ+4m9lp86ytQc1jPOJXgINQyz3kLLunZ57jznW+WIAL0JqZbGubQk4GlD42MuQL5JGOABrxdpqqWeovlVQ==", + "dev": true, + "requires": { + "@types/anymatch": "*", + "@types/node": "*", + "@types/tapable": "*", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "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 + } + } + }, + "@types/webpack-sources": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-2.1.0.tgz", + "integrity": "sha512-LXn/oYIpBeucgP1EIJbKQ2/4ZmpvRl+dlrFdX7+94SKRUV3Evy3FsfMZY318vGhkWUS5MPhtOM3w1/hCOAOXcg==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" + } + }, + "@types/yargs": { + "version": "15.0.12", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.12.tgz", + "integrity": "sha512-f+fD/fQAo3BCbCDlrUpznF1A5Zp9rB0noS5vnoormHSIPFKL0Z2DcUJ3Gxp5ytH4uLRNxy7AwYUC9exZzqGMAw==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "20.2.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", + "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.12.0.tgz", + "integrity": "sha512-wHKj6q8s70sO5i39H2g1gtpCXCvjVszzj6FFygneNFyIAxRvNSVz9GML7XpqrB9t7hNutXw+MHnLN/Ih6uyB8Q==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "4.12.0", + "@typescript-eslint/scope-manager": "4.12.0", + "debug": "^4.1.1", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.0.0", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "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 + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/experimental-utils": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.12.0.tgz", + "integrity": "sha512-MpXZXUAvHt99c9ScXijx7i061o5HEjXltO+sbYfZAAHxv3XankQkPaNi5myy0Yh0Tyea3Hdq1pi7Vsh0GJb0fA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/scope-manager": "4.12.0", + "@typescript-eslint/types": "4.12.0", + "@typescript-eslint/typescript-estree": "4.12.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.12.0.tgz", + "integrity": "sha512-9XxVADAo9vlfjfoxnjboBTxYOiNY93/QuvcPgsiKvHxW6tOZx1W4TvkIQ2jB3k5M0pbFP5FlXihLK49TjZXhuQ==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "4.12.0", + "@typescript-eslint/types": "4.12.0", + "@typescript-eslint/typescript-estree": "4.12.0", + "debug": "^4.1.1" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "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 + } + } + }, + "@typescript-eslint/scope-manager": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.12.0.tgz", + "integrity": "sha512-QVf9oCSVLte/8jvOsxmgBdOaoe2J0wtEmBr13Yz0rkBNkl5D8bfnf6G4Vhox9qqMIoG7QQoVwd2eG9DM/ge4Qg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.12.0", + "@typescript-eslint/visitor-keys": "4.12.0" + } + }, + "@typescript-eslint/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.12.0.tgz", + "integrity": "sha512-N2RhGeheVLGtyy+CxRmxdsniB7sMSCfsnbh8K/+RUIXYYq3Ub5+sukRCjVE80QerrUBvuEvs4fDhz5AW/pcL6g==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.12.0.tgz", + "integrity": "sha512-gZkFcmmp/CnzqD2RKMich2/FjBTsYopjiwJCroxqHZIY11IIoN0l5lKqcgoAPKHt33H2mAkSfvzj8i44Jm7F4w==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.12.0", + "@typescript-eslint/visitor-keys": "4.12.0", + "debug": "^4.1.1", + "globby": "^11.0.1", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "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 + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.12.0.tgz", + "integrity": "sha512-hVpsLARbDh4B9TKYz5cLbcdMIOAoBYgFPCSP9FFS/liSF+b33gVNq8JHY3QGhHNVz85hObvL7BEYLlgx553WCw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.12.0", + "eslint-visitor-keys": "^2.0.0" + } + }, + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@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 + }, + "@zmotivat0r/o0": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@zmotivat0r/o0/-/o0-1.0.2.tgz", + "integrity": "sha512-wQ/sHqJEtYb+QtgxtWlBpGASFZ2avpoRWbvpginEuy7howZHTZTy3zYMRMaBKok4bZwIGU5bjmzE59+m1IWqKQ==" + }, + "abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.0.4.tgz", + "integrity": "sha512-XNP0PqF1XD19ZlLKvB7cMmnZswW4C/03pRHgirB30uSJTaS3A3V1/P4sS3HPvFmjoriPCJQs+JDSbm4bL1TxGQ==", + "dev": true + }, + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + } + } + }, + "acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + }, + "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": "3.0.0", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.0.0.tgz", + "integrity": "sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw==" + }, + "append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=" + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "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" + } + }, + "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==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-differ": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "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" + } + }, + "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 + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "async": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "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 + }, + "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.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "axios": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", + "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "requires": { + "follow-redirects": "^1.10.0" + } + }, + "babel-jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", + "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", + "dev": true, + "requires": { + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + } + }, + "babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", + "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", + "dev": true, + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", + "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^26.6.2", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "bcrypt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-4.0.1.tgz", + "integrity": "sha512-hSIZHkUxIDS5zA2o00Kf2O5RfVbQ888n54xQoF/eIaquU4uaLxK8vhhBdktd0B3n2MjkcAWzv4mnhogykBKOUQ==", + "requires": { + "node-addon-api": "^2.0.0", + "node-pre-gyp": "0.14.0" + } + }, + "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" + } + }, + "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.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "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==", + "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" + } + }, + "bowser": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.9.0.tgz", + "integrity": "sha512-2ld76tuLBNFekRgmJfT2+3j5MIrP6bFict8WAIT3beq+srz1gcKNAdNKMqHqauQt63NmAa88HfP1/Ypa9Er3HA==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "browserslist": { + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.0.tgz", + "integrity": "sha512-/j6k8R0p3nxOC6kx5JGAxsnhc9ixaWJfYc+TNTzxg6+ARaESAvQGV7h0uNOB4t+pLQJZWzcrMxXOxjgsCj3dqQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001165", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.621", + "escalade": "^3.1.1", + "node-releases": "^1.1.67" + } + }, + "bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "requires": { + "fast-json-stable-stringify": "2.x" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, + "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==" + }, + "busboy": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", + "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", + "requires": { + "dicer": "0.2.5", + "readable-stream": "1.1.x" + } + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "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" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "camelize": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", + "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=" + }, + "caniuse-lite": { + "version": "1.0.30001173", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001173.tgz", + "integrity": "sha512-R3aqmjrICdGCTAnSXtNyvWYMK3YtV5jwudbq0T7nN9k4kmE4CBuwPqyJ+KBzepSTh0huivV2gLbSMEzTTmfeYw==", + "dev": true + }, + "capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "dev": true, + "requires": { + "rsvp": "^4.8.4" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true + }, + "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.4.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", + "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "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" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "cjs-module-lexer": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", + "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", + "dev": true + }, + "class-transformer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.2.3.tgz", + "integrity": "sha512-qsP+0xoavpOlJHuYsQJsN58HXSl8Jvveo+T37rEvCEeRfMWoytAyR0Ua/YsFgpM6AZYZ/og2PJwArwzJl1aXtQ==" + }, + "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" + } + } + } + }, + "class-validator": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.11.1.tgz", + "integrity": "sha512-6CGdjwJLmKw+sQbK5ZDo1v1yTajkqfPOUDWSYVIlhUiCh6Phy8sAnMFE2XKHAcKAdoOz4jJUQhjPQWPYUuHxrA==", + "requires": { + "@types/validator": "10.11.3", + "google-libphonenumber": "^3.1.6", + "validator": "12.0.0" + } + }, + "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-highlight": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.9.tgz", + "integrity": "sha512-t8RNIZgiI24i/mslZ8XT8o660RUj5ZbUJpEZrZa/BNekTzdC2LfMRAnt0Y7sgzNM4FGW5tmWg/YnbTH8o1eIOQ==", + "requires": { + "chalk": "^4.0.0", + "highlight.js": "^10.0.0", + "mz": "^2.4.0", + "parse5": "^5.1.1", + "parse5-htmlparser2-tree-adapter": "^6.0.0", + "yargs": "^15.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "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==" + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + } + } + }, + "cli-spinners": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.5.0.tgz", + "integrity": "sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ==", + "dev": true + }, + "cli-table3": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", + "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", + "dev": true, + "requires": { + "colors": "^1.1.2", + "object-assign": "^4.1.0", + "string-width": "^2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "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==" + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "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=" + }, + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "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": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", + "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + }, + "dependencies": { + "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==", + "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=" + } + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "color-string": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.4.tgz", + "integrity": "sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "colorette": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", + "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", + "dev": true + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" + }, + "colorspace": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", + "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==", + "requires": { + "color": "3.0.x", + "text-hex": "1.0.x" + } + }, + "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": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + }, + "compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", + "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 + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "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" + } + }, + "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==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "consola": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.0.tgz", + "integrity": "sha512-vlcSGgdYS26mPf7qNi+dCisbhiyDnrN1zaRbw3CSuc2wGOMEGGPsp46PdRG5gqXwgtJfjxDkxRNAgRPr1B77vQ==" + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + }, + "dependencies": { + "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==" + } + } + }, + "content-security-policy-builder": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/content-security-policy-builder/-/content-security-policy-builder-2.1.0.tgz", + "integrity": "sha512-/MtLWhJVvJNkA9dVLAp6fg9LxD2gfI6R2Fi1hPmfjYXSahJJzcfvoeDOxSyp4NvxMuwWv3WMssE9o31DoULHrQ==" + }, + "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==" + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "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 + } + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==", + "dev": true + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + } + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "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" + } + }, + "dasherize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dasherize/-/dasherize-2.0.0.tgz", + "integrity": "sha1-bYCcnNDPe7iVLYD8hPoT1H3bEwg=" + }, + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "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=" + } + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decimal.js": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", + "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==", + "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-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "deepmerge": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-3.3.0.tgz", + "integrity": "sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA==" + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "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" + } + } + } + }, + "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 + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true + }, + "dicer": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", + "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", + "requires": { + "readable-stream": "1.1.x", + "streamsearch": "0.1.2" + } + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "diff-sequences": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "requires": { + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true + } + } + }, + "dont-sniff-mimetype": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/dont-sniff-mimetype/-/dont-sniff-mimetype-1.1.0.tgz", + "integrity": "sha512-ZjI4zqTaxveH2/tTlzS1wFp+7ncxNZaIEWYg3lzZRHkKf5zPT/MnEG6WL0BhHMJUabkh8GeU5NL5j+rEUCb7Ug==" + }, + "dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" + }, + "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" + } + }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "electron-to-chromium": { + "version": "1.3.634", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.634.tgz", + "integrity": "sha512-QPrWNYeE/A0xRvl/QP3E0nkaEvYUvH3gM04ZWYtIa6QlSpEetRlRI1xvQ7hiMIySHHEV+mwDSX8Kj4YZY6ZQAw==", + "dev": true + }, + "emittery": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", + "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "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" + } + }, + "enhanced-resolve": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", + "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "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" + }, + "dependencies": { + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + } + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "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=" + }, + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "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 + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + } + } + }, + "eslint": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.17.0.tgz", + "integrity": "sha512-zJk08MiBgwuGoxes5sSQhOtibZ75pz0J35XTRlZOk9xMffhpA9BTbQZxoXZzOl5zMbleShbGwtw+1kGferfFwQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@eslint/eslintrc": "^0.2.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^6.0.0", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.4", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "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 + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + } + } + }, + "eslint-config-prettier": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-7.0.0.tgz", + "integrity": "sha512-8Y8lGLVPPZdaNA7JXqnvETVC7IiVRgAP6afQu9gOQRn90YY3otMNh+x7Vr2vMePQntF+5erdSUBqSzCmU/AxaQ==", + "dev": true + }, + "eslint-plugin-prettier": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.3.1.tgz", + "integrity": "sha512-Rq3jkcFY8RYeQLgk2cCwuc0P7SEFwDravPhsJZOQ5N4YI4DSg50NyqJ/9gdZHzQlHf8MvafSesbNJCcP/FF6pQ==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", + "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "dev": true + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "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=" + }, + "events": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", + "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", + "dev": true + }, + "exec-sh": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", + "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", + "dev": true + }, + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.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": { + "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" + } + } + } + }, + "expect": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", + "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "ansi-styles": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0" + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "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": { + "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=" + }, + "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==" + } + } + }, + "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": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "fast-glob": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", + "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fast-safe-stringify": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", + "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" + }, + "fastq": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.10.0.tgz", + "integrity": "sha512-NL2Qc5L3iQEsyYzweq7qfgy5OtXCmGzGvhElGEd/SoFWEMOEczNh5s5ocaF01HDetxz+p8ecjNPA6cZxxIHmzA==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, + "feature-policy": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/feature-policy/-/feature-policy-0.3.0.tgz", + "integrity": "sha512-ZtijOTFN7TzCujt1fnNhfWPFPSHeZkesff9AXZj+UEjYBynWNUIYpC87Ve4wHzyexQsImicLu7WsC2LHq7/xrQ==" + }, + "fecha": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.0.tgz", + "integrity": "sha512-aN3pcx/DSmtyoovUudctc8+6Hl4T+hI9GBBHLjA76jdZl7+b1sgh5g4k+u/GL3dTy1/pnYzKp69FpJ0OicE3Wg==" + }, + "figlet": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.5.0.tgz", + "integrity": "sha512-ZQJM4aifMpz6H19AW1VqvZ7l4pOE9p7i/3LyxgO2kp+PO/VcDYNqIHEMtkccqIhTXMKci4kjueJr/iCQEaT/Ww==" + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz", + "integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "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==", + "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" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "find-versions": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", + "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", + "dev": true, + "requires": { + "semver-regex": "^2.0.0" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.0.tgz", + "integrity": "sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA==", + "dev": true + }, + "fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" + }, + "follow-redirects": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.1.tgz", + "integrity": "sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg==" + }, + "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 + }, + "fork-ts-checker-webpack-plugin": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.0.5.tgz", + "integrity": "sha512-2jIHv2RhXzSxWtvRQX/ZtOxd5joo+FQYzn+sJ/hyLqApKGgvjMEMF951GnvuSNPheGsqiVzIDjvSZo1qRtry1Q==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "dependencies": { + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "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" + } + }, + "formidable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", + "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==", + "dev": true + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "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=" + }, + "fs-extra": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", + "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^1.0.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==", + "requires": { + "minipass": "^2.6.0" + } + }, + "fs-monkey": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.1.tgz", + "integrity": "sha512-fcSa+wyTqZa46iWweI7/ZiUfegOZl0SG8+dltIwFXo7+zYU9J9kpS3NB6pZcSlJdhvIwp81Adx2XhZorncxiaA==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "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.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "globby": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", + "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "google-libphonenumber": { + "version": "3.2.15", + "resolved": "https://registry.npmjs.org/google-libphonenumber/-/google-libphonenumber-3.2.15.tgz", + "integrity": "sha512-tbCIuzMoH34RdrbFRw5kijAZn/p6JMQvsgtr1glg2ugbwqrMPlOL8pHNK8cyGo9B6SXpcMm4hdyDqwomR+HPRg==" + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true, + "optional": 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.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "requires": { + "ajv": "^6.12.3", + "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=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "helmet": { + "version": "3.23.3", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-3.23.3.tgz", + "integrity": "sha512-U3MeYdzPJQhtvqAVBPntVgAvNSOJyagwZwyKsFdyRa8TV3pOKVFljalPOCxbw5Wwf2kncGhmP0qHjyazIdNdSA==", + "requires": { + "depd": "2.0.0", + "dont-sniff-mimetype": "1.1.0", + "feature-policy": "0.3.0", + "helmet-crossdomain": "0.4.0", + "helmet-csp": "2.10.0", + "hide-powered-by": "1.1.0", + "hpkp": "2.0.0", + "hsts": "2.2.0", + "nocache": "2.1.0", + "referrer-policy": "1.2.0", + "x-xss-protection": "1.3.0" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + } + } + }, + "helmet-crossdomain": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/helmet-crossdomain/-/helmet-crossdomain-0.4.0.tgz", + "integrity": "sha512-AB4DTykRw3HCOxovD1nPR16hllrVImeFp5VBV9/twj66lJ2nU75DP8FPL0/Jp4jj79JhTfG+pFI2MD02kWJ+fA==" + }, + "helmet-csp": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/helmet-csp/-/helmet-csp-2.10.0.tgz", + "integrity": "sha512-Rz953ZNEFk8sT2XvewXkYN0Ho4GEZdjAZy4stjiEQV3eN7GDxg1QKmYggH7otDyIA7uGA6XnUMVSgeJwbR5X+w==", + "requires": { + "bowser": "2.9.0", + "camelize": "1.0.0", + "content-security-policy-builder": "2.1.0", + "dasherize": "2.0.0" + } + }, + "hide-powered-by": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hide-powered-by/-/hide-powered-by-1.1.0.tgz", + "integrity": "sha512-Io1zA2yOA1YJslkr+AJlWSf2yWFkKjvkcL9Ni1XSUqnGLr/qRQe2UI3Cn/J9MsJht7yEVCe0SscY1HgVMujbgg==" + }, + "highlight.js": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.5.0.tgz", + "integrity": "sha512-xTmvd9HiIHR6L53TMC7TKolEj65zG1XU+Onr8oi86mYa+nLcIbxTTWkpW7CsEwv/vK7u1zb8alZIMLDqqN6KTw==" + }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "hpkp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hpkp/-/hpkp-2.0.0.tgz", + "integrity": "sha1-EOFCJk52IVpdMMROxD3mTe5tFnI=" + }, + "hsts": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hsts/-/hsts-2.2.0.tgz", + "integrity": "sha512-ToaTnQ2TbJkochoVcdXYm4HOCliNozlviNsg+X2XQLQvZNI/kCHR9rZxVYpJB3UPcHz80PgxRyWQ7PdU1r+VBQ==", + "requires": { + "depd": "2.0.0" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + } + } + }, + "html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.5" + } + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "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==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "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" + } + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, + "husky": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.6.tgz", + "integrity": "sha512-o6UjVI8xtlWRL5395iWq9LKDyp/9TE7XMOTvIpEVzW638UcGxTmV5cfel6fsk/jbZSTlvfGVJf2svFtybcIZag==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "ci-info": "^2.0.0", + "compare-versions": "^3.6.0", + "cosmiconfig": "^7.0.0", + "find-versions": "^3.2.0", + "opencollective-postinstall": "^2.0.2", + "pkg-dir": "^4.2.0", + "please-upgrade-node": "^3.2.0", + "slash": "^3.0.0", + "which-pm-runs": "^1.0.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + } + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + }, + "ignore-walk": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "requires": { + "minimatch": "^3.0.4" + } + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "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.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "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.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "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-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "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-docker": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", + "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", + "dev": true, + "optional": 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-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "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-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-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-potential-custom-element-name": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", + "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=", + "dev": true + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + }, + "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": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "optional": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "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-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "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 + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "iterare": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz", + "integrity": "sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==" + }, + "jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", + "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", + "dev": true, + "requires": { + "@jest/core": "^26.6.3", + "import-local": "^3.0.2", + "jest-cli": "^26.6.3" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "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 + }, + "jest-cli": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", + "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", + "dev": true, + "requires": { + "@jest/core": "^26.6.3", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^26.6.3", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "prompts": "^2.0.1", + "yargs": "^15.4.1" + } + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + } + } + }, + "jest-changed-files": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", + "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "execa": "^4.0.0", + "throat": "^5.0.0" + } + }, + "jest-config": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", + "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^26.6.3", + "@jest/types": "^26.6.2", + "babel-jest": "^26.6.3", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^26.6.2", + "jest-environment-node": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-jasmine2": "^26.6.3", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true + } + } + }, + "jest-diff": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + } + }, + "jest-docblock": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", + "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", + "dev": true, + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", + "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2" + } + }, + "jest-environment-jsdom": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", + "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", + "dev": true, + "requires": { + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2", + "jsdom": "^16.4.0" + } + }, + "jest-environment-node": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", + "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", + "dev": true, + "requires": { + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + } + }, + "jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "dev": true + }, + "jest-haste-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", + "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.1.2", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7" + } + }, + "jest-jasmine2": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", + "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^26.6.2", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2", + "throat": "^5.0.0" + } + }, + "jest-leak-detector": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", + "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", + "dev": true, + "requires": { + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + } + }, + "jest-matcher-utils": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", + "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + } + }, + "jest-message-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + } + }, + "jest-mock": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", + "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*" + } + }, + "jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true + }, + "jest-regex-util": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", + "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", + "dev": true + }, + "jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + } + }, + "jest-resolve-dependencies": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", + "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-snapshot": "^26.6.2" + } + }, + "jest-runner": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", + "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.7.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-docblock": "^26.0.0", + "jest-haste-map": "^26.6.2", + "jest-leak-detector": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "source-map-support": "^0.5.6", + "throat": "^5.0.0" + } + }, + "jest-runtime": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", + "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/globals": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0", + "cjs-module-lexer": "^0.6.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.4.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "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.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + } + } + }, + "jest-serializer": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", + "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", + "dev": true, + "requires": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + } + }, + "jest-snapshot": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", + "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.0.0", + "chalk": "^4.0.0", + "expect": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-haste-map": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "natural-compare": "^1.4.0", + "pretty-format": "^26.6.2", + "semver": "^7.3.2" + }, + "dependencies": { + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + } + }, + "jest-validate": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", + "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "leven": "^3.1.0", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true + } + } + }, + "jest-watcher": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", + "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", + "dev": true, + "requires": { + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^26.6.2", + "string-length": "^4.0.1" + } + }, + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "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 + }, + "jsdom": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.4.0.tgz", + "integrity": "sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==", + "dev": true, + "requires": { + "abab": "^2.0.3", + "acorn": "^7.1.1", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.2.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.0", + "domexception": "^2.0.1", + "escodegen": "^1.14.1", + "html-encoding-sniffer": "^2.0.1", + "is-potential-custom-element-name": "^1.0.0", + "nwsapi": "^2.2.0", + "parse5": "5.1.1", + "request": "^2.88.2", + "request-promise-native": "^1.0.8", + "saxes": "^5.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^3.0.1", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0", + "ws": "^7.2.3", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "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-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "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==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json5": { + "version": "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": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + }, + "dependencies": { + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + } + } + }, + "jsonwebtoken": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "requires": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^5.6.0" + } + }, + "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" + } + }, + "jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "requires": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "loader-runner": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.1.0.tgz", + "integrity": "sha512-oR4lB4WvwFoC70ocraKhn5nkKSs23t57h9udUgw8o0iH8hMXeEoRuUgfcvgUwAJ1ZpRqBvcou4N2SMvM1DwMrA==", + "dev": true + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" + }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "lodash.toarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", + "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=", + "dev": true + }, + "log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "dev": true, + "requires": { + "chalk": "^4.0.0" + } + }, + "logform": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.2.0.tgz", + "integrity": "sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg==", + "requires": { + "colors": "^1.2.1", + "fast-safe-stringify": "^2.0.4", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "triple-beam": "^1.3.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + }, + "dependencies": { + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "macos-release": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.4.1.tgz", + "integrity": "sha512-H/QHeBIN1fIGJX517pvK8IEK53yQOW7YcEI55oYtgjDdoCQQz7eJS94qt5kNrscReEyuD/JcdFCm2XBEcGOITg==", + "dev": true + }, + "magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "requires": { + "tmpl": "1.0.x" + } + }, + "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" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "memfs": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.2.0.tgz", + "integrity": "sha512-f/xxz2TpdKv6uDn6GtHee8ivFyxwxmPuXatBb1FBwxYNuVpbM3k/Y1Z+vC0mH/dIXXrukYfe3qe5J32Dfjg93A==", + "dev": true, + "requires": { + "fs-monkey": "1.0.1" + } + }, + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "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" + } + }, + "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 + }, + "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" + } + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "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 + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", + "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==" + }, + "mime-types": { + "version": "2.1.28", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", + "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", + "requires": { + "mime-db": "1.45.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 + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "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==", + "requires": { + "minipass": "^2.9.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.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "mri": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.6.tgz", + "integrity": "sha512-oi1b3MfbyGa7FJMP9GmLTttni5JoICpYBRlq+x5V16fZbLsnL9N3wFqqIm/nIG43FjUFkFh9Epzp/kzUGUnJxQ==", + "dev": true + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "multer": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.2.tgz", + "integrity": "sha512-xY8pX7V+ybyUpbYMxtjM9KAiD9ixtg5/JkeKUTD6xilfDv0vzzOFcCp4Ljb1UU3tSOM3VTZtKo63OmzOrGi3Cg==", + "requires": { + "append-field": "^1.0.0", + "busboy": "^0.2.11", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.1", + "object-assign": "^4.1.1", + "on-finished": "^2.3.0", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + } + }, + "multimatch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-4.0.0.tgz", + "integrity": "sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==", + "dev": true, + "requires": { + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" + } + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==" + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "needle": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.5.2.tgz", + "integrity": "sha512-LbRIwS9BfkPvNwNHlsA41Q29kL2L/6VaOJ0qisM5lLWsTV3nP15abO5ITL6L81zqFhzjRKDAYjpcBcwM0AVvLQ==", + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "nocache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.1.0.tgz", + "integrity": "sha512-0L9FvHG3nfnnmaEQPjT9xhfN4ISk0A8/2j4M37Np4mcDesJjHgEUfgPhdCyZuFI954tjokaIj/A3NdpFNdEh4Q==" + }, + "node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" + }, + "node-emoji": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.10.0.tgz", + "integrity": "sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw==", + "dev": true, + "requires": { + "lodash.toarray": "^4.4.0" + } + }, + "node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true + }, + "node-notifier": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.1.tgz", + "integrity": "sha512-BvEXF+UmsnAfYfoapKM9nGxnP+Wn7P91YfXmrKnfcYCx6VBeoN5Ez5Ogck6I8Bi5k4RlpqRYaw75pAwzX9OphA==", + "dev": true, + "optional": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^2.2.0", + "semver": "^7.3.2", + "shellwords": "^0.1.1", + "uuid": "^8.3.0", + "which": "^2.0.2" + }, + "dependencies": { + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "optional": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "node-pre-gyp": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz", + "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "node-releases": { + "version": "1.1.69", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.69.tgz", + "integrity": "sha512-DGIjo79VDEyAnRlfSqYTsy+yoHd2IOjJiKUozD2MV2D85Vso6Bug56mb9tT/fY5Urt0iqk01H7x+llAruDR2zA==", + "dev": true + }, + "nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "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" + } + }, + "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 + }, + "npm-bundled": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" + }, + "npm-packlist": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "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=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-hash": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.1.1.tgz", + "integrity": "sha512-VOJmgmS+7wvXf8CjbQmimtCnEx3IAoLxI3fp2fbWehxrWBcAQFbk+vcwb6vzR0VZv/eNCJ/27j151ZTwqW/JeQ==" + }, + "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.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" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "requires": { + "fn.name": "1.x.x" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", + "dev": true + }, + "optional": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/optional/-/optional-0.1.4.tgz", + "integrity": "sha512-gtvrrCfkE08wKcgXaVwQVgwEQ8vel2dc5DDBn9RLQZ3YtmtkBss6A2HY6BnJH4N/4Ku97Ri/SF8sNWE2225WJw==", + "dev": true + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "ora": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.1.0.tgz", + "integrity": "sha512-9tXIMPvjZ7hPTbk8DFq1f7Kow/HU/pQYB60JbNq+QnGwcyhWVZaQ4hM9zQDEsPxw/muLpgiHSaumUZxCAmod/w==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.4.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "mute-stream": "0.0.8", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-name": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.0.tgz", + "integrity": "sha512-caABzDdJMbtykt7GmSogEat3faTKQhmZf0BS5l/pZGmP0vPWQjXWqOhbLyK+b6j2/DQPmEvYdzLXJXXLJNVDNg==", + "dev": true, + "requires": { + "macos-release": "^2.2.0", + "windows-release": "^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=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-each-series": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", + "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-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.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==" + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parent-require": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parent-require/-/parent-require-1.0.0.tgz", + "integrity": "sha1-dGoWdjgIOoYLDu9nMssn7UbDKXc=" + }, + "parse-json": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" + }, + "parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "requires": { + "parse5": "^6.0.1" + }, + "dependencies": { + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + } + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "passport": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.4.1.tgz", + "integrity": "sha512-IxXgZZs8d7uFSt3eqNjM9NQ3g3uQCW5avD8mRNoXV99Yig50vjuaez6dQK2qC0kVWPRTujxY0dWgGfT09adjYg==", + "requires": { + "passport-strategy": "1.x.x", + "pause": "0.0.1" + } + }, + "passport-jwt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/passport-jwt/-/passport-jwt-4.0.0.tgz", + "integrity": "sha512-BwC0n2GP/1hMVjR4QpnvqA61TxenUMlmfNjYNgK0ZAs0HK4SOQkHcSv4L328blNTLtHq7DbmvyNJiH+bn6C5Mg==", + "requires": { + "jsonwebtoken": "^8.2.0", + "passport-strategy": "^1.0.0" + } + }, + "passport-strategy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", + "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=" + }, + "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==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-to-regexp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.2.0.tgz", + "integrity": "sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==" + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" + }, + "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.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true + }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, + "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" + } + }, + "please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "requires": { + "semver-compare": "^1.0.0" + } + }, + "pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prettier": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", + "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + } + } + }, + "pretty-quick": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/pretty-quick/-/pretty-quick-2.0.2.tgz", + "integrity": "sha512-aLb6vtOTEfJDwi1w+MBTeE20GwPVUYyn6IqNg6TtGpiOB1W3y6vKcsGFjqGeaaEtQgMLSPXTWONqh33UBuwG8A==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "execa": "^2.1.0", + "find-up": "^4.1.0", + "ignore": "^5.1.4", + "mri": "^1.1.4", + "multimatch": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.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" + } + }, + "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 + }, + "execa": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-2.1.0.tgz", + "integrity": "sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^3.0.0", + "onetime": "^5.1.0", + "p-finally": "^2.0.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "npm-run-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz", + "integrity": "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "p-finally": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", + "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "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==" + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "prompts": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", + "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "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" + } + }, + "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==" + }, + "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==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "react-is": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", + "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==", + "dev": true + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "referrer-policy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/referrer-policy/-/referrer-policy-1.2.0.tgz", + "integrity": "sha512-LgQJIuS6nAy1Jd88DCQRemyE3mS+ispwlqMk3b0yjZ257fI1v9c+/p6SD5gP5FGyXUIgrNOAfmyioHwZtYv2VA==" + }, + "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==" + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "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 + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "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.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "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 + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } + } + }, + "request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "dev": true, + "requires": { + "lodash": "^4.17.19" + } + }, + "request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "dev": true, + "requires": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "dependencies": { + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "dev": true, + "requires": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "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 + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "dev": true + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "run-parallel": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz", + "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==", + "dev": true + }, + "rxjs": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", + "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", + "requires": { + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "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==" + }, + "sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "dev": true, + "requires": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.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" + } + }, + "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" + } + } + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + } + } + }, + "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" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "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" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "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" + } + }, + "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" + } + } + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "requires": { + "xmlchars": "^2.2.0" + } + }, + "schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, + "semver-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", + "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", + "dev": true + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "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": { + "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==" + } + } + }, + "serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "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==", + "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=" + }, + "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" + } + } + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "shelljs": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "requires": { + "is-arrayish": "^0.3.1" + } + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "dependencies": { + "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 + } + } + }, + "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": { + "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" + } + }, + "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" + } + } + } + }, + "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==", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "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.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "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.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "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=" + }, + "sqlite3": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-4.2.0.tgz", + "integrity": "sha512-roEOz41hxui2Q7uYnWsjMOTry6TcNUNmp8audCx18gF10P2NknwdpF+E+HKvz/F2NvPKGGBF4NGc+ZPQ+AABwg==", + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.11.0" + }, + "dependencies": { + "node-pre-gyp": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz", + "integrity": "sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==", + "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" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "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" + } + }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" + }, + "stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "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=" + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true + }, + "streamsearch": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", + "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" + }, + "string-length": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", + "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==", + "dev": true, + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "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 + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "superagent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz", + "integrity": "sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==", + "dev": true, + "requires": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.2", + "debug": "^4.1.1", + "fast-safe-stringify": "^2.0.7", + "form-data": "^3.0.0", + "formidable": "^1.2.2", + "methods": "^1.1.2", + "mime": "^2.4.6", + "qs": "^6.9.4", + "readable-stream": "^3.6.0", + "semver": "^7.3.2" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "form-data": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", + "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "mime": { + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.7.tgz", + "integrity": "sha512-dhNd1uA2u397uQk3Nv5LM4lm93WYDUXFn3Fu291FJerns4jyTudqhIWe4W04YLy7Uk1tm1Ore04NpjRvQp/NPA==", + "dev": true + }, + "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 + }, + "qs": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", + "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, + "supertest": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.0.1.tgz", + "integrity": "sha512-8yDNdm+bbAN/jeDdXsRipbq9qMpVF7wRsbwLgsANHqdjPsCoecmlTuqEcLQMGpmojFBhxayZ0ckXmLXYq7e+0g==", + "dev": true, + "requires": { + "methods": "1.1.2", + "superagent": "6.1.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-hyperlinks": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", + "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", + "dev": true, + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + } + }, + "swagger-ui-dist": { + "version": "3.38.0", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-3.38.0.tgz", + "integrity": "sha512-sselV8VY6f1BBauY9Sdmwz0jVaWTnGuHQWei7BaTpiUrLcoEUdmmK5bKefLXiwq+dx//es2S8mOvUS+tcXDsKg==" + }, + "swagger-ui-express": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-4.1.6.tgz", + "integrity": "sha512-Xs2BGGudvDBtL7RXcYtNvHsFtP1DBFPMJFRxHe5ez/VG/rzVOEjazJOOSc/kSCyxreCTKfJrII6MJlL9a6t8vw==", + "requires": { + "swagger-ui-dist": "^3.18.1" + } + }, + "symbol-observable": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-2.0.3.tgz", + "integrity": "sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA==", + "dev": true + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "table": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz", + "integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==", + "dev": true, + "requires": { + "ajv": "^7.0.2", + "lodash": "^4.17.20", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0" + }, + "dependencies": { + "ajv": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.0.3.tgz", + "integrity": "sha512-R50QRlXSxqXcQP5SvKUrw8VZeypvo12i2IX0EeR5PiZ7bEKeHWgzgo264LDadUsCU42lTJVhFikTqJwNeH34gQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "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 + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "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==", + "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" + } + }, + "terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + } + }, + "terser": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.5.1.tgz", + "integrity": "sha512-6VGWZNVP2KTUcltUQJ25TtNjx/XgdDsBDKGt8nN0MpydU36LmbPPcMBd2kmtZNNGVVDLg44k7GKeHHj+4zPIBQ==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.19" + }, + "dependencies": { + "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 + } + } + }, + "terser-webpack-plugin": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.0.3.tgz", + "integrity": "sha512-zFdGk8Lh9ZJGPxxPE6jwysOlATWB8GMW8HcfGULWA/nPal+3VdATflQvSBSLQJRCmYZnfFJl6vkRTiwJGNgPiQ==", + "dev": true, + "requires": { + "jest-worker": "^26.6.1", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "source-map": "^0.6.1", + "terser": "^5.3.8" + }, + "dependencies": { + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.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 + } + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, + "throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "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 + }, + "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" + } + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "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==" + }, + "tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "dev": true, + "requires": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tr46": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", + "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, + "tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true + }, + "triple-beam": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", + "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" + }, + "ts-jest": { + "version": "26.4.4", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.4.4.tgz", + "integrity": "sha512-3lFWKbLxJm34QxyVNNCgXX1u4o/RV0myvA2y2Bxm46iGIjKlaY0own9gIckbjZJPn+WaJEnfPPJ20HHGpoq4yg==", + "dev": true, + "requires": { + "@types/jest": "26.x", + "bs-logger": "0.x", + "buffer-from": "1.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^26.1.0", + "json5": "2.x", + "lodash.memoize": "4.x", + "make-error": "1.x", + "mkdirp": "1.x", + "semver": "7.x", + "yargs-parser": "20.x" + }, + "dependencies": { + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true + } + } + }, + "ts-loader": { + "version": "8.0.13", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.0.13.tgz", + "integrity": "sha512-1o1nO6aqouA23d2nlcMSEyPMAWRhnYUU0EQUJSc60E0TUyBNX792RHFYUN1ZM29vhMUNayrsbj2UVdZwKhXCDA==", + "dev": true, + "requires": { + "chalk": "^2.3.0", + "enhanced-resolve": "^4.0.0", + "loader-utils": "^1.0.2", + "micromatch": "^4.0.0", + "semver": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.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" + } + }, + "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 + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "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" + } + } + } + }, + "ts-node": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", + "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", + "dev": true, + "requires": { + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.17", + "yn": "3.1.1" + } + }, + "tsconfig-paths": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", + "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + } + }, + "tsconfig-paths-webpack-plugin": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-3.3.0.tgz", + "integrity": "sha512-MpQeZpwPY4gYASCUjY4yt2Zj8yv86O8f++3Ai4o0yI0fUC6G1syvnL9VuY71PBgimRYDQU47f12BEmJq9wRaSw==", + "dev": true, + "requires": { + "chalk": "^2.3.0", + "enhanced-resolve": "^4.0.0", + "tsconfig-paths": "^3.4.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "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 + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + }, + "tsutils": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.18.0.tgz", + "integrity": "sha512-D9Tu8nE3E7D1Bsf/V29oMHceMf+gnVO+pDguk/A5YRo1cLpkiQ48ZnbbS57pvvHeY+OIeNQx1vf4ASPlEtRpcA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "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-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "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==", + "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=" + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typeorm": { + "version": "0.2.29", + "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.2.29.tgz", + "integrity": "sha512-ih1vrTe3gEAGKRcWlcsTRxTL7gNjacQE498wVGuJ3ZRujtMqPZlbAWuC7xDzWCRjQnkZYNwZQeG9UgKfxSHB5g==", + "requires": { + "@sqltools/formatter": "1.2.2", + "app-root-path": "^3.0.0", + "buffer": "^5.5.0", + "chalk": "^4.1.0", + "cli-highlight": "^2.1.4", + "debug": "^4.1.1", + "dotenv": "^8.2.0", + "glob": "^7.1.6", + "js-yaml": "^3.14.0", + "mkdirp": "^1.0.4", + "reflect-metadata": "^0.1.13", + "sha.js": "^2.4.11", + "tslib": "^1.13.0", + "xml2js": "^0.4.23", + "yargonaut": "^1.1.2", + "yargs": "^16.0.3" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "typescript": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.3.tgz", + "integrity": "sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg==", + "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" + } + }, + "universalify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "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 + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "uri-js": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "dev": true, + "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 + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, + "v8-compile-cache": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", + "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", + "dev": true + }, + "v8-to-istanbul": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.0.tgz", + "integrity": "sha512-uXUVqNUCLa0AH1vuVxzi+MI4RfxEOKt9pBgKwHbgH7st8Kv2P1m+jvWNnektzBh5QShF3ODgKmUFCf38LnVz1g==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + } + }, + "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" + } + }, + "validator": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-12.0.0.tgz", + "integrity": "sha512-r5zA1cQBEOgYlesRmSEwc9LkbfNLTtji+vWyaHzRZUxCTHdsX3bd+sdHfs5tGZ2W6ILGGsxWxCNwT/h3IY/3ng==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "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" + } + }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "requires": { + "xml-name-validator": "^3.0.0" + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.x" + } + }, + "watchpack": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.1.0.tgz", + "integrity": "sha512-UjgD1mqjkG99+3lgG36at4wPnUXNvis2v1utwTgQ43C22c4LD71LsYMExdWXh4HZ+RmW+B0t1Vrg2GpXAkTOQw==", + "dev": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true + }, + "webpack": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.9.0.tgz", + "integrity": "sha512-YnnqIV/uAS5ZrNpctSv378qV7HmbJ74DL+XfvMxzbX1bV9e7eeT6eEWU4wuUw33CNr/HspBh7R/xQlVjTEyAeA==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.0", + "@types/estree": "^0.0.45", + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^8.0.4", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.3.1", + "eslint-scope": "^5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.4", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.1.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "pkg-dir": "^4.2.0", + "schema-utils": "^3.0.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.0.3", + "watchpack": "^2.0.0", + "webpack-sources": "^2.1.1" + }, + "dependencies": { + "enhanced-resolve": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.4.1.tgz", + "integrity": "sha512-4GbyIMzYktTFoRSmkbgZ1LU+RXwf4AQ8Z+rSuuh1dC8plp0PPeaWvx6+G4hh4KnUJ48VoxKbNyA1QQQIUpXjYA==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "tapable": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", + "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==", + "dev": true + } + } + }, + "webpack-node-externals": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-2.5.2.tgz", + "integrity": "sha512-aHdl/y2N7PW2Sx7K+r3AxpJO+aDMcYzMQd60Qxefq3+EwhewSbTBqNumOsCE1JsCUNoyfGj5465N0sSf6hc/5w==", + "dev": true + }, + "webpack-sources": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.2.0.tgz", + "integrity": "sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w==", + "dev": true, + "requires": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "whatwg-url": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz", + "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^2.0.2", + "webidl-conversions": "^6.1.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "which-pm-runs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", + "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", + "dev": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "windows-release": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", + "integrity": "sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==", + "dev": true, + "requires": { + "execa": "^4.0.2" + } + }, + "winston": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.3.3.tgz", + "integrity": "sha512-oEXTISQnC8VlSAKf1KYSSd7J6IWuRPQqDdo8eoRNaYKLvwSb5+79Z3Yi1lrl6KDpU6/VWaxpakDAtb1oQ4n9aw==", + "requires": { + "@dabh/diagnostics": "^2.0.2", + "async": "^3.1.0", + "is-stream": "^2.0.0", + "logform": "^2.2.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, + "winston-transport": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz", + "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==", + "requires": { + "readable-stream": "^2.3.7", + "triple-beam": "^1.2.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "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" + } + }, + "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==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "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==" + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.2.tgz", + "integrity": "sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA==", + "dev": true + }, + "x-xss-protection": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/x-xss-protection/-/x-xss-protection-1.3.0.tgz", + "integrity": "sha512-kpyBI9TlVipZO4diReZMAHWtS0MMa/7Kgx8hwG/EuZLiA6sg4Ah/4TRdASHhRRN3boobzcYgFRUFSgHRge6Qhg==" + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "y18n": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==" + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "yaml": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", + "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", + "dev": true + }, + "yargonaut": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/yargonaut/-/yargonaut-1.1.4.tgz", + "integrity": "sha512-rHgFmbgXAAzl+1nngqOcwEljqHGG9uUZoPjsdZEs1w5JW9RXYzrSvH/u70C1JE5qFi0qjsdhnUX/dJRpWqitSA==", + "requires": { + "chalk": "^1.1.1", + "figlet": "^1.1.1", + "parent-require": "^1.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz", + "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==" + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==" + } + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + } + } +} diff --git a/node-jtq/package.json b/node-jtq/package.json new file mode 100644 index 0000000..f07d9ab --- /dev/null +++ b/node-jtq/package.json @@ -0,0 +1,100 @@ +{ + "name": "node-jtq", + "version": "0.0.1", + "description": "", + "author": "", + "private": true, + "license": "UNLICENSED", + "scripts": { + "prebuild": "rimraf dist", + "build": "nest build", + "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", + "start": "nest start", + "start:dev": "nest start --watch", + "start:debug": "nest start --debug --watch", + "start:prod": "node dist/main", + "lint": "eslint {src,apps,libs,test}/**/*.ts --fix", + "test": "jest", + "test:watch": "jest --watch", + "test:cov": "jest --coverage", + "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", + "test:e2e": "jest --config ./test/jest-e2e.json" + }, + "dependencies": { + "@nestjs/common": "^7.5.1", + "@nestjs/core": "^7.5.1", + "@nestjs/platform-express": "^7.5.1", + "reflect-metadata": "^0.1.13", + "rimraf": "^3.0.2", + "rxjs": "^6.6.3", + "winston": "^3.2.1", + "class-transformer": "^0.2.3", + "class-validator": "^0.11.1", + "@devon4node/common": "^2.0.0", + "@devon4node/config": "^2.0.0", + "@nestjs/typeorm": "^7.0.0", + "typeorm": "^0.2.24", + "sqlite3": "^4.1.1", + "helmet": "^3.21.3", + "@nestjs/swagger": "^4.4.0", + "swagger-ui-express": "^4.1.4", + "@nestjs/passport": "^7.0.0", + "@nestjs/jwt": "^7.0.0", + "passport-jwt": "^4.0.0", + "bcrypt": "^4.0.1", + "passport": "^0.4.1", + "lodash": "^4.17.15", + "@nestjsx/crud": "^4.4.2", + "@nestjsx/crud-typeorm": "^4.4.2" + }, + "devDependencies": { + "@nestjs/cli": "^7.5.1", + "@nestjs/schematics": "^7.1.3", + "@nestjs/testing": "^7.5.1", + "@types/express": "^4.17.8", + "@types/jest": "^26.0.15", + "@types/node": "^14.14.6", + "@types/supertest": "^2.0.10", + "@typescript-eslint/eslint-plugin": "^4.6.1", + "@typescript-eslint/parser": "^4.6.1", + "eslint": "^7.12.1", + "eslint-config-prettier": "7.0.0", + "eslint-plugin-prettier": "^3.1.2", + "jest": "^26.6.3", + "prettier": "^2.1.2", + "supertest": "^6.0.0", + "ts-jest": "^26.4.3", + "ts-loader": "^8.0.8", + "ts-node": "^9.0.0", + "tsconfig-paths": "^3.9.0", + "typescript": "^4.0.5", + "husky": "^4.2.3", + "pretty-quick": "^2.0.1", + "@types/helmet": "^0.0.45", + "@types/passport-jwt": "^3.0.3", + "@types/bcrypt": "^3.0.0", + "@types/lodash": "^4.14.149" + }, + "jest": { + "moduleFileExtensions": [ + "js", + "json", + "ts" + ], + "rootDir": "src", + "testRegex": ".*\\.spec\\.ts$", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + }, + "collectCoverageFrom": [ + "**/*.(t|j)s" + ], + "coverageDirectory": "../coverage", + "testEnvironment": "node" + }, + "husky": { + "hooks": { + "pre-commit": "pretty-quick --staged && eslint --cache --fix" + } + } +} diff --git a/node-jtq/src/app/app.controller.spec.ts b/node-jtq/src/app/app.controller.spec.ts new file mode 100644 index 0000000..d22f389 --- /dev/null +++ b/node-jtq/src/app/app.controller.spec.ts @@ -0,0 +1,22 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { AppController } from './app.controller'; +import { AppService } from './app.service'; + +describe('AppController', () => { + let appController: AppController; + + beforeEach(async () => { + const app: TestingModule = await Test.createTestingModule({ + controllers: [AppController], + providers: [AppService], + }).compile(); + + appController = app.get(AppController); + }); + + describe('root', () => { + it('should return "Hello World!"', () => { + expect(appController.getHello()).toBe('Hello World!'); + }); + }); +}); diff --git a/node-jtq/src/app/app.controller.ts b/node-jtq/src/app/app.controller.ts new file mode 100644 index 0000000..cce879e --- /dev/null +++ b/node-jtq/src/app/app.controller.ts @@ -0,0 +1,12 @@ +import { Controller, Get } from '@nestjs/common'; +import { AppService } from './app.service'; + +@Controller() +export class AppController { + constructor(private readonly appService: AppService) {} + + @Get() + getHello(): string { + return this.appService.getHello(); + } +} diff --git a/node-jtq/src/app/app.module.ts b/node-jtq/src/app/app.module.ts new file mode 100644 index 0000000..8eed885 --- /dev/null +++ b/node-jtq/src/app/app.module.ts @@ -0,0 +1,13 @@ +import { Module } from '@nestjs/common'; +import { AppController } from './app.controller'; +import { AppService } from './app.service'; +import { CoreModule } from './core/core.module'; +import { EventModule } from './event/event.module'; +import { QueueDetailModule } from './queue-detail/queue-detail.module'; + +@Module({ + imports: [CoreModule, EventModule, QueueDetailModule], + controllers: [AppController], + providers: [AppService], +}) +export class AppModule {} diff --git a/node-jtq/src/app/app.service.ts b/node-jtq/src/app/app.service.ts new file mode 100644 index 0000000..927d7cc --- /dev/null +++ b/node-jtq/src/app/app.service.ts @@ -0,0 +1,8 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class AppService { + getHello(): string { + return 'Hello World!'; + } +} diff --git a/node-jtq/src/app/core/auth/auth.module.ts b/node-jtq/src/app/core/auth/auth.module.ts new file mode 100644 index 0000000..d404246 --- /dev/null +++ b/node-jtq/src/app/core/auth/auth.module.ts @@ -0,0 +1,23 @@ +import { Module } from '@nestjs/common'; +import { JwtModule } from '@nestjs/jwt'; +import { PassportModule } from '@nestjs/passport'; +import { AuthController } from './controllers/auth.controller'; +import { AuthService } from './services/auth.service'; +import { JwtStrategy } from './strategies/jwt.strategy'; +import { ConfigModule, ConfigService } from '@devon4node/config'; +import { Config } from '../../shared/model/config/config.model'; + +@Module({ + imports: [ + PassportModule.register({ defaultStrategy: 'jwt' }), + JwtModule.registerAsync({ + imports: [ConfigModule], + useFactory: (config: ConfigService) => config.values.jwtConfig, + inject: [ConfigService], + }), + ], + providers: [AuthService, JwtStrategy], + exports: [AuthService, PassportModule], + controllers: [AuthController], +}) +export class AuthModule {} diff --git a/node-jtq/src/app/core/auth/controllers/auth.controller.spec.ts b/node-jtq/src/app/core/auth/controllers/auth.controller.spec.ts new file mode 100644 index 0000000..dcf4dad --- /dev/null +++ b/node-jtq/src/app/core/auth/controllers/auth.controller.spec.ts @@ -0,0 +1,96 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { AuthServiceMock } from '../../../../../test/auth/auth.service.mock'; +import { AuthService } from '../services/auth.service'; +import { AuthController } from './auth.controller'; +import { PassportModule } from '@nestjs/passport'; +import { UnauthorizedException, BadRequestException } from '@nestjs/common'; + +describe('Auth Controller', () => { + let controller: AuthController; + + beforeAll(async () => { + const module: TestingModule = await Test.createTestingModule({ + imports: [PassportModule.register({ defaultStrategy: 'none' })], + controllers: [AuthController], + providers: [ + { + provide: AuthService, + useClass: AuthServiceMock, + }, + ], + }).compile(); + + controller = module.get(AuthController); + }); + + it('should be defined after module initialization', () => { + expect(controller).toBeDefined(); + }); + + describe('login', () => { + it('should return the JWT token when the user is correct', async () => { + const user: any = { + username: 'user1', + password: 'user1', + }; + + const sendMock = { + send: jest.fn(), + }; + const mockResponse: any = { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + status: jest.fn().mockImplementation(_x => sendMock), + setHeader: jest.fn(), + }; + const value = await controller.login(user, mockResponse); + expect(value).toBeUndefined(); + expect(mockResponse.status).toBeCalledWith(200); + expect(sendMock.send).toBeCalledWith(); + expect(mockResponse.setHeader).toBeCalledWith('Authorization', 'Bearer THISISNOTAJWTTOKEN'); + }); + it('should throw an error when the username or password are not correct', async () => { + await expect( + controller.login( + { + username: 'user2', + password: 'user1', + }, + // response not needed + {} as any, + ), + ).rejects.toThrow(UnauthorizedException); + }); + }); + + describe('register', () => { + it('should register the user if not exists', async () => { + await expect( + controller.register({ + username: 'user2', + password: 'user2', + role: 1, + } as any), + ).resolves.toEqual({ username: 'user2', role: 1 }); + }); + it('should throw an error when user already exists', async () => { + await expect( + controller.register({ + username: 'user1', + password: 'user1', + role: 1, + } as any), + ).rejects.toThrow(BadRequestException); + }); + }); + + describe('currentUser', () => { + it('should return the validated user in the request', () => { + const user: any = { + username: 'user1', + }; + expect(controller.currentUser(user)).toEqual(user); + }); + // The auth guard will rejects all request if the user is not present or invalid, + // so we do not need to test those use case here. + }); +}); diff --git a/node-jtq/src/app/core/auth/controllers/auth.controller.ts b/node-jtq/src/app/core/auth/controllers/auth.controller.ts new file mode 100644 index 0000000..baecb06 --- /dev/null +++ b/node-jtq/src/app/core/auth/controllers/auth.controller.ts @@ -0,0 +1,35 @@ +import { BadRequestException, Body, Controller, Get, HttpCode, Post, UseGuards } from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; +import { User } from '../../user/model/entities/user.entity'; +import { AuthService } from '../services/auth.service'; +import { LoginDTO } from '../model/login.dto'; +import { GetUser } from '../decorators/get-user.decorator'; + +@Controller('auth') +export class AuthController { + constructor(private readonly authService: AuthService) { } + @Post('login') + @HttpCode(200) + async login(@Body() login: LoginDTO): Promise { + const token = await this.authService.login(login); + // res.setHeader('Authorization', 'Bearer ' + token); + // res.status(200).send(); + return token; + } + + @Post('register') + async register(@Body() user: User): Promise { + try { + const registered = await this.authService.register(user); + return registered; + } catch (e) { + throw new BadRequestException(e.message); + } + } + + @Get('currentuser') + @UseGuards(AuthGuard()) + currentUser(@GetUser() user: User): User { + return user; + } +} diff --git a/node-jtq/src/app/core/auth/decorators/get-user.decorator.ts b/node-jtq/src/app/core/auth/decorators/get-user.decorator.ts new file mode 100644 index 0000000..0fff802 --- /dev/null +++ b/node-jtq/src/app/core/auth/decorators/get-user.decorator.ts @@ -0,0 +1,11 @@ +/* istanbul ignore file */ +import { createParamDecorator, ExecutionContext } from '@nestjs/common'; + +export const GetUser = createParamDecorator((_data: unknown, ctx: ExecutionContext) => { + if (ctx.getType() === 'http') { + const request = ctx.switchToHttp().getRequest(); + return request.user; + } + + return undefined; +}); diff --git a/node-jtq/src/app/core/auth/decorators/roles.decorator.spec.ts b/node-jtq/src/app/core/auth/decorators/roles.decorator.spec.ts new file mode 100644 index 0000000..f994caa --- /dev/null +++ b/node-jtq/src/app/core/auth/decorators/roles.decorator.spec.ts @@ -0,0 +1,24 @@ +import { Roles } from './roles.decorator'; +import { roles } from '../model/roles.enum'; +import { Reflector } from '@nestjs/core'; + +@Roles(roles.USER, roles.ADMIN) +class RolesTest { + // eslint-disable-next-line @typescript-eslint/no-empty-function + constructor() {} + + @Roles(roles.ADMIN) + // eslint-disable-next-line @typescript-eslint/no-empty-function + oneHandler(): void {} +} + +describe('Roles', () => { + it('should reflect metadata in the class and methods', () => { + const reflector = new Reflector(); + + expect(reflector.get('roles', RolesTest)).toStrictEqual([roles.USER, roles.ADMIN]); + expect(reflector.get('roles', RolesTest)).not.toStrictEqual([roles.USER]); + expect(reflector.get('roles', RolesTest)).not.toStrictEqual([roles.ADMIN]); + expect(reflector.get('roles', RolesTest.prototype.oneHandler)).toStrictEqual([roles.ADMIN]); + }); +}); diff --git a/node-jtq/src/app/core/auth/decorators/roles.decorator.ts b/node-jtq/src/app/core/auth/decorators/roles.decorator.ts new file mode 100644 index 0000000..41b4a6e --- /dev/null +++ b/node-jtq/src/app/core/auth/decorators/roles.decorator.ts @@ -0,0 +1,3 @@ +import { SetMetadata, CustomDecorator } from '@nestjs/common'; + +export const Roles = (...roles: number[]): CustomDecorator => SetMetadata('roles', roles); diff --git a/node-jtq/src/app/core/auth/guards/roles.guard.spec.ts b/node-jtq/src/app/core/auth/guards/roles.guard.spec.ts new file mode 100644 index 0000000..9c95ec7 --- /dev/null +++ b/node-jtq/src/app/core/auth/guards/roles.guard.spec.ts @@ -0,0 +1,57 @@ +import { RolesGuard } from './roles.guard'; +import { Reflector } from '@nestjs/core'; +import { roles } from '../model/roles.enum'; + +function generateMockExecutionContext(role: number): any { + return { + switchToHttp: (): any => { + return { + getRequest: (): any => { + return { + user: { + role, + }, + }; + }, + }; + }, + getHandler: (): undefined => undefined, + getClass: (): undefined => undefined, + }; +} + +describe('RolesGuard', () => { + describe('canActivate', () => { + let guard: RolesGuard; + beforeEach(async () => { + const reflector = new Reflector(); + // tslint:disable-next-line: variable-name + jest + .spyOn(reflector, 'get') + .mockImplementationOnce(() => [roles.USER]) + .mockImplementationOnce(() => [roles.ADMIN]) + .mockImplementationOnce(() => [roles.ADMIN, roles.USER]) + .mockImplementation(() => undefined); + guard = new RolesGuard(reflector); + }); + it('should return true when the role of the user is in the roles array reflected by the handler or class', () => { + const mockExecutionContext: any = generateMockExecutionContext(roles.USER); + expect(guard.canActivate(mockExecutionContext as any)).toBe(true); + expect(guard.canActivate(mockExecutionContext as any)).toBe(false); + expect(guard.canActivate(mockExecutionContext as any)).toBe(true); + }); + it('should return false when the role of the user is not in the roles array reflected by the handler or class', () => { + const mockExecutionContext: any = generateMockExecutionContext(roles.ADMIN); + expect(guard.canActivate(mockExecutionContext as any)).toBe(false); + expect(guard.canActivate(mockExecutionContext as any)).toBe(true); + expect(guard.canActivate(mockExecutionContext as any)).toBe(true); + }); + it('should return true if no role metadata is defined', () => { + const mockExecutionContext: any = generateMockExecutionContext(roles.ADMIN); + guard.canActivate(mockExecutionContext as any); + guard.canActivate(mockExecutionContext as any); + guard.canActivate(mockExecutionContext as any); + expect(guard.canActivate(mockExecutionContext as any)).toBe(true); + }); + }); +}); diff --git a/node-jtq/src/app/core/auth/guards/roles.guard.ts b/node-jtq/src/app/core/auth/guards/roles.guard.ts new file mode 100644 index 0000000..1b6bed9 --- /dev/null +++ b/node-jtq/src/app/core/auth/guards/roles.guard.ts @@ -0,0 +1,21 @@ +import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common'; +import { Reflector } from '@nestjs/core'; + +@Injectable() +export class RolesGuard implements CanActivate { + constructor(private readonly reflector: Reflector) {} + + canActivate(context: ExecutionContext): boolean { + const rol = + this.reflector.get('roles', context.getHandler()) || + this.reflector.get('roles', context.getClass()); + if (!rol) { + return true; + } + const request = context.switchToHttp().getRequest(); + const user = request.user; + const hasRole = (): boolean => rol.includes(user.role); + + return user !== undefined && user.role !== undefined && hasRole(); + } +} diff --git a/node-jtq/src/app/core/auth/model/login.dto.ts b/node-jtq/src/app/core/auth/model/login.dto.ts new file mode 100644 index 0000000..048ba07 --- /dev/null +++ b/node-jtq/src/app/core/auth/model/login.dto.ts @@ -0,0 +1,11 @@ +import { User } from '../../user/model/entities/user.entity'; +import { IsDefined, IsString } from 'class-validator'; + +export class LoginDTO implements Pick { + @IsDefined() + @IsString() + username!: string; + @IsDefined() + @IsString() + password!: string; +} diff --git a/node-jtq/src/app/core/auth/model/roles.enum.ts b/node-jtq/src/app/core/auth/model/roles.enum.ts new file mode 100644 index 0000000..ba50c94 --- /dev/null +++ b/node-jtq/src/app/core/auth/model/roles.enum.ts @@ -0,0 +1,4 @@ +export enum roles { + USER, + ADMIN, +} diff --git a/node-jtq/src/app/core/auth/model/user-request.interface.ts b/node-jtq/src/app/core/auth/model/user-request.interface.ts new file mode 100644 index 0000000..8ec2c54 --- /dev/null +++ b/node-jtq/src/app/core/auth/model/user-request.interface.ts @@ -0,0 +1,7 @@ +import { Request } from 'express'; + +interface IUserRequest extends Request { + user: any; +} + +export type UserRequest = IUserRequest; diff --git a/node-jtq/src/app/core/auth/services/auth.service.spec.ts b/node-jtq/src/app/core/auth/services/auth.service.spec.ts new file mode 100644 index 0000000..383b2b0 --- /dev/null +++ b/node-jtq/src/app/core/auth/services/auth.service.spec.ts @@ -0,0 +1,105 @@ +process.env.NODE_ENV = 'test'; +import { UnauthorizedException } from '@nestjs/common'; +import { JwtModule } from '@nestjs/jwt'; +import { Test, TestingModule } from '@nestjs/testing'; +import { UserRepositoryMock } from '../../../../../test/user/user.repository.mock'; +import { UserService } from '../../user/services/user.service'; +import { AuthService } from './auth.service'; + +describe('AuthService', () => { + let authService: AuthService; + let userService: UserService; + + beforeAll(async () => { + const module: TestingModule = await Test.createTestingModule({ + imports: [ + JwtModule.register({ + secret: 'SECRET', + signOptions: { expiresIn: '60s' }, + }), + ], + providers: [ + AuthService, + UserService, + { + provide: 'UserRepository', + useClass: UserRepositoryMock, + }, + ], + }).compile(); + + authService = module.get(AuthService); + userService = module.get(UserService); + }); + + it('should be defined after module initialization', () => { + expect(authService).toBeDefined(); + expect(userService).toBeDefined(); + }); + + describe('validateUser', () => { + it('should validate that the user and return it when the user exists and password match.', async () => { + await expect(authService.validateUser('user1', 'user1')).resolves.toStrictEqual({ + id: 1, + username: 'user1', + // password: 'user1', + password: '$2b$12$KgUSTFUTjRqQD7U7tuV9quheR4L.LOAT.GhmTjBIXsgLMhBXjfhYq', + role: 0, + }); + await expect(authService.validateUser('user2', 'user2')).resolves.toStrictEqual({ + id: 2, + username: 'user2', + // password: 'user2', + password: '$2b$12$jDy/bJV0p6mYRlEjZL5t0OX9jinlfEiQDfuApJJGSVW6Ca/hiVbBW', + role: 1, + }); + }); + it('should return undefined when the user does not exists or password does not match.', async () => { + await expect(authService.validateUser('test', 'user1')).resolves.toBeUndefined(); + await expect(authService.validateUser('user1', 'test')).resolves.toBeUndefined(); + }); + }); + + describe('login', () => { + it('should return a User when a valid user is provided', async () => { + const token = await authService.login({ + username: 'user1', + password: 'user1', + } as any); + + expect(token).toBeDefined(); + expect(typeof token).toBe('object'); + }); + it('should return a exception when a invalid user is provided', async () => { + await expect( + authService.login({ + username: 'user1', + password: 'user2', + } as any), + ).rejects.toThrow(UnauthorizedException); + }); + }); + + describe('register', () => { + it('should register a new user if not exists', async () => { + const newUser: any = { + id: 3, + username: 'user3', + password: 'user3', + }; + + const user = await authService.register(newUser); + expect(user).toBeDefined(); + expect(user).toEqual(await userService.findOne('user3')); + }); + it('should throw an error if user exists', async () => { + const newUser: any = { + id: 3, + username: 'user3', + password: 'user3', + }; + + await expect(authService.register(newUser)).rejects.toThrow('User already exists'); + }); + }); +}); diff --git a/node-jtq/src/app/core/auth/services/auth.service.ts b/node-jtq/src/app/core/auth/services/auth.service.ts new file mode 100644 index 0000000..7243cca --- /dev/null +++ b/node-jtq/src/app/core/auth/services/auth.service.ts @@ -0,0 +1,33 @@ +import { Injectable, UnauthorizedException } from '@nestjs/common'; +import { compare } from 'bcrypt'; +import { classToPlain } from 'class-transformer'; +import { UserService } from '../../user/services/user.service'; +import { User } from '../../user/model/entities/user.entity'; +import { LoginDTO } from '../model/login.dto'; + +@Injectable() +export class AuthService { + constructor(private readonly usersService: UserService) { } + + async validateUser(username: string, pass: string): Promise { + const user = await this.usersService.findOne(username); + if (user && (await compare(pass, user.password!))) { + return classToPlain(user) as User; + } + return undefined; + } + + async login(user: LoginDTO): Promise { + const payload = await this.validateUser(user.username!, user.password!); + + if (!payload) { + throw new UnauthorizedException('Wrong username or password'); + } + + return payload; + } + + register(user: User): Promise { + return this.usersService.registerUser(user); + } +} diff --git a/node-jtq/src/app/core/auth/strategies/jwt.strategy.spec.ts b/node-jtq/src/app/core/auth/strategies/jwt.strategy.spec.ts new file mode 100644 index 0000000..bb002bf --- /dev/null +++ b/node-jtq/src/app/core/auth/strategies/jwt.strategy.spec.ts @@ -0,0 +1,16 @@ +import { JwtStrategy } from './jwt.strategy'; +import { UserPayload } from '../../user/model/dto/user-payload.dto'; +describe('JwtStrategy', () => { + describe('validate', () => { + it('should validate the payload received in the JWT token and should return it', () => { + const jwtConfig: any = { values: { jwtConfig: { secret: 'SECRET' } } }; + const jwtStrategy = new JwtStrategy(jwtConfig); + const inputPayload: UserPayload = { id: 0, username: 'test', role: 0 }; + + expect(jwtStrategy.validate(inputPayload)).resolves.toStrictEqual(inputPayload); + expect(jwtStrategy.validate(inputPayload)).resolves.not.toStrictEqual({ + id: 1, + }); + }); + }); +}); diff --git a/node-jtq/src/app/core/auth/strategies/jwt.strategy.ts b/node-jtq/src/app/core/auth/strategies/jwt.strategy.ts new file mode 100644 index 0000000..da2f8c6 --- /dev/null +++ b/node-jtq/src/app/core/auth/strategies/jwt.strategy.ts @@ -0,0 +1,20 @@ +import { Injectable } from '@nestjs/common'; +import { PassportStrategy } from '@nestjs/passport'; +import { ExtractJwt, Strategy } from 'passport-jwt'; +import { ConfigService } from '@devon4node/config'; +import { Config } from '../../../shared/model/config/config.model'; + +@Injectable() +export class JwtStrategy extends PassportStrategy(Strategy) { + constructor(public readonly configService: ConfigService) { + super({ + jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), + ignoreExpiration: false, + secretOrKey: configService.values.jwtConfig.secret, + }); + } + + async validate(payload: any): Promise { + return payload; + } +} diff --git a/node-jtq/src/app/core/core.module.ts b/node-jtq/src/app/core/core.module.ts new file mode 100644 index 0000000..5892afe --- /dev/null +++ b/node-jtq/src/app/core/core.module.ts @@ -0,0 +1,37 @@ +import { Global, Module } from '@nestjs/common'; +import { ClassSerializerInterceptor } from '@devon4node/common/serializer'; +import { APP_INTERCEPTOR, APP_FILTER } from '@nestjs/core'; +import { WinstonLogger } from '../shared/logger/winston.logger'; +import { BusinessLogicFilter } from '../shared/filters/business-logic.filter'; +import { ConfigModule, ConfigService } from '@devon4node/config'; +import { Config } from '../shared/model/config/config.model'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { AuthModule } from './auth/auth.module'; +import { UserModule } from './user/user.module'; + +@Global() +@Module({ + imports: [ + UserModule, + AuthModule, + TypeOrmModule.forRootAsync({ + imports: [ConfigModule], + useFactory: (config: ConfigService) => { + return config.values.database; + }, + inject: [ConfigService], + }), + ConfigModule.forRoot({ + configPrefix: 'devon4node', + configType: Config, + }), + ], + controllers: [], + providers: [ + { provide: APP_FILTER, useClass: BusinessLogicFilter }, + { provide: APP_INTERCEPTOR, useClass: ClassSerializerInterceptor }, + WinstonLogger, + ], + exports: [UserModule, AuthModule, ConfigModule, WinstonLogger], +}) +export class CoreModule {} diff --git a/node-jtq/src/app/core/user/model/dto/user-payload.dto.ts b/node-jtq/src/app/core/user/model/dto/user-payload.dto.ts new file mode 100644 index 0000000..48b2bbd --- /dev/null +++ b/node-jtq/src/app/core/user/model/dto/user-payload.dto.ts @@ -0,0 +1,11 @@ +import { User } from '../entities/user.entity'; + +export class UserPayload implements Pick { + id!: number; + username!: string; + role!: number; + phoneNumber!: string; + name!: string; + acceptedCommercial!: boolean; + acceptedTerms!: boolean; +} diff --git a/node-jtq/src/app/core/user/model/entities/user.entity.ts b/node-jtq/src/app/core/user/model/entities/user.entity.ts new file mode 100644 index 0000000..ab74e3e --- /dev/null +++ b/node-jtq/src/app/core/user/model/entities/user.entity.ts @@ -0,0 +1,29 @@ +import { Exclude } from 'class-transformer'; +import { Column, Entity } from 'typeorm'; +import { BaseEntity } from '../../../../shared/model/entities/base-entity.entity'; +import { roles } from '../../../auth/model/roles.enum'; + +@Entity() +export class User extends BaseEntity { + @Column('varchar', { length: 255, nullable: false }) + username!: string; + + @Column('varchar', { length: 255, nullable: false }) + name!: string; + + @Column('varchar', { length: 255, nullable: false }) + phoneNumber!: string; + + @Column('varchar', { length: 255, nullable: false }) + @Exclude({ toPlainOnly: true }) + password!: string; + + @Column('boolean', { nullable: false }) + acceptedCommercial!: boolean; + + @Column('boolean', { nullable: false }) + acceptedTerms!: boolean; + + @Column('int', { nullable: false, default: roles.USER }) + role!: number; +} diff --git a/node-jtq/src/app/core/user/services/user.service.spec.ts b/node-jtq/src/app/core/user/services/user.service.spec.ts new file mode 100644 index 0000000..8935f3c --- /dev/null +++ b/node-jtq/src/app/core/user/services/user.service.spec.ts @@ -0,0 +1,66 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { UserService } from './user.service'; +import { UserRepositoryMock } from '../../../../../test/user/user.repository.mock'; +import { plainToClass } from 'class-transformer'; +import { User } from '../model/entities/user.entity'; + +describe('UserService', () => { + let service: UserService; + let repository: UserRepositoryMock; + + beforeAll(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [ + UserService, + { + provide: 'UserRepository', + useClass: UserRepositoryMock, + }, + ], + }).compile(); + + service = module.get(UserService); + repository = module.get('UserRepository'); + }); + + it('should be defined after module initialization', () => { + expect(service).toBeDefined(); + expect(repository).toBeDefined(); + }); + + describe('findOne', () => { + it('should return the user when exists', async () => { + await expect(service.findOne('user1')).resolves.toStrictEqual({ + id: 1, + username: 'user1', + // password: 'user1', + password: '$2b$12$KgUSTFUTjRqQD7U7tuV9quheR4L.LOAT.GhmTjBIXsgLMhBXjfhYq', + role: 0, + }); + }); + + it('should return undefined when the user does not exists', async () => { + await expect(service.findOne('usernotdefined')).resolves.toBeUndefined(); + }); + }); + + describe('registerUser', () => { + it('should register a new user if it does not exists', async () => { + const userToAdd: any = { + username: 'user3', + password: 'user3', + }; + const userRegistered = await service.registerUser(userToAdd); + + expect(userRegistered).toStrictEqual(plainToClass(User, repository.users[2])); + }); + + it('should throw an Error when user already exists', async () => { + const userToAdd: any = { + username: 'user3', + password: 'user3', + }; + await expect(service.registerUser(userToAdd)).rejects.toThrowError('User already exists'); + }); + }); +}); diff --git a/node-jtq/src/app/core/user/services/user.service.ts b/node-jtq/src/app/core/user/services/user.service.ts new file mode 100644 index 0000000..942829b --- /dev/null +++ b/node-jtq/src/app/core/user/services/user.service.ts @@ -0,0 +1,44 @@ +import { Injectable } from '@nestjs/common'; +import { Repository } from 'typeorm'; +import { User } from '../model/entities/user.entity'; +import { genSalt, hash } from 'bcrypt'; +import { InjectRepository } from '@nestjs/typeorm'; +import { roles } from '../../auth/model/roles.enum'; +import { plainToClass } from 'class-transformer'; + +@Injectable() +export class UserService { + constructor(@InjectRepository(User) private readonly userRepository: Repository) { } + + async findOne(username: string): Promise { + return this.userRepository.findOne({ + where: { + username, + }, + }); + } + + async registerUser(user: User): Promise { + const actualUser = await this.findOne(user.username!); + + if (actualUser) { + throw new Error('User already exists'); + } + + const salt = await genSalt(12); + const hashPass = await hash(user.password, salt); + + return plainToClass( + User, + await this.userRepository.save({ + username: user.username, + password: hashPass, + role: roles.USER, + phoneNumber: user.phoneNumber, + name: user.name, + acceptedCommercial: user.acceptedCommercial, + acceptedTerms: user.acceptedTerms + }), + ); + } +} diff --git a/node-jtq/src/app/core/user/user.module.ts b/node-jtq/src/app/core/user/user.module.ts new file mode 100644 index 0000000..cb5ace5 --- /dev/null +++ b/node-jtq/src/app/core/user/user.module.ts @@ -0,0 +1,12 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { User } from './model/entities/user.entity'; +import { UserService } from './services/user.service'; + +@Module({ + imports: [TypeOrmModule.forFeature([User])], + controllers: [], + providers: [UserService], + exports: [UserService], +}) +export class UserModule {} diff --git a/node-jtq/src/app/event/controllers/event.crud.controller.ts b/node-jtq/src/app/event/controllers/event.crud.controller.ts new file mode 100644 index 0000000..52be0c6 --- /dev/null +++ b/node-jtq/src/app/event/controllers/event.crud.controller.ts @@ -0,0 +1,18 @@ +import { Controller } from '@nestjs/common'; +import { Crud } from '@nestjsx/crud'; +import { CrudType } from '@devon4node/common/serializer'; +import { Event } from '../model/entities/event.entity'; +import { EventCrudService } from '../services/event.crud.service'; +import { ApiTags } from '@nestjs/swagger'; + +@Crud({ + model: { + type: Event, + }, +}) +@ApiTags('employee') +@CrudType(Event) +@Controller('event/events') +export class EventCrudController { + constructor(public service: EventCrudService) { } +} diff --git a/node-jtq/src/app/event/event.module.ts b/node-jtq/src/app/event/event.module.ts new file mode 100644 index 0000000..d856a44 --- /dev/null +++ b/node-jtq/src/app/event/event.module.ts @@ -0,0 +1,12 @@ +import { Module } from '@nestjs/common'; +import { Event } from './model/entities/event.entity'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { EventCrudService } from './services/event.crud.service'; +import { EventCrudController } from './controllers/event.crud.controller'; + +@Module({ + imports: [TypeOrmModule.forFeature([Event])], + providers: [EventCrudService], + controllers: [EventCrudController], +}) +export class EventModule {} diff --git a/node-jtq/src/app/event/model/entities/event.entity.ts b/node-jtq/src/app/event/model/entities/event.entity.ts new file mode 100644 index 0000000..e6d8095 --- /dev/null +++ b/node-jtq/src/app/event/model/entities/event.entity.ts @@ -0,0 +1,75 @@ +import { ApiPropertyOptional } from '@nestjs/swagger'; +import { CrudValidationGroups } from '@nestjsx/crud'; +import { IsDefined, IsOptional, MaxLength } from 'class-validator'; +import { Column, Entity } from 'typeorm'; +import { BaseEntity } from '../../../shared/model/entities/base-entity.entity'; + +@Entity() +export class Event extends BaseEntity { + @ApiPropertyOptional() + @IsDefined({ groups: [CrudValidationGroups.CREATE] }) + @IsOptional({ groups: [CrudValidationGroups.UPDATE] }) + @MaxLength(255) + @Column('varchar', { length: 255, nullable: true }) + eventName?: string; + + @ApiPropertyOptional() + @IsDefined({ groups: [CrudValidationGroups.CREATE] }) + @IsOptional({ groups: [CrudValidationGroups.UPDATE] }) + @MaxLength(255) + @Column('varchar', { length: 255, nullable: true }) + location?: string; + + @ApiPropertyOptional() + @IsDefined({ groups: [CrudValidationGroups.CREATE] }) + @IsOptional({ groups: [CrudValidationGroups.UPDATE] }) + @MaxLength(255) + @Column('varchar', { length: 255, nullable: true }) + description?: string; + + @ApiPropertyOptional() + @IsDefined({ groups: [CrudValidationGroups.CREATE] }) + @IsOptional({ groups: [CrudValidationGroups.UPDATE] }) + @MaxLength(255) + @Column('varchar', { length: 255, nullable: true }) + logo?: string; + + @ApiPropertyOptional() + @IsDefined({ groups: [CrudValidationGroups.CREATE] }) + @IsOptional({ groups: [CrudValidationGroups.UPDATE] }) + @Column('int', { nullable: true }) + visitorCount?: number; + + @ApiPropertyOptional() + @IsDefined({ groups: [CrudValidationGroups.CREATE] }) + @IsOptional({ groups: [CrudValidationGroups.UPDATE] }) + @Column('text', { nullable: true }) + startDate?: Date; + + @ApiPropertyOptional() + @IsDefined({ groups: [CrudValidationGroups.CREATE] }) + @IsOptional({ groups: [CrudValidationGroups.UPDATE] }) + @Column('text', { nullable: true }) + endDate?: Date; + + @ApiPropertyOptional() + @IsDefined({ groups: [CrudValidationGroups.CREATE] }) + @IsOptional({ groups: [CrudValidationGroups.UPDATE] }) + @MaxLength(255) + @Column('varchar', { length: 255, nullable: true }) + attentionTime?: string; + + @ApiPropertyOptional() + @IsDefined({ groups: [CrudValidationGroups.CREATE] }) + @IsOptional({ groups: [CrudValidationGroups.UPDATE] }) + @MaxLength(255) + @Column('varchar', { length: 255, nullable: true }) + currentlyBeingAttended?: string; + + +} + +/** + * attentionTime, currentlyBeingAttended, + startDate,endDate + */ diff --git a/node-jtq/src/app/event/services/event.crud.service.ts b/node-jtq/src/app/event/services/event.crud.service.ts new file mode 100644 index 0000000..1c83e77 --- /dev/null +++ b/node-jtq/src/app/event/services/event.crud.service.ts @@ -0,0 +1,12 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { TypeOrmCrudService } from '@nestjsx/crud-typeorm'; +import { Repository } from 'typeorm'; +import { Event } from '../model/entities/event.entity'; + +@Injectable() +export class EventCrudService extends TypeOrmCrudService { + constructor(@InjectRepository(Event) repo: Repository) { + super(repo); + } +} diff --git a/node-jtq/src/app/queue-detail/controllers/queue-detail.crud.controller.ts b/node-jtq/src/app/queue-detail/controllers/queue-detail.crud.controller.ts new file mode 100644 index 0000000..042d572 --- /dev/null +++ b/node-jtq/src/app/queue-detail/controllers/queue-detail.crud.controller.ts @@ -0,0 +1,27 @@ +import { Body, Controller, Post } from '@nestjs/common'; +import { Crud } from '@nestjsx/crud'; +import { CrudType } from '@devon4node/common/serializer'; +import { QueueDetail } from '../model/entities/queue-detail.entity'; +import { QueueDetailCrudService } from '../services/queue-detail.crud.service'; +import { ApiTags } from '@nestjs/swagger'; + +@Crud({ + model: { + type: QueueDetail, + }, +}) +@ApiTags('queue-detail') +@CrudType(QueueDetail) +@Controller('queue-detail/queue-details') +export class QueueDetailCrudController { + constructor(public service: QueueDetailCrudService) { } + + @Post('join-queue') + async join(@Body() queueDTO: any): Promise { + + const token = await this.service.joinQueue(queueDTO); + // res.setHeader('Authorization', 'Bearer ' + token); + // res.status(200).send(); + return token; + } +} diff --git a/node-jtq/src/app/queue-detail/model/entities/queue-detail.entity.ts b/node-jtq/src/app/queue-detail/model/entities/queue-detail.entity.ts new file mode 100644 index 0000000..385a5da --- /dev/null +++ b/node-jtq/src/app/queue-detail/model/entities/queue-detail.entity.ts @@ -0,0 +1,61 @@ +import { ApiPropertyOptional } from '@nestjs/swagger'; +import { CrudValidationGroups } from '@nestjsx/crud'; +import { IsDefined, IsOptional, MaxLength } from 'class-validator'; +import { Column, Entity, JoinColumn, ManyToOne } from 'typeorm'; +import { User } from '../../../core/user/model/entities/user.entity'; +import { Event } from '../../../event/model/entities/event.entity'; +import { BaseEntity } from '../../../shared/model/entities/base-entity.entity'; + +@Entity() +export class QueueDetail extends BaseEntity { + @ApiPropertyOptional() + @IsDefined({ groups: [CrudValidationGroups.CREATE] }) + @IsOptional({ groups: [CrudValidationGroups.UPDATE] }) + @MaxLength(5) + @Column('varchar', { length: 5, nullable: true }) + queueNumber?: string; + + @ApiPropertyOptional() + @IsDefined({ groups: [CrudValidationGroups.CREATE] }) + @IsOptional({ groups: [CrudValidationGroups.UPDATE] }) + @Column('datetime', { nullable: true }) + creationTime?: Date; + + @ApiPropertyOptional() + @IsDefined({ groups: [CrudValidationGroups.CREATE] }) + @IsOptional({ groups: [CrudValidationGroups.UPDATE] }) + @Column('datetime', { nullable: true }) + startTime?: Date; + + @ApiPropertyOptional() + @IsDefined({ groups: [CrudValidationGroups.CREATE] }) + @IsOptional({ groups: [CrudValidationGroups.UPDATE] }) + @Column('datetime', { nullable: true }) + endTime?: Date; + + @ApiPropertyOptional() + @IsDefined({ groups: [CrudValidationGroups.CREATE] }) + @IsOptional({ groups: [CrudValidationGroups.UPDATE] }) + @Column('datetime', { nullable: true }) + minEstimatedTime?: Date; + + @ApiPropertyOptional() + @IsDefined({ groups: [CrudValidationGroups.CREATE] }) + @IsOptional({ groups: [CrudValidationGroups.UPDATE] }) + @ManyToOne(() => User) + @JoinColumn({ name: 'idUser', referencedColumnName: 'id' }) + user?: User; + + @ApiPropertyOptional() + @IsDefined({ groups: [CrudValidationGroups.CREATE] }) + @IsOptional({ groups: [CrudValidationGroups.UPDATE] }) + @ManyToOne(() => Event) + @JoinColumn({ name: 'idEvent', referencedColumnName: 'id' }) + event?: Event; + +} + +/** + * queueNumber, creationTime, startTime, endTime, minEstimatedTime, + idVisitor, idEvent + */ diff --git a/node-jtq/src/app/queue-detail/queue-detail.module.ts b/node-jtq/src/app/queue-detail/queue-detail.module.ts new file mode 100644 index 0000000..443754e --- /dev/null +++ b/node-jtq/src/app/queue-detail/queue-detail.module.ts @@ -0,0 +1,14 @@ +import { Module } from '@nestjs/common'; +import { QueueDetail } from './model/entities/queue-detail.entity'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { QueueDetailCrudService } from './services/queue-detail.crud.service'; +import { QueueDetailCrudController } from './controllers/queue-detail.crud.controller'; +import { User } from '../core/user/model/entities/user.entity'; +import { Event } from '../event/model/entities/event.entity'; + +@Module({ + imports: [TypeOrmModule.forFeature([QueueDetail, User, Event])], + providers: [QueueDetailCrudService], + controllers: [QueueDetailCrudController], +}) +export class QueueDetailModule { } diff --git a/node-jtq/src/app/queue-detail/services/queue-detail.crud.service.ts b/node-jtq/src/app/queue-detail/services/queue-detail.crud.service.ts new file mode 100644 index 0000000..ad2b1c7 --- /dev/null +++ b/node-jtq/src/app/queue-detail/services/queue-detail.crud.service.ts @@ -0,0 +1,71 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { TypeOrmCrudService } from '@nestjsx/crud-typeorm'; +import { subtract } from 'lodash'; +import { Repository } from 'typeorm'; +import { User } from '../../core/user/model/entities/user.entity'; +import { Event } from '../../event/model/entities/event.entity'; +import { QueueDetail } from '../model/entities/queue-detail.entity'; + +@Injectable() +export class QueueDetailCrudService extends TypeOrmCrudService { + constructor(@InjectRepository(QueueDetail) repo: Repository, + @InjectRepository(Event) private readonly eventRepository: Repository, + @InjectRepository(User) private readonly userRepository: Repository) { + super(repo); + } + + async joinQueue(queue1: any): Promise { + const eventId = queue1.eventId; + const visitorId = queue1.visitorId; + console.log(eventId); + const eventDetail: Event | any = await this.getEventDetailById(eventId); + + + const queue: QueueDetail = new QueueDetail(); + // const list :QueueDetail[]= await this.getListOfQueue(eId); + // if(list.length==0){ + // queue.queueNumber="Q001" + // } + // else { + // const list1:QueueDetail = list.find(); + // console.log(list1); + // const queueNo = parseInt(list1.queueNumber.substr(1)); + // } + queue.queueNumber = "Q035"; + queue.startTime = eventDetail!.startDate; + queue.endTime = eventDetail!.endDate; + queue.minEstimatedTime = await this.getMinimumEstimatedTime(eventDetail!.currentNumber, queue.queueNumber); + this.userRepository.findOne(visitorId).then(data => { + if (data != null) { + queue.user = data; + } + }); + this.eventRepository.findOne(eventId).then(data => { + if (data != null) { + queue.event = data; + } + }); + const result = await this.repo.save(queue); + console.log(result); + return result; + } + + async getEventDetailById(eId: any): Promise { + console.log('3') + const eventDetail = await this.eventRepository.findOne(eId); + //Promise is showing pending + console.log(eventDetail) + return eventDetail; + } + + async getMinimumEstimatedTime(currentNumber: String, queueNumber: String): Promise { + + const currently = parseInt(currentNumber.substr(1)); + const queue1 = parseInt(queueNumber.substr(1)); + const currentTime = new Date().getTime(); + const queueTime = currentTime + subtract(queue1, currently) * 12000; + return queueTime; + } + +} diff --git a/node-jtq/src/app/shared/exceptions/business-logic.exception.ts b/node-jtq/src/app/shared/exceptions/business-logic.exception.ts new file mode 100644 index 0000000..f12008b --- /dev/null +++ b/node-jtq/src/app/shared/exceptions/business-logic.exception.ts @@ -0,0 +1,27 @@ +export class BusinessLogicException extends Error { + private readonly _errorId?: string; + private readonly _name: string = 'BusinessLogicException'; + private readonly _message: string; + + constructor(message: string, errorId?: string) { + super(); + this._message = message; + this._errorId = errorId; + } + + get errorId(): string | undefined { + return this._errorId; + } + + get name(): string { + return this._name; + } + + get message(): string { + return this._message; + } + + plainObject(): Pick { + return { message: this.message, name: this.name, errorId: this.errorId }; + } +} diff --git a/node-jtq/src/app/shared/filters/business-logic.filter.spec.ts b/node-jtq/src/app/shared/filters/business-logic.filter.spec.ts new file mode 100644 index 0000000..817f74c --- /dev/null +++ b/node-jtq/src/app/shared/filters/business-logic.filter.spec.ts @@ -0,0 +1,63 @@ +import { BusinessLogicFilter } from './business-logic.filter'; +import { BusinessLogicException } from '../exceptions/business-logic.exception'; + +describe('BusinessLogicFilter', () => { + let filter: BusinessLogicFilter; + let error: jest.Mock; + const request = { + url: '/an/url', + }; + const exception = new BusinessLogicException('Logic error', 'id001'); + const jsonFn = jest.fn(); + const status = jest.fn(() => { + return { + json: jsonFn, + }; + }); + const argumentHost: any = { + switchToHttp() { + return { + getResponse(): any { + return { + status, + }; + }, + getRequest(): any { + return request; + }, + }; + }, + }; + + beforeAll(() => { + error = jest.fn(); + const logger = { + error, + }; + filter = new BusinessLogicFilter(logger as any); + }); + + it('should be defined', () => { + expect(filter).toBeDefined(); + }); + + describe('catch', () => { + it('should return an 400 Bad Request error', () => { + filter.catch(exception, argumentHost as any); + expect(error).toBeCalledTimes(1); + expect(status).toBeCalledWith(400); + expect(jsonFn).toBeCalledWith({ + ...exception.plainObject(), + statusCode: 400, + timestamp: jsonFn.mock.calls[0][0].timestamp, + path: request.url, + }); + }); + + it('should also work without logger', () => { + const newFilter = new BusinessLogicFilter(); + + newFilter.catch(new BusinessLogicException('Logic error', 'id001'), argumentHost as any); + }); + }); +}); diff --git a/node-jtq/src/app/shared/filters/business-logic.filter.ts b/node-jtq/src/app/shared/filters/business-logic.filter.ts new file mode 100644 index 0000000..1327601 --- /dev/null +++ b/node-jtq/src/app/shared/filters/business-logic.filter.ts @@ -0,0 +1,28 @@ +import { ArgumentsHost, Catch, ExceptionFilter, Optional } from '@nestjs/common'; +import { BusinessLogicException } from '../exceptions/business-logic.exception'; +import { WinstonLogger } from '../logger/winston.logger'; +import { Response } from 'express'; + +@Catch(BusinessLogicException) +export class BusinessLogicFilter implements ExceptionFilter { + constructor(@Optional() public readonly logger?: WinstonLogger) {} + + catch(exception: T, host: ArgumentsHost): void { + const ctx = host.switchToHttp(); + const response = ctx.getResponse(); + const request = ctx.getRequest(); + + const responseObj = { + ...exception.plainObject(), + statusCode: 400, + timestamp: new Date().toISOString(), + path: request.url, + }; + + if (this.logger) { + this.logger.error(exception.message, exception.stack!, 'LogicFilter'); + } + + response.status(400).json(responseObj); + } +} diff --git a/node-jtq/src/app/shared/logger/winston.logger.ts b/node-jtq/src/app/shared/logger/winston.logger.ts new file mode 100644 index 0000000..9ca7c82 --- /dev/null +++ b/node-jtq/src/app/shared/logger/winston.logger.ts @@ -0,0 +1,114 @@ +/* istanbul ignore file */ +import { ConfigService } from '@devon4node/config'; +import { Logger, LogLevel, Optional } from '@nestjs/common'; +import * as winston from 'winston'; +import { Config } from '../model/config/config.model'; + +export class WinstonLogger extends Logger { + private static DEFAULT_LOG_LEVEL = 'info'; + private console = true; + private logger?: winston.Logger; + + constructor(@Optional() private readonly configService?: ConfigService) { + super(); + const logLevel = this.configService?.values.loggerConfig?.loggerLevel! || WinstonLogger.DEFAULT_LOG_LEVEL; + const generalDir = this.configService?.values.loggerConfig?.generalLogFile; + const errorDir = this.configService?.values.loggerConfig?.errorLogFile; + const transports: any[] = []; + + if (this.configService?.values.loggerConfig?.console !== undefined) { + this.console = this.configService?.values.loggerConfig?.console; + } + + if (generalDir) { + transports.push( + new winston.transports.File({ + filename: generalDir, + }), + ); + } + + if (errorDir) { + transports.push( + new winston.transports.File({ + filename: errorDir, + level: 'error', + }), + ); + } + + this.overrideLogger(logLevel); + + if (transports.length) { + this.logger = winston.createLogger({ + format: winston.format.combine(winston.format.timestamp(), winston.format.json()), + level: logLevel, + transports, + }); + } + } + + overrideLogger(level: 'error' | 'warn' | 'info' | 'http' | 'verbose' | 'debug' | 'silly'): void { + const loggerLevels: LogLevel[] = ['debug', 'verbose', 'log', 'warn', 'error']; + let nestLoggerLevel: string = level; + + if (nestLoggerLevel === 'info' || nestLoggerLevel === 'http') { + nestLoggerLevel = 'log'; + } + + if (nestLoggerLevel === 'silly') { + nestLoggerLevel = 'debug'; + } + + const pos = loggerLevels.findIndex(e => e === nestLoggerLevel); + + if (pos !== -1) { + Logger.overrideLogger(loggerLevels.slice(pos)); + } + } + + log(message: string, context?: string): void { + if (this.console) { + super.log(message, context); + } + if (this.logger) { + this.logger.info({ message, context }); + } + } + + error(message: string, trace: string, context?: string): void { + if (this.console) { + super.error(message, trace, context); + } + if (this.logger) { + this.logger.error({ message, trace, context }); + } + } + + warn(message: string, context?: string): void { + if (this.console) { + super.warn(message, context); + } + if (this.logger) { + this.logger.warn({ message, context }); + } + } + + debug(message: any, context?: string): void { + if (this.console) { + super.debug(message, context); + } + if (this.logger) { + this.logger.debug({ message, context }); + } + } + + verbose(message: any, context?: string): void { + if (this.console) { + super.verbose(message, context); + } + if (this.logger) { + this.logger.verbose({ message, context }); + } + } +} diff --git a/node-jtq/src/app/shared/model/config/config.model.ts b/node-jtq/src/app/shared/model/config/config.model.ts new file mode 100644 index 0000000..7277eeb --- /dev/null +++ b/node-jtq/src/app/shared/model/config/config.model.ts @@ -0,0 +1,49 @@ +import { BaseConfig } from '@devon4node/config'; +import { Type } from 'class-transformer'; +import { IsBoolean, IsIn, IsOptional, IsString, ValidateNested, IsDefined, IsNotEmptyObject } from 'class-validator'; +import { ConnectionOptions } from 'typeorm'; +import { JwtModuleOptions } from '@nestjs/jwt'; + +export class LoggerConfiguration { + @IsOptional() + @IsString() + @IsIn(['error', 'warn', 'info', 'http', 'verbose', 'debug', 'silly']) + loggerLevel?: 'error' | 'warn' | 'info' | 'http' | 'verbose' | 'debug' | 'silly'; + @IsOptional() + @IsString() + generalLogFile?: string; + @IsOptional() + @IsString() + errorLogFile?: string; + @IsOptional() + @IsBoolean() + console?: boolean; +} +export class SwaggerConfig { + @IsDefined() + @IsString() + swaggerTitle!: string; + @IsDefined() + @IsString() + swaggerDescription!: string; + @IsDefined() + @IsString() + swaggerVersion!: string; +} + +export class Config extends BaseConfig { + @IsOptional() + @ValidateNested() + @Type(() => LoggerConfiguration) + loggerConfig?: LoggerConfiguration; + @IsDefined() + @IsNotEmptyObject() + database!: ConnectionOptions; + @IsDefined() + @ValidateNested() + @Type(() => SwaggerConfig) + swaggerConfig?: SwaggerConfig; + @IsDefined() + @IsNotEmptyObject() + jwtConfig!: JwtModuleOptions; +} diff --git a/node-jtq/src/app/shared/model/entities/base-entity.entity.ts b/node-jtq/src/app/shared/model/entities/base-entity.entity.ts new file mode 100644 index 0000000..f1a92fe --- /dev/null +++ b/node-jtq/src/app/shared/model/entities/base-entity.entity.ts @@ -0,0 +1,23 @@ +import { PrimaryGeneratedColumn, VersionColumn, CreateDateColumn, UpdateDateColumn } from 'typeorm'; +import { Exclude } from 'class-transformer'; +import { ApiHideProperty } from '@nestjs/swagger'; + +export abstract class BaseEntity { + @PrimaryGeneratedColumn('increment') + id!: number; + + @VersionColumn({ default: 1 }) + @Exclude({ toPlainOnly: true }) + @ApiHideProperty() + version!: number; + + @CreateDateColumn() + @Exclude({ toPlainOnly: true }) + @ApiHideProperty() + createdAt!: string; + + @UpdateDateColumn() + @Exclude({ toPlainOnly: true }) + @ApiHideProperty() + updatedAt!: string; +} diff --git a/node-jtq/src/config/default.ts b/node-jtq/src/config/default.ts new file mode 100644 index 0000000..4aa329a --- /dev/null +++ b/node-jtq/src/config/default.ts @@ -0,0 +1,24 @@ +import { Config } from '../app/shared/model/config/config.model'; + +const def: Config = { + isDev: true, + host: 'localhost', + port: 3000, + clientUrl: 'localhost:4200', + globalPrefix: 'v1', + loggerConfig: { + console: true, + errorLogFile: './logs/error.log', + generalLogFile: './logs/general.log', + loggerLevel: 'info', + }, + database: require('../../ormconfig.json'), + swaggerConfig: { + swaggerTitle: 'NestJS Application', + swaggerDescription: 'API Documentation', + swaggerVersion: '0.0.1', + }, + jwtConfig: { secret: 'SECRET', signOptions: { expiresIn: '24h' } }, +}; + +export default def; diff --git a/node-jtq/src/config/develop.ts b/node-jtq/src/config/develop.ts new file mode 100644 index 0000000..958fcec --- /dev/null +++ b/node-jtq/src/config/develop.ts @@ -0,0 +1,38 @@ +import { Config } from '../app/shared/model/config/config.model'; + +const def: Config = { + isDev: false, + host: 'localhost', + port: 3000, + clientUrl: 'localhost:4200', + globalPrefix: 'v1', + loggerConfig: { + console: true, + errorLogFile: './logs/error.log', + generalLogFile: './logs/general.log', + loggerLevel: 'info', + }, + database: { + type: 'sqlite', + database: ':memory:', + synchronize: false, + migrationsRun: true, + logging: true, + entities: ['dist/**/*.entity.js'], + migrations: ['dist/migration/**/*.js'], + subscribers: ['dist/subscriber/**/*.js'], + cli: { + entitiesDir: 'src/entity', + migrationsDir: 'src/migration', + subscribersDir: 'src/subscriber', + }, + }, + swaggerConfig: { + swaggerTitle: 'NestJS Application', + swaggerDescription: 'API Documentation', + swaggerVersion: '0.0.1', + }, + jwtConfig: { secret: 'SECRET', signOptions: { expiresIn: '24h' } }, +}; + +export default def; diff --git a/node-jtq/src/config/production.ts b/node-jtq/src/config/production.ts new file mode 100644 index 0000000..fd0e7c4 --- /dev/null +++ b/node-jtq/src/config/production.ts @@ -0,0 +1,33 @@ +import { Config } from '../app/shared/model/config/config.model'; + +const def: Config = { + isDev: false, + host: 'localhost', + port: 3000, + clientUrl: 'localhost:4200', + globalPrefix: 'v1', + loggerConfig: { + console: false, + errorLogFile: './logs/error.log', + generalLogFile: './logs/general.log', + loggerLevel: 'warn', + }, + database: { + type: 'sqlite', + database: ':memory:', + synchronize: false, + migrationsRun: true, + logging: true, + entities: ['dist/**/*.entity.js'], + migrations: ['dist/migration/**/*.js'], + subscribers: ['dist/subscriber/**/*.js'], + cli: { + entitiesDir: 'src/entity', + migrationsDir: 'src/migration', + subscribersDir: 'src/subscriber', + }, + }, + jwtConfig: { secret: 'SECRET', signOptions: { expiresIn: '24h' } }, +}; + +export default def; diff --git a/node-jtq/src/config/test.ts b/node-jtq/src/config/test.ts new file mode 100644 index 0000000..615c189 --- /dev/null +++ b/node-jtq/src/config/test.ts @@ -0,0 +1,36 @@ +import { Config } from '../app/shared/model/config/config.model'; + +const def: Config = { + isDev: true, + host: 'localhost', + port: 3000, + clientUrl: 'localhost:4200', + globalPrefix: 'v1', + loggerConfig: { + console: false, + loggerLevel: 'info', + }, + database: { + type: 'sqlite', + database: ':memory:', + synchronize: false, + migrationsRun: true, + logging: true, + entities: ['dist/**/*.entity.js'], + migrations: ['dist/migration/**/*.js'], + subscribers: ['dist/subscriber/**/*.js'], + cli: { + entitiesDir: 'src/entity', + migrationsDir: 'src/migration', + subscribersDir: 'src/subscriber', + }, + }, + swaggerConfig: { + swaggerTitle: 'NestJS Application', + swaggerDescription: 'API Documentation', + swaggerVersion: '0.0.1', + }, + jwtConfig: { secret: 'SECRET', signOptions: { expiresIn: '24h' } }, +}; + +export default def; diff --git a/node-jtq/src/config/uat.ts b/node-jtq/src/config/uat.ts new file mode 100644 index 0000000..fd0e7c4 --- /dev/null +++ b/node-jtq/src/config/uat.ts @@ -0,0 +1,33 @@ +import { Config } from '../app/shared/model/config/config.model'; + +const def: Config = { + isDev: false, + host: 'localhost', + port: 3000, + clientUrl: 'localhost:4200', + globalPrefix: 'v1', + loggerConfig: { + console: false, + errorLogFile: './logs/error.log', + generalLogFile: './logs/general.log', + loggerLevel: 'warn', + }, + database: { + type: 'sqlite', + database: ':memory:', + synchronize: false, + migrationsRun: true, + logging: true, + entities: ['dist/**/*.entity.js'], + migrations: ['dist/migration/**/*.js'], + subscribers: ['dist/subscriber/**/*.js'], + cli: { + entitiesDir: 'src/entity', + migrationsDir: 'src/migration', + subscribersDir: 'src/subscriber', + }, + }, + jwtConfig: { secret: 'SECRET', signOptions: { expiresIn: '24h' } }, +}; + +export default def; diff --git a/node-jtq/src/main.ts b/node-jtq/src/main.ts new file mode 100644 index 0000000..1d777a6 --- /dev/null +++ b/node-jtq/src/main.ts @@ -0,0 +1,38 @@ +import { NestFactory } from '@nestjs/core'; +import { AppModule } from './app/app.module'; +import { WinstonLogger } from './app/shared/logger/winston.logger'; +import { ValidationPipe } from '@nestjs/common'; +import { ConfigService } from '@devon4node/config'; +import * as helmet from 'helmet'; +import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; + +async function bootstrap(): Promise { + const app = await NestFactory.create(AppModule, { logger: new WinstonLogger() }); + const configModule = app.get(ConfigService); + app.useGlobalPipes( + new ValidationPipe({ + transform: true, + }), + ); + app.setGlobalPrefix(configModule.values.globalPrefix); + app.use(helmet()); + app.enableCors({ + origin: '*', + credentials: true, + exposedHeaders: 'Authorization', + allowedHeaders: 'authorization, content-type', + }); + if (configModule.values.isDev) { + const options = new DocumentBuilder() + .setTitle(configModule.values.swaggerConfig.swaggerTitle) + .setDescription(configModule.values.swaggerConfig.swaggerDescription) + .setVersion(configModule.values.swaggerConfig.swaggerVersion) + .addBearerAuth() + .build(); + + const swaggerDoc = SwaggerModule.createDocument(app, options); + SwaggerModule.setup((configModule.values.globalPrefix || '') + '/api', app, swaggerDoc); + } + await app.listen(configModule.values.port); +} +bootstrap(); diff --git a/node-jtq/src/migration/1609824133465-CreateTables.ts b/node-jtq/src/migration/1609824133465-CreateTables.ts new file mode 100644 index 0000000..831f15e --- /dev/null +++ b/node-jtq/src/migration/1609824133465-CreateTables.ts @@ -0,0 +1,24 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class CreateTables1609824133465 implements MigrationInterface { + name = 'CreateTables1609824133465' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`CREATE TABLE "user" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "version" integer NOT NULL DEFAULT (1), "createdAt" datetime NOT NULL DEFAULT (datetime('now')), "updatedAt" datetime NOT NULL DEFAULT (datetime('now')), + "username" VARCHAR(255), "name" VARCHAR(255), "password" VARCHAR(255), "phoneNumber" VARCHAR(255), + "acceptedCommercial" BOOL DEFAULT '0', "acceptedTerms" BOOL DEFAULT '0', "role" integer NOT NULL DEFAULT (0))`); + await queryRunner.query(`CREATE TABLE "event" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "version" integer NOT NULL DEFAULT (1), "createdAt" datetime NOT NULL DEFAULT (datetime('now')), "updatedAt" datetime NOT NULL DEFAULT (datetime('now')), eventName VARCHAR(255), location VARCHAR(255), description VARCHAR(255), logo VARCHAR(255), visitorCount INTEGER, attentionTime VARCHAR(255),currentlyBeingAttended VARCHAR(255), + startDate text,endDate text)`); + await queryRunner.query(`CREATE TABLE "queue_detail" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "version" integer NOT NULL DEFAULT (1), "createdAt" datetime NOT NULL DEFAULT (datetime('now')), "updatedAt" datetime NOT NULL DEFAULT (datetime('now')), queueNumber VARCHAR(5), creationTime datetime, startTime datetime, endTime datetime, minEstimatedTime datetime, + idUser BIGINT NOT NULL, idEvent BIGINT NOT NULL, + FOREIGN KEY(idUser) REFERENCES user(id), + FOREIGN KEY(idEvent) REFERENCES event(id))`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP TABLE "queue_detail"`); + await queryRunner.query(`DROP TABLE "event"`); + await queryRunner.query(`DROP TABLE "user"`); + } + +} diff --git a/node-jtq/src/migration/1609824210187-InsertData.ts b/node-jtq/src/migration/1609824210187-InsertData.ts new file mode 100644 index 0000000..0fafe67 --- /dev/null +++ b/node-jtq/src/migration/1609824210187-InsertData.ts @@ -0,0 +1,47 @@ +import { hash, genSalt } from 'bcrypt'; +import { MigrationInterface, QueryRunner } from "typeorm"; +import { roles } from '../app/core/auth/model/roles.enum'; + +export class InsertData1609824210187 implements MigrationInterface { + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `INSERT INTO EVENT(id, + eventName, location, description, logo,visitorCount, attentionTime, currentlyBeingAttended, + startDate,endDate) VALUES(1, 'Indigo','Banglore','Biggest Color Fest', NULL,1, '5', 'Q001', + '2021-02-02 00:01:00','2021-03-03 00:01:00');`, + ); + await queryRunner.query( + `INSERT INTO EVENT(id, + eventName, location, description, logo,visitorCount, attentionTime, currentlyBeingAttended, + startDate,endDate) VALUES(2, 'Food Fest','Banglore','Biggest Food Fest', NULL,0, '6', 'Q001', + '2021-02-02 00:01:00','2021-03-03 00:01:00');`, + ); + // await queryRunner.query( + // `INSERT INTO QUEUE_DETAIL(id, queueNumber, creationTime, startTime, endTime, minEstimatedTime, + // idUser, idEvent) VALUES(1, 'Q001', (datetime('now')), (datetime('now')), NULL, (datetime('now')), 1,1);`, + // ); + await queryRunner.query(`INSERT INTO USER(id, username, password, role) VALUES(?, ?, ?, ?);`, [ + 1, + 'user', + await hash('password', await genSalt(12)), + roles.USER, + ]); + await queryRunner.query(`INSERT INTO USER(id, username, password, role) VALUES(?, ?, ?, ?);`, [ + 2, + 'admin', + await hash('admin', await genSalt(12)), + roles.ADMIN, + ]); + await queryRunner.query( + `INSERT INTO QUEUE_DETAIL(id, queueNumber, creationTime, startTime, endTime, minEstimatedTime, + idUser, idEvent) VALUES(1, 'Q001', (datetime('now')), (datetime('now')), NULL, (datetime('now')), 1,1);`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DELETE FROM EVENT`); + await queryRunner.query(`DELETE FROM QUEUE_DETAIL`); + await queryRunner.query(`DELETE FROM USER`); + } + +} diff --git a/node-jtq/test/app.e2e-spec.ts b/node-jtq/test/app.e2e-spec.ts new file mode 100644 index 0000000..50cda62 --- /dev/null +++ b/node-jtq/test/app.e2e-spec.ts @@ -0,0 +1,24 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { INestApplication } from '@nestjs/common'; +import * as request from 'supertest'; +import { AppModule } from './../src/app.module'; + +describe('AppController (e2e)', () => { + let app: INestApplication; + + beforeEach(async () => { + const moduleFixture: TestingModule = await Test.createTestingModule({ + imports: [AppModule], + }).compile(); + + app = moduleFixture.createNestApplication(); + await app.init(); + }); + + it('/ (GET)', () => { + return request(app.getHttpServer()) + .get('/') + .expect(200) + .expect('Hello World!'); + }); +}); diff --git a/node-jtq/test/auth/auth.service.mock.ts b/node-jtq/test/auth/auth.service.mock.ts new file mode 100644 index 0000000..2280648 --- /dev/null +++ b/node-jtq/test/auth/auth.service.mock.ts @@ -0,0 +1,34 @@ +import { User } from '../../src/app/core/user/model/entities/user.entity'; +import { UnauthorizedException } from '@nestjs/common'; +export class AuthServiceMock { + private user: Partial = { + id: 1, + username: 'user1', + password: 'user1', + role: 0, + }; + + async validateUser(username: string, pass: string): Promise { + if (username === this.user.username && pass === this.user.password) { + return this.user as User; + } + + return undefined; + } + + async login(user: User): Promise { + if (!(await this.validateUser(user.username, user.password))) { + throw new UnauthorizedException('Wrong username or password'); + } + + return 'THISISNOTAJWTTOKEN'; + } + + register(user: User): Partial { + if (user.username === this.user.username) { + throw new Error('User already exists'); + } + + return { ...user, password: undefined }; + } +} diff --git a/node-jtq/test/jest-e2e.json b/node-jtq/test/jest-e2e.json new file mode 100644 index 0000000..e9d912f --- /dev/null +++ b/node-jtq/test/jest-e2e.json @@ -0,0 +1,9 @@ +{ + "moduleFileExtensions": ["js", "json", "ts"], + "rootDir": ".", + "testEnvironment": "node", + "testRegex": ".e2e-spec.ts$", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + } +} diff --git a/node-jtq/test/user/user.repository.mock.ts b/node-jtq/test/user/user.repository.mock.ts new file mode 100644 index 0000000..962f1b2 --- /dev/null +++ b/node-jtq/test/user/user.repository.mock.ts @@ -0,0 +1,38 @@ +import * as _ from 'lodash'; +import { FindConditions, FindOneOptions } from 'typeorm'; +import { User } from '../../src/app/core/user/model/entities/user.entity'; + +export class UserRepositoryMock { + users: Array>; + constructor() { + this.users = [ + { + id: 1, + username: 'user1', + // password: 'user1', + password: '$2b$12$KgUSTFUTjRqQD7U7tuV9quheR4L.LOAT.GhmTjBIXsgLMhBXjfhYq', + role: 0, + }, + { + id: 2, + username: 'user2', + // password: 'user2', + password: '$2b$12$jDy/bJV0p6mYRlEjZL5t0OX9jinlfEiQDfuApJJGSVW6Ca/hiVbBW', + role: 1, + }, + ]; + } + + // async to mantain the same return type as UserService + async findOne(options: FindOneOptions | undefined): Promise | undefined> { + return _.find(this.users, { + username: (options!.where! as FindConditions).username as string, + }); + } + + async save(user: User): Promise { + this.users.push(user); + + return user; + } +} diff --git a/node-jtq/tsconfig.build.json b/node-jtq/tsconfig.build.json new file mode 100644 index 0000000..64f86c6 --- /dev/null +++ b/node-jtq/tsconfig.build.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "exclude": ["node_modules", "test", "dist", "**/*spec.ts"] +} diff --git a/node-jtq/tsconfig.json b/node-jtq/tsconfig.json new file mode 100644 index 0000000..e0d0026 --- /dev/null +++ b/node-jtq/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "module": "commonjs", + "declaration": true, + "removeComments": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, + "target": "es2017", + "sourceMap": true, + "outDir": "./dist", + "baseUrl": "./", + "incremental": true, + "strict": true, + "skipLibCheck": true, + "skipDefaultLibCheck": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + } +} \ No newline at end of file From 53f5986be8014838fbf9cbab0ca3ab7b17369616 Mon Sep 17 00:00:00 2001 From: krishnaCG-1997 <35657404+krishnaCG-1997@users.noreply.github.com> Date: Wed, 27 Jan 2021 17:40:13 +0530 Subject: [PATCH 06/10] node code updated --- .../core/auth/controllers/auth.controller.ts | 1 + .../app/event/services/event.crud.service.ts | 1 + .../queue-detail.crud.controller.ts | 26 ++- .../model/entities/queue-detail.entity.ts | 9 +- .../services/queue-detail.crud.service.ts | 155 +++++++++++++----- .../migration/1609824133465-CreateTables.ts | 2 +- .../src/migration/1609824210187-InsertData.ts | 17 +- 7 files changed, 142 insertions(+), 69 deletions(-) diff --git a/node-jtq/src/app/core/auth/controllers/auth.controller.ts b/node-jtq/src/app/core/auth/controllers/auth.controller.ts index baecb06..1ac0591 100644 --- a/node-jtq/src/app/core/auth/controllers/auth.controller.ts +++ b/node-jtq/src/app/core/auth/controllers/auth.controller.ts @@ -21,6 +21,7 @@ export class AuthController { async register(@Body() user: User): Promise { try { const registered = await this.authService.register(user); + console.log(registered); return registered; } catch (e) { throw new BadRequestException(e.message); diff --git a/node-jtq/src/app/event/services/event.crud.service.ts b/node-jtq/src/app/event/services/event.crud.service.ts index 1c83e77..29c92b9 100644 --- a/node-jtq/src/app/event/services/event.crud.service.ts +++ b/node-jtq/src/app/event/services/event.crud.service.ts @@ -9,4 +9,5 @@ export class EventCrudService extends TypeOrmCrudService { constructor(@InjectRepository(Event) repo: Repository) { super(repo); } + } diff --git a/node-jtq/src/app/queue-detail/controllers/queue-detail.crud.controller.ts b/node-jtq/src/app/queue-detail/controllers/queue-detail.crud.controller.ts index 042d572..5212187 100644 --- a/node-jtq/src/app/queue-detail/controllers/queue-detail.crud.controller.ts +++ b/node-jtq/src/app/queue-detail/controllers/queue-detail.crud.controller.ts @@ -1,4 +1,4 @@ -import { Body, Controller, Post } from '@nestjs/common'; +import { Body, Controller, Delete, Get, Param, Post } from '@nestjs/common'; import { Crud } from '@nestjsx/crud'; import { CrudType } from '@devon4node/common/serializer'; import { QueueDetail } from '../model/entities/queue-detail.entity'; @@ -12,16 +12,28 @@ import { ApiTags } from '@nestjs/swagger'; }) @ApiTags('queue-detail') @CrudType(QueueDetail) -@Controller('queue-detail/queue-details') +@Controller('queue-detail/queue-details') //path export class QueueDetailCrudController { constructor(public service: QueueDetailCrudService) { } + @Post('join-queue') - async join(@Body() queueDTO: any): Promise { + async joinQueue(@Body() queueDTO: any): Promise { + + const result = await this.service.joinQueue(queueDTO); + return result; + } + + @Get('fetchJoinedEvents/:id') + async fetchJoinedEvents(@Param('id') id: number): Promise { + const result = await this.service.fetchJoinedEvents(id); + return result; + } - const token = await this.service.joinQueue(queueDTO); - // res.setHeader('Authorization', 'Bearer ' + token); - // res.status(200).send(); - return token; + @Delete('leave-queue/:id') + async leaveQueue(@Param('id') id: number): Promise { + console.log(id); + const result = await this.service.leaveQueue(id); + return result; } } diff --git a/node-jtq/src/app/queue-detail/model/entities/queue-detail.entity.ts b/node-jtq/src/app/queue-detail/model/entities/queue-detail.entity.ts index 385a5da..0c085ac 100644 --- a/node-jtq/src/app/queue-detail/model/entities/queue-detail.entity.ts +++ b/node-jtq/src/app/queue-detail/model/entities/queue-detail.entity.ts @@ -42,19 +42,20 @@ export class QueueDetail extends BaseEntity { @ApiPropertyOptional() @IsDefined({ groups: [CrudValidationGroups.CREATE] }) @IsOptional({ groups: [CrudValidationGroups.UPDATE] }) - @ManyToOne(() => User) + @ManyToOne(() => User, { eager: true }) @JoinColumn({ name: 'idUser', referencedColumnName: 'id' }) - user?: User; + idUser?: number; @ApiPropertyOptional() @IsDefined({ groups: [CrudValidationGroups.CREATE] }) @IsOptional({ groups: [CrudValidationGroups.UPDATE] }) - @ManyToOne(() => Event) + @ManyToOne(() => Event, { eager: true }) @JoinColumn({ name: 'idEvent', referencedColumnName: 'id' }) - event?: Event; + idEvent?: number; } +// type => UserEntity, user => user.books /** * queueNumber, creationTime, startTime, endTime, minEstimatedTime, idVisitor, idEvent diff --git a/node-jtq/src/app/queue-detail/services/queue-detail.crud.service.ts b/node-jtq/src/app/queue-detail/services/queue-detail.crud.service.ts index ad2b1c7..0c0887e 100644 --- a/node-jtq/src/app/queue-detail/services/queue-detail.crud.service.ts +++ b/node-jtq/src/app/queue-detail/services/queue-detail.crud.service.ts @@ -1,71 +1,136 @@ import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { TypeOrmCrudService } from '@nestjsx/crud-typeorm'; -import { subtract } from 'lodash'; -import { Repository } from 'typeorm'; -import { User } from '../../core/user/model/entities/user.entity'; +import { DeleteResult, Repository } from 'typeorm'; import { Event } from '../../event/model/entities/event.entity'; import { QueueDetail } from '../model/entities/queue-detail.entity'; @Injectable() export class QueueDetailCrudService extends TypeOrmCrudService { + constructor(@InjectRepository(QueueDetail) repo: Repository, - @InjectRepository(Event) private readonly eventRepository: Repository, - @InjectRepository(User) private readonly userRepository: Repository) { + @InjectRepository(Event) private readonly eventRepository: Repository) { super(repo); } - async joinQueue(queue1: any): Promise { - const eventId = queue1.eventId; - const visitorId = queue1.visitorId; - console.log(eventId); - const eventDetail: Event | any = await this.getEventDetailById(eventId); + async leaveQueue(id: number): Promise { + + const queue: QueueDetail | any = await this.repo.findOne(id); + const updatedEvent = await this.decreaseVisitorCount(queue.idEvent.id); + console.log(updatedEvent); + return this.repo.delete(id); + + } + + async decreaseVisitorCount(eventId: number) { + + const event: Event | any = await this.eventRepository.findOne({ where: { id: eventId } }); + event.visitorCount = event.visitorCount - 1; + const eventResult = await this.eventRepository.save(event); + return eventResult; + + } + + calculateEstimatedTime(eventDetails: Event, queueNumber: number) { + + let time: number | any; + if (eventDetails.attentionTime) { + time = parseInt(eventDetails.attentionTime) * (60000 * queueNumber); + } + const currentTime = new Date().getTime(); + const estimatedTime = new Date(currentTime + time); + return estimatedTime; + + } + + async fetchJoinedEvents(id: number) { + + const queueDetails: QueueDetail | any = await this.repo.find({ where: { idUser: id } }); + return queueDetails; + + } + async joinQueue(queueDTO: any) { + const eventId = queueDTO.eventId; + const userId = queueDTO.visitorId; const queue: QueueDetail = new QueueDetail(); - // const list :QueueDetail[]= await this.getListOfQueue(eId); - // if(list.length==0){ - // queue.queueNumber="Q001" - // } - // else { - // const list1:QueueDetail = list.find(); - // console.log(list1); - // const queueNo = parseInt(list1.queueNumber.substr(1)); - // } - queue.queueNumber = "Q035"; - queue.startTime = eventDetail!.startDate; - queue.endTime = eventDetail!.endDate; - queue.minEstimatedTime = await this.getMinimumEstimatedTime(eventDetail!.currentNumber, queue.queueNumber); - this.userRepository.findOne(visitorId).then(data => { - if (data != null) { - queue.user = data; + const queueDetail_InQueue: QueueDetail[] | any = await this.getQueueDetailByeventIdAndUserId(eventId, userId); + + if (queueDetail_InQueue.length != 0) { + return queueDetail_InQueue; + } + + const queueDetailEventEtosInQueue: QueueDetail[] | any = await this.getQueueDetailByEventId(eventId); + const event: Event | any = await this.eventRepository.findOne(eventId); + event.visitorCount += 1; + + if (queueDetailEventEtosInQueue.length === 0) { + queue.queueNumber = this.generateTicketCode(1); + queue.minEstimatedTime = this.calculateEstimatedTime(event, 1); + } + + else { + const lastQueueDetail: QueueDetail[] = await this.repo.find({ + where: { idEvent: eventId }, + order: { + creationTime: 'DESC' + }, + take: 1 + }); + + const lastNumber = lastQueueDetail[0].queueNumber?.split(''); + let lastQueueNumber: number; + if (lastNumber) { + lastQueueNumber = parseInt(lastNumber[lastNumber.length - 2] + lastNumber[lastNumber.length - 1]); + console.log(lastQueueNumber); } - }); - this.eventRepository.findOne(eventId).then(data => { - if (data != null) { - queue.event = data; + else { + lastQueueNumber = 0; } - }); + queue.queueNumber = this.generateTicketCode(lastQueueNumber + 1); + queue.minEstimatedTime = this.calculateEstimatedTime(event, event.visitorCount); + } + + queue.creationTime = new Date(); + queue.startTime = event?.startDate; + queue.endTime = event?.endDate; + + const updatedEvent = await this.eventRepository.save(event); + queue.idEvent = updatedEvent.id; + queue.idUser = userId; + const result = await this.repo.save(queue); - console.log(result); - return result; + const queueDetails: QueueDetail | any = await this.repo.find({ where: { id: result.id } }); + return queueDetails; + } - async getEventDetailById(eId: any): Promise { - console.log('3') - const eventDetail = await this.eventRepository.findOne(eId); - //Promise is showing pending - console.log(eventDetail) - return eventDetail; + generateTicketCode(lastTicketDigit: number) { + + const newTicketDigit = (lastTicketDigit).toString().split(''); + const newTicketCode: string = 'Q0'; + if (newTicketDigit.length < 2) { + const queueNumber = newTicketCode.concat('0', newTicketDigit[0]); + return queueNumber; + } + else { + const queueNumber = newTicketCode.concat(newTicketDigit[0], newTicketDigit[1]); + return queueNumber; + } + } - async getMinimumEstimatedTime(currentNumber: String, queueNumber: String): Promise { + getQueueDetailByeventIdAndUserId(eventId: any, userId: any): any { - const currently = parseInt(currentNumber.substr(1)); - const queue1 = parseInt(queueNumber.substr(1)); - const currentTime = new Date().getTime(); - const queueTime = currentTime + subtract(queue1, currently) * 12000; - return queueTime; + const queueDetails = this.repo.find({ where: { idEvent: eventId, idUser: userId } }); + return queueDetails; + + } + + getQueueDetailByEventId(eventId: any): any { + const queueDetails = this.repo.find({ where: { idEvent: eventId } }); + return queueDetails; } } diff --git a/node-jtq/src/migration/1609824133465-CreateTables.ts b/node-jtq/src/migration/1609824133465-CreateTables.ts index 831f15e..a9c6335 100644 --- a/node-jtq/src/migration/1609824133465-CreateTables.ts +++ b/node-jtq/src/migration/1609824133465-CreateTables.ts @@ -10,7 +10,7 @@ export class CreateTables1609824133465 implements MigrationInterface { await queryRunner.query(`CREATE TABLE "event" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "version" integer NOT NULL DEFAULT (1), "createdAt" datetime NOT NULL DEFAULT (datetime('now')), "updatedAt" datetime NOT NULL DEFAULT (datetime('now')), eventName VARCHAR(255), location VARCHAR(255), description VARCHAR(255), logo VARCHAR(255), visitorCount INTEGER, attentionTime VARCHAR(255),currentlyBeingAttended VARCHAR(255), startDate text,endDate text)`); await queryRunner.query(`CREATE TABLE "queue_detail" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "version" integer NOT NULL DEFAULT (1), "createdAt" datetime NOT NULL DEFAULT (datetime('now')), "updatedAt" datetime NOT NULL DEFAULT (datetime('now')), queueNumber VARCHAR(5), creationTime datetime, startTime datetime, endTime datetime, minEstimatedTime datetime, - idUser BIGINT NOT NULL, idEvent BIGINT NOT NULL, + idUser BIGINT, idEvent BIGINT, FOREIGN KEY(idUser) REFERENCES user(id), FOREIGN KEY(idEvent) REFERENCES event(id))`); } diff --git a/node-jtq/src/migration/1609824210187-InsertData.ts b/node-jtq/src/migration/1609824210187-InsertData.ts index 0fafe67..abdde7a 100644 --- a/node-jtq/src/migration/1609824210187-InsertData.ts +++ b/node-jtq/src/migration/1609824210187-InsertData.ts @@ -16,22 +16,15 @@ export class InsertData1609824210187 implements MigrationInterface { startDate,endDate) VALUES(2, 'Food Fest','Banglore','Biggest Food Fest', NULL,0, '6', 'Q001', '2021-02-02 00:01:00','2021-03-03 00:01:00');`, ); - // await queryRunner.query( - // `INSERT INTO QUEUE_DETAIL(id, queueNumber, creationTime, startTime, endTime, minEstimatedTime, - // idUser, idEvent) VALUES(1, 'Q001', (datetime('now')), (datetime('now')), NULL, (datetime('now')), 1,1);`, - // ); - await queryRunner.query(`INSERT INTO USER(id, username, password, role) VALUES(?, ?, ?, ?);`, [ + await queryRunner.query(`INSERT INTO USER(id, username, password, name, phoneNumber, acceptedCommercial, acceptedTerms, role) VALUES(?, ?, ?, ?,?,?,?,?);`, [ 1, - 'user', + 'krishna@mail.com', await hash('password', await genSalt(12)), + 'krishna', + '7987494902', + true, true, roles.USER, ]); - await queryRunner.query(`INSERT INTO USER(id, username, password, role) VALUES(?, ?, ?, ?);`, [ - 2, - 'admin', - await hash('admin', await genSalt(12)), - roles.ADMIN, - ]); await queryRunner.query( `INSERT INTO QUEUE_DETAIL(id, queueNumber, creationTime, startTime, endTime, minEstimatedTime, idUser, idEvent) VALUES(1, 'Q001', (datetime('now')), (datetime('now')), NULL, (datetime('now')), 1,1);`, From e0d6e5feceae05c6df0bba193a541e974f00940c Mon Sep 17 00:00:00 2001 From: krishnaCG-1997 <35657404+krishnaCG-1997@users.noreply.github.com> Date: Thu, 4 Feb 2021 12:54:00 +0530 Subject: [PATCH 07/10] check --- node-jtq/src/app/event/controllers/event.crud.controller.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node-jtq/src/app/event/controllers/event.crud.controller.ts b/node-jtq/src/app/event/controllers/event.crud.controller.ts index 52be0c6..5e29b33 100644 --- a/node-jtq/src/app/event/controllers/event.crud.controller.ts +++ b/node-jtq/src/app/event/controllers/event.crud.controller.ts @@ -12,7 +12,7 @@ import { ApiTags } from '@nestjs/swagger'; }) @ApiTags('employee') @CrudType(Event) -@Controller('event/events') +@Controller('event/events') //path export class EventCrudController { constructor(public service: EventCrudService) { } } From 0235c3afc85ca2c4ac6a8bfd298d5c010fc55f24 Mon Sep 17 00:00:00 2001 From: krishnaCG-1997 <35657404+krishnaCG-1997@users.noreply.github.com> Date: Thu, 25 Feb 2021 16:02:11 +0530 Subject: [PATCH 08/10] readme updated check --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index bc87fae..15ba47d 100644 --- a/README.md +++ b/README.md @@ -9,4 +9,4 @@ Execution: For the execution of front end 'devon ng serve' command has been used For checking the backend functionalities we have used Postman. For checking the frontend functionalities we have used chrome. -Integration: We have integrated backend and frontend using the REST API calls. +Integration: We have integrated backend and frontend using the REST API call. From cc552f7349e84972e5360974fa82e75203e539f6 Mon Sep 17 00:00:00 2001 From: krishnaCG-1997 <35657404+krishnaCG-1997@users.noreply.github.com> Date: Thu, 25 Feb 2021 16:15:11 +0530 Subject: [PATCH 09/10] readme updated check --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 15ba47d..bc87fae 100644 --- a/README.md +++ b/README.md @@ -9,4 +9,4 @@ Execution: For the execution of front end 'devon ng serve' command has been used For checking the backend functionalities we have used Postman. For checking the frontend functionalities we have used chrome. -Integration: We have integrated backend and frontend using the REST API call. +Integration: We have integrated backend and frontend using the REST API calls. From 935af781c8b4bfa65a23408603f9a51f0caf0fd7 Mon Sep 17 00:00:00 2001 From: krishnaCG-1997 Date: Thu, 25 Feb 2021 16:22:18 +0530 Subject: [PATCH 10/10] readme updated check --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index bc87fae..15ba47d 100644 --- a/README.md +++ b/README.md @@ -9,4 +9,4 @@ Execution: For the execution of front end 'devon ng serve' command has been used For checking the backend functionalities we have used Postman. For checking the frontend functionalities we have used chrome. -Integration: We have integrated backend and frontend using the REST API calls. +Integration: We have integrated backend and frontend using the REST API call.