From 5064520889a5d854d51e19a9a7198d7967592ee3 Mon Sep 17 00:00:00 2001 From: Colin DAMON <cdamon@ippon.fr> Date: Sat, 22 Aug 2020 20:10:03 +0200 Subject: [PATCH] JHipster app initialisation --- borestop/.editorconfig | 23 + borestop/.eslintignore | 9 + borestop/.eslintrc.json | 24 + borestop/.gitattributes | 150 + borestop/.gitignore | 148 + borestop/.huskyrc | 5 + borestop/.lintstagedrc.js | 3 + .../.mvn/wrapper/MavenWrapperDownloader.java | 116 + borestop/.mvn/wrapper/maven-wrapper.jar | Bin 0 -> 50710 bytes .../.mvn/wrapper/maven-wrapper.properties | 2 + borestop/.prettierignore | 8 + borestop/.prettierrc | 12 + borestop/.yo-rc.json | 42 + borestop/README.md | 237 + borestop/angular.json | 36 + borestop/checkstyle.xml | 21 + borestop/mvnw | 310 + borestop/mvnw.cmd | 182 + borestop/package-lock.json | 23954 ++++++++++++++++ borestop/package.json | 124 + borestop/pom.xml | 1114 + borestop/postcss.config.js | 3 + borestop/proxy.conf.json | 7 + borestop/sonar-project.properties | 33 + borestop/src/main/docker/app.yml | 16 + .../grafana/provisioning/dashboards/JVM.json | 3778 +++ .../provisioning/dashboards/dashboard.yml | 11 + .../provisioning/datasources/datasource.yml | 50 + borestop/src/main/docker/monitoring.yml | 26 + borestop/src/main/docker/postgresql.yml | 12 + .../src/main/docker/prometheus/prometheus.yml | 31 + borestop/src/main/docker/sonar.yml | 7 + .../com/ippon/borestop/ApplicationWebXml.java | 19 + .../java/com/ippon/borestop/BorestopApp.java | 104 + .../borestop/aop/logging/LoggingAspect.java | 108 + .../config/ApplicationProperties.java | 12 + .../borestop/config/AsyncConfiguration.java | 45 + .../config/CloudDatabaseConfiguration.java | 24 + .../com/ippon/borestop/config/Constants.java | 15 + .../config/DatabaseConfiguration.java | 56 + .../config/DateTimeFormatConfiguration.java | 20 + .../borestop/config/JacksonConfiguration.java | 51 + .../config/LiquibaseConfiguration.java | 68 + .../borestop/config/LocaleConfiguration.java | 26 + .../config/LoggingAspectConfiguration.java | 17 + .../borestop/config/LoggingConfiguration.java | 51 + .../config/SecurityConfiguration.java | 99 + .../StaticResourcesWebConfiguration.java | 50 + .../ippon/borestop/config/WebConfigurer.java | 133 + .../config/audit/AuditEventConverter.java | 88 + .../borestop/config/audit/package-info.java | 4 + .../ippon/borestop/config/package-info.java | 4 + .../domain/AbstractAuditingEntity.java | 75 + .../com/ippon/borestop/domain/Authority.java | 57 + .../borestop/domain/PersistentAuditEvent.java | 107 + .../java/com/ippon/borestop/domain/User.java | 226 + .../ippon/borestop/domain/package-info.java | 4 + .../repository/AuthorityRepository.java | 9 + .../CustomAuditEventRepository.java | 92 + .../PersistenceAuditEventRepository.java | 21 + .../borestop/repository/UserRepository.java | 35 + .../borestop/repository/package-info.java | 4 + .../security/AuthoritiesConstants.java | 14 + .../security/DomainUserDetailsService.java | 61 + .../borestop/security/SecurityUtils.java | 79 + .../security/SpringSecurityAuditorAware.java | 18 + .../security/UserNotActivatedException.java | 18 + .../borestop/security/jwt/JWTConfigurer.java | 20 + .../borestop/security/jwt/JWTFilter.java | 46 + .../borestop/security/jwt/TokenProvider.java | 103 + .../ippon/borestop/security/package-info.java | 4 + .../borestop/service/AuditEventService.java | 77 + .../service/EmailAlreadyUsedException.java | 9 + .../service/InvalidPasswordException.java | 9 + .../ippon/borestop/service/MailService.java | 111 + .../ippon/borestop/service/UserService.java | 313 + .../service/UsernameAlreadyUsedException.java | 9 + .../service/dto/PasswordChangeDTO.java | 34 + .../ippon/borestop/service/dto/UserDTO.java | 192 + .../borestop/service/dto/package-info.java | 4 + .../borestop/service/mapper/UserMapper.java | 78 + .../borestop/service/mapper/package-info.java | 4 + .../ippon/borestop/service/package-info.java | 4 + .../borestop/web/rest/AccountResource.java | 186 + .../borestop/web/rest/AuditResource.java | 76 + .../web/rest/ClientForwardController.java | 17 + .../borestop/web/rest/UserJWTController.java | 67 + .../ippon/borestop/web/rest/UserResource.java | 183 + .../rest/errors/BadRequestAlertException.java | 40 + .../errors/EmailAlreadyUsedException.java | 9 + .../web/rest/errors/ErrorConstants.java | 16 + .../web/rest/errors/ExceptionTranslator.java | 134 + .../web/rest/errors/FieldErrorVM.java | 31 + .../rest/errors/InvalidPasswordException.java | 12 + .../errors/LoginAlreadyUsedException.java | 9 + .../web/rest/errors/package-info.java | 6 + .../ippon/borestop/web/rest/package-info.java | 4 + .../web/rest/vm/KeyAndPasswordVM.java | 26 + .../ippon/borestop/web/rest/vm/LoginVM.java | 52 + .../borestop/web/rest/vm/ManagedUserVM.java | 34 + .../borestop/web/rest/vm/package-info.java | 4 + borestop/src/main/jib/entrypoint.sh | 4 + .../src/main/resources/.h2.server.properties | 5 + borestop/src/main/resources/banner.txt | 10 + .../main/resources/config/application-dev.yml | 116 + .../resources/config/application-prod.yml | 129 + .../main/resources/config/application-tls.yml | 19 + .../src/main/resources/config/application.yml | 165 + .../00000000000000_initial_schema.xml | 159 + .../config/liquibase/data/authority.csv | 3 + .../resources/config/liquibase/data/user.csv | 5 + .../config/liquibase/data/user_authority.csv | 6 + .../resources/config/liquibase/master.xml | 20 + .../main/resources/config/tls/keystore.p12 | Bin 0 -> 2607 bytes .../main/resources/i18n/messages.properties | 21 + .../resources/i18n/messages_en.properties | 21 + .../src/main/resources/logback-spring.xml | 68 + .../src/main/resources/templates/error.html | 87 + .../templates/mail/activationEmail.html | 25 + .../templates/mail/creationEmail.html | 25 + .../templates/mail/passwordResetEmail.html | 25 + borestop/src/main/webapp/404.html | 61 + borestop/src/main/webapp/WEB-INF/web.xml | 13 + .../main/webapp/app/account/account.module.ts | 27 + .../main/webapp/app/account/account.route.ts | 17 + .../account/activate/activate.component.html | 16 + .../account/activate/activate.component.ts | 28 + .../app/account/activate/activate.route.ts | 12 + .../app/account/activate/activate.service.ts | 16 + .../password-reset-finish.component.html | 90 + .../finish/password-reset-finish.component.ts | 69 + .../finish/password-reset-finish.route.ts | 12 + .../finish/password-reset-finish.service.ts | 14 + .../init/password-reset-init.component.html | 53 + .../init/password-reset-init.component.ts | 30 + .../init/password-reset-init.route.ts | 12 + .../init/password-reset-init.service.ts | 14 + .../password-strength-bar.component.ts | 85 + .../password/password-strength-bar.scss | 23 + .../account/password/password.component.html | 94 + .../account/password/password.component.ts | 45 + .../app/account/password/password.route.ts | 15 + .../app/account/password/password.service.ts | 14 + .../account/register/register.component.html | 158 + .../account/register/register.component.ts | 84 + .../app/account/register/register.route.ts | 12 + .../app/account/register/register.service.ts | 15 + .../account/settings/settings.component.html | 108 + .../account/settings/settings.component.ts | 59 + .../app/account/settings/settings.route.ts | 15 + .../webapp/app/admin/admin-routing.module.ts | 44 + .../app/admin/audits/audit-data.model.ts | 3 + .../webapp/app/admin/audits/audit.model.ts | 5 + .../app/admin/audits/audits.component.html | 67 + .../app/admin/audits/audits.component.ts | 115 + .../webapp/app/admin/audits/audits.module.ts | 13 + .../webapp/app/admin/audits/audits.route.ts | 12 + .../webapp/app/admin/audits/audits.service.ts | 28 + .../configuration.component.html | 50 + .../configuration/configuration.component.ts | 32 + .../configuration/configuration.module.ts | 13 + .../configuration/configuration.route.ts | 11 + .../configuration/configuration.service.ts | 68 + .../webapp/app/admin/docs/docs.component.html | 2 + .../webapp/app/admin/docs/docs.component.ts | 8 + .../main/webapp/app/admin/docs/docs.module.ts | 13 + .../main/webapp/app/admin/docs/docs.route.ts | 11 + .../src/main/webapp/app/admin/docs/docs.scss | 6 + .../admin/health/health-modal.component.html | 36 + .../admin/health/health-modal.component.ts | 37 + .../app/admin/health/health.component.html | 38 + .../app/admin/health/health.component.ts | 44 + .../webapp/app/admin/health/health.module.ts | 15 + .../webapp/app/admin/health/health.route.ts | 11 + .../webapp/app/admin/health/health.service.ts | 30 + .../main/webapp/app/admin/logs/log.model.ts | 15 + .../webapp/app/admin/logs/logs.component.html | 28 + .../webapp/app/admin/logs/logs.component.ts | 34 + .../main/webapp/app/admin/logs/logs.module.ts | 13 + .../main/webapp/app/admin/logs/logs.route.ts | 11 + .../webapp/app/admin/logs/logs.service.ts | 19 + .../app/admin/metrics/metrics.component.html | 65 + .../app/admin/metrics/metrics.component.ts | 47 + .../app/admin/metrics/metrics.module.ts | 13 + .../webapp/app/admin/metrics/metrics.route.ts | 11 + .../app/admin/metrics/metrics.service.ts | 23 + ...er-management-delete-dialog.component.html | 23 + ...user-management-delete-dialog.component.ts | 27 + .../user-management-detail.component.html | 58 + .../user-management-detail.component.ts | 18 + .../user-management-update.component.html | 140 + .../user-management-update.component.ts | 106 + .../user-management.component.html | 88 + .../user-management.component.ts | 106 + .../user-management/user-management.module.ts | 21 + .../user-management/user-management.route.ts | 53 + .../src/main/webapp/app/app-routing.module.ts | 35 + borestop/src/main/webapp/app/app.constants.ts | 8 + borestop/src/main/webapp/app/app.main.ts | 16 + borestop/src/main/webapp/app/app.module.ts | 31 + .../webapp/app/blocks/config/prod.config.ts | 9 + .../blocks/config/uib-pagination.config.ts | 13 + .../interceptor/auth-expired.interceptor.ts | 32 + .../blocks/interceptor/auth.interceptor.ts | 27 + .../interceptor/errorhandler.interceptor.ts | 20 + .../interceptor/notification.interceptor.ts | 33 + .../webapp/app/core/auth/account.service.ts | 97 + .../webapp/app/core/auth/auth-jwt.service.ts | 44 + .../main/webapp/app/core/auth/csrf.service.ts | 11 + .../app/core/auth/state-storage.service.ts | 21 + .../core/auth/user-route-access-service.ts | 53 + .../src/main/webapp/app/core/core.module.ts | 85 + .../app/core/icons/font-awesome-icons.ts | 75 + .../app/core/language/language.constants.ts | 8 + .../app/core/login/login-modal.service.ts | 20 + .../main/webapp/app/core/login/login.model.ts | 3 + .../webapp/app/core/login/login.service.ts | 21 + .../webapp/app/core/user/account.model.ts | 12 + .../main/webapp/app/core/user/user.model.ts | 33 + .../main/webapp/app/core/user/user.service.ts | 39 + .../main/webapp/app/entities/entity.module.ts | 11 + .../main/webapp/app/home/home.component.html | 44 + .../main/webapp/app/home/home.component.ts | 36 + .../src/main/webapp/app/home/home.module.ts | 12 + .../src/main/webapp/app/home/home.route.ts | 12 + borestop/src/main/webapp/app/home/home.scss | 23 + .../app/layouts/error/error.component.html | 15 + .../app/layouts/error/error.component.ts | 39 + .../webapp/app/layouts/error/error.route.ts | 36 + .../app/layouts/footer/footer.component.html | 3 + .../app/layouts/footer/footer.component.ts | 7 + .../app/layouts/main/main.component.html | 13 + .../webapp/app/layouts/main/main.component.ts | 60 + .../layouts/navbar/active-menu.directive.ts | 27 + .../app/layouts/navbar/navbar.component.html | 152 + .../app/layouts/navbar/navbar.component.ts | 74 + .../webapp/app/layouts/navbar/navbar.route.ts | 9 + .../webapp/app/layouts/navbar/navbar.scss | 42 + .../layouts/profiles/page-ribbon.component.ts | 23 + .../app/layouts/profiles/page-ribbon.scss | 31 + .../layouts/profiles/profile-info.model.ts | 15 + .../app/layouts/profiles/profile.service.ts | 43 + borestop/src/main/webapp/app/polyfills.ts | 3 + .../app/shared/alert/alert-error.component.ts | 123 + .../app/shared/alert/alert-error.model.ts | 3 + .../app/shared/alert/alert.component.ts | 41 + .../auth/has-any-authority.directive.ts | 47 + .../shared/constants/authority.constants.ts | 4 + .../app/shared/constants/error.constants.ts | 3 + .../app/shared/constants/input.constants.ts | 2 + .../shared/constants/pagination.constants.ts | 1 + .../language/find-language-from-key.pipe.ts | 13 + .../app/shared/login/login.component.html | 51 + .../app/shared/login/login.component.ts | 73 + .../webapp/app/shared/shared-libs.module.ts | 22 + .../main/webapp/app/shared/shared.module.ts | 22 + .../app/shared/util/datepicker-adapter.ts | 23 + .../webapp/app/shared/util/request-util.ts | 33 + borestop/src/main/webapp/app/vendor.ts | 2 + .../src/main/webapp/content/css/loading.css | 152 + .../images/jhipster_family_member_0.svg | 1 + .../jhipster_family_member_0_head-192.png | Bin 0 -> 13439 bytes .../jhipster_family_member_0_head-256.png | Bin 0 -> 7037 bytes .../jhipster_family_member_0_head-384.png | Bin 0 -> 10350 bytes .../jhipster_family_member_0_head-512.png | Bin 0 -> 11431 bytes .../images/jhipster_family_member_1.svg | 1 + .../jhipster_family_member_1_head-192.png | Bin 0 -> 7046 bytes .../jhipster_family_member_1_head-256.png | Bin 0 -> 9505 bytes .../jhipster_family_member_1_head-384.png | Bin 0 -> 15054 bytes .../jhipster_family_member_1_head-512.png | Bin 0 -> 16456 bytes .../images/jhipster_family_member_2.svg | 1 + .../jhipster_family_member_2_head-192.png | Bin 0 -> 5423 bytes .../jhipster_family_member_2_head-256.png | Bin 0 -> 6687 bytes .../jhipster_family_member_2_head-384.png | Bin 0 -> 9682 bytes .../jhipster_family_member_2_head-512.png | Bin 0 -> 10514 bytes .../images/jhipster_family_member_3.svg | 1 + .../jhipster_family_member_3_head-192.png | Bin 0 -> 6148 bytes .../jhipster_family_member_3_head-256.png | Bin 0 -> 8028 bytes .../jhipster_family_member_3_head-384.png | Bin 0 -> 11998 bytes .../jhipster_family_member_3_head-512.png | Bin 0 -> 13555 bytes .../webapp/content/images/logo-jhipster.png | Bin 0 -> 605 bytes .../content/scss/_bootstrap-variables.scss | 45 + .../src/main/webapp/content/scss/global.scss | 195 + .../src/main/webapp/content/scss/vendor.scss | 12 + borestop/src/main/webapp/favicon.ico | Bin 0 -> 1574 bytes .../src/main/webapp/i18n/en/activate.json | 9 + borestop/src/main/webapp/i18n/en/audits.json | 28 + .../main/webapp/i18n/en/configuration.json | 10 + borestop/src/main/webapp/i18n/en/error.json | 14 + borestop/src/main/webapp/i18n/en/global.json | 140 + borestop/src/main/webapp/i18n/en/health.json | 29 + borestop/src/main/webapp/i18n/en/home.json | 19 + borestop/src/main/webapp/i18n/en/login.json | 19 + borestop/src/main/webapp/i18n/en/logs.json | 11 + borestop/src/main/webapp/i18n/en/metrics.json | 102 + .../src/main/webapp/i18n/en/password.json | 12 + .../src/main/webapp/i18n/en/register.json | 24 + borestop/src/main/webapp/i18n/en/reset.json | 26 + .../src/main/webapp/i18n/en/sessions.json | 15 + .../src/main/webapp/i18n/en/settings.json | 32 + .../main/webapp/i18n/en/user-management.json | 30 + borestop/src/main/webapp/index.html | 108 + borestop/src/main/webapp/manifest.webapp | 31 + borestop/src/main/webapp/robots.txt | 11 + .../swagger-ui/dist/images/throbber.gif | Bin 0 -> 9257 bytes .../src/main/webapp/swagger-ui/index.html | 65 + .../java/com/ippon/borestop/ArchTest.java | 29 + .../config/NoOpMailConfiguration.java | 24 + .../StaticResourcesWebConfigurerTest.java | 75 + .../borestop/config/WebConfigurerTest.java | 147 + .../config/WebConfigurerTestController.java | 14 + .../config/timezone/HibernateTimeZoneIT.java | 162 + .../CustomAuditEventRepositoryIT.java | 154 + .../repository/timezone/DateTimeWrapper.java | 132 + .../timezone/DateTimeWrapperRepository.java | 10 + .../security/DomainUserDetailsServiceIT.java | 111 + .../security/SecurityUtilsUnitTest.java | 69 + .../borestop/security/jwt/JWTFilterTest.java | 115 + .../security/jwt/TokenProviderTest.java | 106 + .../borestop/service/AuditEventServiceIT.java | 75 + .../ippon/borestop/service/MailServiceIT.java | 244 + .../ippon/borestop/service/UserServiceIT.java | 197 + .../service/mapper/UserMapperTest.java | 134 + .../borestop/web/rest/AccountResourceIT.java | 755 + .../borestop/web/rest/AuditResourceIT.java | 135 + .../web/rest/ClientForwardControllerTest.java | 57 + .../com/ippon/borestop/web/rest/TestUtil.java | 154 + .../web/rest/UserJWTControllerIT.java | 99 + .../borestop/web/rest/UserResourceIT.java | 562 + .../web/rest/WithUnauthenticatedMockUser.java | 23 + .../rest/errors/ExceptionTranslatorIT.java | 117 + .../ExceptionTranslatorTestController.java | 65 + .../src/test/javascript/jest-global-mocks.ts | 3 + borestop/src/test/javascript/jest.conf.js | 53 + borestop/src/test/javascript/jest.ts | 2 + .../activate/activate.component.spec.ts | 72 + .../password-reset-finish.component.spec.ts | 102 + .../password-reset-init.component.spec.ts | 66 + .../password-strength-bar.component.spec.ts | 48 + .../password/password.component.spec.ts | 102 + .../register/register.component.spec.ts | 137 + .../settings/settings.component.spec.ts | 89 + .../app/admin/audits/audits.component.spec.ts | 204 + .../app/admin/audits/audits.service.spec.ts | 70 + .../configuration.component.spec.ts | 68 + .../configuration.service.spec.ts | 81 + .../app/admin/health/health.component.spec.ts | 67 + .../app/admin/logs/logs.component.spec.ts | 85 + .../spec/app/admin/logs/logs.service.spec.ts | 44 + .../admin/metrics/metrics.component.spec.ts | 54 + .../app/admin/metrics/metrics.service.spec.ts | 68 + ...management-delete-dialog.component.spec.ts | 56 + .../user-management-detail.component.spec.ts | 62 + .../user-management-update.component.spec.ts | 104 + .../user-management.component.spec.ts | 86 + .../core/login/login-modal.service.spec.ts | 48 + .../app/core/user/account.service.spec.ts | 214 + .../spec/app/core/user/user.service.spec.ts | 79 + .../spec/app/home/home.component.spec.ts | 55 + .../app/layouts/main/main.component.spec.ts | 183 + .../layouts/navbar/navbar.component.spec.ts | 52 + .../alert/alert-error.component.spec.ts | 141 + .../app/shared/alert/alert.component.spec.ts | 44 + .../app/shared/login/login.component.spec.ts | 116 + .../spec/helpers/mock-account.service.ts | 31 + .../spec/helpers/mock-active-modal.service.ts | 15 + .../spec/helpers/mock-alert.service.ts | 13 + .../helpers/mock-event-manager.service.ts | 13 + .../spec/helpers/mock-language.service.ts | 14 + .../spec/helpers/mock-login-modal.service.ts | 14 + .../spec/helpers/mock-login.service.ts | 27 + .../spec/helpers/mock-route.service.ts | 50 + .../helpers/mock-state-storage.service.ts | 21 + .../test/javascript/spec/helpers/spyobject.ts | 48 + .../src/test/javascript/spec/test.module.ts | 72 + .../config/application-testcontainers.yml | 22 + .../src/test/resources/config/application.yml | 117 + .../resources/i18n/messages_en.properties | 4 + borestop/src/test/resources/logback.xml | 47 + .../resources/templates/mail/testEmail.html | 1 + borestop/tsconfig.app.json | 4 + borestop/tsconfig.base.json | 31 + borestop/tsconfig.json | 11 + borestop/tslint.json | 17 + borestop/webpack/logo-jhipster.png | Bin 0 -> 3326 bytes borestop/webpack/utils.js | 39 + borestop/webpack/webpack.common.js | 114 + borestop/webpack/webpack.dev.js | 125 + borestop/webpack/webpack.prod.js | 154 + 389 files changed, 48492 insertions(+) create mode 100644 borestop/.editorconfig create mode 100644 borestop/.eslintignore create mode 100644 borestop/.eslintrc.json create mode 100644 borestop/.gitattributes create mode 100644 borestop/.gitignore create mode 100644 borestop/.huskyrc create mode 100644 borestop/.lintstagedrc.js create mode 100644 borestop/.mvn/wrapper/MavenWrapperDownloader.java create mode 100644 borestop/.mvn/wrapper/maven-wrapper.jar create mode 100644 borestop/.mvn/wrapper/maven-wrapper.properties create mode 100644 borestop/.prettierignore create mode 100644 borestop/.prettierrc create mode 100644 borestop/.yo-rc.json create mode 100644 borestop/README.md create mode 100644 borestop/angular.json create mode 100644 borestop/checkstyle.xml create mode 100755 borestop/mvnw create mode 100644 borestop/mvnw.cmd create mode 100644 borestop/package-lock.json create mode 100644 borestop/package.json create mode 100644 borestop/pom.xml create mode 100644 borestop/postcss.config.js create mode 100644 borestop/proxy.conf.json create mode 100644 borestop/sonar-project.properties create mode 100644 borestop/src/main/docker/app.yml create mode 100644 borestop/src/main/docker/grafana/provisioning/dashboards/JVM.json create mode 100644 borestop/src/main/docker/grafana/provisioning/dashboards/dashboard.yml create mode 100644 borestop/src/main/docker/grafana/provisioning/datasources/datasource.yml create mode 100644 borestop/src/main/docker/monitoring.yml create mode 100644 borestop/src/main/docker/postgresql.yml create mode 100644 borestop/src/main/docker/prometheus/prometheus.yml create mode 100644 borestop/src/main/docker/sonar.yml create mode 100644 borestop/src/main/java/com/ippon/borestop/ApplicationWebXml.java create mode 100644 borestop/src/main/java/com/ippon/borestop/BorestopApp.java create mode 100644 borestop/src/main/java/com/ippon/borestop/aop/logging/LoggingAspect.java create mode 100644 borestop/src/main/java/com/ippon/borestop/config/ApplicationProperties.java create mode 100644 borestop/src/main/java/com/ippon/borestop/config/AsyncConfiguration.java create mode 100644 borestop/src/main/java/com/ippon/borestop/config/CloudDatabaseConfiguration.java create mode 100644 borestop/src/main/java/com/ippon/borestop/config/Constants.java create mode 100644 borestop/src/main/java/com/ippon/borestop/config/DatabaseConfiguration.java create mode 100644 borestop/src/main/java/com/ippon/borestop/config/DateTimeFormatConfiguration.java create mode 100644 borestop/src/main/java/com/ippon/borestop/config/JacksonConfiguration.java create mode 100644 borestop/src/main/java/com/ippon/borestop/config/LiquibaseConfiguration.java create mode 100644 borestop/src/main/java/com/ippon/borestop/config/LocaleConfiguration.java create mode 100644 borestop/src/main/java/com/ippon/borestop/config/LoggingAspectConfiguration.java create mode 100644 borestop/src/main/java/com/ippon/borestop/config/LoggingConfiguration.java create mode 100644 borestop/src/main/java/com/ippon/borestop/config/SecurityConfiguration.java create mode 100644 borestop/src/main/java/com/ippon/borestop/config/StaticResourcesWebConfiguration.java create mode 100644 borestop/src/main/java/com/ippon/borestop/config/WebConfigurer.java create mode 100644 borestop/src/main/java/com/ippon/borestop/config/audit/AuditEventConverter.java create mode 100644 borestop/src/main/java/com/ippon/borestop/config/audit/package-info.java create mode 100644 borestop/src/main/java/com/ippon/borestop/config/package-info.java create mode 100644 borestop/src/main/java/com/ippon/borestop/domain/AbstractAuditingEntity.java create mode 100644 borestop/src/main/java/com/ippon/borestop/domain/Authority.java create mode 100644 borestop/src/main/java/com/ippon/borestop/domain/PersistentAuditEvent.java create mode 100644 borestop/src/main/java/com/ippon/borestop/domain/User.java create mode 100644 borestop/src/main/java/com/ippon/borestop/domain/package-info.java create mode 100644 borestop/src/main/java/com/ippon/borestop/repository/AuthorityRepository.java create mode 100644 borestop/src/main/java/com/ippon/borestop/repository/CustomAuditEventRepository.java create mode 100644 borestop/src/main/java/com/ippon/borestop/repository/PersistenceAuditEventRepository.java create mode 100644 borestop/src/main/java/com/ippon/borestop/repository/UserRepository.java create mode 100644 borestop/src/main/java/com/ippon/borestop/repository/package-info.java create mode 100644 borestop/src/main/java/com/ippon/borestop/security/AuthoritiesConstants.java create mode 100644 borestop/src/main/java/com/ippon/borestop/security/DomainUserDetailsService.java create mode 100644 borestop/src/main/java/com/ippon/borestop/security/SecurityUtils.java create mode 100644 borestop/src/main/java/com/ippon/borestop/security/SpringSecurityAuditorAware.java create mode 100644 borestop/src/main/java/com/ippon/borestop/security/UserNotActivatedException.java create mode 100644 borestop/src/main/java/com/ippon/borestop/security/jwt/JWTConfigurer.java create mode 100644 borestop/src/main/java/com/ippon/borestop/security/jwt/JWTFilter.java create mode 100644 borestop/src/main/java/com/ippon/borestop/security/jwt/TokenProvider.java create mode 100644 borestop/src/main/java/com/ippon/borestop/security/package-info.java create mode 100644 borestop/src/main/java/com/ippon/borestop/service/AuditEventService.java create mode 100644 borestop/src/main/java/com/ippon/borestop/service/EmailAlreadyUsedException.java create mode 100644 borestop/src/main/java/com/ippon/borestop/service/InvalidPasswordException.java create mode 100644 borestop/src/main/java/com/ippon/borestop/service/MailService.java create mode 100644 borestop/src/main/java/com/ippon/borestop/service/UserService.java create mode 100644 borestop/src/main/java/com/ippon/borestop/service/UsernameAlreadyUsedException.java create mode 100644 borestop/src/main/java/com/ippon/borestop/service/dto/PasswordChangeDTO.java create mode 100644 borestop/src/main/java/com/ippon/borestop/service/dto/UserDTO.java create mode 100644 borestop/src/main/java/com/ippon/borestop/service/dto/package-info.java create mode 100644 borestop/src/main/java/com/ippon/borestop/service/mapper/UserMapper.java create mode 100644 borestop/src/main/java/com/ippon/borestop/service/mapper/package-info.java create mode 100644 borestop/src/main/java/com/ippon/borestop/service/package-info.java create mode 100644 borestop/src/main/java/com/ippon/borestop/web/rest/AccountResource.java create mode 100644 borestop/src/main/java/com/ippon/borestop/web/rest/AuditResource.java create mode 100644 borestop/src/main/java/com/ippon/borestop/web/rest/ClientForwardController.java create mode 100644 borestop/src/main/java/com/ippon/borestop/web/rest/UserJWTController.java create mode 100644 borestop/src/main/java/com/ippon/borestop/web/rest/UserResource.java create mode 100644 borestop/src/main/java/com/ippon/borestop/web/rest/errors/BadRequestAlertException.java create mode 100644 borestop/src/main/java/com/ippon/borestop/web/rest/errors/EmailAlreadyUsedException.java create mode 100644 borestop/src/main/java/com/ippon/borestop/web/rest/errors/ErrorConstants.java create mode 100644 borestop/src/main/java/com/ippon/borestop/web/rest/errors/ExceptionTranslator.java create mode 100644 borestop/src/main/java/com/ippon/borestop/web/rest/errors/FieldErrorVM.java create mode 100644 borestop/src/main/java/com/ippon/borestop/web/rest/errors/InvalidPasswordException.java create mode 100644 borestop/src/main/java/com/ippon/borestop/web/rest/errors/LoginAlreadyUsedException.java create mode 100644 borestop/src/main/java/com/ippon/borestop/web/rest/errors/package-info.java create mode 100644 borestop/src/main/java/com/ippon/borestop/web/rest/package-info.java create mode 100644 borestop/src/main/java/com/ippon/borestop/web/rest/vm/KeyAndPasswordVM.java create mode 100644 borestop/src/main/java/com/ippon/borestop/web/rest/vm/LoginVM.java create mode 100644 borestop/src/main/java/com/ippon/borestop/web/rest/vm/ManagedUserVM.java create mode 100644 borestop/src/main/java/com/ippon/borestop/web/rest/vm/package-info.java create mode 100644 borestop/src/main/jib/entrypoint.sh create mode 100644 borestop/src/main/resources/.h2.server.properties create mode 100644 borestop/src/main/resources/banner.txt create mode 100644 borestop/src/main/resources/config/application-dev.yml create mode 100644 borestop/src/main/resources/config/application-prod.yml create mode 100644 borestop/src/main/resources/config/application-tls.yml create mode 100644 borestop/src/main/resources/config/application.yml create mode 100644 borestop/src/main/resources/config/liquibase/changelog/00000000000000_initial_schema.xml create mode 100644 borestop/src/main/resources/config/liquibase/data/authority.csv create mode 100644 borestop/src/main/resources/config/liquibase/data/user.csv create mode 100644 borestop/src/main/resources/config/liquibase/data/user_authority.csv create mode 100644 borestop/src/main/resources/config/liquibase/master.xml create mode 100644 borestop/src/main/resources/config/tls/keystore.p12 create mode 100644 borestop/src/main/resources/i18n/messages.properties create mode 100644 borestop/src/main/resources/i18n/messages_en.properties create mode 100644 borestop/src/main/resources/logback-spring.xml create mode 100644 borestop/src/main/resources/templates/error.html create mode 100644 borestop/src/main/resources/templates/mail/activationEmail.html create mode 100644 borestop/src/main/resources/templates/mail/creationEmail.html create mode 100644 borestop/src/main/resources/templates/mail/passwordResetEmail.html create mode 100644 borestop/src/main/webapp/404.html create mode 100644 borestop/src/main/webapp/WEB-INF/web.xml create mode 100644 borestop/src/main/webapp/app/account/account.module.ts create mode 100644 borestop/src/main/webapp/app/account/account.route.ts create mode 100644 borestop/src/main/webapp/app/account/activate/activate.component.html create mode 100644 borestop/src/main/webapp/app/account/activate/activate.component.ts create mode 100644 borestop/src/main/webapp/app/account/activate/activate.route.ts create mode 100644 borestop/src/main/webapp/app/account/activate/activate.service.ts create mode 100644 borestop/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.html create mode 100644 borestop/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.ts create mode 100644 borestop/src/main/webapp/app/account/password-reset/finish/password-reset-finish.route.ts create mode 100644 borestop/src/main/webapp/app/account/password-reset/finish/password-reset-finish.service.ts create mode 100644 borestop/src/main/webapp/app/account/password-reset/init/password-reset-init.component.html create mode 100644 borestop/src/main/webapp/app/account/password-reset/init/password-reset-init.component.ts create mode 100644 borestop/src/main/webapp/app/account/password-reset/init/password-reset-init.route.ts create mode 100644 borestop/src/main/webapp/app/account/password-reset/init/password-reset-init.service.ts create mode 100644 borestop/src/main/webapp/app/account/password/password-strength-bar.component.ts create mode 100644 borestop/src/main/webapp/app/account/password/password-strength-bar.scss create mode 100644 borestop/src/main/webapp/app/account/password/password.component.html create mode 100644 borestop/src/main/webapp/app/account/password/password.component.ts create mode 100644 borestop/src/main/webapp/app/account/password/password.route.ts create mode 100644 borestop/src/main/webapp/app/account/password/password.service.ts create mode 100644 borestop/src/main/webapp/app/account/register/register.component.html create mode 100644 borestop/src/main/webapp/app/account/register/register.component.ts create mode 100644 borestop/src/main/webapp/app/account/register/register.route.ts create mode 100644 borestop/src/main/webapp/app/account/register/register.service.ts create mode 100644 borestop/src/main/webapp/app/account/settings/settings.component.html create mode 100644 borestop/src/main/webapp/app/account/settings/settings.component.ts create mode 100644 borestop/src/main/webapp/app/account/settings/settings.route.ts create mode 100644 borestop/src/main/webapp/app/admin/admin-routing.module.ts create mode 100644 borestop/src/main/webapp/app/admin/audits/audit-data.model.ts create mode 100644 borestop/src/main/webapp/app/admin/audits/audit.model.ts create mode 100644 borestop/src/main/webapp/app/admin/audits/audits.component.html create mode 100644 borestop/src/main/webapp/app/admin/audits/audits.component.ts create mode 100644 borestop/src/main/webapp/app/admin/audits/audits.module.ts create mode 100644 borestop/src/main/webapp/app/admin/audits/audits.route.ts create mode 100644 borestop/src/main/webapp/app/admin/audits/audits.service.ts create mode 100644 borestop/src/main/webapp/app/admin/configuration/configuration.component.html create mode 100644 borestop/src/main/webapp/app/admin/configuration/configuration.component.ts create mode 100644 borestop/src/main/webapp/app/admin/configuration/configuration.module.ts create mode 100644 borestop/src/main/webapp/app/admin/configuration/configuration.route.ts create mode 100644 borestop/src/main/webapp/app/admin/configuration/configuration.service.ts create mode 100644 borestop/src/main/webapp/app/admin/docs/docs.component.html create mode 100644 borestop/src/main/webapp/app/admin/docs/docs.component.ts create mode 100644 borestop/src/main/webapp/app/admin/docs/docs.module.ts create mode 100644 borestop/src/main/webapp/app/admin/docs/docs.route.ts create mode 100644 borestop/src/main/webapp/app/admin/docs/docs.scss create mode 100644 borestop/src/main/webapp/app/admin/health/health-modal.component.html create mode 100644 borestop/src/main/webapp/app/admin/health/health-modal.component.ts create mode 100644 borestop/src/main/webapp/app/admin/health/health.component.html create mode 100644 borestop/src/main/webapp/app/admin/health/health.component.ts create mode 100644 borestop/src/main/webapp/app/admin/health/health.module.ts create mode 100644 borestop/src/main/webapp/app/admin/health/health.route.ts create mode 100644 borestop/src/main/webapp/app/admin/health/health.service.ts create mode 100644 borestop/src/main/webapp/app/admin/logs/log.model.ts create mode 100644 borestop/src/main/webapp/app/admin/logs/logs.component.html create mode 100644 borestop/src/main/webapp/app/admin/logs/logs.component.ts create mode 100644 borestop/src/main/webapp/app/admin/logs/logs.module.ts create mode 100644 borestop/src/main/webapp/app/admin/logs/logs.route.ts create mode 100644 borestop/src/main/webapp/app/admin/logs/logs.service.ts create mode 100644 borestop/src/main/webapp/app/admin/metrics/metrics.component.html create mode 100644 borestop/src/main/webapp/app/admin/metrics/metrics.component.ts create mode 100644 borestop/src/main/webapp/app/admin/metrics/metrics.module.ts create mode 100644 borestop/src/main/webapp/app/admin/metrics/metrics.route.ts create mode 100644 borestop/src/main/webapp/app/admin/metrics/metrics.service.ts create mode 100644 borestop/src/main/webapp/app/admin/user-management/user-management-delete-dialog.component.html create mode 100644 borestop/src/main/webapp/app/admin/user-management/user-management-delete-dialog.component.ts create mode 100644 borestop/src/main/webapp/app/admin/user-management/user-management-detail.component.html create mode 100644 borestop/src/main/webapp/app/admin/user-management/user-management-detail.component.ts create mode 100644 borestop/src/main/webapp/app/admin/user-management/user-management-update.component.html create mode 100644 borestop/src/main/webapp/app/admin/user-management/user-management-update.component.ts create mode 100644 borestop/src/main/webapp/app/admin/user-management/user-management.component.html create mode 100644 borestop/src/main/webapp/app/admin/user-management/user-management.component.ts create mode 100644 borestop/src/main/webapp/app/admin/user-management/user-management.module.ts create mode 100644 borestop/src/main/webapp/app/admin/user-management/user-management.route.ts create mode 100644 borestop/src/main/webapp/app/app-routing.module.ts create mode 100644 borestop/src/main/webapp/app/app.constants.ts create mode 100644 borestop/src/main/webapp/app/app.main.ts create mode 100644 borestop/src/main/webapp/app/app.module.ts create mode 100644 borestop/src/main/webapp/app/blocks/config/prod.config.ts create mode 100644 borestop/src/main/webapp/app/blocks/config/uib-pagination.config.ts create mode 100644 borestop/src/main/webapp/app/blocks/interceptor/auth-expired.interceptor.ts create mode 100644 borestop/src/main/webapp/app/blocks/interceptor/auth.interceptor.ts create mode 100644 borestop/src/main/webapp/app/blocks/interceptor/errorhandler.interceptor.ts create mode 100644 borestop/src/main/webapp/app/blocks/interceptor/notification.interceptor.ts create mode 100644 borestop/src/main/webapp/app/core/auth/account.service.ts create mode 100644 borestop/src/main/webapp/app/core/auth/auth-jwt.service.ts create mode 100644 borestop/src/main/webapp/app/core/auth/csrf.service.ts create mode 100644 borestop/src/main/webapp/app/core/auth/state-storage.service.ts create mode 100644 borestop/src/main/webapp/app/core/auth/user-route-access-service.ts create mode 100644 borestop/src/main/webapp/app/core/core.module.ts create mode 100644 borestop/src/main/webapp/app/core/icons/font-awesome-icons.ts create mode 100644 borestop/src/main/webapp/app/core/language/language.constants.ts create mode 100644 borestop/src/main/webapp/app/core/login/login-modal.service.ts create mode 100644 borestop/src/main/webapp/app/core/login/login.model.ts create mode 100644 borestop/src/main/webapp/app/core/login/login.service.ts create mode 100644 borestop/src/main/webapp/app/core/user/account.model.ts create mode 100644 borestop/src/main/webapp/app/core/user/user.model.ts create mode 100644 borestop/src/main/webapp/app/core/user/user.service.ts create mode 100644 borestop/src/main/webapp/app/entities/entity.module.ts create mode 100644 borestop/src/main/webapp/app/home/home.component.html create mode 100644 borestop/src/main/webapp/app/home/home.component.ts create mode 100644 borestop/src/main/webapp/app/home/home.module.ts create mode 100644 borestop/src/main/webapp/app/home/home.route.ts create mode 100644 borestop/src/main/webapp/app/home/home.scss create mode 100644 borestop/src/main/webapp/app/layouts/error/error.component.html create mode 100644 borestop/src/main/webapp/app/layouts/error/error.component.ts create mode 100644 borestop/src/main/webapp/app/layouts/error/error.route.ts create mode 100644 borestop/src/main/webapp/app/layouts/footer/footer.component.html create mode 100644 borestop/src/main/webapp/app/layouts/footer/footer.component.ts create mode 100644 borestop/src/main/webapp/app/layouts/main/main.component.html create mode 100644 borestop/src/main/webapp/app/layouts/main/main.component.ts create mode 100644 borestop/src/main/webapp/app/layouts/navbar/active-menu.directive.ts create mode 100644 borestop/src/main/webapp/app/layouts/navbar/navbar.component.html create mode 100644 borestop/src/main/webapp/app/layouts/navbar/navbar.component.ts create mode 100644 borestop/src/main/webapp/app/layouts/navbar/navbar.route.ts create mode 100644 borestop/src/main/webapp/app/layouts/navbar/navbar.scss create mode 100644 borestop/src/main/webapp/app/layouts/profiles/page-ribbon.component.ts create mode 100644 borestop/src/main/webapp/app/layouts/profiles/page-ribbon.scss create mode 100644 borestop/src/main/webapp/app/layouts/profiles/profile-info.model.ts create mode 100644 borestop/src/main/webapp/app/layouts/profiles/profile.service.ts create mode 100644 borestop/src/main/webapp/app/polyfills.ts create mode 100644 borestop/src/main/webapp/app/shared/alert/alert-error.component.ts create mode 100644 borestop/src/main/webapp/app/shared/alert/alert-error.model.ts create mode 100644 borestop/src/main/webapp/app/shared/alert/alert.component.ts create mode 100644 borestop/src/main/webapp/app/shared/auth/has-any-authority.directive.ts create mode 100644 borestop/src/main/webapp/app/shared/constants/authority.constants.ts create mode 100644 borestop/src/main/webapp/app/shared/constants/error.constants.ts create mode 100644 borestop/src/main/webapp/app/shared/constants/input.constants.ts create mode 100644 borestop/src/main/webapp/app/shared/constants/pagination.constants.ts create mode 100644 borestop/src/main/webapp/app/shared/language/find-language-from-key.pipe.ts create mode 100644 borestop/src/main/webapp/app/shared/login/login.component.html create mode 100644 borestop/src/main/webapp/app/shared/login/login.component.ts create mode 100644 borestop/src/main/webapp/app/shared/shared-libs.module.ts create mode 100644 borestop/src/main/webapp/app/shared/shared.module.ts create mode 100644 borestop/src/main/webapp/app/shared/util/datepicker-adapter.ts create mode 100644 borestop/src/main/webapp/app/shared/util/request-util.ts create mode 100644 borestop/src/main/webapp/app/vendor.ts create mode 100644 borestop/src/main/webapp/content/css/loading.css create mode 100755 borestop/src/main/webapp/content/images/jhipster_family_member_0.svg create mode 100644 borestop/src/main/webapp/content/images/jhipster_family_member_0_head-192.png create mode 100755 borestop/src/main/webapp/content/images/jhipster_family_member_0_head-256.png create mode 100755 borestop/src/main/webapp/content/images/jhipster_family_member_0_head-384.png create mode 100755 borestop/src/main/webapp/content/images/jhipster_family_member_0_head-512.png create mode 100755 borestop/src/main/webapp/content/images/jhipster_family_member_1.svg create mode 100755 borestop/src/main/webapp/content/images/jhipster_family_member_1_head-192.png create mode 100755 borestop/src/main/webapp/content/images/jhipster_family_member_1_head-256.png create mode 100755 borestop/src/main/webapp/content/images/jhipster_family_member_1_head-384.png create mode 100755 borestop/src/main/webapp/content/images/jhipster_family_member_1_head-512.png create mode 100755 borestop/src/main/webapp/content/images/jhipster_family_member_2.svg create mode 100755 borestop/src/main/webapp/content/images/jhipster_family_member_2_head-192.png create mode 100755 borestop/src/main/webapp/content/images/jhipster_family_member_2_head-256.png create mode 100755 borestop/src/main/webapp/content/images/jhipster_family_member_2_head-384.png create mode 100755 borestop/src/main/webapp/content/images/jhipster_family_member_2_head-512.png create mode 100755 borestop/src/main/webapp/content/images/jhipster_family_member_3.svg create mode 100755 borestop/src/main/webapp/content/images/jhipster_family_member_3_head-192.png create mode 100755 borestop/src/main/webapp/content/images/jhipster_family_member_3_head-256.png create mode 100755 borestop/src/main/webapp/content/images/jhipster_family_member_3_head-384.png create mode 100755 borestop/src/main/webapp/content/images/jhipster_family_member_3_head-512.png create mode 100644 borestop/src/main/webapp/content/images/logo-jhipster.png create mode 100644 borestop/src/main/webapp/content/scss/_bootstrap-variables.scss create mode 100644 borestop/src/main/webapp/content/scss/global.scss create mode 100644 borestop/src/main/webapp/content/scss/vendor.scss create mode 100755 borestop/src/main/webapp/favicon.ico create mode 100644 borestop/src/main/webapp/i18n/en/activate.json create mode 100644 borestop/src/main/webapp/i18n/en/audits.json create mode 100644 borestop/src/main/webapp/i18n/en/configuration.json create mode 100644 borestop/src/main/webapp/i18n/en/error.json create mode 100644 borestop/src/main/webapp/i18n/en/global.json create mode 100644 borestop/src/main/webapp/i18n/en/health.json create mode 100644 borestop/src/main/webapp/i18n/en/home.json create mode 100644 borestop/src/main/webapp/i18n/en/login.json create mode 100644 borestop/src/main/webapp/i18n/en/logs.json create mode 100644 borestop/src/main/webapp/i18n/en/metrics.json create mode 100644 borestop/src/main/webapp/i18n/en/password.json create mode 100644 borestop/src/main/webapp/i18n/en/register.json create mode 100644 borestop/src/main/webapp/i18n/en/reset.json create mode 100644 borestop/src/main/webapp/i18n/en/sessions.json create mode 100644 borestop/src/main/webapp/i18n/en/settings.json create mode 100644 borestop/src/main/webapp/i18n/en/user-management.json create mode 100644 borestop/src/main/webapp/index.html create mode 100644 borestop/src/main/webapp/manifest.webapp create mode 100644 borestop/src/main/webapp/robots.txt create mode 100644 borestop/src/main/webapp/swagger-ui/dist/images/throbber.gif create mode 100644 borestop/src/main/webapp/swagger-ui/index.html create mode 100644 borestop/src/test/java/com/ippon/borestop/ArchTest.java create mode 100644 borestop/src/test/java/com/ippon/borestop/config/NoOpMailConfiguration.java create mode 100644 borestop/src/test/java/com/ippon/borestop/config/StaticResourcesWebConfigurerTest.java create mode 100644 borestop/src/test/java/com/ippon/borestop/config/WebConfigurerTest.java create mode 100644 borestop/src/test/java/com/ippon/borestop/config/WebConfigurerTestController.java create mode 100644 borestop/src/test/java/com/ippon/borestop/config/timezone/HibernateTimeZoneIT.java create mode 100644 borestop/src/test/java/com/ippon/borestop/repository/CustomAuditEventRepositoryIT.java create mode 100644 borestop/src/test/java/com/ippon/borestop/repository/timezone/DateTimeWrapper.java create mode 100644 borestop/src/test/java/com/ippon/borestop/repository/timezone/DateTimeWrapperRepository.java create mode 100644 borestop/src/test/java/com/ippon/borestop/security/DomainUserDetailsServiceIT.java create mode 100644 borestop/src/test/java/com/ippon/borestop/security/SecurityUtilsUnitTest.java create mode 100644 borestop/src/test/java/com/ippon/borestop/security/jwt/JWTFilterTest.java create mode 100644 borestop/src/test/java/com/ippon/borestop/security/jwt/TokenProviderTest.java create mode 100644 borestop/src/test/java/com/ippon/borestop/service/AuditEventServiceIT.java create mode 100644 borestop/src/test/java/com/ippon/borestop/service/MailServiceIT.java create mode 100644 borestop/src/test/java/com/ippon/borestop/service/UserServiceIT.java create mode 100644 borestop/src/test/java/com/ippon/borestop/service/mapper/UserMapperTest.java create mode 100644 borestop/src/test/java/com/ippon/borestop/web/rest/AccountResourceIT.java create mode 100644 borestop/src/test/java/com/ippon/borestop/web/rest/AuditResourceIT.java create mode 100644 borestop/src/test/java/com/ippon/borestop/web/rest/ClientForwardControllerTest.java create mode 100644 borestop/src/test/java/com/ippon/borestop/web/rest/TestUtil.java create mode 100644 borestop/src/test/java/com/ippon/borestop/web/rest/UserJWTControllerIT.java create mode 100644 borestop/src/test/java/com/ippon/borestop/web/rest/UserResourceIT.java create mode 100644 borestop/src/test/java/com/ippon/borestop/web/rest/WithUnauthenticatedMockUser.java create mode 100644 borestop/src/test/java/com/ippon/borestop/web/rest/errors/ExceptionTranslatorIT.java create mode 100644 borestop/src/test/java/com/ippon/borestop/web/rest/errors/ExceptionTranslatorTestController.java create mode 100644 borestop/src/test/javascript/jest-global-mocks.ts create mode 100644 borestop/src/test/javascript/jest.conf.js create mode 100644 borestop/src/test/javascript/jest.ts create mode 100644 borestop/src/test/javascript/spec/app/account/activate/activate.component.spec.ts create mode 100644 borestop/src/test/javascript/spec/app/account/password-reset/finish/password-reset-finish.component.spec.ts create mode 100644 borestop/src/test/javascript/spec/app/account/password-reset/init/password-reset-init.component.spec.ts create mode 100644 borestop/src/test/javascript/spec/app/account/password/password-strength-bar.component.spec.ts create mode 100644 borestop/src/test/javascript/spec/app/account/password/password.component.spec.ts create mode 100644 borestop/src/test/javascript/spec/app/account/register/register.component.spec.ts create mode 100644 borestop/src/test/javascript/spec/app/account/settings/settings.component.spec.ts create mode 100644 borestop/src/test/javascript/spec/app/admin/audits/audits.component.spec.ts create mode 100644 borestop/src/test/javascript/spec/app/admin/audits/audits.service.spec.ts create mode 100644 borestop/src/test/javascript/spec/app/admin/configuration/configuration.component.spec.ts create mode 100644 borestop/src/test/javascript/spec/app/admin/configuration/configuration.service.spec.ts create mode 100644 borestop/src/test/javascript/spec/app/admin/health/health.component.spec.ts create mode 100644 borestop/src/test/javascript/spec/app/admin/logs/logs.component.spec.ts create mode 100644 borestop/src/test/javascript/spec/app/admin/logs/logs.service.spec.ts create mode 100644 borestop/src/test/javascript/spec/app/admin/metrics/metrics.component.spec.ts create mode 100644 borestop/src/test/javascript/spec/app/admin/metrics/metrics.service.spec.ts create mode 100644 borestop/src/test/javascript/spec/app/admin/user-management/user-management-delete-dialog.component.spec.ts create mode 100644 borestop/src/test/javascript/spec/app/admin/user-management/user-management-detail.component.spec.ts create mode 100644 borestop/src/test/javascript/spec/app/admin/user-management/user-management-update.component.spec.ts create mode 100644 borestop/src/test/javascript/spec/app/admin/user-management/user-management.component.spec.ts create mode 100644 borestop/src/test/javascript/spec/app/core/login/login-modal.service.spec.ts create mode 100644 borestop/src/test/javascript/spec/app/core/user/account.service.spec.ts create mode 100644 borestop/src/test/javascript/spec/app/core/user/user.service.spec.ts create mode 100644 borestop/src/test/javascript/spec/app/home/home.component.spec.ts create mode 100644 borestop/src/test/javascript/spec/app/layouts/main/main.component.spec.ts create mode 100644 borestop/src/test/javascript/spec/app/layouts/navbar/navbar.component.spec.ts create mode 100644 borestop/src/test/javascript/spec/app/shared/alert/alert-error.component.spec.ts create mode 100644 borestop/src/test/javascript/spec/app/shared/alert/alert.component.spec.ts create mode 100644 borestop/src/test/javascript/spec/app/shared/login/login.component.spec.ts create mode 100644 borestop/src/test/javascript/spec/helpers/mock-account.service.ts create mode 100644 borestop/src/test/javascript/spec/helpers/mock-active-modal.service.ts create mode 100644 borestop/src/test/javascript/spec/helpers/mock-alert.service.ts create mode 100644 borestop/src/test/javascript/spec/helpers/mock-event-manager.service.ts create mode 100644 borestop/src/test/javascript/spec/helpers/mock-language.service.ts create mode 100644 borestop/src/test/javascript/spec/helpers/mock-login-modal.service.ts create mode 100644 borestop/src/test/javascript/spec/helpers/mock-login.service.ts create mode 100644 borestop/src/test/javascript/spec/helpers/mock-route.service.ts create mode 100644 borestop/src/test/javascript/spec/helpers/mock-state-storage.service.ts create mode 100644 borestop/src/test/javascript/spec/helpers/spyobject.ts create mode 100644 borestop/src/test/javascript/spec/test.module.ts create mode 100644 borestop/src/test/resources/config/application-testcontainers.yml create mode 100644 borestop/src/test/resources/config/application.yml create mode 100644 borestop/src/test/resources/i18n/messages_en.properties create mode 100644 borestop/src/test/resources/logback.xml create mode 100644 borestop/src/test/resources/templates/mail/testEmail.html create mode 100644 borestop/tsconfig.app.json create mode 100644 borestop/tsconfig.base.json create mode 100644 borestop/tsconfig.json create mode 100644 borestop/tslint.json create mode 100755 borestop/webpack/logo-jhipster.png create mode 100644 borestop/webpack/utils.js create mode 100644 borestop/webpack/webpack.common.js create mode 100644 borestop/webpack/webpack.dev.js create mode 100644 borestop/webpack/webpack.prod.js diff --git a/borestop/.editorconfig b/borestop/.editorconfig new file mode 100644 index 00000000..04398663 --- /dev/null +++ b/borestop/.editorconfig @@ -0,0 +1,23 @@ +# EditorConfig helps developers define and maintain consistent +# coding styles between different editors and IDEs +# editorconfig.org + +root = true + +[*] + +# We recommend you to keep these unchanged +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +# Change these settings to your own preference +indent_style = space +indent_size = 4 + +[*.{ts,tsx,js,jsx,json,css,scss,yml}] +indent_size = 2 + +[*.md] +trim_trailing_whitespace = false diff --git a/borestop/.eslintignore b/borestop/.eslintignore new file mode 100644 index 00000000..c8d1f557 --- /dev/null +++ b/borestop/.eslintignore @@ -0,0 +1,9 @@ +node_modules/ +src/main/docker/ +src/test/javascript/protractor.conf.js +src/test/javascript/jest.conf.js +webpack/ +target/ +build/ +node/ +postcss.config.js diff --git a/borestop/.eslintrc.json b/borestop/.eslintrc.json new file mode 100644 index 00000000..43c1cf27 --- /dev/null +++ b/borestop/.eslintrc.json @@ -0,0 +1,24 @@ +{ + "plugins": ["@typescript-eslint/tslint"], + "extends": ["jhipster"], + "parserOptions": { + "project": "./tsconfig.base.json" + }, + "rules": { + "@typescript-eslint/tslint/config": [ + "error", + { + "lintFile": "./tslint.json" + } + ], + "@typescript-eslint/no-unused-vars": [ + "warn", + { + "vars": "all", + "args": "after-used", + "ignoreRestSiblings": false + } + ], + "@typescript-eslint/no-non-null-assertion": "off" + } +} diff --git a/borestop/.gitattributes b/borestop/.gitattributes new file mode 100644 index 00000000..ca61722d --- /dev/null +++ b/borestop/.gitattributes @@ -0,0 +1,150 @@ +# This file is inspired by https://github.com/alexkaratarakis/gitattributes +# +# Auto detect text files and perform LF normalization +# http://davidlaing.com/2012/09/19/customise-your-gitattributes-to-become-a-git-ninja/ +* text=auto + +# The above will handle all files NOT found below +# These files are text and should be normalized (Convert crlf => lf) + +*.bat text eol=crlf +*.cmd text eol=crlf +*.ps1 text eol=crlf +*.coffee text +*.css text +*.cql text +*.df text +*.ejs text +*.html text +*.java text +*.js text +*.json text +*.less text +*.properties text +*.sass text +*.scss text +*.sh text eol=lf +*.sql text +*.txt text +*.ts text +*.xml text +*.yaml text +*.yml text + +# Documents +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain +*.markdown text +*.md text +*.adoc text +*.textile text +*.mustache text +*.csv text +*.tab text +*.tsv text +*.txt text +AUTHORS text +CHANGELOG text +CHANGES text +CONTRIBUTING text +COPYING text +copyright text +*COPYRIGHT* text +INSTALL text +license text +LICENSE text +NEWS text +readme text +*README* text +TODO text + +# Graphics +*.png binary +*.jpg binary +*.jpeg binary +*.gif binary +*.tif binary +*.tiff binary +*.ico binary +# SVG treated as an asset (binary) by default. If you want to treat it as text, +# comment-out the following line and uncomment the line after. +*.svg binary +#*.svg text +*.eps binary + +# These files are binary and should be left untouched +# (binary is a macro for -text -diff) +*.class binary +*.jar binary +*.war binary + +## LINTERS +.csslintrc text +.eslintrc text +.jscsrc text +.jshintrc text +.jshintignore text +.stylelintrc text + +## CONFIGS +*.conf text +*.config text +.editorconfig text +.gitattributes text +.gitconfig text +.gitignore text +.htaccess text +*.npmignore text + +## HEROKU +Procfile text +.slugignore text + +## AUDIO +*.kar binary +*.m4a binary +*.mid binary +*.midi binary +*.mp3 binary +*.ogg binary +*.ra binary + +## VIDEO +*.3gpp binary +*.3gp binary +*.as binary +*.asf binary +*.asx binary +*.fla binary +*.flv binary +*.m4v binary +*.mng binary +*.mov binary +*.mp4 binary +*.mpeg binary +*.mpg binary +*.swc binary +*.swf binary +*.webm binary + +## ARCHIVES +*.7z binary +*.gz binary +*.rar binary +*.tar binary +*.zip binary + +## FONTS +*.ttf binary +*.eot binary +*.otf binary +*.woff binary +*.woff2 binary diff --git a/borestop/.gitignore b/borestop/.gitignore new file mode 100644 index 00000000..520491fa --- /dev/null +++ b/borestop/.gitignore @@ -0,0 +1,148 @@ +###################### +# Project Specific +###################### +/src/main/webapp/content/css/main.css +/target/classes/static/** +/src/test/javascript/coverage/ + +###################### +# Node +###################### +/node/ +node_tmp/ +node_modules/ +npm-debug.log.* +/.awcache/* +/.cache-loader/* + +###################### +# SASS +###################### +.sass-cache/ + +###################### +# Eclipse +###################### +*.pydevproject +.project +.metadata +tmp/ +tmp/**/* +*.tmp +*.bak +*.swp +*~.nib +local.properties +.classpath +.settings/ +.loadpath +.factorypath +/src/main/resources/rebel.xml + +# External tool builders +.externalToolBuilders/** + +# Locally stored "Eclipse launch configurations" +*.launch + +# CDT-specific +.cproject + +# PDT-specific +.buildpath + +# STS-specific +/.sts4-cache/* + +###################### +# IntelliJ +###################### +.idea/ +*.iml +*.iws +*.ipr +*.ids +*.orig +classes/ +out/ + +###################### +# Visual Studio Code +###################### +.vscode/ + +###################### +# Maven +###################### +/log/ +/target/ + +###################### +# Gradle +###################### +.gradle/ +/build/ + +###################### +# Package Files +###################### +*.jar +*.war +*.ear +*.db + +###################### +# Windows +###################### +# Windows image file caches +Thumbs.db + +# Folder config file +Desktop.ini + +###################### +# Mac OSX +###################### +.DS_Store +.svn + +# Thumbnails +._* + +# Files that might appear on external disk +.Spotlight-V100 +.Trashes + +###################### +# Directories +###################### +/bin/ +/deploy/ + +###################### +# Logs +###################### +*.log* + +###################### +# Others +###################### +*.class +*.*~ +*~ +.merge_file* + +###################### +# Gradle Wrapper +###################### +!gradle/wrapper/gradle-wrapper.jar + +###################### +# Maven Wrapper +###################### +!.mvn/wrapper/maven-wrapper.jar + +###################### +# ESLint +###################### +.eslintcache diff --git a/borestop/.huskyrc b/borestop/.huskyrc new file mode 100644 index 00000000..4d077c82 --- /dev/null +++ b/borestop/.huskyrc @@ -0,0 +1,5 @@ +{ + "hooks": { + "pre-commit": "lint-staged" + } +} diff --git a/borestop/.lintstagedrc.js b/borestop/.lintstagedrc.js new file mode 100644 index 00000000..00c792a5 --- /dev/null +++ b/borestop/.lintstagedrc.js @@ -0,0 +1,3 @@ +module.exports = { + '{,src/**/}*.{json,md,yml,ts,css,scss}': ['prettier --write', 'git add'] +}; diff --git a/borestop/.mvn/wrapper/MavenWrapperDownloader.java b/borestop/.mvn/wrapper/MavenWrapperDownloader.java new file mode 100644 index 00000000..5a155e2d --- /dev/null +++ b/borestop/.mvn/wrapper/MavenWrapperDownloader.java @@ -0,0 +1,116 @@ +/* + * Copyright 2007-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import java.io.*; +import java.net.*; +import java.nio.channels.*; +import java.util.Properties; + +public class MavenWrapperDownloader { + private static final String WRAPPER_VERSION = "0.5.6"; + + /** + * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. + */ + private static final String DEFAULT_DOWNLOAD_URL = + "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; + + /** + * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to + * use instead of the default one. + */ + private static final String MAVEN_WRAPPER_PROPERTIES_PATH = ".mvn/wrapper/maven-wrapper.properties"; + + /** + * Path where the maven-wrapper.jar will be saved to. + */ + private static final String MAVEN_WRAPPER_JAR_PATH = ".mvn/wrapper/maven-wrapper.jar"; + + /** + * Name of the property which should be used to override the default download url for the wrapper. + */ + private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; + + public static void main(String args[]) { + System.out.println("- Downloader started"); + File baseDirectory = new File(args[0]); + System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); + + // If the maven-wrapper.properties exists, read it and check if it contains a custom + // wrapperUrl parameter. + File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); + String url = DEFAULT_DOWNLOAD_URL; + if (mavenWrapperPropertyFile.exists()) { + FileInputStream mavenWrapperPropertyFileInputStream = null; + try { + mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); + Properties mavenWrapperProperties = new Properties(); + mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); + url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); + } catch (IOException e) { + System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); + } finally { + try { + if (mavenWrapperPropertyFileInputStream != null) { + mavenWrapperPropertyFileInputStream.close(); + } + } catch (IOException e) { + // Ignore ... + } + } + } + System.out.println("- Downloading from: " + url); + + File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); + if (!outputFile.getParentFile().exists()) { + if (!outputFile.getParentFile().mkdirs()) { + System.out.println("- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); + } + } + System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); + try { + downloadFileFromURL(url, outputFile); + System.out.println("Done"); + System.exit(0); + } catch (Throwable e) { + System.out.println("- Error downloading"); + e.printStackTrace(); + System.exit(1); + } + } + + private static void downloadFileFromURL(String urlString, File destination) throws Exception { + if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { + String username = System.getenv("MVNW_USERNAME"); + char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); + Authenticator.setDefault( + new Authenticator() { + + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(username, password); + } + } + ); + } + URL website = new URL(urlString); + ReadableByteChannel rbc; + rbc = Channels.newChannel(website.openStream()); + FileOutputStream fos = new FileOutputStream(destination); + fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); + fos.close(); + rbc.close(); + } +} diff --git a/borestop/.mvn/wrapper/maven-wrapper.jar b/borestop/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..2cc7d4a55c0cd0092912bf49ae38b3a9e3fd0054 GIT binary patch literal 50710 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 EfAhh=DF6Tf literal 0 HcmV?d00001 diff --git a/borestop/.mvn/wrapper/maven-wrapper.properties b/borestop/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 00000000..642d572c --- /dev/null +++ b/borestop/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,2 @@ +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar diff --git a/borestop/.prettierignore b/borestop/.prettierignore new file mode 100644 index 00000000..ab0567f5 --- /dev/null +++ b/borestop/.prettierignore @@ -0,0 +1,8 @@ +node_modules +target +build +package-lock.json +.git +.mvn +gradle +.gradle diff --git a/borestop/.prettierrc b/borestop/.prettierrc new file mode 100644 index 00000000..b7492864 --- /dev/null +++ b/borestop/.prettierrc @@ -0,0 +1,12 @@ +# Prettier configuration + +printWidth: 140 +singleQuote: true +tabWidth: 2 +useTabs: false + +# js and ts rules: +arrowParens: avoid + +# jsx and tsx rules: +jsxBracketSameLine: false diff --git a/borestop/.yo-rc.json b/borestop/.yo-rc.json new file mode 100644 index 00000000..27775c66 --- /dev/null +++ b/borestop/.yo-rc.json @@ -0,0 +1,42 @@ +{ + "generator-jhipster": { + "promptValues": { + "packageName": "com.ippon.borestop", + "nativeLanguage": "en" + }, + "jhipsterVersion": "6.10.1", + "applicationType": "monolith", + "baseName": "borestop", + "packageName": "com.ippon.borestop", + "packageFolder": "com/ippon/borestop", + "serverPort": "8080", + "authenticationType": "jwt", + "cacheProvider": "no", + "websocket": false, + "databaseType": "sql", + "devDatabaseType": "h2Disk", + "prodDatabaseType": "postgresql", + "searchEngine": false, + "messageBroker": false, + "serviceDiscoveryType": false, + "buildTool": "maven", + "enableSwaggerCodegen": false, + "jwtSecretKey": "NzdiMjRkMmMxZDNkMGY2ZWIyYTcxYWNhYzM4YTBiZjMzOWQzZDQyM2VjY2UwOGRlZDVjZTNiOTdkMWMzNWEzZGNkNzg4YTk2ZDFhZWYwMjUxZjU1ZWFiY2U1ZjA2ZDI1MzFiNTJmMTk5NzE2ZmIzMTE0YzMwYTMzODliYzhhY2E=", + "embeddableLaunchScript": false, + "useSass": true, + "clientPackageManager": "npm", + "clientFramework": "angularX", + "clientTheme": "none", + "clientThemeVariant": "", + "creationTimestamp": 1598119629721, + "testFrameworks": [], + "jhiPrefix": "jhi", + "entitySuffix": "", + "dtoSuffix": "DTO", + "otherModules": [], + "enableTranslation": true, + "nativeLanguage": "en", + "languages": ["en"], + "blueprints": [] + } +} diff --git a/borestop/README.md b/borestop/README.md new file mode 100644 index 00000000..884572bd --- /dev/null +++ b/borestop/README.md @@ -0,0 +1,237 @@ +# borestop + +This application was generated using JHipster 6.10.1, you can find documentation and help at [https://www.jhipster.tech/documentation-archive/v6.10.1](https://www.jhipster.tech/documentation-archive/v6.10.1). + +## Development + +Before you can build this project, you must install and configure the following dependencies on your machine: + +1. [Node.js][]: We use Node to run a development web server and build the project. + Depending on your system, you can install Node either from source or as a pre-packaged bundle. + +After installing Node, you should be able to run the following command to install development tools. +You will only need to run this command when dependencies change in [package.json](package.json). + +``` +npm install +``` + +We use npm scripts and [Webpack][] as our build system. + +Run the following commands in two separate terminals to create a blissful development experience where your browser +auto-refreshes when files change on your hard drive. + +``` + +./mvnw + + +npm start +``` + +Npm is also used to manage CSS and JavaScript dependencies used in this application. You can upgrade dependencies by +specifying a newer version in [package.json](package.json). You can also run `npm update` and `npm install` to manage dependencies. +Add the `help` flag on any command to see how you can use it. For example, `npm help update`. + +The `npm run` command will list all of the scripts available to run for this project. + +### PWA Support + +JHipster ships with PWA (Progressive Web App) support, and it's turned off by default. One of the main components of a PWA is a service worker. + +The service worker initialization code is commented out by default. To enable it, uncomment the following code in `src/main/webapp/index.html`: + +```html +<script> + if ('serviceWorker' in navigator) { + navigator.serviceWorker.register('./service-worker.js').then(function() { + console.log('Service Worker Registered'); + }); + } +</script> +``` + +Note: [Workbox](https://developers.google.com/web/tools/workbox/) powers JHipster's service worker. It dynamically generates the `service-worker.js` file. + +### Managing dependencies + +For example, to add [Leaflet][] library as a runtime dependency of your application, you would run following command: + +``` +npm install --save --save-exact leaflet +``` + +To benefit from TypeScript type definitions from [DefinitelyTyped][] repository in development, you would run following command: + +``` +npm install --save-dev --save-exact @types/leaflet +``` + +Then you would import the JS and CSS files specified in library's installation instructions so that [Webpack][] knows about them: +Edit [src/main/webapp/app/vendor.ts](src/main/webapp/app/vendor.ts) file: + +``` +import 'leaflet/dist/leaflet.js'; +``` + +Edit [src/main/webapp/content/scss/vendor.scss](src/main/webapp/content/scss/vendor.scss) file: + +``` +@import '~leaflet/dist/leaflet.css'; +``` + +Note: There are still a few other things remaining to do for Leaflet that we won't detail here. + +For further instructions on how to develop with JHipster, have a look at [Using JHipster in development][]. + +### Using Angular CLI + +You can also use [Angular CLI][] to generate some custom client code. + +For example, the following command: + +``` +ng generate component my-component +``` + +will generate few files: + +``` +create src/main/webapp/app/my-component/my-component.component.html +create src/main/webapp/app/my-component/my-component.component.ts +update src/main/webapp/app/app.module.ts +``` + +## Building for production + +### Packaging as jar + +To build the final jar and optimize the borestop application for production, run: + +``` + +./mvnw -Pprod clean verify + + +``` + +This will concatenate and minify the client CSS and JavaScript files. It will also modify `index.html` so it references these new files. +To ensure everything worked, run: + +``` + +java -jar target/*.jar + + +``` + +Then navigate to [http://localhost:8080](http://localhost:8080) in your browser. + +Refer to [Using JHipster in production][] for more details. + +### Packaging as war + +To package your application as a war in order to deploy it to an application server, run: + +``` + +./mvnw -Pprod,war clean verify + + +``` + +## Testing + +To launch your application's tests, run: + +``` +./mvnw verify +``` + +### Client tests + +Unit tests are run by [Jest][] and written with [Jasmine][]. They're located in [src/test/javascript/](src/test/javascript/) and can be run with: + +``` +npm test +``` + +For more information, refer to the [Running tests page][]. + +### Code quality + +Sonar is used to analyse code quality. You can start a local Sonar server (accessible on http://localhost:9001) with: + +``` +docker-compose -f src/main/docker/sonar.yml up -d +``` + +You can run a Sonar analysis with using the [sonar-scanner](https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner) or by using the maven plugin. + +Then, run a Sonar analysis: + +``` +./mvnw -Pprod clean verify sonar:sonar +``` + +If you need to re-run the Sonar phase, please be sure to specify at least the `initialize` phase since Sonar properties are loaded from the sonar-project.properties file. + +``` +./mvnw initialize sonar:sonar +``` + +For more information, refer to the [Code quality page][]. + +## Using Docker to simplify development (optional) + +You can use Docker to improve your JHipster development experience. A number of docker-compose configuration are available in the [src/main/docker](src/main/docker) folder to launch required third party services. + +For example, to start a postgresql database in a docker container, run: + +``` +docker-compose -f src/main/docker/postgresql.yml up -d +``` + +To stop it and remove the container, run: + +``` +docker-compose -f src/main/docker/postgresql.yml down +``` + +You can also fully dockerize your application and all the services that it depends on. +To achieve this, first build a docker image of your app by running: + +``` +./mvnw -Pprod verify jib:dockerBuild +``` + +Then run: + +``` +docker-compose -f src/main/docker/app.yml up -d +``` + +For more information refer to [Using Docker and Docker-Compose][], this page also contains information on the docker-compose sub-generator (`jhipster docker-compose`), which is able to generate docker configurations for one or several JHipster applications. + +## Continuous Integration (optional) + +To configure CI for your project, run the ci-cd sub-generator (`jhipster ci-cd`), this will let you generate configuration files for a number of Continuous Integration systems. Consult the [Setting up Continuous Integration][] page for more information. + +[jhipster homepage and latest documentation]: https://www.jhipster.tech +[jhipster 6.10.1 archive]: https://www.jhipster.tech/documentation-archive/v6.10.1 +[using jhipster in development]: https://www.jhipster.tech/documentation-archive/v6.10.1/development/ +[using docker and docker-compose]: https://www.jhipster.tech/documentation-archive/v6.10.1/docker-compose +[using jhipster in production]: https://www.jhipster.tech/documentation-archive/v6.10.1/production/ +[running tests page]: https://www.jhipster.tech/documentation-archive/v6.10.1/running-tests/ +[code quality page]: https://www.jhipster.tech/documentation-archive/v6.10.1/code-quality/ +[setting up continuous integration]: https://www.jhipster.tech/documentation-archive/v6.10.1/setting-up-ci/ +[node.js]: https://nodejs.org/ +[yarn]: https://yarnpkg.org/ +[webpack]: https://webpack.github.io/ +[angular cli]: https://cli.angular.io/ +[browsersync]: https://www.browsersync.io/ +[jest]: https://facebook.github.io/jest/ +[jasmine]: https://jasmine.github.io/2.0/introduction.html +[protractor]: https://angular.github.io/protractor/ +[leaflet]: https://leafletjs.com/ +[definitelytyped]: https://definitelytyped.org/ diff --git a/borestop/angular.json b/borestop/angular.json new file mode 100644 index 00000000..fe079645 --- /dev/null +++ b/borestop/angular.json @@ -0,0 +1,36 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "borestop": { + "root": "", + "sourceRoot": "src/main/webapp", + "projectType": "application", + "schematics": { + "@schematics/angular:component": { + "skipTests": true, + "style": "scss" + }, + "@schematics/angular:directive": { + "skipTests": true + }, + "@schematics/angular:guard": { + "skipTests": true + }, + "@schematics/angular:pipe": { + "skipTests": true + }, + "@schematics/angular:service": { + "skipTests": true + } + }, + "prefix": "jhi", + "architect": {} + } + }, + "defaultProject": "borestop", + "cli": { + "packageManager": "npm" + } +} diff --git a/borestop/checkstyle.xml b/borestop/checkstyle.xml new file mode 100644 index 00000000..6e3dbafe --- /dev/null +++ b/borestop/checkstyle.xml @@ -0,0 +1,21 @@ +<?xml version="1.0"?> +<!DOCTYPE module PUBLIC "-//Puppy Crawl//DTD Check Configuration 1.3//EN" + "https://www.puppycrawl.com/dtds/configuration_1_3.dtd"> +<module name="Checker"> + + <!-- Configure checker to use UTF-8 encoding --> + <property name="charset" value="UTF-8"/> + <!-- Configure checker to run on files with these extensions --> + <property name="fileExtensions" value=""/> + <!-- For detailed checkstyle configuration, see https://github.com/spring-io/nohttp/tree/master/nohttp-checkstyle --> + <module name="io.spring.nohttp.checkstyle.check.NoHttpCheck"> + <property name="whitelist" value="http://maven.apache.org/POM/4.0.0 + http://www.w3.org/2001/XMLSchema-instance http://maven.apache.org/maven-v4_0_0.xsd"/> + </module> + <!-- Allow suppression with comments + // CHECKSTYLE:OFF + ... ignored content ... + // CHECKSTYLE:ON + --> + <module name="SuppressWithPlainTextCommentFilter"/> +</module> diff --git a/borestop/mvnw b/borestop/mvnw new file mode 100755 index 00000000..41c0f0c2 --- /dev/null +++ b/borestop/mvnw @@ -0,0 +1,310 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/borestop/mvnw.cmd b/borestop/mvnw.cmd new file mode 100644 index 00000000..86115719 --- /dev/null +++ b/borestop/mvnw.cmd @@ -0,0 +1,182 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + +FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/borestop/package-lock.json b/borestop/package-lock.json new file mode 100644 index 00000000..a9e29e4a --- /dev/null +++ b/borestop/package-lock.json @@ -0,0 +1,23954 @@ +{ + "name": "borestop", + "version": "0.0.1-SNAPSHOT", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@angular-devkit/architect": { + "version": "0.1000.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1000.0.tgz", + "integrity": "sha512-luzBYe7t994ebq6xIfYJudxOkMBO0bywafk6sQqb+bOaBQAran4orF1R/zEx6f8TJzEoXELjUvxm/ePSqZdpKg==", + "dev": true, + "requires": { + "@angular-devkit/core": "10.0.0", + "rxjs": "6.5.5" + } + }, + "@angular-devkit/core": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.0.0.tgz", + "integrity": "sha512-IvX9IMaCjDkN9vDVnYcgWbSBinlUUb7jdFhDGeTtK6rGSnjX1GoLvWneVI2hoccS07fPbnfMoYXBoZLwVxiIxw==", + "dev": true, + "requires": { + "ajv": "6.12.2", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.5.5", + "source-map": "0.7.3" + }, + "dependencies": { + "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 + } + } + }, + "@angular-devkit/schematics": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-10.0.0.tgz", + "integrity": "sha512-FJ/dY18M+cnAT9RkVjVRJ0PMFZci3ok0WoOosW25Fk68jwNSbGCeF8k8NcD6YE60+CfF4/0LxQWgFagr/wdEhw==", + "dev": true, + "requires": { + "@angular-devkit/core": "10.0.0", + "ora": "4.0.4", + "rxjs": "6.5.5" + } + }, + "@angular/cli": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-10.0.0.tgz", + "integrity": "sha512-I+2cltQCmThgrnHwsG5AX0hQ9z6rK/8ysRWWeiJXHtEtqupW9eNzXX1QfXWxWB3o6oIKgijvnLlp04BUlWCyXA==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.1000.0", + "@angular-devkit/core": "10.0.0", + "@angular-devkit/schematics": "10.0.0", + "@schematics/angular": "10.0.0", + "@schematics/update": "0.1000.0", + "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.1", + "debug": "4.1.1", + "ini": "1.3.5", + "inquirer": "7.1.0", + "npm-package-arg": "8.0.1", + "npm-pick-manifest": "6.1.0", + "open": "7.0.4", + "pacote": "9.5.12", + "read-package-tree": "5.3.1", + "rimraf": "3.0.2", + "semver": "7.3.2", + "symbol-observable": "1.2.0", + "universal-analytics": "0.4.20", + "uuid": "8.1.0" + }, + "dependencies": { + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + } + } + }, + "@angular/common": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-10.0.0.tgz", + "integrity": "sha512-zaLHMRQqjZyoIc15tLGrwg5ugcVlggqATiMlMVNo9ddqxwpZ4qHK2fdAvqQy9FfWKaPGi6NpIBSR31RGV0ircw==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@angular/compiler": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-10.0.0.tgz", + "integrity": "sha512-meyJKPLLhkgjxF4dvdJq/sw7MI7KvpgYADoFt2K/5dt48ExXRj+kDlyQC6FAwm9mbgSea/A+JpDG8HMPU7AK5Q==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@angular/compiler-cli": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-10.0.0.tgz", + "integrity": "sha512-KusRkS1NKPrjhj3BXoxRgeejuJVy/ra4dcDV3hpscRmR8FSdim3rs2H+lYK2hZ26ISGsYUvC8cHNaMqP2U3X+g==", + "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", + "tslib": "^2.0.0", + "yargs": "15.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 + }, + "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 + } + } + }, + "@angular/core": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-10.0.0.tgz", + "integrity": "sha512-N1m6op428ktgcsnXqqspb1xGZ9gp664Jmb4JoVajCD3JXucRfidw+vt3kPOldbWA6M4pIu5ZtZY3IZc2GrK5UQ==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@angular/forms": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-10.0.0.tgz", + "integrity": "sha512-Jaqs6WmF3fcaL1mKmeZt8pcFHkMuFvgLjbgGFqiOKcdz4UdGTcYkI3mE+UqHpqqXGXYTHLusup8A4TqD7s0rxg==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@angular/localize": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-10.0.0.tgz", + "integrity": "sha512-UWuuJYVYDwMGKu8wQuyKH2v0Qbb9HW5n/3tIuw5s0O9yDlhyreueWqCYk42u51p8YDQ7FY7ToZhbMq73G7A8tA==", + "requires": { + "@babel/core": "7.8.3", + "glob": "7.1.2", + "yargs": "15.3.0" + } + }, + "@angular/platform-browser": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-10.0.0.tgz", + "integrity": "sha512-2gp53WjGUrL1uReewU21IZJa4KFpbigCyDYB0j/KwTkIGrdwYCOjD0/04oHYjkpazPe/VIu3aN7Gb3PgUa3X/Q==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@angular/platform-browser-dynamic": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-10.0.0.tgz", + "integrity": "sha512-Ol9dMU/UB8PZ1xQkcILmANC+tA1Y/6YeYc8+MYnZUH7uAMXV6kscg9C5fK9JixSldOOS05AQZAdEty9ESjFNNg==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@angular/router": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-10.0.0.tgz", + "integrity": "sha512-rx9e0eOwXypV/oWLrGsug3wx9lPnD6NUU3i20/VG9O1uMHgXfpnP8RJLcUHqmEMBZEYTLMo59fDE5LEgM1sIFg==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@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==", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/compat-data": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.11.0.tgz", + "integrity": "sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==", + "dev": true, + "requires": { + "browserslist": "^4.12.0", + "invariant": "^2.2.4", + "semver": "^5.5.0" + } + }, + "@babel/core": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.3.tgz", + "integrity": "sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA==", + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.3", + "@babel/helpers": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.0", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "@babel/generator": { + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.4.tgz", + "integrity": "sha512-Rn26vueFx0eOoz7iifCN2UHT6rGtnkSGWSoDRIy8jZN3B91PzeSULbswfLoOWuTuAcNwpG/mxy+uCTDnZ9Mp1g==", + "requires": { + "@babel/types": "^7.11.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@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-compilation-targets": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz", + "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.10.4", + "browserslist": "^4.12.0", + "invariant": "^2.2.4", + "levenary": "^1.1.1", + "semver": "^5.5.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz", + "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.10.5", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", + "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-regex": "^7.10.4", + "regexpu-core": "^4.7.0" + } + }, + "@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.11.4", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.11.4.tgz", + "integrity": "sha512-ux9hm3zR4WV1Y3xXxXkdG/0gxF9nvI0YVmKVhvK9AfMoaQkemL3sJpXw+Xbz65azo8qJiEz2XVDUpK3KYhH3ZQ==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@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==", + "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==", + "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.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", + "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-module-transforms": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", + "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/template": "^7.10.4", + "@babel/types": "^7.11.0", + "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.11.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz", + "integrity": "sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-wrap-function": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-replace-supers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", + "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-simple-access": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", + "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", + "dev": true, + "requires": { + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz", + "integrity": "sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@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==", + "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==" + }, + "@babel/helper-wrap-function": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", + "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helpers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", + "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", + "requires": { + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz", + "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA==" + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz", + "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.10.4", + "@babel/plugin-syntax-async-generators": "^7.8.0" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz", + "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz", + "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz", + "integrity": "sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz", + "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.0" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz", + "integrity": "sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", + "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz", + "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz", + "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.10.4" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz", + "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz", + "integrity": "sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz", + "integrity": "sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz", + "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@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-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.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", + "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@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.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz", + "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", + "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz", + "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.10.4" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz", + "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz", + "integrity": "sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz", + "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-define-map": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz", + "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz", + "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz", + "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz", + "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz", + "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", + "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz", + "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz", + "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz", + "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz", + "integrity": "sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.10.5", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz", + "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz", + "integrity": "sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.10.4", + "@babel/helper-module-transforms": "^7.10.5", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz", + "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz", + "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz", + "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz", + "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz", + "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz", + "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz", + "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz", + "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz", + "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz", + "integrity": "sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz", + "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-regex": "^7.10.4" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz", + "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz", + "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz", + "integrity": "sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz", + "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/preset-env": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.0.tgz", + "integrity": "sha512-2u1/k7rG/gTh02dylX2kL3S0IJNF+J6bfDSp4DI2Ma8QN6Y9x9pmAax59fsCk6QUQG0yqH47yJWA+u1I1LccAg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.11.0", + "@babel/helper-compilation-targets": "^7.10.4", + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-proposal-async-generator-functions": "^7.10.4", + "@babel/plugin-proposal-class-properties": "^7.10.4", + "@babel/plugin-proposal-dynamic-import": "^7.10.4", + "@babel/plugin-proposal-export-namespace-from": "^7.10.4", + "@babel/plugin-proposal-json-strings": "^7.10.4", + "@babel/plugin-proposal-logical-assignment-operators": "^7.11.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", + "@babel/plugin-proposal-numeric-separator": "^7.10.4", + "@babel/plugin-proposal-object-rest-spread": "^7.11.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.10.4", + "@babel/plugin-proposal-optional-chaining": "^7.11.0", + "@babel/plugin-proposal-private-methods": "^7.10.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.10.4", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-class-properties": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.10.4", + "@babel/plugin-transform-arrow-functions": "^7.10.4", + "@babel/plugin-transform-async-to-generator": "^7.10.4", + "@babel/plugin-transform-block-scoped-functions": "^7.10.4", + "@babel/plugin-transform-block-scoping": "^7.10.4", + "@babel/plugin-transform-classes": "^7.10.4", + "@babel/plugin-transform-computed-properties": "^7.10.4", + "@babel/plugin-transform-destructuring": "^7.10.4", + "@babel/plugin-transform-dotall-regex": "^7.10.4", + "@babel/plugin-transform-duplicate-keys": "^7.10.4", + "@babel/plugin-transform-exponentiation-operator": "^7.10.4", + "@babel/plugin-transform-for-of": "^7.10.4", + "@babel/plugin-transform-function-name": "^7.10.4", + "@babel/plugin-transform-literals": "^7.10.4", + "@babel/plugin-transform-member-expression-literals": "^7.10.4", + "@babel/plugin-transform-modules-amd": "^7.10.4", + "@babel/plugin-transform-modules-commonjs": "^7.10.4", + "@babel/plugin-transform-modules-systemjs": "^7.10.4", + "@babel/plugin-transform-modules-umd": "^7.10.4", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4", + "@babel/plugin-transform-new-target": "^7.10.4", + "@babel/plugin-transform-object-super": "^7.10.4", + "@babel/plugin-transform-parameters": "^7.10.4", + "@babel/plugin-transform-property-literals": "^7.10.4", + "@babel/plugin-transform-regenerator": "^7.10.4", + "@babel/plugin-transform-reserved-words": "^7.10.4", + "@babel/plugin-transform-shorthand-properties": "^7.10.4", + "@babel/plugin-transform-spread": "^7.11.0", + "@babel/plugin-transform-sticky-regex": "^7.10.4", + "@babel/plugin-transform-template-literals": "^7.10.4", + "@babel/plugin-transform-typeof-symbol": "^7.10.4", + "@babel/plugin-transform-unicode-escapes": "^7.10.4", + "@babel/plugin-transform-unicode-regex": "^7.10.4", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.11.0", + "browserslist": "^4.12.0", + "core-js-compat": "^3.6.2", + "invariant": "^2.2.2", + "levenary": "^1.1.1", + "semver": "^5.5.0" + } + }, + "@babel/preset-modules": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz", + "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/runtime": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", + "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.0", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.11.0", + "@babel/types": "^7.11.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "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" + } + }, + "@fortawesome/angular-fontawesome": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@fortawesome/angular-fontawesome/-/angular-fontawesome-0.6.1.tgz", + "integrity": "sha512-ARQjtRuT+ZskzJDJKPwuiGO3+7nS0iyNLU/uHVJHfG4LwGJxwVIGldwg1SU957sra0Z0OtWEajHMhiS4vB9LwQ==" + }, + "@fortawesome/fontawesome-common-types": { + "version": "0.2.30", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.30.tgz", + "integrity": "sha512-TsRwpTuKwFNiPhk1UfKgw7zNPeV5RhNp2Uw3pws+9gDAkPGKrtjR1y2lI3SYn7+YzyfuNknflpBA1LRKjt7hMg==" + }, + "@fortawesome/fontawesome-svg-core": { + "version": "1.2.29", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.29.tgz", + "integrity": "sha512-xmPmP2t8qrdo8RyKihTkGb09RnZoc+7HFBCnr0/6ZhStdGDSLeEd7ajV181+2W29NWIFfylO13rU+s3fpy3cnA==", + "requires": { + "@fortawesome/fontawesome-common-types": "^0.2.29" + } + }, + "@fortawesome/free-solid-svg-icons": { + "version": "5.13.1", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.13.1.tgz", + "integrity": "sha512-LQH/0L1p4+rqtoSHa9qFYR84hpuRZKqaQ41cfBQx8b68p21zoWSekTAeA54I/2x9VlCHDLFlG74Nmdg4iTPQOg==", + "requires": { + "@fortawesome/fontawesome-common-types": "^0.2.29" + } + }, + "@hapi/address": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", + "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==", + "dev": true + }, + "@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==", + "dev": true + }, + "@hapi/hoek": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", + "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", + "dev": true + }, + "@hapi/joi": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", + "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", + "dev": true, + "requires": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" + } + }, + "@hapi/topo": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "dev": true, + "requires": { + "@hapi/hoek": "^8.3.0" + } + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "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.3.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.3.0.tgz", + "integrity": "sha512-/5Pn6sJev0nPUcAdpJHMVIsA8sKizL2ZkcKPE5+dJrCccks7tcM7c9wbgHudBJbxXLoTbqsHkG1Dofoem4F09w==", + "dev": true, + "requires": { + "@jest/types": "^26.3.0", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^26.3.0", + "jest-util": "^26.3.0", + "slash": "^3.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "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" + } + }, + "@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": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/core": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.4.2.tgz", + "integrity": "sha512-sDva7YkeNprxJfepOctzS8cAk9TOekldh+5FhVuXS40+94SHbiicRO1VV2tSoRtgIo+POs/Cdyf8p76vPTd6dg==", + "dev": true, + "requires": { + "@jest/console": "^26.3.0", + "@jest/reporters": "^26.4.1", + "@jest/test-result": "^26.3.0", + "@jest/transform": "^26.3.0", + "@jest/types": "^26.3.0", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^26.3.0", + "jest-config": "^26.4.2", + "jest-haste-map": "^26.3.0", + "jest-message-util": "^26.3.0", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.4.0", + "jest-resolve-dependencies": "^26.4.2", + "jest-runner": "^26.4.2", + "jest-runtime": "^26.4.2", + "jest-snapshot": "^26.4.2", + "jest-util": "^26.3.0", + "jest-validate": "^26.4.2", + "jest-watcher": "^26.3.0", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "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" + } + }, + "@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": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "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" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/environment": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.3.0.tgz", + "integrity": "sha512-EW+MFEo0DGHahf83RAaiqQx688qpXgl99wdb8Fy67ybyzHwR1a58LHcO376xQJHfmoXTu89M09dH3J509cx2AA==", + "dev": true, + "requires": { + "@jest/fake-timers": "^26.3.0", + "@jest/types": "^26.3.0", + "@types/node": "*", + "jest-mock": "^26.3.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "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" + } + }, + "@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": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/fake-timers": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.3.0.tgz", + "integrity": "sha512-ZL9ytUiRwVP8ujfRepffokBvD2KbxbqMhrXSBhSdAhISCw3gOkuntisiSFv+A6HN0n0fF4cxzICEKZENLmW+1A==", + "dev": true, + "requires": { + "@jest/types": "^26.3.0", + "@sinonjs/fake-timers": "^6.0.1", + "@types/node": "*", + "jest-message-util": "^26.3.0", + "jest-mock": "^26.3.0", + "jest-util": "^26.3.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "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" + } + }, + "@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": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/globals": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.4.2.tgz", + "integrity": "sha512-Ot5ouAlehhHLRhc+sDz2/9bmNv9p5ZWZ9LE1pXGGTCXBasmi5jnYjlgYcYt03FBwLmZXCZ7GrL29c33/XRQiow==", + "dev": true, + "requires": { + "@jest/environment": "^26.3.0", + "@jest/types": "^26.3.0", + "expect": "^26.4.2" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "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" + } + }, + "@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": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/reporters": { + "version": "26.4.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.4.1.tgz", + "integrity": "sha512-aROTkCLU8++yiRGVxLsuDmZsQEKO6LprlrxtAuzvtpbIFl3eIjgIf3EUxDKgomkS25R9ZzwGEdB5weCcBZlrpQ==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^26.3.0", + "@jest/test-result": "^26.3.0", + "@jest/transform": "^26.3.0", + "@jest/types": "^26.3.0", + "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.3.0", + "jest-resolve": "^26.4.0", + "jest-util": "^26.3.0", + "jest-worker": "^26.3.0", + "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": "^5.0.1" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "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" + } + }, + "@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": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "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.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/source-map": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.3.0.tgz", + "integrity": "sha512-hWX5IHmMDWe1kyrKl7IhFwqOuAreIwHhbe44+XH2ZRHjrKIh0LO5eLQ/vxHFeAfRwJapmxuqlGAEYLadDq6ZGQ==", + "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.3.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.3.0.tgz", + "integrity": "sha512-a8rbLqzW/q7HWheFVMtghXV79Xk+GWwOK1FrtimpI5n1la2SY0qHri3/b0/1F0Ve0/yJmV8pEhxDfVwiUBGtgg==", + "dev": true, + "requires": { + "@jest/console": "^26.3.0", + "@jest/types": "^26.3.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "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" + } + }, + "@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": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/test-sequencer": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.4.2.tgz", + "integrity": "sha512-83DRD8N3M0tOhz9h0bn6Kl6dSp+US6DazuVF8J9m21WAp5x7CqSMaNycMP0aemC/SH/pDQQddbsfHRTBXVUgog==", + "dev": true, + "requires": { + "@jest/test-result": "^26.3.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.3.0", + "jest-runner": "^26.4.2", + "jest-runtime": "^26.4.2" + } + }, + "@jest/transform": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.3.0.tgz", + "integrity": "sha512-Isj6NB68QorGoFWvcOjlUhpkT56PqNIsXKR7XfvoDlCANn/IANlh8DrKAA2l2JKC3yWSMH5wS0GwuQM20w3b2A==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^26.3.0", + "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.3.0", + "jest-regex-util": "^26.0.0", + "jest-util": "^26.3.0", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "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" + } + }, + "@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": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "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" + } + }, + "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.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/types": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "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" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dev": true, + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, + "@ng-bootstrap/ng-bootstrap": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-6.1.0.tgz", + "integrity": "sha512-2GzkNJBKdeHkaUqaCAqSILPft0IzzHjMfAlAuGY6/ZLlVQ0glt5MTbIXtIhSbjR+OvlrljoXFLrvzs1LGdmE+A==" + }, + "@ngtools/webpack": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-10.0.0.tgz", + "integrity": "sha512-2mnuzkCokn84PrBIiSwUqZImd5uKdsdZcpnuvgABmbxe3bAPxbOgzud/bLxG1/ynLvk/vd/FCNeDcY6HylB8OQ==", + "dev": true, + "requires": { + "@angular-devkit/core": "10.0.0", + "enhanced-resolve": "4.1.1", + "rxjs": "6.5.5", + "webpack-sources": "1.4.3" + } + }, + "@ngx-translate/core": { + "version": "12.1.2", + "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-12.1.2.tgz", + "integrity": "sha512-ZudJsqIxTKlLmPoqK8gJY3UpMGujR0Xm7HfXL6AR79yGRS23QqpjAhMfx4v5qUCcHMmQ9/78bW8QJLfp31c7vQ==" + }, + "@ngx-translate/http-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@ngx-translate/http-loader/-/http-loader-5.0.0.tgz", + "integrity": "sha512-8+aV7N52qed+6t4LIu4Yru/PkeBX4TR2ioXGwXzQE5syqSLTj/8TgKQIi3i2Z61ZhPxQG1qrGbapUoGQzUDVeg==" + }, + "@nodelib/fs.scandir": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.3", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" + } + }, + "@npmcli/move-file": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.0.1.tgz", + "integrity": "sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + } + } + }, + "@openapitools/openapi-generator-cli": { + "version": "1.0.13-4.3.1", + "resolved": "https://registry.npmjs.org/@openapitools/openapi-generator-cli/-/openapi-generator-cli-1.0.13-4.3.1.tgz", + "integrity": "sha512-hUbSHCXak8vujMpTgH5dDACq0mynya37xgPFD3JbmnwRrPrgrZ4mr3+w7QZJ5aLMCIfb2j3s96d1sWaOZYZzxA==", + "dev": true + }, + "@rollup/plugin-node-resolve": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz", + "integrity": "sha512-RxtSL3XmdTAE2byxekYLnx+98kEUOrPHF/KRVjLH+DEIHy6kjIw7YINQzn+NXiH/NTrQLAwYs0GWB+csWygA9Q==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.0.8", + "@types/resolve": "0.0.8", + "builtin-modules": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.14.2" + }, + "dependencies": { + "builtin-modules": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", + "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==", + "dev": true + } + } + }, + "@rollup/plugin-replace": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.3.3.tgz", + "integrity": "sha512-XPmVXZ7IlaoWaJLkSCDaa0Y6uVo5XQYHhiMFzOd5qSv5rE+t/UJToPIOE56flKIxBFQI27ONsxb7dqHnwSsjKQ==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.0.8", + "magic-string": "^0.25.5" + } + }, + "@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "requires": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + } + }, + "@samverschueren/stream-to-observable": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.1.tgz", + "integrity": "sha512-c/qwwcHyafOQuVQJj0IlBjf5yYgBI7YPJ77k4fOJYesb41jio65eaJODRUmfYKhTOFBrIZ66kgvGPlNbjuoRdQ==", + "dev": true, + "requires": { + "any-observable": "^0.3.0" + } + }, + "@scarf/scarf": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-0.1.5.tgz", + "integrity": "sha512-Fx6atDc7JM1r0WkPCDhNetVZNp+DO21q/HGlomAKBG+k8vb1B8fg8Yige4oCf1P9OWTZWm5tM5i3jlXhrSbNOg==" + }, + "@schematics/angular": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-10.0.0.tgz", + "integrity": "sha512-m7Pxz4guAMbe7NASKCPUNxvUX/LeieDjGsXwIt09tVE4dEi9yqJP5zq8kOnZEiLKKflP7GoB65RNex4dTxsydw==", + "dev": true, + "requires": { + "@angular-devkit/core": "10.0.0", + "@angular-devkit/schematics": "10.0.0" + } + }, + "@schematics/update": { + "version": "0.1000.0", + "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.1000.0.tgz", + "integrity": "sha512-snjz7sQCOn4Xi66XQREXZx9K6R/vAnUfdyO5nXekls8+E+MIowlP+gqHM0whi8qJDwCLd9maYmeVsD6XZaGImQ==", + "dev": true, + "requires": { + "@angular-devkit/core": "10.0.0", + "@angular-devkit/schematics": "10.0.0", + "@yarnpkg/lockfile": "1.1.0", + "ini": "1.3.5", + "npm-package-arg": "^8.0.0", + "pacote": "9.5.12", + "rxjs": "6.5.5", + "semver": "7.3.2", + "semver-intersect": "1.4.0" + }, + "dependencies": { + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + } + } + }, + "@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" + } + }, + "@surma/rollup-plugin-off-main-thread": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-1.4.1.tgz", + "integrity": "sha512-ZPBWYQDdO4JZiTmTP3DABsHhIPA7bEJk9Znk7tZsrbPGanoGo8YxMv//WLx5Cvb+lRgS42+6yiOIYYHCKDmkpQ==", + "dev": true, + "requires": { + "ejs": "^2.6.1", + "magic-string": "^0.25.0" + }, + "dependencies": { + "ejs": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", + "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", + "dev": true + } + } + }, + "@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.9", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.9.tgz", + "integrity": "sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw==", + "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.1", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz", + "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", + "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.13.tgz", + "integrity": "sha512-i+zS7t6/s9cdQvbqKDARrcbrPvtJGlbYsMkazo03nTAK3RX9FNrLllXys22uiTGJapPOTZTQ35nHh4ISph4SLQ==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" + }, + "@types/concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-OU2+C7X+5Gs42JZzXoto7yOQ0A0=", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", + "dev": true + }, + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha1-yayFsqX9GENbjIXZ7LUObWyJP/g=", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@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/graceful-fs": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.3.tgz", + "integrity": "sha512-AiHRaEB50LQg0pZmm659vNBb9f4SJ0qrAnteuzhSeAUcJKxoYgEnprg/83kppCnc2zvtCKbdZry1a5pVY3lOTQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/html-minifier-terser": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.0.tgz", + "integrity": "sha512-iYCgjm1dGPRuo12+BStjd1HiVQqhlRhWDOQigNxn023HcjnhsiFz9pc6CzJj4HwDCSQca9bxTL4PxJDbkdm3PA==", + "dev": true + }, + "@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": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "26.0.3", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.3.tgz", + "integrity": "sha512-v89ga1clpVL/Y1+YI0eIu1VMW+KU7Xl8PhylVtDKVWaSUHBHYPLXMQGBdrpHewaKoTvlXkksbYqPgz8b4cmRZg==", + "dev": true, + "requires": { + "jest-diff": "^25.2.1", + "pretty-format": "^25.2.1" + } + }, + "@types/json-schema": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", + "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=", + "dev": true + }, + "@types/node": { + "version": "13.13.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.4.tgz", + "integrity": "sha512-x26ur3dSXgv5AwKS0lNfbjpCakGIduWU1DU91Zz58ONRWrIKGunmZBNv4P7N+e27sJkiGDsw/3fT4AtsqQBrBA==", + "dev": true + }, + "@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/prettier": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.0.2.tgz", + "integrity": "sha512-IkVfat549ggtkZUthUzEX49562eGikhSYeVGX97SkMFn+sTZrgRewXjQ4tPKFPCykZHkX1Zfd9OoELGqKU2jJA==", + "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/qs": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.4.tgz", + "integrity": "sha512-+wYo+L6ZF6BMoEjtf8zB2esQsqdV6WsjRK/GP9WOgLPrq87PbNWgIxS76dS5uvl/QXtHGakZmwTznIfcPXcKlQ==", + "dev": true + }, + "@types/resolve": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", + "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", + "dev": true, + "requires": { + "@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": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", + "dev": true + }, + "@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.9.3", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.9.3.tgz", + "integrity": "sha512-KswB5C7Kwduwjj04Ykz+AjvPcfgv/37Za24O2EDzYNbwyzOo8+ydtvzUfZ5UMguiVu29Gx44l1A6VsPPcmYu9w==", + "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/webpack": { + "version": "4.41.21", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.21.tgz", + "integrity": "sha512-2j9WVnNrr/8PLAB5csW44xzQSJwS26aOnICsP3pSGCEdsu6KYtfQ6QJsVUKHWRnm1bL7HziJsfh5fHqth87yKA==", + "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": "1.4.2", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-1.4.2.tgz", + "integrity": "sha512-77T++JyKow4BQB/m9O96n9d/UUHWLQHlcqXb9Vsf4F1+wKNrrlWNFPDLKNT92RJnCSL6CieTc+NDXtCVZswdTw==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" + }, + "dependencies": { + "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 + } + } + }, + "@types/yargs": { + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz", + "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", + "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.30.0.tgz", + "integrity": "sha512-PGejii0qIZ9Q40RB2jIHyUpRWs1GJuHP1pkoCiaeicfwO9z7Fx03NQzupuyzAmv+q9/gFNHu7lo1ByMXe8PNyg==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "2.30.0", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.0.0", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/eslint-plugin-tslint": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin-tslint/-/eslint-plugin-tslint-2.30.0.tgz", + "integrity": "sha512-phARGRY1SyAkG9uVhF7o0yjK1eqmGYCwM7JpNkOo/50d68ZG0V/P9VyYMSKAj+IbRlZ/k2rKFibKZvfLJPcFGw==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "2.30.0", + "lodash": "^4.17.15" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.30.0.tgz", + "integrity": "sha512-L3/tS9t+hAHksy8xuorhOzhdefN0ERPDWmR9CclsIGOUqGKy6tqc/P+SoXeJRye5gazkuPO0cK9MQRnolykzkA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "2.30.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.30.0.tgz", + "integrity": "sha512-9kDOxzp0K85UnpmPJqUzdWaCNorYYgk1yZmf4IKzpeTlSAclnFsrLjfwD9mQExctLoLoGAUXq1co+fbr+3HeFw==", + "dev": true, + "requires": { + "@types/eslint-visitor-keys": "^1.0.0", + "@typescript-eslint/experimental-utils": "2.30.0", + "@typescript-eslint/typescript-estree": "2.30.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "@typescript-eslint/typescript-estree": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.30.0.tgz", + "integrity": "sha512-nI5WOechrA0qAhnr+DzqwmqHsx7Ulr/+0H7bWCcClDhhWkSyZR5BmTvnBEyONwJCTWHfc5PAQExX24VD26IAVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "eslint-visitor-keys": "^1.1.0", + "glob": "^7.1.6", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^6.3.0", + "tsutils": "^3.17.1" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@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 + }, + "@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" + } + }, + "abab": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.4.tgz", + "integrity": "sha512-Eu9ELJWCz/c1e9gTiCY+FceWxcqzjYEbqMgtndnuSqZSUCOL73TWNK2mHfIj4Cw2E/ongOp+JISVNCmovt2KYQ==", + "dev": true + }, + "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.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", + "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", + "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" + } + }, + "acorn-jsx": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", + "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 + }, + "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.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "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-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": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz", + "integrity": "sha1-DELU+xcWDVqa8eSEus4cZpIsGyE=", + "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-font": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/ansi-font/-/ansi-font-0.0.2.tgz", + "integrity": "sha1-iQMBvVhBRi/TnAt3Ca/R9SUUMzE=", + "dev": true + }, + "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": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "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==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true + }, + "any-observable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", + "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==", + "dev": true + }, + "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 + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + }, + "dependencies": { + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + } + } + }, + "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-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=", + "dev": true + }, + "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-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": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "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 + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "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-each-series": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", + "integrity": "sha1-dhfBkXQB/Yykooqtzj266Yr+tDI=", + "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.8.4", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.4.tgz", + "integrity": "sha512-84aYfXlpUe45lvmS+HoAWKCkirI/sw4JK0/bTeeqgHYco3dcsOn0NqdejISjptsYwNji/21dnkDri9PsYKk89A==", + "dev": true, + "requires": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001087", + "colorette": "^1.2.0", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + } + }, + "aws-sdk": { + "version": "2.706.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.706.0.tgz", + "integrity": "sha512-7GT+yrB5Wb/zOReRdv/Pzkb2Qt+hz6B/8FGMVaoysX3NryHvQUdz7EQWi5yhg9CxOjKxdw5lFwYSs69YlSp1KA==", + "dev": true, + "requires": { + "buffer": "4.9.2", + "events": "1.1.1", + "ieee754": "1.1.13", + "jmespath": "0.15.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "uuid": "3.3.2", + "xml2js": "0.4.19" + }, + "dependencies": { + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "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.10.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", + "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==", + "dev": true + }, + "axios": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz", + "integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==", + "dev": true, + "requires": { + "follow-redirects": "1.5.10", + "is-buffer": "^2.0.2" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", + "dev": true + } + } + }, + "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-extract-comments": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz", + "integrity": "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==", + "dev": true, + "requires": { + "babylon": "^6.18.0" + } + }, + "babel-jest": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.3.0.tgz", + "integrity": "sha512-sxPnQGEyHAOPF8NcUsD0g7hDCnvLL2XyblRBcgrzTWBB/mAIpWow3n1bEL+VghnnZfreLhFSBsFluRoK2tRK4g==", + "dev": true, + "requires": { + "@jest/transform": "^26.3.0", + "@jest/types": "^26.3.0", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^26.3.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "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" + } + }, + "@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": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "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" + } + }, + "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.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.2.0.tgz", + "integrity": "sha512-B/hVMRv8Nh1sQ1a3EY8I0n4Y1Wty3NrR5ebOyVT302op+DOAau+xNEImGMsUWOC3++ZlMooCytKz+NgN8aKGbA==", + "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-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "dev": true + }, + "babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" + } + }, + "babel-preset-current-node-syntax": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.3.tgz", + "integrity": "sha512-uyexu1sVwcdFnyq9o8UQYsXwXflIh8LvrF5+cKrYam93ned1CStffB3+BEcsxGSgagoA3GEyjDqO4a/58hyPYQ==", + "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-preset-jest": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.3.0.tgz", + "integrity": "sha512-5WPdf7nyYi2/eRxCbVrE1kKCWxgWY4RsPEbdJWFm7QsesFGqjdkyLeu1zRkwM1cxK6EPIlNd6d2AxLk7J+t4pw==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^26.2.0", + "babel-preset-current-node-syntax": "^0.1.3" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + } + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "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" + } + }, + "bfj": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.2.tgz", + "integrity": "sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "check-types": "^8.0.3", + "hoopy": "^0.1.4", + "tryer": "^1.0.1" + } + }, + "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 + }, + "binaryextensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.3.0.tgz", + "integrity": "sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg==", + "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 + }, + "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": { + "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.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" + } + }, + "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" + } + }, + "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 + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "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" + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "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" + }, + "dependencies": { + "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 + } + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "bootstrap": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.5.0.tgz", + "integrity": "sha512-Z93QoXvodoVslA+PWNdk23Hze4RBYIkpb5h8I2HY2Tu2h7A0LpAgLcyrhrSUyo2/Oxm2l1fRZPs1e5hnxnliXA==" + }, + "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" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "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 + }, + "browser-sync": { + "version": "2.26.7", + "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.26.7.tgz", + "integrity": "sha512-lY3emme0OyvA2ujEMpRmyRy9LY6gHLuTr2/ABxhIm3lADOiRXzP4dgekvnDrQqZ/Ec2Fz19lEjm6kglSG5766w==", + "dev": true, + "requires": { + "browser-sync-client": "^2.26.6", + "browser-sync-ui": "^2.26.4", + "bs-recipes": "1.3.4", + "bs-snippet-injector": "^2.0.1", + "chokidar": "^2.0.4", + "connect": "3.6.6", + "connect-history-api-fallback": "^1", + "dev-ip": "^1.0.1", + "easy-extender": "^2.3.4", + "eazy-logger": "^3", + "etag": "^1.8.1", + "fresh": "^0.5.2", + "fs-extra": "3.0.1", + "http-proxy": "1.15.2", + "immutable": "^3", + "localtunnel": "1.9.2", + "micromatch": "^3.1.10", + "opn": "5.3.0", + "portscanner": "2.1.1", + "qs": "6.2.3", + "raw-body": "^2.3.2", + "resp-modifier": "6.0.2", + "rx": "4.1.0", + "send": "0.16.2", + "serve-index": "1.9.1", + "serve-static": "1.13.2", + "server-destroy": "1.0.1", + "socket.io": "2.1.1", + "ua-parser-js": "0.7.17", + "yargs": "6.4.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "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" + } + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "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" + } + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.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" + } + }, + "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" + } + }, + "fs-extra": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", + "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^3.0.0", + "universalify": "^0.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 + }, + "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 + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^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" + } + }, + "jsonfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", + "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "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" + } + }, + "qs": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz", + "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=", + "dev": true + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "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 + }, + "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" + } + }, + "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" + } + }, + "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-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.4.0.tgz", + "integrity": "sha1-gW4ahm1VmMzzTlWW3c4i2S2kkNQ=", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "window-size": "^0.2.0", + "y18n": "^3.2.1", + "yargs-parser": "^4.1.0" + } + }, + "yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "dev": true, + "requires": { + "camelcase": "^3.0.0" + } + } + } + }, + "browser-sync-client": { + "version": "2.26.12", + "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.26.12.tgz", + "integrity": "sha512-bEBDRkufKxrIfjOsIB1FN9itUEXr2oLtz1AySgSSr80K2AWzmtoYnxtVASx/i40qFrSdeI31pNvdCjHivihLVA==", + "dev": true, + "requires": { + "etag": "1.8.1", + "fresh": "0.5.2", + "mitt": "^1.1.3", + "rxjs": "^5.5.6" + }, + "dependencies": { + "rxjs": { + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "dev": true, + "requires": { + "symbol-observable": "1.0.1" + } + }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "dev": true + } + } + }, + "browser-sync-ui": { + "version": "2.26.12", + "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.26.12.tgz", + "integrity": "sha512-PkAJNf/TfCFTCkQUfXplR2Kp/+/lbCWFO9lrgLZsmxIhvMLx2pYZFBbTBIaem8qjXhld9ZcESUC8EdU5VWFJgQ==", + "dev": true, + "requires": { + "async-each-series": "0.1.1", + "connect-history-api-fallback": "^1", + "immutable": "^3", + "server-destroy": "1.0.1", + "socket.io-client": "^2.0.4", + "stream-throttle": "^0.1.3" + } + }, + "browser-sync-webpack-plugin": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/browser-sync-webpack-plugin/-/browser-sync-webpack-plugin-2.2.2.tgz", + "integrity": "sha512-x92kl8LdBi4dp6YVXYqrSoDkOCOLCeBOrYSY0h9Sk1VcCDSoZC1Vc62eae6TfC2ljN4/L+aYlkzE46kirHzbgA==", + "dev": true, + "requires": { + "lodash": "^4" + } + }, + "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.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.0.tgz", + "integrity": "sha512-pUsXKAF2lVwhmtpeA3LJrZ76jXuusrNyhduuQs7CDFf9foT4Y38aQOserd2lMe5DSSrjf3fx34oHwryuvxAUgQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001111", + "electron-to-chromium": "^1.3.523", + "escalade": "^3.0.2", + "node-releases": "^1.1.60" + } + }, + "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" + } + }, + "bs-recipes": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz", + "integrity": "sha1-DS1NSKcYyMBEdp/cT4lZLci2lYU=", + "dev": true + }, + "bs-snippet-injector": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bs-snippet-injector/-/bs-snippet-injector-2.0.1.tgz", + "integrity": "sha1-YbU5PxH1JVntEgaTEANDtu2wTdU=", + "dev": true + }, + "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": "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-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.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "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" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "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" + } + }, + "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" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "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" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + } + } + }, + "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": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camel-case": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.1.tgz", + "integrity": "sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==", + "dev": true, + "requires": { + "pascal-case": "^3.1.1", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + } + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + } + }, + "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.30001117", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001117.tgz", + "integrity": "sha512-4tY0Fatzdx59kYjQs+bNxUwZB03ZEBgVmJ1UkFPz/Q8OLiUUbjct2EdpnXj0fvFTPej2EkbPIG0w8BWsjAyk1Q==", + "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 + }, + "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" + } + }, + "capture-stack-trace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", + "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==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.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 + }, + "check-types": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-8.0.3.tgz", + "integrity": "sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==", + "dev": true + }, + "chevrotain": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-7.0.1.tgz", + "integrity": "sha512-B/44jrdw5GAzy483LEeVSgXSX0qOYM8lUd3l5+yf6Vl6OQjEUCm2BUiYbHRCIK6xCEvCLAFe1kj8uyV6+zdaVw==", + "dev": true, + "requires": { + "regexp-to-ast": "0.5.0" + } + }, + "chokidar": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", + "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "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.4.0" + } + }, + "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" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "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 + }, + "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" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "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.4.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.4.0.tgz", + "integrity": "sha512-sJAofoarcm76ZGpuooaO0eDy8saEy+YoZBLjC4h8srt4jeBnkYeOgqxgsJQTpyt2LjI5PTfLJHSL+41Yu4fEJA==", + "dev": true + }, + "cli-table": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", + "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", + "dev": true, + "requires": { + "colors": "1.0.3" + }, + "dependencies": { + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", + "dev": true + } + } + }, + "cli-truncate": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", + "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", + "dev": true, + "requires": { + "slice-ansi": "0.0.4", + "string-width": "^1.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "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" + } + }, + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true + }, + "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" + } + }, + "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" + } + } + } + }, + "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": "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" + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "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" + } + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "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" + } + }, + "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==", + "dev": true, + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + } + }, + "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-string": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "dev": true, + "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 + }, + "colornames": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/colornames/-/colornames-1.1.1.tgz", + "integrity": "sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y=", + "dev": true + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + }, + "colorspace": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", + "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==", + "dev": true, + "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": "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 + }, + "common-tags": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", + "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", + "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.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "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": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "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 + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "conf": { + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/conf/-/conf-6.2.4.tgz", + "integrity": "sha512-GjgyPRLo1qK1LR9RWAdUagqo+DP18f5HWCFk4va7GS+wpxQTOzfuKTwKOvGW2c01/YXNicAyyoyuSddmdkBzZQ==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "debounce-fn": "^3.0.1", + "dot-prop": "^5.0.0", + "env-paths": "^2.2.0", + "json-schema-typed": "^7.0.1", + "make-dir": "^3.0.0", + "onetime": "^5.1.0", + "pkg-up": "^3.0.1", + "semver": "^6.2.0", + "write-file-atomic": "^3.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 + } + } + }, + "connect": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.0", + "parseurl": "~1.3.2", + "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==", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "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": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "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": "6.0.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.0.2.tgz", + "integrity": "sha512-9Gm8X0c6eXlKnmltMPFCBeGOKjtcRIyTt4VaO3k1TkNgVTe5Ov2lYsYVuyLp0kp8DItO3apewflM+1GYgh6V2Q==", + "dev": true, + "requires": { + "cacache": "^15.0.4", + "fast-glob": "^3.2.2", + "find-cache-dir": "^3.3.1", + "glob-parent": "^5.1.1", + "globby": "^11.0.1", + "loader-utils": "^2.0.0", + "normalize-path": "^3.0.0", + "p-limit": "^2.3.0", + "schema-utils": "^2.7.0", + "serialize-javascript": "^3.1.0", + "webpack-sources": "^1.4.3" + }, + "dependencies": { + "cacache": { + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz", + "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==", + "dev": true, + "requires": { + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.0", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, + "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" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "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" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "ssri": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz", + "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "tar": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.5.tgz", + "integrity": "sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + } + } + }, + "core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", + "dev": true + }, + "core-js-compat": { + "version": "3.6.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": "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" + }, + "dependencies": { + "parse-json": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.1.tgz", + "integrity": "sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "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 + } + } + }, + "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-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, + "requires": { + "capture-stack-trace": "^1.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "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" + } + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "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-loader": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.6.0.tgz", + "integrity": "sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.32", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.2", + "postcss-modules-scope": "^2.2.0", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^2.7.0", + "semver": "^6.3.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.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" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + }, + "dependencies": { + "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.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", + "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.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + } + } + }, + "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": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", + "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" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "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" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "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.0.3", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz", + "integrity": "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==", + "dev": true, + "requires": { + "css-tree": "1.0.0-alpha.39" + }, + "dependencies": { + "css-tree": { + "version": "1.0.0-alpha.39", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz", + "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==", + "dev": true, + "requires": { + "mdn-data": "2.0.6", + "source-map": "^0.6.1" + } + }, + "mdn-data": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz", + "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==", + "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 + } + } + }, + "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 + } + } + }, + "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 + }, + "dargs": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-6.1.0.tgz", + "integrity": "sha512-5dVBvpBLBnPwSsYXqfybFyehMmC/EenKEcf23AhCTgTf48JFBbmJKqoZBsERDnjL0FyiVTYWdFsRfTLHxLyKdQ==", + "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" + } + }, + "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" + } + }, + "date-fns": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", + "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", + "dev": true + }, + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true + }, + "debounce-fn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-3.0.1.tgz", + "integrity": "sha512-aBoJh5AhpqlRoHZjHmOzZlRx+wz2xVwGL9rjs+Kj0EWUrL4/h4K7OD176thl2Tdoqui/AaA4xhHrNArGLAaI3Q==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "debuglog": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", + "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", + "dev": true + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + } + } + }, + "decimal.js": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.0.tgz", + "integrity": "sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw==", + "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 + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "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" + } + }, + "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==", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "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 + }, + "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" + } + }, + "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-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": "3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", + "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "dev": true, + "requires": { + "globby": "^6.1.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "p-map": "^1.1.1", + "pify": "^3.0.0", + "rimraf": "^2.2.8" + }, + "dependencies": { + "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" + } + }, + "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": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "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" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + } + } + }, + "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=", + "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-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, + "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 + }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "dev": true + }, + "dev-ip": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", + "integrity": "sha1-p2o+0YVb56ASu4rBbLgPPADcKPA=", + "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" + } + }, + "diagnostics": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz", + "integrity": "sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ==", + "dev": true, + "requires": { + "colorspace": "1.1.x", + "enabled": "1.0.x", + "kuler": "1.0.x" + } + }, + "didyoumean": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.1.tgz", + "integrity": "sha1-6S7f2tplN9SE1zwBcv0eugxJdv8=", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "diff-sequences": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", + "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", + "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": "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" + }, + "dependencies": { + "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 + } + } + }, + "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" + } + }, + "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" + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "requires": { + "utila": "~0.4" + } + }, + "dom-serializer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.0.1.tgz", + "integrity": "sha512-1Aj1Qy3YLbdslkI75QEOfdp9TkQ3o8LRISAzxOibjBs/xWwr1WxZFOQphFkZuepHFGo+kB8e5FVJSS0faAJ4Rw==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^3.0.0", + "entities": "^2.0.0" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domelementtype": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", + "dev": true + }, + "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 + } + } + }, + "domhandler": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.0.0.tgz", + "integrity": "sha512-eKLdI5v9m67kbXQbJSNn1zjh0SDzvzWVWtX+qEI3eMjZw8daH9k8rlj1FZY9memPwjiskQFbe7vHVVJIAqoEhw==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1" + } + }, + "domutils": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.2.0.tgz", + "integrity": "sha512-0haAxVr1PR0SqYwCH7mxMpHZUwjih9oPPedqpR/KufsnxPyZ9dyVw1R5093qnJF3WXSbjBkdzRWLw/knJV/fAg==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.0.1", + "domhandler": "^3.0.0" + } + }, + "dot-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.3.tgz", + "integrity": "sha512-7hwEmg6RiSQfm/GwPL4AAWXKy3YNNZA3oFv2Pdiey0mwkRCPZ9x6SZbkLcn8Ma5PYeVokzoD4Twv2n7LKp5WeA==", + "dev": true, + "requires": { + "no-case": "^3.0.3", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + } + } + }, + "dot-prop": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", + "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "download-stats": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/download-stats/-/download-stats-0.3.4.tgz", + "integrity": "sha512-ic2BigbyUWx7/CBbsfGjf71zUNZB4edBGC3oRliSzsoNmvyVx3Ycfp1w3vp2Y78Ee0eIIkjIEO5KzW0zThDGaA==", + "dev": true, + "requires": { + "JSONStream": "^1.2.1", + "lazy-cache": "^2.0.1", + "moment": "^2.15.1" + } + }, + "drange": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/drange/-/drange-1.1.1.tgz", + "integrity": "sha512-pYxfDYpued//QpnLIm4Avk7rsNtAtQkUES2cwAYSvD/wd2pKD71gN2Ebj3e7klzXwjocvE8c5vx/1fxwpqmSxA==", + "dev": true + }, + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "easy-extender": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz", + "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==", + "dev": true, + "requires": { + "lodash": "^4.17.10" + } + }, + "eazy-logger": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-3.0.2.tgz", + "integrity": "sha1-oyWqXlPROiIliJsqxBE7K5Y29Pw=", + "dev": true, + "requires": { + "tfunk": "^3.0.1" + } + }, + "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" + } + }, + "editions": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/editions/-/editions-2.3.1.tgz", + "integrity": "sha512-ptGvkwTvGdGfC0hfhKg0MT+TRLRKGtUiWGBInxOm5pz7ssADezahjCUaYuZ8Dr+C05FW0AECIIPt4WBxVINEhA==", + "dev": true, + "requires": { + "errlop": "^2.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 + } + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "ejs": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.3.tgz", + "integrity": "sha512-wmtrUGyfSC23GC/B1SMv2ogAUgbQEtDmTIhfqielrG5ExIM9TP4UoYdi90jLF1aTcsWCJNEO0UrgKzP0y3nTSg==", + "dev": true, + "requires": { + "jake": "^10.6.1" + } + }, + "electron-to-chromium": { + "version": "1.3.542", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.542.tgz", + "integrity": "sha512-9Wm4o9h2CE/h4PDBkE5Ff2ha4frgltV/BgVCwFK8Tc9DKF19xJK85zA82JFah0/+oe8SU3rYRWtlYZH58pC6Ng==", + "dev": true + }, + "elegant-spinner": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", + "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=", + "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 + } + } + }, + "emittery": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.1.tgz", + "integrity": "sha512-d34LN4L6h18Bzz9xpoku2nPwKxCPlPMr3EEKTkoEBi+1/+b0lcRkRJ1UVyyZaKNeqGR3swcGl6s390DNO4YVgQ==", + "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": "1.0.2", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", + "integrity": "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=", + "dev": true, + "requires": { + "env-variable": "0.0.x" + } + }, + "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" + } + }, + "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": { + "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" + } + }, + "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" + } + }, + "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.4.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.3.tgz", + "integrity": "sha512-0NGY+9hioejTEJCaSJZfWZLk4FPI9dN+1H1C4+wj2iuFba47UgZbJzfWs4aNFajnX/qAaYKbe2lLTfEEWzCmcw==", + "dev": true, + "requires": { + "component-emitter": "~1.3.0", + "component-inherit": "0.0.3", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "~6.1.0", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + }, + "dependencies": { + "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 + } + } + }, + "engine.io-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.0.tgz", + "integrity": "sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==", + "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" + } + }, + "entities": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", + "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", + "dev": true + }, + "env-paths": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz", + "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==", + "dev": true + }, + "env-variable": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.6.tgz", + "integrity": "sha512-bHz59NlBbtS0NhftmR8+ExBEekE7br0e01jw+kk0NDro7TtZzBYZ5ScGPs3OmwnpyfHTHOtr1Y6uedCdrIldtg==", + "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 + }, + "errlop": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/errlop/-/errlop-2.2.0.tgz", + "integrity": "sha512-e64Qj9+4aZzjzzFpZC7p5kmm/ccCrbLhAJplhsDXQFs87XTsXwOpH4s1Io2s90Tau/8r2j9f4l/thhDevRjzxw==", + "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": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/error/-/error-7.2.1.tgz", + "integrity": "sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA==", + "dev": true, + "requires": { + "string-template": "~0.2.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" + } + }, + "error-stack-parser": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", + "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", + "dev": true, + "requires": { + "stackframe": "^1.1.1" + } + }, + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "es-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.0.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.2.tgz", + "integrity": "sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ==", + "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=" + }, + "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": { + "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 + } + } + }, + "eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "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", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "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 + }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "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" + } + }, + "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 + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "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" + } + }, + "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 + } + } + }, + "eslint-config-jhipster": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-jhipster/-/eslint-config-jhipster-0.0.1.tgz", + "integrity": "sha512-E9/05t3+6V2K9YrJwsLmrblGgYnYfw62o/ja+Hr9wz3+AX2nG6gtycMW7LrS4alFuar1SGhbAyT3orTR5ur9MQ==", + "dev": true + }, + "eslint-config-prettier": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz", + "integrity": "sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA==", + "dev": true, + "requires": { + "get-stdin": "^6.0.0" + } + }, + "eslint-loader": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-4.0.2.tgz", + "integrity": "sha512-EDpXor6lsjtTzZpLUn7KmXs02+nIjGcgees9BYjNkWra3jVq5vVa8IoCKgzT2M7dNNeoMBtaSG83Bd40N3poLw==", + "dev": true, + "requires": { + "find-cache-dir": "^3.3.1", + "fs-extra": "^8.1.0", + "loader-utils": "^2.0.0", + "object-hash": "^2.0.3", + "schema-utils": "^2.6.5" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } + } + }, + "eslint-scope": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", + "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", + "dev": true, + "requires": { + "esrecurse": "^4.1.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" + } + }, + "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 + }, + "espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "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 + }, + "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.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eventemitter3": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", + "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=", + "dev": true + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "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" + } + }, + "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": "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 + }, + "exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", + "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 + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "expect": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.4.2.tgz", + "integrity": "sha512-IlJ3X52Z0lDHm7gjEp+m76uX46ldH5VpqmU0006vqDju/285twh7zaWMRhs67VpQhBwjjMchk+p5aA0VkERCAA==", + "dev": true, + "requires": { + "@jest/types": "^26.3.0", + "ansi-styles": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-matcher-utils": "^26.4.2", + "jest-message-util": "^26.3.0", + "jest-regex-util": "^26.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "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" + } + }, + "@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": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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-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 + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "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": { + "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 + }, + "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" + } + }, + "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" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "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 + }, + "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": { + "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 + } + } + }, + "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" + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "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" + }, + "dependencies": { + "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" + } + } + } + }, + "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 + }, + "faker": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/faker/-/faker-4.1.0.tgz", + "integrity": "sha1-HkW7vsxndLPBlfrSg1EJxtdIzD8=", + "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-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" + }, + "dependencies": { + "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" + } + } + } + }, + "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==", + "dev": true + }, + "fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "dev": true + }, + "fastq": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", + "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "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" + } + }, + "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" + } + }, + "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==", + "dev": true + }, + "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-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "file-loader": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.0.0.tgz", + "integrity": "sha512-/aMOAYEFXDdjG0wytpTL5YQLfZnnTmLNjn+AIrJ/6HVnTfDqLsVKUUwkDf4I4kgex36BvjuXEn/TX9B/1ESyqQ==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^2.6.5" + } + }, + "filelist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.1.tgz", + "integrity": "sha512-8zSK6Nu0DQIC08mUC46sWGXi+q3GGpKydAG36k+JDba6VRpkevvOWUW5a/PhShij4+vHT9M+ghgG7eM+a9JDUQ==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "filesize": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", + "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "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.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==", + "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" + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "first-chunk-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz", + "integrity": "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA=", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "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" + } + }, + "fn-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fn-name/-/fn-name-2.0.1.tgz", + "integrity": "sha1-UhTXU3pNBqSjAcDMJi/rhBiAAuc=", + "dev": true + }, + "follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "dev": true, + "requires": { + "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 + } + } + }, + "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 + }, + "friendly-errors-webpack-plugin": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.0.tgz", + "integrity": "sha512-K27M3VK30wVoOarP651zDmb93R9zF28usW4ocaK3mfQeIEI5BPht/EzZs5E8QLLwbLRJQMwscAjDxYPb1FuNiw==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "error-stack-parser": "^2.0.0", + "string-width": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "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" + } + }, + "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" + }, + "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" + } + } + } + }, + "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" + } + }, + "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 + } + } + }, + "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": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "dev": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "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 + }, + "g-status": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/g-status/-/g-status-2.0.2.tgz", + "integrity": "sha512-kQoE9qH+T1AHKgSSD0Hkv98bobE90ILQcXAF4wvGgsr7uFqNvwmh8j+Lq3l0RVt3E3HjSbv2B9biEGcEtpHLCA==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "matcher": "^1.0.0", + "simple-git": "^1.85.0" + }, + "dependencies": { + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + } + } + }, + "gauge": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz", + "integrity": "sha1-6c7FSD09TuDvRLYKfZnkk14TbZM=", + "dev": true, + "requires": { + "ansi": "^0.3.0", + "has-unicode": "^2.0.0", + "lodash.pad": "^4.1.0", + "lodash.padend": "^4.1.0", + "lodash.padstart": "^4.1.0" + } + }, + "generator-jhipster": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/generator-jhipster/-/generator-jhipster-6.10.1.tgz", + "integrity": "sha512-a2MtlL//Ui/29F2Q4qgHp6qoXRr5vcqFwH4y5I5xDRHq3x1cHscZYedR79EV1oAwKzmFCqYpsWGoPAhFJlj0UA==", + "dev": true, + "requires": { + "aws-sdk": "2.706.0", + "axios": "0.19.2", + "chalk": "4.1.0", + "commander": "5.1.0", + "conf": "6.2.4", + "didyoumean": "1.2.1", + "ejs": "3.1.3", + "faker": "4.1.0", + "glob": "7.1.6", + "gulp-filter": "6.0.0", + "insight": "0.10.3", + "jhipster-core": "7.3.4", + "js-object-pretty-print": "0.3.0", + "js-yaml": "3.14.0", + "lodash": "4.17.15", + "meow": "6.1.0", + "mkdirp": "1.0.4", + "normalize-path": "3.0.0", + "ora": "4.0.4", + "os-locale": "5.0.0", + "parse-gitignore": "1.0.1", + "pluralize": "8.0.0", + "prettier": "2.0.5", + "prettier-plugin-java": "0.8.0", + "progress": "2.0.3", + "randexp": "0.5.3", + "semver": "7.3.2", + "shelljs": "0.8.4", + "sync-request": "6.1.0", + "tabtab": "2.2.2", + "test": "^0.6.0", + "through2": "3.0.2", + "uuid": "7.0.3", + "yeoman-environment": "2.10.3", + "yeoman-generator": "4.11.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "axios": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", + "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", + "dev": true, + "requires": { + "follow-redirects": "1.5.10" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "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" + } + }, + "execa": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz", + "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==", + "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" + } + }, + "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" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "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 + }, + "invert-kv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-3.0.1.tgz", + "integrity": "sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw==", + "dev": true + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "lcid": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-3.1.1.tgz", + "integrity": "sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg==", + "dev": true, + "requires": { + "invert-kv": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "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" + } + }, + "os-locale": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-5.0.0.tgz", + "integrity": "sha512-tqZcNEDAIZKBEPnHPlVDvKrp7NzgLi7jRmhKiUoa2NUmhl13FtkAGLUVR+ZsYvApBQdBfYm43A4tXXQ4IrYLBA==", + "dev": true, + "requires": { + "execa": "^4.0.0", + "lcid": "^3.0.0", + "mem": "^5.0.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "through2": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "2 || 3" + } + }, + "uuid": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", + "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "genfun": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", + "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==" + }, + "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-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "dev": true + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=", + "dev": true + }, + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "gh-got": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/gh-got/-/gh-got-5.0.0.tgz", + "integrity": "sha1-7pW+NxBv2HSKlvjR20uuqJ4b+oo=", + "dev": true, + "requires": { + "got": "^6.2.0", + "is-plain-obj": "^1.1.0" + } + }, + "github-username": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/github-username/-/github-username-3.0.0.tgz", + "integrity": "sha1-CnciGbMTB0NCnyRW0L3T21Xc57E=", + "dev": true, + "requires": { + "gh-got": "^5.0.0" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "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.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "requires": { + "global-prefix": "^3.0.0" + }, + "dependencies": { + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + } + } + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "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" + } + }, + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true, + "requires": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + }, + "dependencies": { + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + } + } + }, + "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 + }, + "grouped-queue": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grouped-queue/-/grouped-queue-1.1.0.tgz", + "integrity": "sha512-rZOFKfCqLhsu5VqjBjEWiwrYqJR07KxIkH4mLZlNlGDfntbb4FbMyGFP14TlvRPrU9S3Hnn/sgxbC5ZeN0no3Q==", + "dev": true, + "requires": { + "lodash": "^4.17.15" + } + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, + "gulp-filter": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gulp-filter/-/gulp-filter-6.0.0.tgz", + "integrity": "sha512-veQFW93kf6jBdWdF/RxMEIlDK2mkjHyPftM381DID2C9ImTVngwYpyyThxm4/EpgcNOT37BLefzMOjEKbyYg0Q==", + "dev": true, + "requires": { + "multimatch": "^4.0.0", + "plugin-error": "^1.0.1", + "streamfilter": "^3.0.0" + } + }, + "gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "dev": true, + "requires": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "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.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", + "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", + "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" + } + } + } + }, + "hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "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" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "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=" + }, + "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-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "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" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "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" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "dev": true + }, + "hosted-git-info": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.5.tgz", + "integrity": "sha512-i4dpK6xj9BIpVOTboXIlKG9+8HMKggcrMX7WA24xZtKwX0TPelq/rbaS5rCKeNX8sJXZJGdSxpnEGtta+wismQ==", + "dev": true, + "requires": { + "lru-cache": "^6.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-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-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 + }, + "html-loader": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-1.1.0.tgz", + "integrity": "sha512-zwLbEgy+i7sgIYTlxI9M7jwkn29IvdsV6f1y7a2aLv/w8l1RigVk0PFijBZLLFsdi2gvL8sf2VJhTjLlfnK8sA==", + "dev": true, + "requires": { + "html-minifier-terser": "^5.0.5", + "htmlparser2": "^4.1.0", + "loader-utils": "^2.0.0", + "parse-srcset": "^1.0.2", + "schema-utils": "^2.6.5" + } + }, + "html-minifier-terser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", + "dev": true, + "requires": { + "camel-case": "^4.1.1", + "clean-css": "^4.2.3", + "commander": "^4.1.1", + "he": "^1.2.0", + "param-case": "^3.0.3", + "relateurl": "^0.2.7", + "terser": "^4.6.3" + }, + "dependencies": { + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + } + } + }, + "html-webpack-plugin": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.3.0.tgz", + "integrity": "sha512-C0fzKN8yQoVLTelcJxZfJCE+aAvQiY2VUf3UuKrR4a9k5UMWYOtpDLsaXwATbcVCnI05hUS7L9ULQHWLZhyi3w==", + "dev": true, + "requires": { + "@types/html-minifier-terser": "^5.0.0", + "@types/tapable": "^1.0.5", + "@types/webpack": "^4.41.8", + "html-minifier-terser": "^5.0.1", + "loader-utils": "^1.2.3", + "lodash": "^4.17.15", + "pretty-error": "^2.1.1", + "tapable": "^1.1.3", + "util.promisify": "1.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.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" + } + } + } + }, + "htmlparser2": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-4.1.0.tgz", + "integrity": "sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^3.0.0", + "domutils": "^2.0.0", + "entities": "^2.0.0" + } + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "dev": true, + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "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.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + } + } + }, + "http-proxy": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.15.2.tgz", + "integrity": "sha1-ZC/cr/5S00SNK9o7AHnpQJBk2jE=", + "dev": true, + "requires": { + "eventemitter3": "1.x.x", + "requires-port": "1.x.x" + } + }, + "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" + }, + "dependencies": { + "eventemitter3": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.5.tgz", + "integrity": "sha512-QR0rh0YiPuxuDQ6+T9GAO/xWTExXpxIes1Nl9RykNGTnE1HJmkuEfxJH9cubjIOQZ/GH4qNBR4u8VSHaKiWs4g==", + "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-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "dev": true, + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.28", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.28.tgz", + "integrity": "sha512-dzjES1Egb4c1a89C7lKwQh8pwjYmlOAG9dW1pBgxEk57tMrLnssOfEthz8kdkNaBd7lIqQx7APm5+mZ619IiCQ==", + "dev": true + } + } + }, + "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" + } + } + } + }, + "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 + }, + "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" + } + }, + "husky": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/husky/-/husky-4.2.5.tgz", + "integrity": "sha512-SYZ95AjKcX7goYVZtVZF2i6XiZcHknw50iXvY7b0MiGoj5RwdgRQNEHdb+gPDPCXKlzwrybjFjkL6FOj8uRhZQ==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "ci-info": "^2.0.0", + "compare-versions": "^3.6.0", + "cosmiconfig": "^6.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": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "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" + } + }, + "icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "dev": true, + "requires": { + "postcss": "^7.0.14" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "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==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "immutable": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=", + "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": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.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" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "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 + }, + "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=", + "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==" + }, + "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.1.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", + "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "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.4.0", + "rxjs": "^6.5.3", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "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" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "insight": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/insight/-/insight-0.10.3.tgz", + "integrity": "sha512-YOncxSN6Omh+1Oqxt+OJAvJVMDKw7l6IEG0wT2cTMGxjsTcroOGW4IR926QDzxg/uZHcFZ2cZbckDWdZhc2pZw==", + "dev": true, + "requires": { + "async": "^2.6.2", + "chalk": "^2.4.2", + "conf": "^1.4.0", + "inquirer": "^6.3.1", + "lodash.debounce": "^4.0.8", + "os-name": "^3.1.0", + "request": "^2.88.0", + "tough-cookie": "^3.0.1", + "uuid": "^3.3.2" + }, + "dependencies": { + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "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" + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "conf": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/conf/-/conf-1.4.0.tgz", + "integrity": "sha512-bzlVWS2THbMetHqXKB8ypsXN4DQ/1qopGwNJi1eYbpwesJcd86FBjFciCQX/YwAhp9bM7NVnPFqZ5LpV7gP0Dg==", + "dev": true, + "requires": { + "dot-prop": "^4.1.0", + "env-paths": "^1.0.0", + "make-dir": "^1.0.0", + "pkg-up": "^2.0.0", + "write-file-atomic": "^2.3.0" + } + }, + "dot-prop": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", + "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "env-paths": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-1.0.0.tgz", + "integrity": "sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA=", + "dev": true + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "inquirer": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + } + }, + "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-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "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 + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "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": { + "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" + } + } + } + }, + "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 + } + } + }, + "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" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + } + } + }, + "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" + } + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "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.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "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-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-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": "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==" + }, + "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-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", + "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-number-like": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", + "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", + "dev": true, + "requires": { + "lodash.isfinite": "^3.3.2" + } + }, + "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-observable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz", + "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==", + "dev": true, + "requires": { + "symbol-observable": "^1.1.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" + } + }, + "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-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-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "dev": true + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true + }, + "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-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "dev": true + }, + "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-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "dev": true + }, + "is-scoped": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-scoped/-/is-scoped-1.0.0.tgz", + "integrity": "sha1-RJypgpnnEwOCViieyytUDcQ3yzA=", + "dev": true, + "requires": { + "scoped-regex": "^1.0.0" + } + }, + "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-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "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": "4.0.6", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.6.tgz", + "integrity": "sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "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" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "istextorbinary": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-2.6.0.tgz", + "integrity": "sha512-+XRlFseT8B3L9KyjxxLjfXSLMuErKDsd8DBNrsaxoViABMEZlOSCstwmw0qpoFX3+U6yWU1yhLudAe6/lETGGA==", + "dev": true, + "requires": { + "binaryextensions": "^2.1.2", + "editions": "^2.2.0", + "textextensions": "^2.5.0" + } + }, + "jake": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz", + "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==", + "dev": true, + "requires": { + "async": "0.9.x", + "chalk": "^2.4.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "dependencies": { + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", + "dev": true + } + } + }, + "java-parser": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/java-parser/-/java-parser-0.8.0.tgz", + "integrity": "sha512-8MOu9EDjWlAcBnxjVI8jblcOX/zJt9XVLaMLrXYvmJYk3gvRqTUKsEp/PxaooJQc6wh+nPEyqEbhCy3BWIgi0g==", + "dev": true, + "requires": { + "chevrotain": "6.5.0", + "lodash": "4.17.15" + }, + "dependencies": { + "chevrotain": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-6.5.0.tgz", + "integrity": "sha512-BwqQ/AgmKJ8jcMEjaSnfMybnKMgGTrtDKowfTP3pX4jwVy0kNjRsT/AP6h+wC3+3NC+X8X15VWBnTCQlX+wQFg==", + "dev": true, + "requires": { + "regexp-to-ast": "0.4.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "regexp-to-ast": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.4.0.tgz", + "integrity": "sha512-4qf/7IsIKfSNHQXSwial1IFmfM1Cc/whNBQqRwe0V2stPe7KmN1U0tWQiIx6JiirgSrisjE0eECdNf7Tav1Ntw==", + "dev": true + } + } + }, + "jest": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.1.0.tgz", + "integrity": "sha512-LIti8jppw5BcQvmNJe4w2g1N/3V68HUfAv9zDVm7v+VAtQulGhH0LnmmiVkbNE4M4I43Bj2fXPiBGKt26k9tHw==", + "dev": true, + "requires": { + "@jest/core": "^26.1.0", + "import-local": "^3.0.2", + "jest-cli": "^26.1.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "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" + } + }, + "@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": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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-cli": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.4.2.tgz", + "integrity": "sha512-zb+lGd/SfrPvoRSC/0LWdaWCnscXc1mGYW//NP4/tmBvRPT3VntZ2jtKUONsRi59zc5JqmsSajA9ewJKFYp8Cw==", + "dev": true, + "requires": { + "@jest/core": "^26.4.2", + "@jest/test-result": "^26.3.0", + "@jest/types": "^26.3.0", + "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.4.2", + "jest-util": "^26.3.0", + "jest-validate": "^26.4.2", + "prompts": "^2.0.1", + "yargs": "^15.3.1" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "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.3.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.3.0.tgz", + "integrity": "sha512-1C4R4nijgPltX6fugKxM4oQ18zimS7LqQ+zTTY8lMCMFPrxqBFb7KJH0Z2fRQJvw2Slbaipsqq7s1mgX5Iot+g==", + "dev": true, + "requires": { + "@jest/types": "^26.3.0", + "execa": "^4.0.0", + "throat": "^5.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "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" + } + }, + "@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": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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" + } + }, + "execa": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz", + "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==", + "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" + } + }, + "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" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "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" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "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 + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "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" + } + } + } + }, + "jest-config": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.4.2.tgz", + "integrity": "sha512-QBf7YGLuToiM8PmTnJEdRxyYy3mHWLh24LJZKVdXZ2PNdizSe1B/E8bVm+HYcjbEzGuVXDv/di+EzdO/6Gq80A==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^26.4.2", + "@jest/types": "^26.3.0", + "babel-jest": "^26.3.0", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^26.3.0", + "jest-environment-node": "^26.3.0", + "jest-get-type": "^26.3.0", + "jest-jasmine2": "^26.4.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.4.0", + "jest-util": "^26.3.0", + "jest-validate": "^26.4.2", + "micromatch": "^4.0.2", + "pretty-format": "^26.4.2" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "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" + } + }, + "@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": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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-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 + }, + "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" + } + }, + "pretty-format": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.4.2.tgz", + "integrity": "sha512-zK6Gd8zDsEiVydOCGLkoBoZuqv8VTiHyAbKznXe/gaph/DAeZOmit9yMfgIz5adIgAMMs5XfoYSwAX3jcCO1tA==", + "dev": true, + "requires": { + "@jest/types": "^26.3.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-date-mock": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/jest-date-mock/-/jest-date-mock-1.0.8.tgz", + "integrity": "sha512-0Lyp+z9xvuNmLbK+5N6FOhSiBeux05Lp5bbveFBmYo40Aggl2wwxFoIrZ+rOWC8nDNcLeBoDd2miQdEDSf3iQw==", + "dev": true + }, + "jest-diff": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz", + "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "diff-sequences": "^25.2.6", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.5.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "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" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "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.4.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.4.2.tgz", + "integrity": "sha512-p15rt8r8cUcRY0Mvo1fpkOGYm7iI8S6ySxgIdfh3oOIv+gHwrHTy5VWCGOecWUhDsit4Nz8avJWdT07WLpbwDA==", + "dev": true, + "requires": { + "@jest/types": "^26.3.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-util": "^26.3.0", + "pretty-format": "^26.4.2" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "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" + } + }, + "@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": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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-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 + }, + "pretty-format": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.4.2.tgz", + "integrity": "sha512-zK6Gd8zDsEiVydOCGLkoBoZuqv8VTiHyAbKznXe/gaph/DAeZOmit9yMfgIz5adIgAMMs5XfoYSwAX3jcCO1tA==", + "dev": true, + "requires": { + "@jest/types": "^26.3.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-environment-jsdom": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.3.0.tgz", + "integrity": "sha512-zra8He2btIMJkAzvLaiZ9QwEPGEetbxqmjEBQwhH3CA+Hhhu0jSiEJxnJMbX28TGUvPLxBt/zyaTLrOPF4yMJA==", + "dev": true, + "requires": { + "@jest/environment": "^26.3.0", + "@jest/fake-timers": "^26.3.0", + "@jest/types": "^26.3.0", + "@types/node": "*", + "jest-mock": "^26.3.0", + "jest-util": "^26.3.0", + "jsdom": "^16.2.2" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "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" + } + }, + "@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": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-environment-node": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.3.0.tgz", + "integrity": "sha512-c9BvYoo+FGcMj5FunbBgtBnbR5qk3uky8PKyRVpSfe2/8+LrNQMiXX53z6q2kY+j15SkjQCOSL/6LHnCPLVHNw==", + "dev": true, + "requires": { + "@jest/environment": "^26.3.0", + "@jest/fake-timers": "^26.3.0", + "@jest/types": "^26.3.0", + "@types/node": "*", + "jest-mock": "^26.3.0", + "jest-util": "^26.3.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "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" + } + }, + "@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": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-get-type": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", + "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", + "dev": true + }, + "jest-haste-map": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.3.0.tgz", + "integrity": "sha512-DHWBpTJgJhLLGwE5Z1ZaqLTYqeODQIZpby0zMBsCU9iRFHYyhklYqP4EiG73j5dkbaAdSZhgB938mL51Q5LeZA==", + "dev": true, + "requires": { + "@jest/types": "^26.3.0", + "@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.3.0", + "jest-util": "^26.3.0", + "jest-worker": "^26.3.0", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "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" + } + }, + "@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": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "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" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-jasmine2": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.4.2.tgz", + "integrity": "sha512-z7H4EpCldHN1J8fNgsja58QftxBSL+JcwZmaXIvV9WKIM+x49F4GLHu/+BQh2kzRKHAgaN/E82od+8rTOBPyPA==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.3.0", + "@jest/source-map": "^26.3.0", + "@jest/test-result": "^26.3.0", + "@jest/types": "^26.3.0", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^26.4.2", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.4.2", + "jest-matcher-utils": "^26.4.2", + "jest-message-util": "^26.3.0", + "jest-runtime": "^26.4.2", + "jest-snapshot": "^26.4.2", + "jest-util": "^26.3.0", + "pretty-format": "^26.4.2", + "throat": "^5.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "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" + } + }, + "@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": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "pretty-format": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.4.2.tgz", + "integrity": "sha512-zK6Gd8zDsEiVydOCGLkoBoZuqv8VTiHyAbKznXe/gaph/DAeZOmit9yMfgIz5adIgAMMs5XfoYSwAX3jcCO1tA==", + "dev": true, + "requires": { + "@jest/types": "^26.3.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-junit": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-11.0.1.tgz", + "integrity": "sha512-stgc0mBoiSg/F9qWd4KkmR3K7Nk2u+M/dc1oup7gxz9mrzGcEaU2YL9/0QscVqqg3IOaA1P5ZXtozG/XR6j6nw==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "strip-ansi": "^5.2.0", + "uuid": "^3.3.3", + "xml": "^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 + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "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" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } + } + }, + "jest-leak-detector": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.4.2.tgz", + "integrity": "sha512-akzGcxwxtE+9ZJZRW+M2o+nTNnmQZxrHJxX/HjgDaU5+PLmY1qnQPnMjgADPGCRPhB+Yawe1iij0REe+k/aHoA==", + "dev": true, + "requires": { + "jest-get-type": "^26.3.0", + "pretty-format": "^26.4.2" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "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" + } + }, + "@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": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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-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 + }, + "pretty-format": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.4.2.tgz", + "integrity": "sha512-zK6Gd8zDsEiVydOCGLkoBoZuqv8VTiHyAbKznXe/gaph/DAeZOmit9yMfgIz5adIgAMMs5XfoYSwAX3jcCO1tA==", + "dev": true, + "requires": { + "@jest/types": "^26.3.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-matcher-utils": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.4.2.tgz", + "integrity": "sha512-KcbNqWfWUG24R7tu9WcAOKKdiXiXCbMvQYT6iodZ9k1f7065k0keUOW6XpJMMvah+hTfqkhJhRXmA3r3zMAg0Q==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^26.4.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.4.2" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "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" + } + }, + "@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": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "diff-sequences": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.3.0.tgz", + "integrity": "sha512-5j5vdRcw3CNctePNYN0Wy2e/JbWT6cAYnXv5OuqPhDpyCGc0uLu2TK0zOCJWNB9kOIfYMSpIulRaDgIi4HJ6Ig==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-diff": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.4.2.tgz", + "integrity": "sha512-6T1XQY8U28WH0Z5rGpQ+VqZSZz8EN8rZcBtfvXaOkbwxIEeRre6qnuZQlbY1AJ4MKDxQF8EkrCvK+hL/VkyYLQ==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^26.3.0", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.4.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 + }, + "pretty-format": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.4.2.tgz", + "integrity": "sha512-zK6Gd8zDsEiVydOCGLkoBoZuqv8VTiHyAbKznXe/gaph/DAeZOmit9yMfgIz5adIgAMMs5XfoYSwAX3jcCO1tA==", + "dev": true, + "requires": { + "@jest/types": "^26.3.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-message-util": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.3.0.tgz", + "integrity": "sha512-xIavRYqr4/otGOiLxLZGj3ieMmjcNE73Ui+LdSW/Y790j5acqCsAdDiLIbzHCZMpN07JOENRWX5DcU+OQ+TjTA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.3.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "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" + } + }, + "@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": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "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" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-mock": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.3.0.tgz", + "integrity": "sha512-PeaRrg8Dc6mnS35gOo/CbZovoDPKAeB1FICZiuagAgGvbWdNNyjQjkOaGUa/3N3JtpQ/Mh9P4A2D4Fv51NnP8Q==", + "dev": true, + "requires": { + "@jest/types": "^26.3.0", + "@types/node": "*" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "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" + } + }, + "@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": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "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-preset-angular": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/jest-preset-angular/-/jest-preset-angular-8.2.1.tgz", + "integrity": "sha512-6t7lavnIHnZWz6a03jpZ5L7phMefi6SoBIRZ/GQdyML8YgwMtbJszbhUE+dh5lzmeNbd6AJ1gfleetGy2Rg4cQ==", + "dev": true, + "requires": { + "pretty-format": "^26.0.0", + "ts-jest": "^26.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "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" + } + }, + "@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": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "pretty-format": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.4.2.tgz", + "integrity": "sha512-zK6Gd8zDsEiVydOCGLkoBoZuqv8VTiHyAbKznXe/gaph/DAeZOmit9yMfgIz5adIgAMMs5XfoYSwAX3jcCO1tA==", + "dev": true, + "requires": { + "@jest/types": "^26.3.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "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.4.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.4.0.tgz", + "integrity": "sha512-bn/JoZTEXRSlEx3+SfgZcJAVuTMOksYq9xe9O6s4Ekg84aKBObEaVXKOEilULRqviSLAYJldnoWV9c07kwtiCg==", + "dev": true, + "requires": { + "@jest/types": "^26.3.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.3.0", + "read-pkg-up": "^7.0.1", + "resolve": "^1.17.0", + "slash": "^3.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "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" + } + }, + "@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": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "parse-json": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.1.tgz", + "integrity": "sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "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" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "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 + } + } + }, + "jest-resolve-dependencies": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.4.2.tgz", + "integrity": "sha512-ADHaOwqEcVc71uTfySzSowA/RdxUpCxhxa2FNLiin9vWLB1uLPad3we+JSSROq5+SrL9iYPdZZF8bdKM7XABTQ==", + "dev": true, + "requires": { + "@jest/types": "^26.3.0", + "jest-regex-util": "^26.0.0", + "jest-snapshot": "^26.4.2" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "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" + } + }, + "@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": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-runner": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.4.2.tgz", + "integrity": "sha512-FgjDHeVknDjw1gRAYaoUoShe1K3XUuFMkIaXbdhEys+1O4bEJS8Avmn4lBwoMfL8O5oFTdWYKcf3tEJyyYyk8g==", + "dev": true, + "requires": { + "@jest/console": "^26.3.0", + "@jest/environment": "^26.3.0", + "@jest/test-result": "^26.3.0", + "@jest/types": "^26.3.0", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.7.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-config": "^26.4.2", + "jest-docblock": "^26.0.0", + "jest-haste-map": "^26.3.0", + "jest-leak-detector": "^26.4.2", + "jest-message-util": "^26.3.0", + "jest-resolve": "^26.4.0", + "jest-runtime": "^26.4.2", + "jest-util": "^26.3.0", + "jest-worker": "^26.3.0", + "source-map-support": "^0.5.6", + "throat": "^5.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "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" + } + }, + "@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": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-runtime": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.4.2.tgz", + "integrity": "sha512-4Pe7Uk5a80FnbHwSOk7ojNCJvz3Ks2CNQWT5Z7MJo4tX0jb3V/LThKvD9tKPNVNyeMH98J/nzGlcwc00R2dSHQ==", + "dev": true, + "requires": { + "@jest/console": "^26.3.0", + "@jest/environment": "^26.3.0", + "@jest/fake-timers": "^26.3.0", + "@jest/globals": "^26.4.2", + "@jest/source-map": "^26.3.0", + "@jest/test-result": "^26.3.0", + "@jest/transform": "^26.3.0", + "@jest/types": "^26.3.0", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-config": "^26.4.2", + "jest-haste-map": "^26.3.0", + "jest-message-util": "^26.3.0", + "jest-mock": "^26.3.0", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.4.0", + "jest-snapshot": "^26.4.2", + "jest-util": "^26.3.0", + "jest-validate": "^26.4.2", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.3.1" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "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" + } + }, + "@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": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "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 + }, + "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 + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "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.3.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.3.0.tgz", + "integrity": "sha512-IDRBQBLPlKa4flg77fqg0n/pH87tcRKwe8zxOVTWISxGpPHYkRZ1dXKyh04JOja7gppc60+soKVZ791mruVdow==", + "dev": true, + "requires": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + } + }, + "jest-snapshot": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.4.2.tgz", + "integrity": "sha512-N6Uub8FccKlf5SBFnL2Ri/xofbaA68Cc3MGjP/NuwgnsvWh+9hLIR/DhrxbSiKXMY9vUW5dI6EW1eHaDHqe9sg==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0", + "@jest/types": "^26.3.0", + "@types/prettier": "^2.0.0", + "chalk": "^4.0.0", + "expect": "^26.4.2", + "graceful-fs": "^4.2.4", + "jest-diff": "^26.4.2", + "jest-get-type": "^26.3.0", + "jest-haste-map": "^26.3.0", + "jest-matcher-utils": "^26.4.2", + "jest-message-util": "^26.3.0", + "jest-resolve": "^26.4.0", + "natural-compare": "^1.4.0", + "pretty-format": "^26.4.2", + "semver": "^7.3.2" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "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" + } + }, + "@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": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "diff-sequences": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.3.0.tgz", + "integrity": "sha512-5j5vdRcw3CNctePNYN0Wy2e/JbWT6cAYnXv5OuqPhDpyCGc0uLu2TK0zOCJWNB9kOIfYMSpIulRaDgIi4HJ6Ig==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-diff": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.4.2.tgz", + "integrity": "sha512-6T1XQY8U28WH0Z5rGpQ+VqZSZz8EN8rZcBtfvXaOkbwxIEeRre6qnuZQlbY1AJ4MKDxQF8EkrCvK+hL/VkyYLQ==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^26.3.0", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.4.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 + }, + "pretty-format": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.4.2.tgz", + "integrity": "sha512-zK6Gd8zDsEiVydOCGLkoBoZuqv8VTiHyAbKznXe/gaph/DAeZOmit9yMfgIz5adIgAMMs5XfoYSwAX3jcCO1tA==", + "dev": true, + "requires": { + "@jest/types": "^26.3.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-sonar-reporter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jest-sonar-reporter/-/jest-sonar-reporter-2.0.0.tgz", + "integrity": "sha512-ZervDCgEX5gdUbdtWsjdipLN3bKJwpxbvhkYNXTAYvAckCihobSLr9OT/IuyNIRT1EZMDDwR6DroWtrq+IL64w==", + "dev": true, + "requires": { + "xml": "^1.0.1" + } + }, + "jest-util": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.3.0.tgz", + "integrity": "sha512-4zpn6bwV0+AMFN0IYhH/wnzIQzRaYVrz1A8sYnRnj4UXDXbOVtWmlaZkO9mipFqZ13okIfN87aDoJWB7VH6hcw==", + "dev": true, + "requires": { + "@jest/types": "^26.3.0", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "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" + } + }, + "@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": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "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" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-validate": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.4.2.tgz", + "integrity": "sha512-blft+xDX7XXghfhY0mrsBCYhX365n8K5wNDC4XAcNKqqjEzsRUSXP44m6PL0QJEW2crxQFLLztVnJ4j7oPlQrQ==", + "dev": true, + "requires": { + "@jest/types": "^26.3.0", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "leven": "^3.1.0", + "pretty-format": "^26.4.2" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "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" + } + }, + "@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": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "camelcase": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz", + "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==", + "dev": true + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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-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 + }, + "pretty-format": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.4.2.tgz", + "integrity": "sha512-zK6Gd8zDsEiVydOCGLkoBoZuqv8VTiHyAbKznXe/gaph/DAeZOmit9yMfgIz5adIgAMMs5XfoYSwAX3jcCO1tA==", + "dev": true, + "requires": { + "@jest/types": "^26.3.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-watcher": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.3.0.tgz", + "integrity": "sha512-XnLdKmyCGJ3VoF6G/p5ohbJ04q/vv5aH9ENI+i6BL0uu9WWB6Z7Z2lhQQk0d2AVZcRGp1yW+/TsoToMhBFPRdQ==", + "dev": true, + "requires": { + "@jest/test-result": "^26.3.0", + "@jest/types": "^26.3.0", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^26.3.0", + "string-length": "^4.0.1" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "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" + } + }, + "@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": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-worker": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.3.0.tgz", + "integrity": "sha512-Vmpn2F6IASefL+DVBhPzI2J9/GJUsqzomdeN+P+dK8/jKxbh8R3BtFnx3FIta7wYlPU62cpJMJQo4kuOowcMnw==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jhipster-core": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/jhipster-core/-/jhipster-core-7.3.4.tgz", + "integrity": "sha512-AUhT69kNkqppaJZVfan/xnKG4Gs9Ggj7YLtTZFVe+xg+THrbMb5Ng7PL07PDlDw4KAEA33GMCwuAf65E8EpC4g==", + "dev": true, + "requires": { + "chevrotain": "7.0.1", + "fs-extra": "8.1.0", + "lodash": "4.17.15", + "winston": "3.2.1" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + } + } + }, + "jmespath": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", + "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=", + "dev": true + }, + "js-object-pretty-print": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/js-object-pretty-print/-/js-object-pretty-print-0.3.0.tgz", + "integrity": "sha1-RnDkUAZu4ezPNRdMfRl/WqOLz3Q=", + "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==" + }, + "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 + }, + "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": { + "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" + } + }, + "ws": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", + "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==", + "dev": true + } + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, + "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.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.0.tgz", + "integrity": "sha512-o3aP+RsWDJZayj1SbHNQAI8x0v3T3SKiGoZlNYfbUP1S3omJQ6i9CnqADqkSPaOAxwua4/1YWx5CM7oiChJt2Q==", + "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-schema-typed": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.3.tgz", + "integrity": "sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==", + "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 + }, + "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": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "requires": { + "minimist": "^1.2.5" + } + }, + "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" + } + }, + "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 + }, + "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": "1.0.1", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-1.0.1.tgz", + "integrity": "sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ==", + "dev": true, + "requires": { + "colornames": "^1.1.1" + } + }, + "last-call-webpack-plugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", + "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", + "dev": true, + "requires": { + "lodash": "^4.17.5", + "webpack-sources": "^1.1.0" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "dev": true, + "requires": { + "set-getter": "^0.1.0" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "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 + }, + "levenary": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", + "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", + "dev": true, + "requires": { + "leven": "^3.1.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "limiter": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", + "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==", + "dev": true + }, + "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 + }, + "lint-staged": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-8.2.1.tgz", + "integrity": "sha512-n0tDGR/rTCgQNwXnUf/eWIpPNddGWxC32ANTNYsj2k02iZb7Cz5ox2tytwBu+2r0zDXMEMKw7Y9OD/qsav561A==", + "dev": true, + "requires": { + "chalk": "^2.3.1", + "commander": "^2.14.1", + "cosmiconfig": "^5.2.0", + "debug": "^3.1.0", + "dedent": "^0.7.0", + "del": "^3.0.0", + "execa": "^1.0.0", + "g-status": "^2.0.2", + "is-glob": "^4.0.0", + "is-windows": "^1.0.2", + "listr": "^0.14.2", + "listr-update-renderer": "^0.5.0", + "lodash": "^4.17.11", + "log-symbols": "^2.2.0", + "micromatch": "^3.1.8", + "npm-which": "^3.0.1", + "p-map": "^1.1.1", + "path-is-inside": "^1.0.2", + "pify": "^3.0.0", + "please-upgrade-node": "^3.0.2", + "staged-git-files": "1.1.2", + "string-argv": "^0.0.2", + "stringify-object": "^3.2.2", + "yup": "^0.27.0" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "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" + } + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true + }, + "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" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "listr": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz", + "integrity": "sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==", + "dev": true, + "requires": { + "@samverschueren/stream-to-observable": "^0.3.0", + "is-observable": "^1.1.0", + "is-promise": "^2.1.0", + "is-stream": "^1.1.0", + "listr-silent-renderer": "^1.1.1", + "listr-update-renderer": "^0.5.0", + "listr-verbose-renderer": "^0.5.0", + "p-map": "^2.0.0", + "rxjs": "^6.3.3" + }, + "dependencies": { + "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 + } + } + }, + "listr-silent-renderer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", + "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=", + "dev": true + }, + "listr-update-renderer": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz", + "integrity": "sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "cli-truncate": "^0.2.1", + "elegant-spinner": "^1.0.1", + "figures": "^1.7.0", + "indent-string": "^3.0.0", + "log-symbols": "^1.0.2", + "log-update": "^2.3.0", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "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" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "dev": true, + "requires": { + "chalk": "^1.0.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" + } + }, + "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 + } + } + }, + "listr-verbose-renderer": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz", + "integrity": "sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "cli-cursor": "^2.1.0", + "date-fns": "^1.27.2", + "figures": "^2.0.0" + }, + "dependencies": { + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + } + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "localtunnel": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-1.9.2.tgz", + "integrity": "sha512-NEKF7bDJE9U3xzJu3kbayF0WTvng6Pww7tzqNb/XtEARYwqw7CKEX7BvOMg98FtE9es2CRizl61gkV3hS8dqYg==", + "dev": true, + "requires": { + "axios": "0.19.0", + "debug": "4.1.1", + "openurl": "1.1.1", + "yargs": "6.6.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "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 + }, + "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" + } + }, + "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" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^4.2.0" + } + }, + "yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "dev": true, + "requires": { + "camelcase": "^3.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==", + "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._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=", + "dev": true + }, + "lodash.isfinite": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", + "integrity": "sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=", + "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.pad": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz", + "integrity": "sha1-QzCUmoM6fI2iLMIPaibE1Z3runA=", + "dev": true + }, + "lodash.padend": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", + "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=", + "dev": true + }, + "lodash.padstart": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz", + "integrity": "sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs=", + "dev": true + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "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" + } + }, + "log-update": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz", + "integrity": "sha1-iDKP19HOeTiykoN0bwsbwSayRwg=", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "cli-cursor": "^2.0.0", + "wrap-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "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 + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "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" + } + }, + "wrap-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", + "integrity": "sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo=", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0" + } + } + } + }, + "logform": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.2.0.tgz", + "integrity": "sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg==", + "dev": true, + "requires": { + "colors": "^1.2.1", + "fast-safe-stringify": "^2.0.4", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "triple-beam": "^1.3.0" + } + }, + "loglevel": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.8.tgz", + "integrity": "sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA==", + "dev": true + }, + "loose-envify": { + "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" + } + }, + "lower-case": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz", + "integrity": "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==", + "dev": true, + "requires": { + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + } + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "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" + } + }, + "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 + }, + "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": { + "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" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "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-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-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz", + "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==", + "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" + } + }, + "matcher": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-1.1.1.tgz", + "integrity": "sha512-+BmqxWIubKTRKNWx/ahnCkk3mG8m7OturVlqq6HiojGJTd5hVYbgZm6WzcYPCoB+KBT4Vd6R7WSRG2OADNaCjg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.4" + } + }, + "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": "5.1.1", + "resolved": "https://registry.npmjs.org/mem/-/mem-5.1.1.tgz", + "integrity": "sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.3", + "mimic-fn": "^2.1.0", + "p-is-promise": "^2.1.0" + } + }, + "mem-fs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mem-fs/-/mem-fs-1.2.0.tgz", + "integrity": "sha512-b8g0jWKdl8pM0LqAPdK9i8ERL7nYrzmJfRhxMiWH2uYdfYnb7uXnmwVb0ZGe7xyEl4lj+nLIU3yf4zPUT+XsVQ==", + "dev": true, + "requires": { + "through2": "^3.0.0", + "vinyl": "^2.0.1", + "vinyl-file": "^3.0.0" + }, + "dependencies": { + "through2": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "2 || 3" + } + } + } + }, + "mem-fs-editor": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/mem-fs-editor/-/mem-fs-editor-6.0.0.tgz", + "integrity": "sha512-e0WfJAMm8Gv1mP5fEq/Blzy6Lt1VbLg7gNnZmZak7nhrBTibs+c6nQ4SKs/ZyJYHS1mFgDJeopsLAv7Ow0FMFg==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "deep-extend": "^0.6.0", + "ejs": "^2.6.1", + "glob": "^7.1.4", + "globby": "^9.2.0", + "isbinaryfile": "^4.0.0", + "mkdirp": "^0.5.0", + "multimatch": "^4.0.0", + "rimraf": "^2.6.3", + "through2": "^3.0.1", + "vinyl": "^2.2.0" + }, + "dependencies": { + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "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" + } + }, + "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" + } + }, + "ejs": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", + "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", + "dev": true + }, + "fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "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" + } + } + } + }, + "globby": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", + "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^1.0.2", + "dir-glob": "^2.2.2", + "fast-glob": "^2.2.6", + "glob": "^7.1.3", + "ignore": "^4.0.3", + "pify": "^4.0.1", + "slash": "^2.0.0" + } + }, + "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 + }, + "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 + } + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "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" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "through2": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "2 || 3" + } + } + } + }, + "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" + } + }, + "meow": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-6.1.0.tgz", + "integrity": "sha512-iIAoeI01v6pmSfObAAWFoITAA4GgiT45m4SmJgoxtZfvI0fyZwhV4d0lTwiUXvAKIPlma05Feb2Xngl52Mj5Cg==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.1.1", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.0.0", + "minimist-options": "^4.0.1", + "normalize-package-data": "^2.5.0", + "read-pkg-up": "^7.0.0", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.8.1", + "yargs-parser": "^18.1.1" + }, + "dependencies": { + "parse-json": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.1.tgz", + "integrity": "sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "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" + } + }, + "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 + } + } + }, + "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-jsons-webpack-plugin": { + "version": "1.0.21", + "resolved": "https://registry.npmjs.org/merge-jsons-webpack-plugin/-/merge-jsons-webpack-plugin-1.0.21.tgz", + "integrity": "sha512-5Brw0DBi7tF48gm3BB21hu3qYWUMHuKWHKNqdZYmGTQlZQFTc63VFY/5LgonqusI/b0uvvjkpTdx1WrjInXreQ==", + "dev": true, + "requires": { + "es6-promise": "4.0.5", + "glob": "7.1.1" + }, + "dependencies": { + "es6-promise": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.0.5.tgz", + "integrity": "sha1-eILzCt3lskDM+n99eMVIMwlRrkI=", + "dev": true + }, + "glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "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=", + "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.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "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 + }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, + "mini-css-extract-plugin": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", + "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.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" + } + }, + "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" + } + } + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "dependencies": { + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + } + } + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + }, + "dependencies": { + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "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" + }, + "dependencies": { + "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-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" + }, + "dependencies": { + "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-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" + }, + "dependencies": { + "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" + } + } + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "dev": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mitt": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", + "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==", + "dev": true + }, + "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" + } + }, + "moment": { + "version": "2.27.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz", + "integrity": "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ==" + }, + "moment-locales-webpack-plugin": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/moment-locales-webpack-plugin/-/moment-locales-webpack-plugin-1.2.0.tgz", + "integrity": "sha512-QAi5v0OlPUP7GXviKMtxnpBAo8WmTHrUNN7iciAhNOEAd9evCOvuN0g1N7ThIg3q11GLCkjY1zQ2saRcf/43nQ==", + "dev": true, + "requires": { + "lodash.difference": "^4.5.0" + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "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==" + }, + "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 + }, + "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 + }, + "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 + }, + "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 + }, + "ng-jhipster": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/ng-jhipster/-/ng-jhipster-0.14.0.tgz", + "integrity": "sha512-f6S8gkGLVOLYcODykhhgGkqY3zTO/VIc2oavvkN8pg7BAqIwj7gkLjrPnYTF4IDH9taSDkkD+Oizp4XLPEEc4A==", + "requires": { + "tslib": "^2.0.0" + } + }, + "ngx-cookie-service": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/ngx-cookie-service/-/ngx-cookie-service-3.0.4.tgz", + "integrity": "sha512-g4KHpCWL2EtKatWqn8lz/DdyMQO8sDS7BNwCSvxF1ETTW5DPJnbdEwCjSdm84MmfqBh6JdgvoQd//rOxH5EbgQ==" + }, + "ngx-infinite-scroll": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/ngx-infinite-scroll/-/ngx-infinite-scroll-9.0.0.tgz", + "integrity": "sha512-C8JhvrTip/AKv6f8oiB+GJjW+FGE3EPIc3Kk+v3MICGlW0nkOetyJDe/ejXr8tI8zwbNjbfvAKFRKenibDIW6w==", + "requires": { + "@scarf/scarf": "0.1.5", + "opencollective-postinstall": "^2.0.2" + } + }, + "ngx-webstorage": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ngx-webstorage/-/ngx-webstorage-5.0.0.tgz", + "integrity": "sha512-m96dBjUgLCpaknLRKfsJMEik393xrSX0EwO3paNSkS5d+xj2/cAendE3NwJeKY/W1D9EkKAhCvSUDX9/bAwCUg==" + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "no-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz", + "integrity": "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==", + "dev": true, + "requires": { + "lower-case": "^2.0.1", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "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.9.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", + "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==", + "dev": true + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "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": { + "events": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", + "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "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 + } + } + } + } + }, + "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.0", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.0.tgz", + "integrity": "sha512-46z7DUmcjoYdaWyXouuFNNfUo6eFa94t23c53c+lG/9Cvauk4a98rAUp9672X5dxGdQmLpPzTxzu8f/OeEPaFA==", + "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.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true, + "optional": true + }, + "uuid": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==", + "dev": true, + "optional": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "optional": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "node-releases": { + "version": "1.1.60", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.60.tgz", + "integrity": "sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA==", + "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 + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + }, + "npm-api": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/npm-api/-/npm-api-1.0.0.tgz", + "integrity": "sha512-gtJhIhGq07g9H5sIAB9TZzTySW8MYtcYqg+e+J+5q1GmDsDLLVfyvVBL1VklzjtRsElph11GUtLBS191RDOJxQ==", + "dev": true, + "requires": { + "JSONStream": "^1.3.5", + "clone-deep": "^4.0.1", + "download-stats": "^0.3.4", + "moment": "^2.24.0", + "paged-request": "^2.0.1", + "request": "^2.88.0" + } + }, + "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-install-checks": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz", + "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==", + "dev": true, + "requires": { + "semver": "^7.1.1" + }, + "dependencies": { + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + } + } + }, + "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": "8.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.0.1.tgz", + "integrity": "sha512-/h5Fm6a/exByzFSTm7jAyHbgOqErl9qSNJDQF32Si/ZzgwT2TERVxRxn3Jurw1wflgyVVAxnFR4fRHPM7y1ClQ==", + "dev": true, + "requires": { + "hosted-git-info": "^3.0.2", + "semver": "^7.0.0", + "validate-npm-package-name": "^3.0.0" + }, + "dependencies": { + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "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-path": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/npm-path/-/npm-path-2.0.4.tgz", + "integrity": "sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw==", + "dev": true, + "requires": { + "which": "^1.2.10" + } + }, + "npm-pick-manifest": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.0.tgz", + "integrity": "sha512-ygs4k6f54ZxJXrzT0x34NybRlLeZ4+6nECAIbr2i0foTnijtS1TJiyzpqtuUAJOps/hO0tNDr8fRV5g+BtRlTw==", + "dev": true, + "requires": { + "npm-install-checks": "^4.0.0", + "npm-package-arg": "^8.0.0", + "semver": "^7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "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": { + "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 + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "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" + } + }, + "npm-which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-which/-/npm-which-3.0.1.tgz", + "integrity": "sha1-kiXybsOihcIJyuZ8OxGmtKtxQKo=", + "dev": true, + "requires": { + "commander": "^2.9.0", + "npm-path": "^2.0.2", + "which": "^1.2.10" + } + }, + "npmlog": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-2.0.4.tgz", + "integrity": "sha1-mLUlMPJRTKkNCexbIsiEZyI3VpI=", + "dev": true, + "requires": { + "ansi": "~0.3.1", + "are-we-there-yet": "~1.1.2", + "gauge": "~1.2.5" + } + }, + "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 + }, + "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=", + "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-hash": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.0.3.tgz", + "integrity": "sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg==", + "dev": true + }, + "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.2", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", + "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-path": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.9.2.tgz", + "integrity": "sha1-D9mnT8X60a45aLWGvaXGMr1sBaU=", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.getownpropertydescriptors": { + "version": "2.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=", + "requires": { + "wrappy": "1" + } + }, + "one-time": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz", + "integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4=", + "dev": true + }, + "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.4", + "resolved": "https://registry.npmjs.org/open/-/open-7.0.4.tgz", + "integrity": "sha512-brSA+/yq+b08Hsr4c8fsEW2CRzk1BmfN3SAK/5VCHQ9bdoZJ4qa/+AfR0xHjlbbZUyPkUHs1b8x1RqdyZdkVqQ==", + "dev": true, + "requires": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + } + }, + "opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==" + }, + "opener": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", + "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==", + "dev": true + }, + "openurl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", + "integrity": "sha1-OHW0sO96UsFW8NtB1GCduw+Us4c=", + "dev": true + }, + "opn": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", + "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", + "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 + } + } + }, + "optimize-css-assets-webpack-plugin": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz", + "integrity": "sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA==", + "dev": true, + "requires": { + "cssnano": "^4.1.10", + "last-call-webpack-plugin": "^3.0.0" + } + }, + "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" + } + }, + "ora": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/ora/-/ora-4.0.4.tgz", + "integrity": "sha512-77iGeVU1cIdRhgFzCK8aw1fbtT1B/iZAvWjS+l/o1x0RShMgxHUZaD2yDpWsNCPwXg9z1ZA78Kbdvr8kBmG/Ww==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.2.0", + "is-interactive": "^1.0.0", + "log-symbols": "^3.0.0", + "mute-stream": "0.0.8", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "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" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "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": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "os-name": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz", + "integrity": "sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg==", + "dev": true, + "requires": { + "macos-release": "^2.2.0", + "windows-release": "^3.1.0" + } + }, + "os-shim": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz", + "integrity": "sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc=", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "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-each-series": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", + "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==", + "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==", + "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-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "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" + }, + "dependencies": { + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + } + } + }, + "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==" + }, + "pacote": { + "version": "9.5.12", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.12.tgz", + "integrity": "sha512-BUIj/4kKbwWg4RtnBncXPJd15piFSVNpTzY0rysSr3VnMowTYgkGKcaHrbReepAkjTr8lH2CVWRi58Spg2CicQ==", + "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-normalize-package-bin": "^1.0.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": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "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 + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "paged-request": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/paged-request/-/paged-request-2.0.1.tgz", + "integrity": "sha512-C0bB/PFk9rQskD1YEiz7uuchzqKDQGgdsEHN1ahify0UUWzgmMK4NDG9fhlQg2waogmNFwEvEeHfMRvJySpdVw==", + "dev": true, + "requires": { + "axios": "^0.18.0" + }, + "dependencies": { + "axios": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.1.tgz", + "integrity": "sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==", + "dev": true, + "requires": { + "follow-redirects": "1.5.10", + "is-buffer": "^2.0.2" + } + }, + "is-buffer": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", + "dev": true + } + } + }, + "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" + } + }, + "param-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.3.tgz", + "integrity": "sha512-VWBVyimc1+QrzappRs7waeN2YmoZFCGXWASRYX1/rGHtXqEcrGEIDm+jqIwFa2fRXNgQEwrxaYuIrX0WcAguTA==", + "dev": true, + "requires": { + "dot-case": "^3.0.3", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + } + } + }, + "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" + } + }, + "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-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha1-juqz5U+laSD+Fro493+iGqzC104=", + "dev": true + }, + "parse-gitignore": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-gitignore/-/parse-gitignore-1.0.1.tgz", + "integrity": "sha512-UGyowyjtx26n65kdAMWhm6/3uy5uSrpcuH7tt+QEVudiBoVS+eqHxD5kbi9oWVRwj7sCzXqwuM+rUGw7earl6A==", + "dev": true + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "parse-srcset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz", + "integrity": "sha1-8r0iH2zJcKk42IVWq8WJyqqiveE=", + "dev": true + }, + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "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 + }, + "pascal-case": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.1.tgz", + "integrity": "sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA==", + "dev": true, + "requires": { + "no-case": "^3.0.3", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "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": "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-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==" + }, + "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": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "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": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "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" + } + }, + "pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "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" + } + }, + "plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "dev": true, + "requires": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + }, + "dependencies": { + "ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "requires": { + "ansi-wrap": "^0.1.0" + } + } + } + }, + "pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true + }, + "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": { + "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" + } + }, + "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" + } + } + } + }, + "portscanner": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.1.1.tgz", + "integrity": "sha1-6rtAnk3iSVD1oqUW01rnaTQ/u5Y=", + "dev": true, + "requires": { + "async": "1.5.2", + "is-number-like": "^1.0.3" + } + }, + "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.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "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.3", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.3.tgz", + "integrity": "sha512-IB/EAEmZhIMEIhG7Ov4x+l47UaXOS1n2f4FBUk/aKllQhtSCxWhTzn0nJgkqN7fo/jcWySvWTSB6Syk9L+31bA==", + "dev": true, + "requires": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + } + }, + "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-load-config": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", + "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "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" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "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" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.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" + } + }, + "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" + } + } + } + }, + "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-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "dev": true, + "requires": { + "postcss": "^7.0.5" + } + }, + "postcss-modules-local-by-default": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", + "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", + "dev": true, + "requires": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.32", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "dev": true, + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + } + }, + "postcss-modules-values": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "dev": true, + "requires": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + } + }, + "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": { + "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 + }, + "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.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "postcss-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 + }, + "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 + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "prettier": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.5.tgz", + "integrity": "sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==", + "dev": true + }, + "prettier-plugin-java": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/prettier-plugin-java/-/prettier-plugin-java-0.8.0.tgz", + "integrity": "sha512-+4qdhUfFQIj4bLGSDrAGmUZKXQRjJYpQFbmRh04atEZe7QEZUF6NHVyRjJ73Cgwhc5NaiyIpFhtcXgLf9J9V6A==", + "dev": true, + "requires": { + "java-parser": "^0.8.0", + "lodash": "4.17.15", + "prettier": "2.0.4" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "prettier": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.4.tgz", + "integrity": "sha512-SVJIQ51spzFDvh4fIbCLvciiDMCrRhlN3mbZvv/+ycjvmF5E73bKdGfU8QDLNmjYJf+lsGnDBC4UUnvTe5OO0w==", + "dev": true + } + } + }, + "pretty-bytes": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.3.0.tgz", + "integrity": "sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg==", + "dev": true + }, + "pretty-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", + "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "dev": true, + "requires": { + "renderkid": "^2.0.1", + "utila": "~0.4" + } + }, + "pretty-format": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, + "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 + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "promise": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", + "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", + "dev": true, + "requires": { + "asap": "~2.0.6" + } + }, + "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" + } + }, + "prompts": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", + "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.4" + } + }, + "property-expr": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-1.5.1.tgz", + "integrity": "sha512-CGuc0VUTGthpJXL36ydB6jnbyOf/rAHFvmVrJlH+Rg0DqqLFQGAP6hIaxD/G0OAmBJPhXDHuEJigrp0e0wFV6g==", + "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" + } + }, + "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 + }, + "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 + }, + "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 + }, + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true + }, + "randexp": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.5.3.tgz", + "integrity": "sha512-U+5l2KrcMNOUPYvazA3h5ekF80FHTUG+87SEAmHZmolh1M+i/WyTCxVzmi+tidIa1tM4BSe8g2Y/D3loWDjj+w==", + "dev": true, + "requires": { + "drange": "^1.0.2", + "ret": "^0.2.0" + }, + "dependencies": { + "ret": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz", + "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==", + "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.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", + "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.3", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "read-chunk": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-3.2.0.tgz", + "integrity": "sha512-CEjy9LCzhmD7nUpJ1oVOE6s/hBkejlcJEgLQHVnQznOSilOPb+kpKktlLfFDK3/WP43+F80xkUTM2VOkYoSYvQ==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "with-open-file": "^0.1.6" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "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" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.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.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "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" + } + }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", + "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.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.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "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-to-ast": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz", + "integrity": "sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==", + "dev": true + }, + "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" + } + }, + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + }, + "regexpu-core": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", + "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.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 + } + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "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 + }, + "renderkid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz", + "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", + "dev": true, + "requires": { + "css-select": "^1.1.0", + "dom-converter": "^0.2", + "htmlparser2": "^3.3.0", + "strip-ansi": "^3.0.0", + "utila": "^0.4.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "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.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", + "dev": true + }, + "entities": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", + "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", + "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 + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "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" + } + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "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" + } + }, + "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" + } + } + } + }, + "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 + }, + "replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "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": { + "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" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "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.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "requires": { + "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-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "dependencies": { + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + } + } + }, + "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 + }, + "resp-modifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz", + "integrity": "sha1-sSTeXE+6/LpUH0j/pzlw9KpFa08=", + "dev": true, + "requires": { + "debug": "^2.2.0", + "minimatch": "^3.0.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 + } + } + }, + "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.10.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", + "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", + "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 + }, + "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.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "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.32.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.32.1.tgz", + "integrity": "sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/node": "*", + "acorn": "^7.1.0" + } + }, + "rollup-plugin-babel": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-4.4.0.tgz", + "integrity": "sha512-Lek/TYp1+7g7I+uMfJnnSJ7YWoD58ajo6Oarhlex7lvUce+RCKRuGRSgztDO3/MF/PuGKmUL5iTHKf208UNszw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "rollup-pluginutils": "^2.8.1" + } + }, + "rollup-plugin-terser": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-5.3.0.tgz", + "integrity": "sha512-XGMJihTIO3eIBsVGq7jiNYOdDMb3pVxuzY0uhOE/FM4x/u9nQgr3+McsjzqBn3QfHIpNSZmFnpoKAwHBEcsT7g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "jest-worker": "^24.9.0", + "rollup-pluginutils": "^2.8.2", + "serialize-javascript": "^2.1.2", + "terser": "^4.6.2" + }, + "dependencies": { + "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" + } + }, + "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 + }, + "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" + } + } + } + }, + "rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dev": true, + "requires": { + "estree-walker": "^0.6.1" + }, + "dependencies": { + "estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true + } + } + }, + "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.9", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", + "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" + } + }, + "rx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", + "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", + "dev": true + }, + "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" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "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" + } + }, + "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" + } + } + } + }, + "sass": { + "version": "1.26.9", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.9.tgz", + "integrity": "sha512-t8AkRVi+xvba4yZiLWkJdgJHBFCB3Dh4johniQkPy9ywkgFHNasXFEFP+RG/F6LhQ+aoE4aX+IorIWQjS0esVw==", + "dev": true, + "requires": { + "chokidar": ">=2.0.0 <4.0.0" + } + }, + "sass-loader": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz", + "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "loader-utils": "^1.2.3", + "neo-async": "^2.6.1", + "schema-utils": "^2.6.1", + "semver": "^6.3.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.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" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=", + "dev": true + }, + "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" + } + }, + "scoped-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/scoped-regex/-/scoped-regex-1.0.0.tgz", + "integrity": "sha1-o0a7Gs1CB65wvXwMfKnlZra63bg=", + "dev": true + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selfsigned": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", + "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", + "dev": true, + "requires": { + "node-forge": "0.9.0" + } + }, + "semver": { + "version": "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-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" + } + }, + "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" + } + }, + "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.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "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.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.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" + } + }, + "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 + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", + "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-index": { + "version": "1.9.1", + "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 + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + } + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + } + }, + "server-destroy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", + "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-getter": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz", + "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=", + "dev": true, + "requires": { + "to-object-path": "^0.3.0" + } + }, + "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 + }, + "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 + }, + "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-git": { + "version": "1.132.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.132.0.tgz", + "integrity": "sha512-xauHm1YqCTom1sC9eOjfq3/9RKiUA9iPnxBbrY2DdL8l4ADMu0jjM5l5lphQP5YWNqAL2aXC/OeuQ76vHtW5fg==", + "dev": true, + "requires": { + "debug": "^4.0.1" + } + }, + "simple-progress-webpack-plugin": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/simple-progress-webpack-plugin/-/simple-progress-webpack-plugin-1.1.2.tgz", + "integrity": "sha512-bNQfb3qSqbtsfxg6d0dGechUUJH2lZqKG5+bj2aoJmEA0rSzcm+2JVfC2YgkDABfuGItZ/O5ttt6BssWZW4SNg==", + "dev": true, + "requires": { + "chalk": "2.3.x", + "figures": "2.0.x", + "log-update": "2.3.x" + }, + "dependencies": { + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + } + } + }, + "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 + } + } + }, + "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": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + } + } + }, + "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 + } + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "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" + } + }, + "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" + } + }, + "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" + } + } + } + }, + "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.3.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.0.tgz", + "integrity": "sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==", + "dev": true, + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "~4.1.0", + "engine.io-client": "~3.4.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.3.0", + "to-array": "0.1.4" + } + }, + "socket.io-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.0.tgz", + "integrity": "sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "isarray": "2.0.1" + }, + "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" + } + }, + "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.20", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz", + "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==", + "dev": true, + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.4.0", + "websocket-driver": "0.6.5" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } + } + }, + "sockjs-client": { + "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.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "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 + }, + "spawn-sync": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz", + "integrity": "sha1-sAeZVX63+wyDdsKdROih6mfldHY=", + "dev": true, + "requires": { + "concat-stream": "^1.4.7", + "os-shim": "^0.1.2" + } + }, + "spdx-correct": { + "version": "3.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.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, + "spdy": { + "version": "4.0.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" + } + } + } + }, + "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.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", + "dev": true + }, + "stack-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", + "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "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 + } + } + }, + "stackframe": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", + "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==", + "dev": true + }, + "staged-git-files": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/staged-git-files/-/staged-git-files-1.1.2.tgz", + "integrity": "sha512-0Eyrk6uXW6tg9PYkhi/V/J4zHp33aNyi2hOCmhFLqLTIhbgqWn5jlSzI+IU0VqrZq6+DbHcabQl/WP6P3BG0QA==", + "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.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + }, + "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 + }, + "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 + }, + "stream-throttle": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", + "integrity": "sha1-rdV8jXzHOoFjDTHNVdOWHPr7qcM=", + "dev": true, + "requires": { + "commander": "^2.2.0", + "limiter": "^1.0.5" + } + }, + "streamfilter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/streamfilter/-/streamfilter-3.0.0.tgz", + "integrity": "sha512-kvKNfXCmUyC8lAXSSHCIXBUlo/lhsLcCU/OmzACZYpRUdtKIH68xYhm/+HI15jFJYtNJGYtCgn2wmIiExY1VwA==", + "dev": true, + "requires": { + "readable-stream": "^3.0.6" + }, + "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" + } + } + } + }, + "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-argv": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.0.2.tgz", + "integrity": "sha1-2sMECGkMIfPDYwo/86BYd73L1zY=", + "dev": true + }, + "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" + } + }, + "string-template": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", + "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=", + "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==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "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" + } + }, + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, + "requires": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "dependencies": { + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "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==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-bom-buf": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-buf/-/strip-bom-buf-1.0.0.tgz", + "integrity": "sha1-HLRar1dTD0yvhsf3UXnSyaUd1XI=", + "dev": true, + "requires": { + "is-utf8": "^0.2.1" + } + }, + "strip-bom-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz", + "integrity": "sha1-+H217yYT9paKpUWr/h7HKLaoKco=", + "dev": true, + "requires": { + "first-chunk-stream": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "strip-comments": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz", + "integrity": "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==", + "dev": true, + "requires": { + "babel-extract-comments": "^1.0.0", + "babel-plugin-transform-object-rest-spread": "^6.26.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-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-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.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 + }, + "style-loader": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.2.1.tgz", + "integrity": "sha512-ByHSTQvHLkWE9Ir5+lGbVOXhxX10fbprhLvdg96wedFZb4NDekDPxVKv5Fwmio+QcMlkkNfuK+5W1peQ5CUhZg==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^2.6.6" + } + }, + "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" + } + } + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.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" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "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" + }, + "dependencies": { + "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-what": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.3.0.tgz", + "integrity": "sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg==", + "dev": true + }, + "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.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", + "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" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + } + } + }, + "swagger-ui-dist": { + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-3.25.1.tgz", + "integrity": "sha512-Sw/K95j1pT9TZtLKiHDEml7YqcXC9thTTQjxrvNgd9j1KzOIxpo/5lhHuUMAN/hxVAHetzmcBcQaBjywRXog8w==" + }, + "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 + }, + "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 + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "dev": true, + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "dev": true, + "requires": { + "get-port": "^3.1.0" + } + }, + "synchronous-promise": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/synchronous-promise/-/synchronous-promise-2.0.13.tgz", + "integrity": "sha512-R9N6uDkVsghHePKh1TEqbnLddO2IY25OcsksyFp/qBe7XYd0PVbKEWxhcdMhpLzE1I6skj5l4aEZ3CRxcbArlA==", + "dev": true + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.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 + }, + "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": "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" + } + } + } + }, + "tabtab": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tabtab/-/tabtab-2.2.2.tgz", + "integrity": "sha1-egR/FDsBC0y9MfhX6ClhUSy/ThQ=", + "dev": true, + "requires": { + "debug": "^2.2.0", + "inquirer": "^1.0.2", + "lodash.difference": "^4.5.0", + "lodash.uniq": "^4.5.0", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "npmlog": "^2.0.3", + "object-assign": "^4.1.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "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": "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" + } + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "^1.0.1" + } + }, + "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" + } + }, + "external-editor": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-1.1.1.tgz", + "integrity": "sha1-Etew24UPf/fnCBuvQAVwAGDEYAs=", + "dev": true, + "requires": { + "extend": "^3.0.0", + "spawn-sync": "^1.0.15", + "tmp": "^0.0.29" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, + "inquirer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-1.2.3.tgz", + "integrity": "sha1-TexvMvN+97sLLtPx0aXD9UUHSRg=", + "dev": true, + "requires": { + "ansi-escapes": "^1.1.0", + "chalk": "^1.0.0", + "cli-cursor": "^1.0.1", + "cli-width": "^2.0.0", + "external-editor": "^1.1.0", + "figures": "^1.3.5", + "lodash": "^4.3.0", + "mute-stream": "0.0.6", + "pinkie-promise": "^2.0.0", + "run-async": "^2.2.0", + "rx": "^4.1.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.0", + "through": "^2.3.6" + } + }, + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "mute-stream": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.6.tgz", + "integrity": "sha1-SJYrGeFp/R38JAs/HnMXYnu8R9s=", + "dev": true + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "^1.0.0", + "onetime": "^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" + } + }, + "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" + } + }, + "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 + }, + "tmp": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.29.tgz", + "integrity": "sha1-8lEl/w3Z2jzLDC3Tce4SiLuRKMA=", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.1" + } + } + } + }, + "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": { + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=", + "dev": true + }, + "tempy": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.3.0.tgz", + "integrity": "sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ==", + "dev": true, + "requires": { + "temp-dir": "^1.0.0", + "type-fest": "^0.3.1", + "unique-string": "^1.0.0" + }, + "dependencies": { + "type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "dev": true + } + } + }, + "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": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "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": "3.0.6", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-3.0.6.tgz", + "integrity": "sha512-z3HLOOPUHkCNGkeEHqqiMAIy1pjpHwS1o+i6Zn0Ws3EAvHJj46737efNNEvJ0Vx9BdDQM83d56qySDJOSORA0A==", + "dev": true, + "requires": { + "cacache": "^15.0.4", + "find-cache-dir": "^3.3.1", + "jest-worker": "^26.0.0", + "p-limit": "^3.0.1", + "schema-utils": "^2.6.6", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.8.0", + "webpack-sources": "^1.4.3" + }, + "dependencies": { + "cacache": { + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz", + "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==", + "dev": true, + "requires": { + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.0", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, + "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" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "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" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "p-limit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", + "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "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": "8.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz", + "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "tar": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.5.tgz", + "integrity": "sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + } + } + }, + "test": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/test/-/test-0.6.0.tgz", + "integrity": "sha1-WYasRF7Bd1QyJRLRBLoyyKY+k44=", + "dev": true, + "requires": { + "ansi-font": "0.0.2" + } + }, + "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" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "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==", + "dev": true + }, + "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 + }, + "textextensions": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-2.6.0.tgz", + "integrity": "sha512-49WtAWS+tcsy93dRt6P0P3AMD2m5PvXRhuEA0kaXos5ZLlujtYmpmFsB+QvWUSxE1ZsstmYXfQ7L40+EcQgpAQ==", + "dev": true + }, + "tfunk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tfunk/-/tfunk-3.1.0.tgz", + "integrity": "sha1-OORBT8ZJd9h6/apy+sttKfgve1s=", + "dev": true, + "requires": { + "chalk": "^1.1.1", + "object-path": "^0.9.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "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" + } + }, + "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" + } + }, + "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 + } + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "dev": true, + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.62", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.62.tgz", + "integrity": "sha512-76fupxOYVxk36kb7O/6KtrAPZ9jnSK3+qisAX4tQMEuGNdlvl7ycwatlHqjoE6jHfVtXFM3pCrCixZOidc5cuw==", + "dev": true + } + } + }, + "thread-loader": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/thread-loader/-/thread-loader-2.1.3.tgz", + "integrity": "sha512-wNrVKH2Lcf8ZrWxDF/khdlLlsTMczdcwPA9VEK4c2exlEPynYWxi9op3nPTo5lAnDIkE0rQEB3VBP+4Zncc9Hg==", + "dev": true, + "requires": { + "loader-runner": "^2.3.1", + "loader-utils": "^1.1.0", + "neo-async": "^2.6.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.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" + } + } + } + }, + "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 + }, + "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 + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, + "timers-browserify": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "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" + } + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "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=" + }, + "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" + } + }, + "to-string-loader": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/to-string-loader/-/to-string-loader-1.1.6.tgz", + "integrity": "sha512-VNg62//PS1WfNwrK3n7t6wtK5Vdtx/qeYLLEioW46VMlYUwAYT6wnfB+OwS2FMTCalIHu0tk79D3RXX8ttmZTQ==", + "dev": true, + "requires": { + "loader-utils": "^1.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.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" + } + } + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "toposort": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", + "integrity": "sha1-riF2gXXRVZ1IvvNUILL0li8JwzA=", + "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" + } + }, + "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" + } + }, + "trim-newlines": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz", + "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==", + "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==", + "dev": true + }, + "tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", + "dev": true + }, + "ts-jest": { + "version": "26.2.0", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.2.0.tgz", + "integrity": "sha512-9+y2qwzXdAImgLSYLXAb/Rhq9+K4rbt0417b8ai987V60g2uoNWBBmMkYgutI7D8Zhu+IbCSHbBtrHxB9d7xyA==", + "dev": true, + "requires": { + "@types/jest": "26.x", + "bs-logger": "0.x", + "buffer-from": "1.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "26.x", + "json5": "2.x", + "lodash.memoize": "4.x", + "make-error": "1.x", + "mkdirp": "1.x", + "semver": "7.x", + "yargs-parser": "18.x" + }, + "dependencies": { + "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.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + } + } + }, + "ts-loader": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-7.0.5.tgz", + "integrity": "sha512-zXypEIT6k3oTc+OZNx/cqElrsbBtYqDknf48OZos0NQ3RTt045fBIU8RRSu+suObBzYB355aIPGOe/3kj9h7Ig==", + "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": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.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" + } + }, + "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" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "tslib": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.0.tgz", + "integrity": "sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g==" + }, + "tslint": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.2.tgz", + "integrity": "sha512-UyNrLdK3E0fQG/xWNqAFAC5ugtFyPO4JJR1KyyfQAyzR8W0fTRrC91A8Wej4BntFzcvETdCSDa/4PnNYJQLYiA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^4.0.1", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.3", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.10.0", + "tsutils": "^2.29.0" + }, + "dependencies": { + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "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" + } + } + } + }, + "tsutils": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + } + } + }, + "tty-browserify": { + "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-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" + } + }, + "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==", + "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 + }, + "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" + } + }, + "typescript": { + "version": "3.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.5.tgz", + "integrity": "sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ==", + "dev": true + }, + "ua-parser-js": { + "version": "0.7.17", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz", + "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g==", + "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" + } + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, + "requires": { + "crypto-random-string": "^1.0.0" + } + }, + "universal-analytics": { + "version": "0.4.20", + "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.20.tgz", + "integrity": "sha512-gE91dtMvNkjO+kWsPstHRtSwHXz0l2axqptGYp5ceg4MsuurloM0PU3pdOfpb5zBXUvyjT4PwhWK2m39uczZuw==", + "dev": true, + "requires": { + "debug": "^3.0.0", + "request": "^2.88.0", + "uuid": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } + } + }, + "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 + } + } + }, + "untildify": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.3.tgz", + "integrity": "sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA==", + "dev": true + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "dev": true + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "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.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", + "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" + } + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "^1.0.1" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util-promisify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/util-promisify/-/util-promisify-2.1.0.tgz", + "integrity": "sha1-PCI2R2xNMsX/PEcAKt18E7moKlM=", + "dev": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "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": "8.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.1.0.tgz", + "integrity": "sha512-CI18flHDznR0lq54xBycOVmphdCYnQLKn8abKn7PXUiKUGdEd+/l9LWNJmugXel4hXq7S+RMNl34ecyC9TntWg==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", + "dev": true + }, + "v8-to-istanbul": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-5.0.1.tgz", + "integrity": "sha512-mbDNjuDajqYe3TXFk5qxcQy8L1msXNE37WTlLoqqpBfRsimbNcrlhQlDPntmECEcUvdC+AQ8CyMMf6EUx1r74Q==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "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 + } + } + }, + "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" + } + }, + "vinyl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", + "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + }, + "dependencies": { + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + } + } + }, + "vinyl-file": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-3.0.0.tgz", + "integrity": "sha1-sQTZ5ECf+jJfqt1SBkLQo7SIs2U=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.3.0", + "strip-bom-buf": "^1.0.0", + "strip-bom-stream": "^2.0.0", + "vinyl": "^2.0.1" + } + }, + "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 + }, + "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": "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 + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "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" + } + }, + "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": "4.43.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.43.0.tgz", + "integrity": "sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "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.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.6.1", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "acorn": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "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" + } + }, + "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" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.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": "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" + } + }, + "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" + } + }, + "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" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "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" + } + }, + "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 + }, + "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-bundle-analyzer": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.8.0.tgz", + "integrity": "sha512-PODQhAYVEourCcOuU+NiYI7WdR8QyELZGgPvB1y2tjbUpbmcQOt5Q7jEK+ttd5se0KSBKD9SXHCEozS++Wllmw==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1", + "bfj": "^6.1.1", + "chalk": "^2.4.1", + "commander": "^2.18.0", + "ejs": "^2.6.1", + "express": "^4.16.3", + "filesize": "^3.6.1", + "gzip-size": "^5.0.0", + "lodash": "^4.17.15", + "mkdirp": "^0.5.1", + "opener": "^1.5.1", + "ws": "^6.0.0" + }, + "dependencies": { + "ejs": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", + "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", + "dev": true + } + } + }, + "webpack-cli": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", + "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "cross-spawn": "^6.0.5", + "enhanced-resolve": "^4.1.1", + "findup-sync": "^3.0.0", + "global-modules": "^2.0.0", + "import-local": "^2.0.0", + "interpret": "^1.4.0", + "loader-utils": "^1.4.0", + "supports-color": "^6.1.0", + "v8-compile-cache": "^2.1.1", + "yargs": "^13.3.2" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "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" + } + }, + "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 + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.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": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "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" + } + }, + "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 + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "supports-color": { + "version": "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" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "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.11.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz", + "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "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.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.7", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "0.3.20", + "sockjs-client": "1.4.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "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" + } + } + } + }, + "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" + } + }, + "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" + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "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" + } + } + } + }, + "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" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "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" + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "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 + } + } + }, + "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" + } + }, + "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-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-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" + } + }, + "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-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "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" + } + }, + "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" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + }, + "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 + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "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 + }, + "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" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "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" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "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" + } + }, + "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" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "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" + } + } + } + }, + "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" + } + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "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" + }, + "dependencies": { + "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 + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } + } + }, + "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-notifier": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/webpack-notifier/-/webpack-notifier-1.8.0.tgz", + "integrity": "sha512-I6t76NoPe5DZCCm5geELmDV2wlJ89LbU425uN6T2FG8Ywrrt1ZcUMz6g8yWGNg4pttqTPFQJYUPjWAlzUEQ+cQ==", + "dev": true, + "requires": { + "node-notifier": "^5.1.2", + "object-assign": "^4.1.0", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "node-notifier": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", + "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", + "dev": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^1.1.0", + "semver": "^5.5.0", + "shellwords": "^0.1.1", + "which": "^1.3.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" + } + } + } + }, + "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 + } + } + }, + "websocket-driver": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", + "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", + "dev": true, + "requires": { + "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 + }, + "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" + }, + "dependencies": { + "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" + } + } + } + }, + "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.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.1.0.tgz", + "integrity": "sha512-vEIkwNi9Hqt4TV9RdnaBPNt+E2Sgmo3gePebCRgZ1R7g6d23+53zCTnuB0amKI4AXq6VM8jj2DUAa0S1vjJxkw==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^2.0.2", + "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 + } + } + }, + "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=" + }, + "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 + }, + "window-size": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", + "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=", + "dev": true + }, + "windows-release": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.3.3.tgz", + "integrity": "sha512-OSOGH1QYiW5yVor9TtmXKQvt2vjQqbYS+DqmsZw+r7xDwLXEeT3JGW0ZppFmHx4diyXmxt238KFR3N9jzevBRg==", + "dev": true, + "requires": { + "execa": "^1.0.0" + } + }, + "winston": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.2.1.tgz", + "integrity": "sha512-zU6vgnS9dAWCEKg/QYigd6cgMVVNwyTzKs81XZtTFuRwJOcDdBg7AU0mXVyNbs7O5RH2zdv+BdNZUlx7mXPuOw==", + "dev": true, + "requires": { + "async": "^2.6.1", + "diagnostics": "^1.1.1", + "is-stream": "^1.1.0", + "logform": "^2.1.1", + "one-time": "0.0.4", + "readable-stream": "^3.1.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.3.0" + }, + "dependencies": { + "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" + } + }, + "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" + } + } + } + }, + "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==", + "dev": true, + "requires": { + "readable-stream": "^2.3.7", + "triple-beam": "^1.2.0" + } + }, + "with-open-file": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/with-open-file/-/with-open-file-0.1.7.tgz", + "integrity": "sha512-ecJS2/oHtESJ1t3ZfMI3B7KIDKyfN0O16miWxdn30zdh66Yd3LsRFebXZXq6GU4xfxLf6nVxp9kIqElb5fqczA==", + "dev": true, + "requires": { + "p-finally": "^1.0.0", + "p-try": "^2.1.0", + "pify": "^4.0.1" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, + "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 + }, + "workbox-background-sync": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-5.1.3.tgz", + "integrity": "sha512-V/R95aPxYjbKCaVzUTihrZ9ObGOnzoA5n60r0DQ747p8Pj15/dDTYixonKhhlvavTiNezUrp+wTQBvZvcd/ETA==", + "dev": true, + "requires": { + "workbox-core": "^5.1.3" + } + }, + "workbox-broadcast-update": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-5.1.3.tgz", + "integrity": "sha512-HJ7FDmgweRcYp8fMiFbkmhaTjMYhMByURe5+TempnCi7cT5NNbyaG4T+rg8NWYxAeumSAB3JQF6XD/z34vRRHA==", + "dev": true, + "requires": { + "workbox-core": "^5.1.3" + } + }, + "workbox-build": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-5.1.3.tgz", + "integrity": "sha512-cssa2cKAi/FNp2P2m2DjF/UsXlVX6b1HgkXOjBTraFkIeyZEKxN1F1DnxOpGkdM/bPPRa7y5OmUvjOpgOd9apA==", + "dev": true, + "requires": { + "@babel/core": "^7.8.4", + "@babel/preset-env": "^7.8.4", + "@babel/runtime": "^7.8.4", + "@hapi/joi": "^15.1.0", + "@rollup/plugin-node-resolve": "^7.1.1", + "@rollup/plugin-replace": "^2.3.1", + "@surma/rollup-plugin-off-main-thread": "^1.1.1", + "common-tags": "^1.8.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^8.1.0", + "glob": "^7.1.6", + "lodash.template": "^4.5.0", + "pretty-bytes": "^5.3.0", + "rollup": "^1.31.1", + "rollup-plugin-babel": "^4.3.3", + "rollup-plugin-terser": "^5.2.0", + "source-map": "^0.7.3", + "source-map-url": "^0.4.0", + "stringify-object": "^3.3.0", + "strip-comments": "^1.0.2", + "tempy": "^0.3.0", + "upath": "^1.2.0", + "workbox-background-sync": "^5.1.3", + "workbox-broadcast-update": "^5.1.3", + "workbox-cacheable-response": "^5.1.3", + "workbox-core": "^5.1.3", + "workbox-expiration": "^5.1.3", + "workbox-google-analytics": "^5.1.3", + "workbox-navigation-preload": "^5.1.3", + "workbox-precaching": "^5.1.3", + "workbox-range-requests": "^5.1.3", + "workbox-routing": "^5.1.3", + "workbox-strategies": "^5.1.3", + "workbox-streams": "^5.1.3", + "workbox-sw": "^5.1.3", + "workbox-window": "^5.1.3" + }, + "dependencies": { + "@babel/core": { + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.4.tgz", + "integrity": "sha512-5deljj5HlqRXN+5oJTY7Zs37iH3z3b++KjiKtIsJy1NrjOOVSEaJHEetLBhyu0aQOSNNZ/0IuEAan9GzRuDXHg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.4", + "@babel/helper-module-transforms": "^7.11.0", + "@babel/helpers": "^7.10.4", + "@babel/parser": "^7.11.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.11.0", + "@babel/types": "^7.11.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "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 + } + } + }, + "workbox-cacheable-response": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-5.1.3.tgz", + "integrity": "sha512-lOJEwK2T4KWFNdhRFUKxTPBIO5hIYm9E/nYgMq5h/IH3iHPHlBPuFwRMaQy+TTCGWWTA85NomQOjVw1bj65RLw==", + "dev": true, + "requires": { + "workbox-core": "^5.1.3" + } + }, + "workbox-core": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-5.1.3.tgz", + "integrity": "sha512-TFSIPxxciX9sFaj0FDiohBeIKpwMcCyNduydi9i3LChItcndDS6TJpErxybv8aBWeCMraXt33TWtF6kKuIObNw==", + "dev": true + }, + "workbox-expiration": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-5.1.3.tgz", + "integrity": "sha512-8YhpmIHqIx+xmtxONADc+di4a3zzCsvVHLiKq6T3vJZUPnqV2jzx+51+UHMUh3T5w5Z5SFC14l0V/jesRbuMKg==", + "dev": true, + "requires": { + "workbox-core": "^5.1.3" + } + }, + "workbox-google-analytics": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-5.1.3.tgz", + "integrity": "sha512-ouK6xIJa+raFcO29TgwKFU/Hv1ejqSYzCzH9lI2B/4z/Wdnb8maL6mMIojQ8j5SohwKswMZmLDl0Az2PCmX11w==", + "dev": true, + "requires": { + "workbox-background-sync": "^5.1.3", + "workbox-core": "^5.1.3", + "workbox-routing": "^5.1.3", + "workbox-strategies": "^5.1.3" + } + }, + "workbox-navigation-preload": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-5.1.3.tgz", + "integrity": "sha512-29SPQMAccOgbq3BT9Gz7k+ydy0mcKKR0Rmkmd46tnujutiL4ooE57fBhwsA+c6OlLcYdisvilKlV2YWEtKWfgQ==", + "dev": true, + "requires": { + "workbox-core": "^5.1.3" + } + }, + "workbox-precaching": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-5.1.3.tgz", + "integrity": "sha512-9jjBiB00AOI0NnI320ddnhvlL3bjMrDoI3211kEaxcRWh0N2fX25uVn0O8N8u1gWY4tIfwZAn/DgtAU13cFhYA==", + "dev": true, + "requires": { + "workbox-core": "^5.1.3" + } + }, + "workbox-range-requests": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-5.1.3.tgz", + "integrity": "sha512-uUvEoyEUx86LJc7mtmy/6U8xuK0guXU2FnPimt17zDbsC8FSOaPxc92rxtD6xmDSYrI4FqIebypBCjgIe+sfxA==", + "dev": true, + "requires": { + "workbox-core": "^5.1.3" + } + }, + "workbox-routing": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-5.1.3.tgz", + "integrity": "sha512-F+sAp9Iy3lVl3BEG+pzXWVq4AftzjiFpHDaZ4Kf4vLoBoKQE0hIHet4zE5DpHqYdyw+Udhp4wrfHamX6PN6z1Q==", + "dev": true, + "requires": { + "workbox-core": "^5.1.3" + } + }, + "workbox-strategies": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-5.1.3.tgz", + "integrity": "sha512-wiXHfmOKnWABeIVW+/ye0e00+2CcS5y7SIj2f9zcdy2ZLEbcOf7B+yOl5OrWpBGlTUwRjIYhV++ZqiKm3Dc+8w==", + "dev": true, + "requires": { + "workbox-core": "^5.1.3", + "workbox-routing": "^5.1.3" + } + }, + "workbox-streams": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-5.1.3.tgz", + "integrity": "sha512-8kt70eBd1RXL0qenxEnch3Cd7VyW3O0CkeGBN4Bikt307nIV5Q0JciLA5o0CRteijawYOiTq0/px4GDBv1obgQ==", + "dev": true, + "requires": { + "workbox-core": "^5.1.3", + "workbox-routing": "^5.1.3" + } + }, + "workbox-sw": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-5.1.3.tgz", + "integrity": "sha512-Syk6RhYr/8VdFwXrxo5IpVz8Og2xapHTWJhqsZRF+TbxSvlaJs8hrvVPd7edn5ZiiVdPhE9NTeOTOg1+D+FGoA==", + "dev": true + }, + "workbox-webpack-plugin": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-5.1.3.tgz", + "integrity": "sha512-gxSkZ9GFLrMNC/8DGNRjcMhrt8iu+MMXhH/Fpo3wo9rKaSMsI7esGq0klTH/UloP9pNvBizVydysrB52eRhI7w==", + "dev": true, + "requires": { + "@babel/runtime": "^7.5.5", + "fast-json-stable-stringify": "^2.0.0", + "source-map-url": "^0.4.0", + "upath": "^1.1.2", + "webpack-sources": "^1.3.0", + "workbox-build": "^5.1.3" + } + }, + "workbox-window": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-5.1.3.tgz", + "integrity": "sha512-oYvfVtPLET7FUrhOzbk0R+aATVmpdQBkmDqwyFH4W2dfVqJXTvTXzuGP5Pn9oZ8jMTB3AYW43yhYBlLYM3mYyg==", + "dev": true, + "requires": { + "workbox-core": "^5.1.3" + } + }, + "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" + } + }, + "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-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "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==" + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "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" + } + }, + "write-file-webpack-plugin": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/write-file-webpack-plugin/-/write-file-webpack-plugin-4.5.1.tgz", + "integrity": "sha512-AZ7qJUvhTCBiOtG21aFJUcNuLVo2FFM6JMGKvaUGAH+QDqQAp2iG0nq3GcuXmJOFQR2JjpjhyYkyPrbFKhdjNQ==", + "dev": true, + "requires": { + "chalk": "^2.4.0", + "debug": "^3.1.0", + "filesize": "^3.6.1", + "lodash": "^4.17.13", + "mkdirp": "^0.5.1", + "moment": "^2.22.1", + "write-file-atomic": "^2.3.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" + } + }, + "write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + } + } + }, + "ws": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", + "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=", + "dev": true + }, + "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.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" + } + }, + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "dev": true + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "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==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yaml": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", + "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", + "dev": true + }, + "yargs": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.0.tgz", + "integrity": "sha512-g/QCnmjgOl1YJjGsnUg2SatC7NUYEiLXJqxNOQU9qSpjzGtGXda9b+OKccr1kLTy8BN9yqEyqfq5lxlwdc13TA==", + "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.0" + } + }, + "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" + } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true + }, + "yeoman-environment": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/yeoman-environment/-/yeoman-environment-2.10.3.tgz", + "integrity": "sha512-pLIhhU9z/G+kjOXmJ2bPFm3nejfbH+f1fjYRSOteEXDBrv1EoJE/e+kuHixSXfCYfTkxjYsvRaDX+1QykLCnpQ==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "debug": "^3.1.0", + "diff": "^3.5.0", + "escape-string-regexp": "^1.0.2", + "execa": "^4.0.0", + "globby": "^8.0.1", + "grouped-queue": "^1.1.0", + "inquirer": "^7.1.0", + "is-scoped": "^1.0.0", + "lodash": "^4.17.10", + "log-symbols": "^2.2.0", + "mem-fs": "^1.1.0", + "mem-fs-editor": "^6.0.0", + "npm-api": "^1.0.0", + "semver": "^7.1.3", + "strip-ansi": "^4.0.0", + "text-table": "^0.2.0", + "untildify": "^3.0.3", + "yeoman-generator": "^4.8.2" + }, + "dependencies": { + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "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" + } + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "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" + } + }, + "dir-glob": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "path-type": "^3.0.0" + } + }, + "execa": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz", + "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==", + "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" + } + }, + "fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + } + }, + "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" + } + }, + "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" + } + } + } + }, + "globby": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", + "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "2.0.0", + "fast-glob": "^2.0.2", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + } + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "^2.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" + } + }, + "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-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "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" + } + }, + "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" + } + } + } + }, + "yeoman-generator": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/yeoman-generator/-/yeoman-generator-4.11.0.tgz", + "integrity": "sha512-++t6t2Z6HjL5F1/UM7+uNvGknKmQdF8tstJx8WKzsUSEpB+19kLVtapSfQIh9uWqm0L59fLWDzUui//WXoynPw==", + "dev": true, + "requires": { + "async": "^2.6.2", + "chalk": "^2.4.2", + "cli-table": "^0.3.1", + "cross-spawn": "^6.0.5", + "dargs": "^6.1.0", + "dateformat": "^3.0.3", + "debug": "^4.1.1", + "diff": "^4.0.1", + "error": "^7.0.2", + "find-up": "^3.0.0", + "github-username": "^3.0.0", + "grouped-queue": "^1.1.0", + "istextorbinary": "^2.5.1", + "lodash": "^4.17.11", + "make-dir": "^3.0.0", + "mem-fs-editor": "^7.0.1", + "minimist": "^1.2.5", + "pretty-bytes": "^5.2.0", + "read-chunk": "^3.2.0", + "read-pkg-up": "^5.0.0", + "rimraf": "^2.6.3", + "run-async": "^2.0.0", + "semver": "^7.2.1", + "shelljs": "^0.8.3", + "text-table": "^0.2.0", + "through2": "^3.0.1", + "yeoman-environment": "^2.9.5" + }, + "dependencies": { + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "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" + } + }, + "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" + } + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "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" + } + }, + "fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + } + }, + "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" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "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" + } + } + } + }, + "globby": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", + "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^1.0.2", + "dir-glob": "^2.2.2", + "fast-glob": "^2.2.6", + "glob": "^7.1.3", + "ignore": "^4.0.3", + "pify": "^4.0.1", + "slash": "^2.0.0" + } + }, + "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 + }, + "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" + } + }, + "mem-fs-editor": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/mem-fs-editor/-/mem-fs-editor-7.0.1.tgz", + "integrity": "sha512-eD8r4/d2ayp9HHIgBPHB6Ds0ggA8F9cf9HxcNtbqrwqJXfIDrOSMG5K4fV3+Ib3B+HIdrWqkeDDDvrO7i9EbvQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "deep-extend": "^0.6.0", + "ejs": "^3.0.1", + "glob": "^7.1.4", + "globby": "^9.2.0", + "isbinaryfile": "^4.0.0", + "mkdirp": "^1.0.0", + "multimatch": "^4.0.0", + "rimraf": "^3.0.0", + "through2": "^3.0.1", + "vinyl": "^2.2.0" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "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" + } + }, + "parse-json": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.1.tgz", + "integrity": "sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "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-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 + } + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "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" + } + }, + "read-pkg-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-5.0.0.tgz", + "integrity": "sha512-XBQjqOBtTzyol2CpsQOw8LHV0XbDZVG7xMMjmXAJomlVY03WOBRmYgDJETlvcg0H63AJvPRwT7GFi5rvOzUOKg==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^5.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": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "through2": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "2 || 3" + } + }, + "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 + } + } + }, + "yup": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/yup/-/yup-0.27.0.tgz", + "integrity": "sha512-v1yFnE4+u9za42gG/b/081E7uNW9mUj3qtkmelLbW5YPROZzSH/KUUyJu9Wt8vxFJcT9otL/eZopS0YK1L5yPQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.0.0", + "fn-name": "~2.0.1", + "lodash": "^4.17.11", + "property-expr": "^1.5.0", + "synchronous-promise": "^2.0.6", + "toposort": "^2.0.2" + } + }, + "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/borestop/package.json b/borestop/package.json new file mode 100644 index 00000000..644c8c57 --- /dev/null +++ b/borestop/package.json @@ -0,0 +1,124 @@ +{ + "name": "borestop", + "version": "0.0.1-SNAPSHOT", + "description": "Description for borestop", + "private": true, + "license": "UNLICENSED", + "cacheDirectories": [ + "node_modules" + ], + "dependencies": { + "@angular/common": "10.0.0", + "@angular/compiler": "10.0.0", + "@angular/core": "10.0.0", + "@angular/forms": "10.0.0", + "@angular/localize": "10.0.0", + "@angular/platform-browser": "10.0.0", + "@angular/platform-browser-dynamic": "10.0.0", + "@angular/router": "10.0.0", + "@fortawesome/angular-fontawesome": "0.6.1", + "@fortawesome/fontawesome-svg-core": "1.2.29", + "@fortawesome/free-solid-svg-icons": "5.13.1", + "@ng-bootstrap/ng-bootstrap": "6.1.0", + "@ngx-translate/core": "12.1.2", + "@ngx-translate/http-loader": "5.0.0", + "bootstrap": "4.5.0", + "moment": "2.27.0", + "ng-jhipster": "0.14.0", + "ngx-cookie-service": "3.0.4", + "ngx-infinite-scroll": "9.0.0", + "ngx-webstorage": "5.0.0", + "rxjs": "6.5.5", + "swagger-ui-dist": "3.25.1", + "tslib": "2.0.0", + "zone.js": "0.10.3" + }, + "devDependencies": { + "@angular/cli": "10.0.0", + "@angular/compiler-cli": "10.0.0", + "@ngtools/webpack": "10.0.0", + "@openapitools/openapi-generator-cli": "1.0.13-4.3.1", + "@types/jest": "26.0.3", + "@types/node": "13.13.4", + "@typescript-eslint/eslint-plugin": "2.30.0", + "@typescript-eslint/eslint-plugin-tslint": "2.30.0", + "@typescript-eslint/parser": "2.30.0", + "autoprefixer": "9.8.4", + "browser-sync": "2.26.7", + "browser-sync-webpack-plugin": "2.2.2", + "codelyzer": "5.2.2", + "copy-webpack-plugin": "6.0.2", + "css-loader": "3.6.0", + "eslint": "6.8.0", + "eslint-config-jhipster": "0.0.1", + "eslint-config-prettier": "6.11.0", + "eslint-loader": "4.0.2", + "file-loader": "6.0.0", + "friendly-errors-webpack-plugin": "1.7.0", + "generator-jhipster": "6.10.1", + "html-loader": "1.1.0", + "html-webpack-plugin": "4.3.0", + "husky": "4.2.5", + "jest": "26.1.0", + "jest-date-mock": "1.0.8", + "jest-junit": "11.0.1", + "jest-preset-angular": "8.2.1", + "jest-sonar-reporter": "2.0.0", + "lint-staged": "8.2.1", + "merge-jsons-webpack-plugin": "1.0.21", + "mini-css-extract-plugin": "0.9.0", + "moment-locales-webpack-plugin": "1.2.0", + "optimize-css-assets-webpack-plugin": "5.0.3", + "postcss-loader": "3.0.0", + "prettier": "2.0.5", + "rimraf": "3.0.2", + "sass": "1.26.9", + "sass-loader": "8.0.2", + "simple-progress-webpack-plugin": "1.1.2", + "style-loader": "1.2.1", + "terser-webpack-plugin": "3.0.6", + "thread-loader": "2.1.3", + "to-string-loader": "1.1.6", + "ts-loader": "7.0.5", + "tslint": "6.1.2", + "typescript": "3.9.5", + "webpack": "4.43.0", + "webpack-bundle-analyzer": "3.8.0", + "webpack-cli": "3.3.12", + "webpack-dev-server": "3.11.0", + "webpack-merge": "4.2.2", + "webpack-notifier": "1.8.0", + "workbox-webpack-plugin": "5.1.3", + "write-file-webpack-plugin": "4.5.1" + }, + "engines": { + "node": ">=12.16.1" + }, + "scripts": { + "prettier:format": "prettier --write \"{,src/**/}*.{md,json,ts,css,scss,yml}\"", + "lint": "eslint . --ext .js,.ts", + "lint:fix": "npm run lint -- --fix", + "ngc": "ngc -p tsconfig.app.json", + "cleanup": "rimraf target/classes/static/", + "clean-www": "rimraf target/classes/static/app/{src,target/}", + "start": "npm run webpack:dev", + "start-tls": "npm run webpack:dev -- --env.tls", + "serve": "npm run start", + "build": "npm run webpack:prod", + "test": "npm run lint && jest --coverage --logHeapUsage -w=2 --config src/test/javascript/jest.conf.js", + "test:watch": "npm run test -- --watch", + "webpack:dev": "npm run webpack-dev-server -- --config webpack/webpack.dev.js --inline --hot --port=9060 --watch-content-base --env.stats=minimal", + "webpack:dev-verbose": "npm run webpack-dev-server -- --config webpack/webpack.dev.js --inline --hot --port=9060 --watch-content-base --profile --progress --env.stats=normal", + "webpack:build:main": "npm run webpack -- --config webpack/webpack.dev.js --env.stats=minimal", + "webpack:build": "npm run cleanup && npm run webpack:build:main", + "webpack:prod:main": "npm run webpack -- --config webpack/webpack.prod.js --profile", + "webpack:prod": "npm run cleanup && npm run webpack:prod:main && npm run clean-www", + "webpack:test": "npm run test", + "webpack-dev-server": "node --max_old_space_size=4096 node_modules/webpack-dev-server/bin/webpack-dev-server.js", + "webpack": "node --max_old_space_size=4096 node_modules/webpack/bin/webpack.js" + }, + "jestSonar": { + "reportPath": "target/test-results/jest", + "reportFile": "TESTS-results-sonar.xml" + } +} diff --git a/borestop/pom.xml b/borestop/pom.xml new file mode 100644 index 00000000..9d377575 --- /dev/null +++ b/borestop/pom.xml @@ -0,0 +1,1114 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <groupId>com.ippon.borestop</groupId> + <artifactId>borestop</artifactId> + <version>0.0.1-SNAPSHOT</version> + <packaging>jar</packaging> + <name>Borestop</name> + + <repositories> + <!-- jhipster-needle-maven-repository --> + </repositories> + + <pluginRepositories> + <!-- jhipster-needle-maven-plugin-repository --> + </pluginRepositories> + + <!-- jhipster-needle-distribution-management --> + + <properties> + <!-- Build properties --> + <maven.version>3.3.9</maven.version> + <java.version>1.8</java.version> + <node.version>v12.16.1</node.version> + <npm.version>6.14.5</npm.version> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> + <project.testresult.directory>${project.build.directory}/test-results</project.testresult.directory> + <maven.build.timestamp.format>yyyyMMddHHmmss</maven.build.timestamp.format> + <maven.compiler.source>${java.version}</maven.compiler.source> + <maven.compiler.target>${java.version}</maven.compiler.target> + <argLine>-Djava.security.egd=file:/dev/./urandom -Xmx256m</argLine> + <m2e.apt.activation>jdt_apt</m2e.apt.activation> + <run.addResources>false</run.addResources> + <!-- These remain empty unless the corresponding profile is active --> + <profile.no-liquibase /> + <profile.swagger /> + <profile.tls /> + + <!-- Dependency versions --> + <jhipster-dependencies.version>3.9.0</jhipster-dependencies.version> + <!-- The spring-boot version should match the one managed by + https://mvnrepository.com/artifact/io.github.jhipster/jhipster-dependencies/${jhipster-dependencies.version} --> + <spring-boot.version>2.2.7.RELEASE</spring-boot.version> + <!-- The hibernate version should match the one managed by + https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-dependencies/${spring-boot.version} --> + <hibernate.version>5.4.15.Final</hibernate.version> + <!-- The javassist version should match the one managed by + https://mvnrepository.com/artifact/org.hibernate/hibernate-core/${hibernate.version} --> + <javassist.version>3.24.0-GA</javassist.version> + <!-- The liquibase version should match the one managed by + https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-dependencies/${spring-boot.version} --> + <liquibase.version>3.9.0</liquibase.version> + <liquibase-hibernate5.version>3.8</liquibase-hibernate5.version> + <h2.version>1.4.200</h2.version> + <validation-api.version>2.0.1.Final</validation-api.version> + <jaxb-runtime.version>2.3.3</jaxb-runtime.version> + <archunit-junit5.version>0.14.1</archunit-junit5.version> + <mapstruct.version>1.3.1.Final</mapstruct.version> + <!-- Plugin versions --> + <maven-clean-plugin.version>3.1.0</maven-clean-plugin.version> + <maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version> + <maven-javadoc-plugin.version>3.2.0</maven-javadoc-plugin.version> + <maven-eclipse-plugin.version>2.10</maven-eclipse-plugin.version> + <maven-enforcer-plugin.version>3.0.0-M3</maven-enforcer-plugin.version> + <maven-failsafe-plugin.version>3.0.0-M4</maven-failsafe-plugin.version> + <maven-idea-plugin.version>2.2.1</maven-idea-plugin.version> + <maven-resources-plugin.version>3.1.0</maven-resources-plugin.version> + <maven-surefire-plugin.version>3.0.0-M4</maven-surefire-plugin.version> + <maven-war-plugin.version>3.2.3</maven-war-plugin.version> + <maven-checkstyle.version>3.1.1</maven-checkstyle.version> + <checkstyle.version>8.32</checkstyle.version> + <spring-nohttp-checkstyle.version>0.0.4.RELEASE</spring-nohttp-checkstyle.version> + <frontend-maven-plugin.version>1.10.0</frontend-maven-plugin.version> + <git-commit-id-plugin.version>4.0.0</git-commit-id-plugin.version> + <jacoco-maven-plugin.version>0.8.5</jacoco-maven-plugin.version> + <jib-maven-plugin.version>2.4.0</jib-maven-plugin.version> + <lifecycle-mapping.version>1.0.0</lifecycle-mapping.version> + <properties-maven-plugin.version>1.0.0</properties-maven-plugin.version> + <sonar-maven-plugin.version>3.7.0.1746</sonar-maven-plugin.version> + <jacoco.utReportFolder>${project.build.directory}/jacoco/test</jacoco.utReportFolder> + <jacoco.utReportFile>${jacoco.utReportFolder}/test.exec</jacoco.utReportFile> + <jacoco.itReportFolder>${project.build.directory}/jacoco/integrationTest</jacoco.itReportFolder> + <jacoco.itReportFile>${jacoco.itReportFolder}/integrationTest.exec</jacoco.itReportFile> + <junit.utReportFolder>${project.testresult.directory}/test</junit.utReportFolder> + <junit.itReportFolder>${project.testresult.directory}/integrationTest</junit.itReportFolder> + <!-- jhipster-needle-maven-property --> + </properties> + + <dependencyManagement> + <dependencies> + <dependency> + <groupId>io.github.jhipster</groupId> + <artifactId>jhipster-dependencies</artifactId> + <version>${jhipster-dependencies.version}</version> + <type>pom</type> + <scope>import</scope> + </dependency> + <!-- jhipster-needle-maven-add-dependency-management --> + </dependencies> + </dependencyManagement> + + <dependencies> + <dependency> + <groupId>io.github.jhipster</groupId> + <artifactId>jhipster-framework</artifactId> + </dependency> + <dependency> + <groupId>javax.annotation</groupId> + <artifactId>javax.annotation-api</artifactId> + </dependency> + + <dependency> + <groupId>com.fasterxml.jackson.module</groupId> + <artifactId>jackson-module-jaxb-annotations</artifactId> + </dependency> + <dependency> + <groupId>com.fasterxml.jackson.datatype</groupId> + <artifactId>jackson-datatype-hibernate5</artifactId> + </dependency> + <dependency> + <groupId>com.fasterxml.jackson.datatype</groupId> + <artifactId>jackson-datatype-hppc</artifactId> + </dependency> + <dependency> + <groupId>com.fasterxml.jackson.datatype</groupId> + <artifactId>jackson-datatype-jsr310</artifactId> + </dependency> + <dependency> + <groupId>com.h2database</groupId> + <artifactId>h2</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>io.springfox</groupId> + <artifactId>springfox-swagger2</artifactId> + </dependency> + <dependency> + <groupId>io.springfox</groupId> + <artifactId>springfox-bean-validators</artifactId> + </dependency> + <dependency> + <groupId>com.zaxxer</groupId> + <artifactId>HikariCP</artifactId> + </dependency> + <dependency> + <groupId>org.testcontainers</groupId> + <artifactId>postgresql</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.hibernate</groupId> + <artifactId>hibernate-jpamodelgen</artifactId> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.hibernate</groupId> + <artifactId>hibernate-core</artifactId> + </dependency> + <dependency> + <groupId>org.hibernate.validator</groupId> + <artifactId>hibernate-validator</artifactId> + </dependency> + <dependency> + <groupId>org.liquibase</groupId> + <artifactId>liquibase-core</artifactId> + <!-- Inherited version from Spring Boot can't be used because of regressions --> + <version>${liquibase.version}</version> + </dependency> + <dependency> + <groupId>net.logstash.logback</groupId> + <artifactId>logstash-logback-encoder</artifactId> + </dependency> + <dependency> + <groupId>org.postgresql</groupId> + <artifactId>postgresql</artifactId> + </dependency> + <dependency> + <groupId>org.mapstruct</groupId> + <artifactId>mapstruct</artifactId> + </dependency> + <dependency> + <groupId>org.mapstruct</groupId> + <artifactId>mapstruct-processor</artifactId> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-configuration-processor</artifactId> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-loader-tools</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-actuator</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-aop</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-data-jpa</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-logging</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-mail</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-security</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-thymeleaf</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-web</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-test</artifactId> + <scope>test</scope> + <exclusions> + <exclusion> + <groupId>org.junit.vintage</groupId> + <artifactId>junit-vintage-engine</artifactId> + </exclusion> + </exclusions> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-test</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.springframework.security</groupId> + <artifactId>spring-security-test</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>com.tngtech.archunit</groupId> + <artifactId>archunit-junit5-api</artifactId> + <version>${archunit-junit5.version}</version> + <scope>test</scope> + </dependency> + <!-- Adding the engine dependency to the surefire-plugin unfortunately does not work in the current version. --> + <!-- https://www.archunit.org/userguide/html/000_Index.html#_junit_5 --> + <dependency> + <groupId>com.tngtech.archunit</groupId> + <artifactId>archunit-junit5-engine</artifactId> + <version>${archunit-junit5.version}</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.zalando</groupId> + <artifactId>problem-spring-web</artifactId> + </dependency> + <dependency> + <groupId>io.jsonwebtoken</groupId> + <artifactId>jjwt-api</artifactId> + </dependency> + <dependency> + <groupId>io.jsonwebtoken</groupId> + <artifactId>jjwt-impl</artifactId> + <scope>runtime</scope> + </dependency> + <dependency> + <groupId>io.jsonwebtoken</groupId> + <artifactId>jjwt-jackson</artifactId> + <scope>runtime</scope> + </dependency> + <!-- Spring Cloud --> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-cloud-connectors</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.security</groupId> + <artifactId>spring-security-data</artifactId> + </dependency> + <dependency> + <groupId>io.micrometer</groupId> + <artifactId>micrometer-registry-prometheus</artifactId> + </dependency> + <dependency> + <groupId>io.dropwizard.metrics</groupId> + <artifactId>metrics-core</artifactId> + </dependency> + <!-- jhipster-needle-maven-add-dependency --> + </dependencies> + + <build> + <defaultGoal>spring-boot:run</defaultGoal> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-checkstyle-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-javadoc-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-eclipse-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-enforcer-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-failsafe-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-idea-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-resources-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.jacoco</groupId> + <artifactId>jacoco-maven-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.sonarsource.scanner.maven</groupId> + <artifactId>sonar-maven-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.liquibase</groupId> + <artifactId>liquibase-maven-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-maven-plugin</artifactId> + </plugin> + <plugin> + <groupId>com.google.cloud.tools</groupId> + <artifactId>jib-maven-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>properties-maven-plugin</artifactId> + </plugin> + <!-- jhipster-needle-maven-add-plugin --> + </plugins> + <pluginManagement> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-checkstyle-plugin</artifactId> + <version>${maven-checkstyle.version}</version> + <dependencies> + <dependency> + <groupId>com.puppycrawl.tools</groupId> + <artifactId>checkstyle</artifactId> + <version>${checkstyle.version}</version> + </dependency> + <dependency> + <groupId>io.spring.nohttp</groupId> + <artifactId>nohttp-checkstyle</artifactId> + <version>${spring-nohttp-checkstyle.version}</version> + </dependency> + </dependencies> + <configuration> + <configLocation>checkstyle.xml</configLocation> + <includes>pom.xml,README.md</includes> + <excludes>.git/**/*,target/**/*,node_modules/**/*,node/**/*</excludes> + <sourceDirectories>./</sourceDirectories> + </configuration> + <executions> + <execution> + <goals> + <goal>check</goal> + </goals> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <version>${maven-compiler-plugin.version}</version> + <configuration> + <source>${java.version}</source> + <target>${java.version}</target> + <annotationProcessorPaths> + <path> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-configuration-processor</artifactId> + <version>${spring-boot.version}</version> + </path> + <path> + <groupId>org.mapstruct</groupId> + <artifactId>mapstruct-processor</artifactId> + <version>${mapstruct.version}</version> + </path> + <!-- For JPA static metamodel generation --> + <path> + <groupId>org.hibernate</groupId> + <artifactId>hibernate-jpamodelgen</artifactId> + <version>${hibernate.version}</version> + </path> + <path> + <groupId>org.glassfish.jaxb</groupId> + <artifactId>jaxb-runtime</artifactId> + <version>${jaxb-runtime.version}</version> + </path> + <!-- jhipster-needle-maven-add-annotation-processor --> + </annotationProcessorPaths> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-javadoc-plugin</artifactId> + <version>${maven-javadoc-plugin.version}</version> + <configuration> + <source>${maven.compiler.source}</source> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-war-plugin</artifactId> + <version>${maven-war-plugin.version}</version> + <executions> + <execution> + <id>default-war</id> + <goals> + <goal>war</goal> + </goals> + <phase>package</phase> + </execution> + </executions> + <configuration> + <warSourceIncludes>WEB-INF/**,META-INF/**</warSourceIncludes> + <failOnMissingWebXml>false</failOnMissingWebXml> + <warSourceDirectory>target/classes/static/</warSourceDirectory> + <webResources> + <resource> + <directory>src/main/webapp</directory> + <includes> + <include>WEB-INF/**</include> + </includes> + </resource> + </webResources> + </configuration> + </plugin> + <plugin> + <groupId>com.github.eirslett</groupId> + <artifactId>frontend-maven-plugin</artifactId> + <version>${frontend-maven-plugin.version}</version> + </plugin> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>properties-maven-plugin</artifactId> + <version>${properties-maven-plugin.version}</version> + <executions> + <execution> + <phase>initialize</phase> + <goals> + <goal>read-project-properties</goal> + </goals> + <configuration> + <files> + <file>sonar-project.properties</file> + </files> + </configuration> + </execution> + </executions> + </plugin> + + <plugin> + <groupId>pl.project13.maven</groupId> + <artifactId>git-commit-id-plugin</artifactId> + <version>${git-commit-id-plugin.version}</version> + <executions> + <execution> + <goals> + <goal>revision</goal> + </goals> + </execution> + </executions> + <configuration> + <failOnNoGitDirectory>false</failOnNoGitDirectory> + <failOnUnableToExtractRepoInfo>false</failOnUnableToExtractRepoInfo> + <generateGitPropertiesFile>true</generateGitPropertiesFile> + <includeOnlyProperties> + <includeOnlyProperty>^git.commit.id.abbrev$</includeOnlyProperty> + <includeOnlyProperty>^git.commit.id.describe$</includeOnlyProperty> + <includeOnlyProperty>^git.branch$</includeOnlyProperty> + </includeOnlyProperties> + </configuration> + </plugin> + <plugin> + <groupId>org.jacoco</groupId> + <artifactId>jacoco-maven-plugin</artifactId> + <version>${jacoco-maven-plugin.version}</version> + <executions> + <execution> + <id>pre-unit-tests</id> + <goals> + <goal>prepare-agent</goal> + </goals> + <configuration> + <!-- Sets the path to the file which contains the execution data. --> + <destFile>${jacoco.utReportFile}</destFile> + </configuration> + </execution> + <!-- Ensures that the code coverage report for unit tests is created after unit tests have been run --> + <execution> + <id>post-unit-test</id> + <phase>test</phase> + <goals> + <goal>report</goal> + </goals> + <configuration> + <dataFile>${jacoco.utReportFile}</dataFile> + <outputDirectory>${jacoco.utReportFolder}</outputDirectory> + </configuration> + </execution> + <execution> + <id>pre-integration-tests</id> + <goals> + <goal>prepare-agent-integration</goal> + </goals> + <configuration> + <!-- Sets the path to the file which contains the execution data. --> + <destFile>${jacoco.itReportFile}</destFile> + </configuration> + </execution> + <!-- Ensures that the code coverage report for integration tests is created after integration tests have been run --> + <execution> + <id>post-integration-tests</id> + <phase>post-integration-test</phase> + <goals> + <goal>report-integration</goal> + </goals> + <configuration> + <dataFile>${jacoco.itReportFile}</dataFile> + <outputDirectory>${jacoco.itReportFolder}</outputDirectory> + </configuration> + </execution> + </executions> + </plugin> + <plugin> + <groupId>com.google.cloud.tools</groupId> + <artifactId>jib-maven-plugin</artifactId> + <version>${jib-maven-plugin.version}</version> + <configuration> + <from> + <image>adoptopenjdk:11-jre-hotspot</image> + </from> + <to> + <image>borestop:latest</image> + </to> + <container> + <entrypoint> + <shell>bash</shell> + <option>-c</option> + <arg>/entrypoint.sh</arg> + </entrypoint> + <ports> + <port>8080</port> + </ports> + <environment> + <SPRING_OUTPUT_ANSI_ENABLED>ALWAYS</SPRING_OUTPUT_ANSI_ENABLED> + <JHIPSTER_SLEEP>0</JHIPSTER_SLEEP> + </environment> + <creationTime>USE_CURRENT_TIMESTAMP</creationTime> + </container> + <extraDirectories> + <paths>src/main/jib</paths> + <permissions> + <permission> + <file>/entrypoint.sh</file> + <mode>755</mode> + </permission> + </permissions> + </extraDirectories> + </configuration> + </plugin> + <plugin> + <groupId>org.liquibase</groupId> + <artifactId>liquibase-maven-plugin</artifactId> + <version>${liquibase.version}</version> + <configuration> + <changeLogFile>${project.basedir}/src/main/resources/config/liquibase/master.xml</changeLogFile> + <diffChangeLogFile>${project.basedir}/src/main/resources/config/liquibase/changelog/${maven.build.timestamp}_changelog.xml</diffChangeLogFile> + <driver>org.h2.Driver</driver> + <url>jdbc:h2:file:${project.build.directory}/h2db/db/borestop</url> + <defaultSchemaName></defaultSchemaName> + <username>borestop</username> + <password></password> + <referenceUrl>hibernate:spring:com.ippon.borestop.domain?dialect=org.hibernate.dialect.H2Dialect&hibernate.physical_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy&hibernate.implicit_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy</referenceUrl> + <verbose>true</verbose> + <logging>debug</logging> + <contexts>!test</contexts> + </configuration> + <dependencies> + <dependency> + <groupId>org.liquibase</groupId> + <artifactId>liquibase-core</artifactId> + <version>${liquibase.version}</version> + </dependency> + <dependency> + <groupId>org.liquibase.ext</groupId> + <artifactId>liquibase-hibernate5</artifactId> + <version>${liquibase-hibernate5.version}</version> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-data-jpa</artifactId> + <version>${spring-boot.version}</version> + </dependency> + <dependency> + <groupId>javax.validation</groupId> + <artifactId>validation-api</artifactId> + <version>${validation-api.version}</version> + </dependency> + <dependency> + <groupId>org.javassist</groupId> + <artifactId>javassist</artifactId> + <version>${javassist.version}</version> + </dependency> + <dependency> + <groupId>com.h2database</groupId> + <artifactId>h2</artifactId> + <version>${h2.version}</version> + </dependency> + </dependencies> + </plugin> + <plugin> + <artifactId>maven-clean-plugin</artifactId> + <version>${maven-clean-plugin.version}</version> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-eclipse-plugin</artifactId> + <version>${maven-eclipse-plugin.version}</version> + <configuration> + <downloadSources>true</downloadSources> + <downloadJavadocs>true</downloadJavadocs> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-enforcer-plugin</artifactId> + <version>${maven-enforcer-plugin.version}</version> + <executions> + <execution> + <id>enforce-versions</id> + <goals> + <goal>enforce</goal> + </goals> + </execution> + <execution> + <id>enforce-dependencyConvergence</id> + <configuration> + <rules> + <DependencyConvergence /> + </rules> + <fail>false</fail> + </configuration> + <goals> + <goal>enforce</goal> + </goals> + </execution> + </executions> + <configuration> + <rules> + <requireMavenVersion> + <message>You are running an older version of Maven. JHipster requires at least Maven ${maven.version}</message> + <version>[${maven.version},)</version> + </requireMavenVersion> + <requireJavaVersion> + <message>You are running an incompatible version of Java. JHipster supports JDK 8 to 14.</message> + <version>[1.8,15)</version> + </requireJavaVersion> + </rules> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-idea-plugin</artifactId> + <version>${maven-idea-plugin.version}</version> + <configuration> + <exclude>node_modules</exclude> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-resources-plugin</artifactId> + <version>${maven-resources-plugin.version}</version> + <executions> + <execution> + <id>default-resources</id> + <phase>validate</phase> + <goals> + <goal>copy-resources</goal> + </goals> + <configuration> + <outputDirectory>${project.build.directory}/classes</outputDirectory> + <useDefaultDelimiters>false</useDefaultDelimiters> + <delimiters> + <delimiter>#</delimiter> + </delimiters> + <resources> + <resource> + <directory>src/main/resources/</directory> + <filtering>true</filtering> + <includes> + <include>config/*.yml</include> + </includes> + </resource> + <resource> + <directory>src/main/resources/</directory> + <filtering>false</filtering> + <excludes> + <exclude>config/*.yml</exclude> + </excludes> + </resource> + </resources> + </configuration> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + <version>${maven-surefire-plugin.version}</version> + <configuration> + <!-- Force alphabetical order to have a reproducible build --> + <runOrder>alphabetical</runOrder> + <reportsDirectory>${junit.utReportFolder}</reportsDirectory> + <excludes> + <exclude>**/*IT*</exclude> + <exclude>**/*IntTest*</exclude> + </excludes> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-failsafe-plugin</artifactId> + <version>${maven-failsafe-plugin.version}</version> + <configuration> + <!-- Due to spring-boot repackage, without adding this property test classes are not found + See https://github.com/spring-projects/spring-boot/issues/6254 --> + <classesDirectory>${project.build.outputDirectory}</classesDirectory> + <!-- Force alphabetical order to have a reproducible build --> + <runOrder>alphabetical</runOrder> + <reportsDirectory>${junit.itReportFolder}</reportsDirectory> + <includes> + <include>**/*IT*</include> + <include>**/*IntTest*</include> + </includes> + </configuration> + <executions> + <execution> + <id>integration-test</id> + <goals> + <goal>integration-test</goal> + </goals> + </execution> + <execution> + <id>verify</id> + <goals> + <goal>verify</goal> + </goals> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.sonarsource.scanner.maven</groupId> + <artifactId>sonar-maven-plugin</artifactId> + <version>${sonar-maven-plugin.version}</version> + </plugin> + <plugin> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-maven-plugin</artifactId> + <version>${spring-boot.version}</version> + <executions> + <execution> + <goals> + <goal>repackage</goal> + </goals> + </execution> + </executions> + <configuration> + <mainClass>${start-class}</mainClass> + <fork>true</fork> + <!-- + Enable the line below to have remote debugging of your application on port 5005 + <jvmArguments>-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005</jvmArguments> + --> + </configuration> + + </plugin> + <!-- jhipster-needle-maven-add-plugin-management --> + </plugins> + </pluginManagement> + </build> + <profiles> + <profile> + <id>no-liquibase</id> + <properties> + <profile.no-liquibase>,no-liquibase</profile.no-liquibase> + </properties> + </profile> + <profile> + <id>swagger</id> + <properties> + <profile.swagger>,swagger</profile.swagger> + </properties> + </profile> + <profile> + <id>tls</id> + <properties> + <profile.tls>,tls</profile.tls> + </properties> + </profile> + <profile> + <id>webpack</id> + <activation> + <activeByDefault>true</activeByDefault> + </activation> + <dependencies> + <dependency> + <groupId>com.h2database</groupId> + <artifactId>h2</artifactId> + </dependency> + </dependencies> + <build> + <plugins> + <plugin> + <groupId>com.github.eirslett</groupId> + <artifactId>frontend-maven-plugin</artifactId> + <executions> + <execution> + <id>install node and npm</id> + <goals> + <goal>install-node-and-npm</goal> + </goals> + <configuration> + <nodeVersion>${node.version}</nodeVersion> + <npmVersion>${npm.version}</npmVersion> + </configuration> + </execution> + <execution> + <id>npm install</id> + <goals> + <goal>npm</goal> + </goals> + </execution> + <execution> + <id>webpack build dev</id> + <goals> + <goal>npm</goal> + </goals> + <phase>generate-resources</phase> + <configuration> + <arguments>run webpack:build</arguments> + <environmentVariables> + <APP_VERSION>${project.version}</APP_VERSION> + </environmentVariables> + <npmInheritsProxyConfigFromMaven>false</npmInheritsProxyConfigFromMaven> + </configuration> + </execution> + </executions> + </plugin> + </plugins> + </build> + <properties> + <!-- default Spring profiles --> + <spring.profiles.active>dev${profile.no-liquibase}</spring.profiles.active> + </properties> + </profile> + <profile> + <id>dev</id> + <activation> + <activeByDefault>true</activeByDefault> + </activation> + <dependencies> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-undertow</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-devtools</artifactId> + <optional>true</optional> + </dependency> + <dependency> + <groupId>com.h2database</groupId> + <artifactId>h2</artifactId> + </dependency> + </dependencies> + <properties> + <!-- default Spring profiles --> + <spring.profiles.active>dev${profile.tls}${profile.no-liquibase}</spring.profiles.active> + </properties> + </profile> + <profile> + <id>prod</id> + <dependencies> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-undertow</artifactId> + </dependency> + </dependencies> + <build> + <plugins> + <plugin> + <artifactId>maven-clean-plugin</artifactId> + <configuration> + <filesets> + <fileset> + <directory>target/classes/static/</directory> + </fileset> + </filesets> + </configuration> + </plugin> + <plugin> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-maven-plugin</artifactId> + <executions> + <execution> + <goals> + <goal>build-info</goal> + </goals> + </execution> + </executions> + </plugin> + <plugin> + <groupId>com.github.eirslett</groupId> + <artifactId>frontend-maven-plugin</artifactId> + <executions> + <execution> + <id>install node and npm</id> + <goals> + <goal>install-node-and-npm</goal> + </goals> + <configuration> + <nodeVersion>${node.version}</nodeVersion> + <npmVersion>${npm.version}</npmVersion> + </configuration> + </execution> + <execution> + <id>npm install</id> + <goals> + <goal>npm</goal> + </goals> + <configuration> + <arguments>install</arguments> + </configuration> + </execution> + <execution> + <id>webpack build test</id> + <goals> + <goal>npm</goal> + </goals> + <phase>test</phase> + <configuration> + <arguments>run webpack:test</arguments> + <npmInheritsProxyConfigFromMaven>false</npmInheritsProxyConfigFromMaven> + </configuration> + </execution> + <execution> + <id>webpack build prod</id> + <goals> + <goal>npm</goal> + </goals> + <phase>generate-resources</phase> + <configuration> + <arguments>run webpack:prod</arguments> + <environmentVariables> + <APP_VERSION>${project.version}</APP_VERSION> + </environmentVariables> + <npmInheritsProxyConfigFromMaven>false</npmInheritsProxyConfigFromMaven> + </configuration> + </execution> + </executions> + </plugin> + <plugin> + <groupId>pl.project13.maven</groupId> + <artifactId>git-commit-id-plugin</artifactId> + </plugin> + </plugins> + </build> + <properties> + <!-- default Spring profiles --> + <spring.profiles.active>prod${profile.swagger}${profile.tls}${profile.no-liquibase}</spring.profiles.active> + </properties> + </profile> + <profile> + <id>war</id> + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-war-plugin</artifactId> + </plugin> + </plugins> + </build> + </profile> + <profile> + <!-- + Profile for applying IDE-specific configuration. + At the moment it configures MapStruct and Hibernate JPA Metamodel Generator, which you need when working + with DTOs and entity filtering. + --> + <id>IDE</id> + <dependencies> + <dependency> + <groupId>org.mapstruct</groupId> + <artifactId>mapstruct-processor</artifactId> + </dependency> + <dependency> + <groupId>org.hibernate</groupId> + <artifactId>hibernate-jpamodelgen</artifactId> + </dependency> + </dependencies> + </profile> + <profile> + <!-- This is automatically activated when working in Eclipse --> + <id>eclipse</id> + <activation> + <property> + <name>m2e.version</name> + </property> + </activation> + <dependencies> + <!-- The following dependency is added due to issue #9175--> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-undertow</artifactId> + </dependency> + </dependencies> + <build> + <pluginManagement> + <plugins> + <!-- + This plugin's configuration is used to store Eclipse m2e settings only. + It has no influence on the Maven build itself. + Remove when the m2e plugin can correctly bind to Maven lifecycle + --> + <plugin> + <groupId>org.eclipse.m2e</groupId> + <artifactId>lifecycle-mapping</artifactId> + <version>${lifecycle-mapping.version}</version> + <configuration> + <lifecycleMappingMetadata> + <pluginExecutions> + <pluginExecution> + <pluginExecutionFilter> + <groupId>org.jacoco</groupId> + <artifactId> + jacoco-maven-plugin + </artifactId> + <versionRange> + ${jacoco-maven-plugin.version} + </versionRange> + <goals> + <goal>prepare-agent</goal> + </goals> + </pluginExecutionFilter> + <action> + <ignore/> + </action> + </pluginExecution> + <pluginExecution> + <pluginExecutionFilter> + <groupId>com.github.eirslett</groupId> + <artifactId>frontend-maven-plugin</artifactId> + <versionRange>${frontend-maven-plugin.version}</versionRange> + <goals> + <goal>install-node-and-npm</goal> + <goal>npm</goal> + </goals> + </pluginExecutionFilter> + <action> + <ignore/> + </action> + </pluginExecution> + </pluginExecutions> + </lifecycleMappingMetadata> + </configuration> + </plugin> + </plugins> + </pluginManagement> + </build> + </profile> + <!-- jhipster-needle-maven-add-profile --> + </profiles> +</project> diff --git a/borestop/postcss.config.js b/borestop/postcss.config.js new file mode 100644 index 00000000..b0f214d5 --- /dev/null +++ b/borestop/postcss.config.js @@ -0,0 +1,3 @@ +module.exports = { + plugins: [require('autoprefixer')] +}; diff --git a/borestop/proxy.conf.json b/borestop/proxy.conf.json new file mode 100644 index 00000000..3bfe56a3 --- /dev/null +++ b/borestop/proxy.conf.json @@ -0,0 +1,7 @@ +{ + "*": { + "target": "http://localhost:8080", + "secure": false, + "loglevel": "debug" + } +} diff --git a/borestop/sonar-project.properties b/borestop/sonar-project.properties new file mode 100644 index 00000000..4f82e483 --- /dev/null +++ b/borestop/sonar-project.properties @@ -0,0 +1,33 @@ +sonar.projectKey=borestop +sonar.projectName=borestop generated by jhipster +sonar.projectVersion=1.0 + +sonar.sources=src/main/ +sonar.host.url=http://localhost:9001 + +sonar.tests=src/test/ +sonar.coverage.jacoco.xmlReportPaths=target/jacoco/test/jacoco.xml,target/jacoco/integrationTest/jacoco.xml +sonar.java.codeCoveragePlugin=jacoco +sonar.junit.reportPaths=target/test-results/test,target/test-results/integrationTest +sonar.testExecutionReportPaths=target/test-results/jest/TESTS-results-sonar.xml +sonar.typescript.lcov.reportPaths=target/test-results/lcov.info + +sonar.sourceEncoding=UTF-8 +sonar.exclusions=src/main/webapp/content/**/*.*, src/main/webapp/i18n/*.js, target/classes/static/**/*.* + +sonar.issue.ignore.multicriteria=S3437,S4502,S4684,UndocumentedApi,BoldAndItalicTagsCheck +# Rule https://sonarcloud.io/coding_rules?open=squid%3AS3437&rule_key=squid%3AS3437 is ignored, as a JPA-managed field cannot be transient +sonar.issue.ignore.multicriteria.S3437.resourceKey=src/main/java/**/* +sonar.issue.ignore.multicriteria.S3437.ruleKey=squid:S3437 +# Rule https://sonarcloud.io/coding_rules?open=squid%3AUndocumentedApi&rule_key=squid%3AUndocumentedApi is ignored, as we want to follow "clean code" guidelines and classes, methods and arguments names should be self-explanatory +sonar.issue.ignore.multicriteria.UndocumentedApi.resourceKey=src/main/java/**/* +sonar.issue.ignore.multicriteria.UndocumentedApi.ruleKey=squid:UndocumentedApi +# Rule https://sonarcloud.io/coding_rules?open=squid%3AS4502&rule_key=squid%3AS4502 is ignored, as for JWT tokens we are not subject to CSRF attack +sonar.issue.ignore.multicriteria.S4502.resourceKey=src/main/java/**/* +sonar.issue.ignore.multicriteria.S4502.ruleKey=squid:S4502 +# Rule https://sonarcloud.io/coding_rules?open=java%3AS4684&rule_key=java%3AS4684 +sonar.issue.ignore.multicriteria.S4684.resourceKey=src/main/java/**/* +sonar.issue.ignore.multicriteria.S4684.ruleKey=java:S4684 +# Rule https://sonarcloud.io/coding_rules?open=Web%3ABoldAndItalicTagsCheck&rule_key=Web%3ABoldAndItalicTagsCheck is ignored. Even if we agree that using the "i" tag is an awful practice, this is what is recommended by http://fontawesome.io/examples/ +sonar.issue.ignore.multicriteria.BoldAndItalicTagsCheck.resourceKey=src/main/webapp/app/**/*.* +sonar.issue.ignore.multicriteria.BoldAndItalicTagsCheck.ruleKey=Web:BoldAndItalicTagsCheck diff --git a/borestop/src/main/docker/app.yml b/borestop/src/main/docker/app.yml new file mode 100644 index 00000000..e864d8b4 --- /dev/null +++ b/borestop/src/main/docker/app.yml @@ -0,0 +1,16 @@ +version: '2' +services: + borestop-app: + image: borestop + environment: + - _JAVA_OPTIONS=-Xmx512m -Xms256m + - SPRING_PROFILES_ACTIVE=prod,swagger + - MANAGEMENT_METRICS_EXPORT_PROMETHEUS_ENABLED=true + - SPRING_DATASOURCE_URL=jdbc:postgresql://borestop-postgresql:5432/borestop + - JHIPSTER_SLEEP=30 # gives time for other services to boot before the application + ports: + - 8080:8080 + borestop-postgresql: + extends: + file: postgresql.yml + service: borestop-postgresql diff --git a/borestop/src/main/docker/grafana/provisioning/dashboards/JVM.json b/borestop/src/main/docker/grafana/provisioning/dashboards/JVM.json new file mode 100644 index 00000000..5104abcd --- /dev/null +++ b/borestop/src/main/docker/grafana/provisioning/dashboards/JVM.json @@ -0,0 +1,3778 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "limit": 100, + "name": "Annotations & Alerts", + "showIn": 0, + "type": "dashboard" + }, + { + "datasource": "Prometheus", + "enable": true, + "expr": "resets(process_uptime_seconds{application=\"$application\", instance=\"$instance\"}[1m]) > 0", + "iconColor": "rgba(255, 96, 96, 1)", + "name": "Restart Detection", + "showIn": 0, + "step": "1m", + "tagKeys": "restart-tag", + "textFormat": "uptime reset", + "titleFormat": "Restart" + } + ] + }, + "description": "Dashboard for Micrometer instrumented applications (Java, Spring Boot, Micronaut)", + "editable": true, + "gnetId": 4701, + "graphTooltip": 1, + "iteration": 1553765841423, + "links": [], + "panels": [ + { + "content": "\n# Acknowledgments\n\nThank you to [Michael Weirauch](https://twitter.com/emwexx) for creating this dashboard: see original JVM (Micrometer) dashboard at [https://grafana.com/dashboards/4701](https://grafana.com/dashboards/4701)\n\n\n\n", + "gridPos": { + "h": 3, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 141, + "links": [], + "mode": "markdown", + "timeFrom": null, + "timeShift": null, + "title": "Acknowledgments", + "type": "text" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 3 + }, + "id": 125, + "panels": [], + "repeat": null, + "title": "Quick Facts", + "type": "row" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": true, + "colors": ["rgba(245, 54, 54, 0.9)", "rgba(237, 129, 40, 0.89)", "rgba(50, 172, 45, 0.97)"], + "datasource": "Prometheus", + "decimals": 1, + "editable": true, + "error": false, + "format": "s", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 0, + "y": 4 + }, + "height": "", + "id": 63, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "70%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "process_uptime_seconds{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "", + "metric": "", + "refId": "A", + "step": 14400 + } + ], + "thresholds": "", + "title": "Uptime", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": true, + "colors": ["rgba(245, 54, 54, 0.9)", "rgba(237, 129, 40, 0.89)", "rgba(50, 172, 45, 0.97)"], + "datasource": "Prometheus", + "decimals": null, + "editable": true, + "error": false, + "format": "dateTimeAsIso", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 6, + "y": 4 + }, + "height": "", + "id": 92, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "70%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "process_start_time_seconds{application=\"$application\", instance=\"$instance\"}*1000", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "", + "metric": "", + "refId": "A", + "step": 14400 + } + ], + "thresholds": "", + "title": "Start time", + "type": "singlestat", + "valueFontSize": "70%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": true, + "colors": ["rgba(50, 172, 45, 0.97)", "rgba(237, 129, 40, 0.89)", "rgba(245, 54, 54, 0.9)"], + "datasource": "Prometheus", + "decimals": 2, + "editable": true, + "error": false, + "format": "percent", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 12, + "y": 4 + }, + "id": 65, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "70%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "sum(jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", area=\"heap\"})*100/sum(jvm_memory_max_bytes{application=\"$application\",instance=\"$instance\", area=\"heap\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "", + "refId": "A", + "step": 14400 + } + ], + "thresholds": "70,90", + "title": "Heap used", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": true, + "colors": ["rgba(50, 172, 45, 0.97)", "rgba(237, 129, 40, 0.89)", "rgba(245, 54, 54, 0.9)"], + "datasource": "Prometheus", + "decimals": 2, + "editable": true, + "error": false, + "format": "percent", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 18, + "y": 4 + }, + "id": 75, + "interval": null, + "links": [], + "mappingType": 2, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "70%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + }, + { + "from": "-99999999999999999999999999999999", + "text": "N/A", + "to": "0" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "sum(jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", area=\"nonheap\"})*100/sum(jvm_memory_max_bytes{application=\"$application\",instance=\"$instance\", area=\"nonheap\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "", + "refId": "A", + "step": 14400 + } + ], + "thresholds": "70,90", + "title": "Non-Heap used", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + }, + { + "op": "=", + "text": "x", + "value": "" + } + ], + "valueName": "current" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 7 + }, + "id": 126, + "panels": [], + "repeat": null, + "title": "I/O Overview", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 8 + }, + "id": 111, + "legend": { + "avg": false, + "current": true, + "max": false, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(http_server_requests_seconds_count{application=\"$application\", instance=\"$instance\"}[1m]))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "HTTP", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Rate", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": null, + "format": "ops", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "HTTP": "#890f02", + "HTTP - 5xx": "#bf1b00" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 8 + }, + "id": 112, + "legend": { + "avg": false, + "current": true, + "max": false, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(http_server_requests_seconds_count{application=\"$application\", instance=\"$instance\", status=~\"5..\"}[1m]))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "HTTP - 5xx", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Errors", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": null, + "format": "ops", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 8 + }, + "id": 113, + "legend": { + "avg": false, + "current": true, + "max": false, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(http_server_requests_seconds_sum{application=\"$application\", instance=\"$instance\", status!~\"5..\"}[1m]))/sum(rate(http_server_requests_seconds_count{application=\"$application\", instance=\"$instance\", status!~\"5..\"}[1m]))", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "HTTP - AVG", + "refId": "A" + }, + { + "expr": "max(http_server_requests_seconds_max{application=\"$application\", instance=\"$instance\", status!~\"5..\"})", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "HTTP - MAX", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Duration", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 15 + }, + "id": 127, + "panels": [], + "repeat": null, + "title": "JVM Memory", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 16 + }, + "id": 24, + "legend": { + "avg": false, + "current": true, + "max": true, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", area=\"heap\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 2400 + }, + { + "expr": "sum(jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", area=\"heap\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "committed", + "refId": "B", + "step": 2400 + }, + { + "expr": "sum(jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", area=\"heap\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "max", + "refId": "C", + "step": 2400 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "JVM Heap", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["mbytes", "short"], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 16 + }, + "id": 25, + "legend": { + "avg": false, + "current": true, + "max": true, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", area=\"nonheap\"})", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 2400 + }, + { + "expr": "sum(jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", area=\"nonheap\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "committed", + "refId": "B", + "step": 2400 + }, + { + "expr": "sum(jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", area=\"nonheap\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "max", + "refId": "C", + "step": 2400 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "JVM Non-Heap", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["mbytes", "short"], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 16 + }, + "id": 26, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": true, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 2400 + }, + { + "expr": "sum(jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "committed", + "refId": "B", + "step": 2400 + }, + { + "expr": "sum(jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "max", + "refId": "C", + "step": 2400 + }, + { + "expr": "process_memory_vss_bytes{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "hide": true, + "intervalFactor": 2, + "legendFormat": "vss", + "metric": "", + "refId": "D", + "step": 2400 + }, + { + "expr": "process_memory_rss_bytes{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "rss", + "refId": "E", + "step": 2400 + }, + { + "expr": "process_memory_pss_bytes{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "pss", + "refId": "F", + "step": 2400 + }, + { + "expr": "process_memory_swap_bytes{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "swap", + "refId": "G", + "step": 2400 + }, + { + "expr": "process_memory_swappss_bytes{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "swappss", + "refId": "H", + "step": 2400 + }, + { + "expr": "process_memory_pss_bytes{application=\"$application\", instance=\"$instance\"} + process_memory_swap_bytes{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "phys (pss+swap)", + "refId": "I", + "step": 2400 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "JVM Total", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["mbytes", "short"], + "yaxes": [ + { + "format": "bytes", + "label": "", + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 23 + }, + "id": 128, + "panels": [], + "repeat": null, + "title": "JVM Misc", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 0, + "y": 24 + }, + "id": 106, + "legend": { + "avg": false, + "current": true, + "max": true, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "system_cpu_usage{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "system", + "metric": "", + "refId": "A", + "step": 2400 + }, + { + "expr": "process_cpu_usage{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "process", + "refId": "B" + }, + { + "expr": "avg_over_time(process_cpu_usage{application=\"$application\", instance=\"$instance\"}[1h])", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "process-1h", + "refId": "C" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "CPU", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["short", "short"], + "yaxes": [ + { + "decimals": 1, + "format": "percentunit", + "label": "", + "logBase": 1, + "max": "1", + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 6, + "y": 24 + }, + "id": 93, + "legend": { + "avg": false, + "current": true, + "max": true, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "system_load_average_1m{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "system-1m", + "metric": "", + "refId": "A", + "step": 2400 + }, + { + "expr": "", + "format": "time_series", + "intervalFactor": 2, + "refId": "B" + }, + { + "expr": "system_cpu_count{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "cpu", + "refId": "C" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Load", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["short", "short"], + "yaxes": [ + { + "decimals": 1, + "format": "short", + "label": "", + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 12, + "y": 24 + }, + "id": 32, + "legend": { + "avg": false, + "current": true, + "max": true, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_threads_live{application=\"$application\", instance=\"$instance\"} or jvm_threads_live_threads{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "live", + "metric": "", + "refId": "A", + "step": 2400 + }, + { + "expr": "jvm_threads_daemon{application=\"$application\", instance=\"$instance\"} or jvm_threads_daemon_threads{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "daemon", + "metric": "", + "refId": "B", + "step": 2400 + }, + { + "expr": "jvm_threads_peak{application=\"$application\", instance=\"$instance\"} or jvm_threads_peak_threads{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "peak", + "refId": "C", + "step": 2400 + }, + { + "expr": "process_threads{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "process", + "refId": "D", + "step": 2400 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Threads", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["short", "short"], + "yaxes": [ + { + "decimals": 0, + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "blocked": "#bf1b00", + "new": "#fce2de", + "runnable": "#7eb26d", + "terminated": "#511749", + "timed-waiting": "#c15c17", + "waiting": "#eab839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 1, + "gridPos": { + "h": 7, + "w": 6, + "x": 18, + "y": 24 + }, + "id": 124, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_threads_states_threads{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{state}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Thread States", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "debug": "#1F78C1", + "error": "#BF1B00", + "info": "#508642", + "trace": "#6ED0E0", + "warn": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 18, + "x": 0, + "y": 31 + }, + "height": "", + "id": 91, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": true, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "error", + "yaxis": 1 + }, + { + "alias": "warn", + "yaxis": 1 + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "increase(logback_events_total{application=\"$application\", instance=\"$instance\"}[1m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{level}}", + "metric": "", + "refId": "A", + "step": 1200 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Log Events (1m)", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["short", "short"], + "yaxes": [ + { + "decimals": 0, + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 18, + "y": 31 + }, + "id": 61, + "legend": { + "avg": false, + "current": true, + "max": true, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "process_open_fds{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "open", + "metric": "", + "refId": "A", + "step": 2400 + }, + { + "expr": "process_max_fds{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "max", + "metric": "", + "refId": "B", + "step": 2400 + }, + { + "expr": "process_files_open{application=\"$application\", instance=\"$instance\"} or process_files_open_files{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "open", + "refId": "C" + }, + { + "expr": "process_files_max{application=\"$application\", instance=\"$instance\"} or process_files_max_files{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "max", + "refId": "D" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "File Descriptors", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["short", "short"], + "yaxes": [ + { + "decimals": 0, + "format": "short", + "label": null, + "logBase": 10, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 38 + }, + "id": 129, + "panels": [], + "repeat": "persistence_counts", + "title": "JVM Memory Pools (Heap)", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 39 + }, + "id": 3, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "maxPerRow": 3, + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": "jvm_memory_pool_heap", + "scopedVars": { + "jvm_memory_pool_heap": { + "selected": false, + "text": "PS Eden Space", + "value": "PS Eden Space" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 1800 + }, + { + "expr": "jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "commited", + "metric": "", + "refId": "B", + "step": 1800 + }, + { + "expr": "jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "max", + "metric": "", + "refId": "C", + "step": 1800 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "$jvm_memory_pool_heap", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["mbytes", "short"], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 39 + }, + "id": 134, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "maxPerRow": 3, + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatIteration": 1553765841423, + "repeatPanelId": 3, + "scopedVars": { + "jvm_memory_pool_heap": { + "selected": false, + "text": "PS Old Gen", + "value": "PS Old Gen" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 1800 + }, + { + "expr": "jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "commited", + "metric": "", + "refId": "B", + "step": 1800 + }, + { + "expr": "jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "max", + "metric": "", + "refId": "C", + "step": 1800 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "$jvm_memory_pool_heap", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["mbytes", "short"], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 39 + }, + "id": 135, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "maxPerRow": 3, + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatIteration": 1553765841423, + "repeatPanelId": 3, + "scopedVars": { + "jvm_memory_pool_heap": { + "selected": false, + "text": "PS Survivor Space", + "value": "PS Survivor Space" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 1800 + }, + { + "expr": "jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "commited", + "metric": "", + "refId": "B", + "step": 1800 + }, + { + "expr": "jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "max", + "metric": "", + "refId": "C", + "step": 1800 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "$jvm_memory_pool_heap", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["mbytes", "short"], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 46 + }, + "id": 130, + "panels": [], + "repeat": null, + "title": "JVM Memory Pools (Non-Heap)", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 47 + }, + "id": 78, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "maxPerRow": 3, + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": "jvm_memory_pool_nonheap", + "scopedVars": { + "jvm_memory_pool_nonheap": { + "selected": false, + "text": "Metaspace", + "value": "Metaspace" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 1800 + }, + { + "expr": "jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "commited", + "metric": "", + "refId": "B", + "step": 1800 + }, + { + "expr": "jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "max", + "metric": "", + "refId": "C", + "step": 1800 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "$jvm_memory_pool_nonheap", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["mbytes", "short"], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 47 + }, + "id": 136, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "maxPerRow": 3, + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatIteration": 1553765841423, + "repeatPanelId": 78, + "scopedVars": { + "jvm_memory_pool_nonheap": { + "selected": false, + "text": "Compressed Class Space", + "value": "Compressed Class Space" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 1800 + }, + { + "expr": "jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "commited", + "metric": "", + "refId": "B", + "step": 1800 + }, + { + "expr": "jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "max", + "metric": "", + "refId": "C", + "step": 1800 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "$jvm_memory_pool_nonheap", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["mbytes", "short"], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 47 + }, + "id": 137, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "maxPerRow": 3, + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatIteration": 1553765841423, + "repeatPanelId": 78, + "scopedVars": { + "jvm_memory_pool_nonheap": { + "selected": false, + "text": "Code Cache", + "value": "Code Cache" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 1800 + }, + { + "expr": "jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "commited", + "metric": "", + "refId": "B", + "step": 1800 + }, + { + "expr": "jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "max", + "metric": "", + "refId": "C", + "step": 1800 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "$jvm_memory_pool_nonheap", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["mbytes", "short"], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 54 + }, + "id": 131, + "panels": [], + "repeat": null, + "title": "Garbage Collection", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 55 + }, + "id": 98, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(jvm_gc_pause_seconds_count{application=\"$application\", instance=\"$instance\"}[1m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "{{action}} ({{cause}})", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Collections", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "ops", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": "", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 55 + }, + "id": 101, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(jvm_gc_pause_seconds_sum{application=\"$application\", instance=\"$instance\"}[1m])/rate(jvm_gc_pause_seconds_count{application=\"$application\", instance=\"$instance\"}[1m])", + "format": "time_series", + "hide": false, + "instant": false, + "intervalFactor": 1, + "legendFormat": "avg {{action}} ({{cause}})", + "refId": "A" + }, + { + "expr": "jvm_gc_pause_seconds_max{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "hide": false, + "instant": false, + "intervalFactor": 1, + "legendFormat": "max {{action}} ({{cause}})", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Pause Durations", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": "", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 55 + }, + "id": 99, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(jvm_gc_memory_allocated_bytes_total{application=\"$application\", instance=\"$instance\"}[1m])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "allocated", + "refId": "A" + }, + { + "expr": "rate(jvm_gc_memory_promoted_bytes_total{application=\"$application\", instance=\"$instance\"}[1m])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "promoted", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Allocated/Promoted", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 62 + }, + "id": 132, + "panels": [], + "repeat": null, + "title": "Classloading", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 63 + }, + "id": 37, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_classes_loaded{application=\"$application\", instance=\"$instance\"} or jvm_classes_loaded_classes{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "loaded", + "metric": "", + "refId": "A", + "step": 1200 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Classes loaded", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["short", "short"], + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 63 + }, + "id": 38, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "delta(jvm_classes_loaded{application=\"$application\",instance=\"$instance\"}[5m]) or delta(jvm_classes_loaded_classes{application=\"$application\",instance=\"$instance\"}[5m])", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "delta", + "metric": "", + "refId": "A", + "step": 1200 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Class delta (5m)", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["ops", "short"], + "yaxes": [ + { + "decimals": null, + "format": "short", + "label": "", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 70 + }, + "id": 133, + "panels": [], + "repeat": null, + "title": "Buffer Pools", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 0, + "y": 71 + }, + "id": 33, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_buffer_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=\"direct\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 2400 + }, + { + "expr": "jvm_buffer_total_capacity_bytes{application=\"$application\", instance=\"$instance\", id=\"direct\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "capacity", + "metric": "", + "refId": "B", + "step": 2400 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Direct Buffers", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["short", "short"], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 6, + "y": 71 + }, + "id": 83, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_buffer_count{application=\"$application\", instance=\"$instance\", id=\"direct\"} or jvm_buffer_count_buffers{application=\"$application\", instance=\"$instance\", id=\"direct\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "count", + "metric": "", + "refId": "A", + "step": 2400 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Direct Buffers", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["short", "short"], + "yaxes": [ + { + "decimals": 0, + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 12, + "y": 71 + }, + "id": 85, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_buffer_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=\"mapped\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 2400 + }, + { + "expr": "jvm_buffer_total_capacity_bytes{application=\"$application\", instance=\"$instance\", id=\"mapped\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "capacity", + "metric": "", + "refId": "B", + "step": 2400 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Mapped Buffers", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["short", "short"], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 18, + "y": 71 + }, + "id": 84, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_buffer_count{application=\"$application\", instance=\"$instance\", id=\"mapped\"} or jvm_buffer_count_buffers{application=\"$application\", instance=\"$instance\", id=\"mapped\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "count", + "metric": "", + "refId": "A", + "step": 2400 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Mapped Buffers", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["short", "short"], + "yaxes": [ + { + "decimals": 0, + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + } + ], + "refresh": "10s", + "schemaVersion": 18, + "style": "dark", + "tags": [], + "templating": { + "list": [ + { + "allValue": null, + "current": { + "text": "test", + "value": "test" + }, + "datasource": "Prometheus", + "definition": "", + "hide": 0, + "includeAll": false, + "label": "Application", + "multi": false, + "name": "application", + "options": [], + "query": "label_values(application)", + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allFormat": "glob", + "allValue": null, + "current": { + "text": "localhost:8080", + "value": "localhost:8080" + }, + "datasource": "Prometheus", + "definition": "", + "hide": 0, + "includeAll": false, + "label": "Instance", + "multi": false, + "multiFormat": "glob", + "name": "instance", + "options": [], + "query": "label_values(jvm_memory_used_bytes{application=\"$application\"}, instance)", + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allFormat": "glob", + "allValue": null, + "current": { + "text": "All", + "value": "$__all" + }, + "datasource": "Prometheus", + "definition": "", + "hide": 0, + "includeAll": true, + "label": "JVM Memory Pools Heap", + "multi": false, + "multiFormat": "glob", + "name": "jvm_memory_pool_heap", + "options": [], + "query": "label_values(jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", area=\"heap\"},id)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allFormat": "glob", + "allValue": null, + "current": { + "text": "All", + "value": "$__all" + }, + "datasource": "Prometheus", + "definition": "", + "hide": 0, + "includeAll": true, + "label": "JVM Memory Pools Non-Heap", + "multi": false, + "multiFormat": "glob", + "name": "jvm_memory_pool_nonheap", + "options": [], + "query": "label_values(jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", area=\"nonheap\"},id)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 2, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + } + ] + }, + "time": { + "from": "now-30m", + "to": "now" + }, + "timepicker": { + "now": true, + "refresh_intervals": ["5s", "10s", "30s", "1m", "5m", "15m", "30m", "1h", "2h", "1d"], + "time_options": ["5m", "15m", "1h", "6h", "12h", "24h", "2d", "7d", "30d"] + }, + "timezone": "browser", + "title": "JVM (Micrometer)", + "uid": "Ud1CFe3iz", + "version": 1 +} diff --git a/borestop/src/main/docker/grafana/provisioning/dashboards/dashboard.yml b/borestop/src/main/docker/grafana/provisioning/dashboards/dashboard.yml new file mode 100644 index 00000000..4817a83a --- /dev/null +++ b/borestop/src/main/docker/grafana/provisioning/dashboards/dashboard.yml @@ -0,0 +1,11 @@ +apiVersion: 1 + +providers: + - name: 'Prometheus' + orgId: 1 + folder: '' + type: file + disableDeletion: false + editable: true + options: + path: /etc/grafana/provisioning/dashboards diff --git a/borestop/src/main/docker/grafana/provisioning/datasources/datasource.yml b/borestop/src/main/docker/grafana/provisioning/datasources/datasource.yml new file mode 100644 index 00000000..57b2bb3e --- /dev/null +++ b/borestop/src/main/docker/grafana/provisioning/datasources/datasource.yml @@ -0,0 +1,50 @@ +apiVersion: 1 + +# list of datasources that should be deleted from the database +deleteDatasources: + - name: Prometheus + orgId: 1 + +# list of datasources to insert/update depending +# whats available in the database +datasources: + # <string, required> name of the datasource. Required + - name: Prometheus + # <string, required> datasource type. Required + type: prometheus + # <string, required> access mode. direct or proxy. Required + access: proxy + # <int> org id. will default to orgId 1 if not specified + orgId: 1 + # <string> url + # On MacOS, replace localhost by host.docker.internal + url: http://localhost:9090 + # <string> database password, if used + password: + # <string> database user, if used + user: + # <string> database name, if used + database: + # <bool> enable/disable basic auth + basicAuth: false + # <string> basic auth username + basicAuthUser: admin + # <string> basic auth password + basicAuthPassword: admin + # <bool> enable/disable with credentials headers + withCredentials: + # <bool> mark as default datasource. Max one per org + isDefault: true + # <map> fields that will be converted to json and stored in json_data + jsonData: + graphiteVersion: '1.1' + tlsAuth: false + tlsAuthWithCACert: false + # <string> json object of data that will be encrypted. + secureJsonData: + tlsCACert: '...' + tlsClientCert: '...' + tlsClientKey: '...' + version: 1 + # <bool> allow users to edit datasources from the UI. + editable: true diff --git a/borestop/src/main/docker/monitoring.yml b/borestop/src/main/docker/monitoring.yml new file mode 100644 index 00000000..bac6b99c --- /dev/null +++ b/borestop/src/main/docker/monitoring.yml @@ -0,0 +1,26 @@ +version: '2' +services: + borestop-prometheus: + image: prom/prometheus:v2.18.1 + volumes: + - ./prometheus/:/etc/prometheus/ + command: + - '--config.file=/etc/prometheus/prometheus.yml' + ports: + - 9090:9090 + # On MacOS, remove next line and replace localhost by host.docker.internal in prometheus/prometheus.yml and + # grafana/provisioning/datasources/datasource.yml + network_mode: 'host' # to test locally running service + borestop-grafana: + image: grafana/grafana:7.0.1 + volumes: + - ./grafana/provisioning/:/etc/grafana/provisioning/ + environment: + - GF_SECURITY_ADMIN_PASSWORD=admin + - GF_USERS_ALLOW_SIGN_UP=false + - GF_INSTALL_PLUGINS=grafana-piechart-panel + ports: + - 3000:3000 + # On MacOS, remove next line and replace localhost by host.docker.internal in prometheus/prometheus.yml and + # grafana/provisioning/datasources/datasource.yml + network_mode: 'host' # to test locally running service diff --git a/borestop/src/main/docker/postgresql.yml b/borestop/src/main/docker/postgresql.yml new file mode 100644 index 00000000..21dfb387 --- /dev/null +++ b/borestop/src/main/docker/postgresql.yml @@ -0,0 +1,12 @@ +version: '2' +services: + borestop-postgresql: + image: postgres:12.3 + # volumes: + # - ~/volumes/jhipster/borestop/postgresql/:/var/lib/postgresql/data/ + environment: + - POSTGRES_USER=borestop + - POSTGRES_PASSWORD= + - POSTGRES_HOST_AUTH_METHOD=trust + ports: + - 5432:5432 diff --git a/borestop/src/main/docker/prometheus/prometheus.yml b/borestop/src/main/docker/prometheus/prometheus.yml new file mode 100644 index 00000000..b370a2f4 --- /dev/null +++ b/borestop/src/main/docker/prometheus/prometheus.yml @@ -0,0 +1,31 @@ +# Sample global config for monitoring JHipster applications +global: + scrape_interval: 15s # By default, scrape targets every 15 seconds. + evaluation_interval: 15s # By default, scrape targets every 15 seconds. + # scrape_timeout is set to the global default (10s). + + # Attach these labels to any time series or alerts when communicating with + # external systems (federation, remote storage, Alertmanager). + external_labels: + monitor: 'jhipster' + +# A scrape configuration containing exactly one endpoint to scrape: +# Here it's Prometheus itself. +scrape_configs: + # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config. + - job_name: 'prometheus' + + # Override the global default and scrape targets from this job every 5 seconds. + scrape_interval: 5s + + # scheme defaults to 'http' enable https in case your application is server via https + #scheme: https + # basic auth is not needed by default. See https://www.jhipster.tech/monitoring/#configuring-metrics-forwarding for details + #basic_auth: + # username: admin + # password: admin + metrics_path: /management/prometheus + static_configs: + - targets: + # On MacOS, replace localhost by host.docker.internal + - localhost:8080 diff --git a/borestop/src/main/docker/sonar.yml b/borestop/src/main/docker/sonar.yml new file mode 100644 index 00000000..001568b4 --- /dev/null +++ b/borestop/src/main/docker/sonar.yml @@ -0,0 +1,7 @@ +version: '2' +services: + borestop-sonar: + image: sonarqube:8.3.1-community + ports: + - 9001:9000 + - 9092:9092 diff --git a/borestop/src/main/java/com/ippon/borestop/ApplicationWebXml.java b/borestop/src/main/java/com/ippon/borestop/ApplicationWebXml.java new file mode 100644 index 00000000..ce00b439 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/ApplicationWebXml.java @@ -0,0 +1,19 @@ +package com.ippon.borestop; + +import io.github.jhipster.config.DefaultProfileUtil; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; + +/** + * This is a helper Java class that provides an alternative to creating a {@code web.xml}. + * This will be invoked only when the application is deployed to a Servlet container like Tomcat, JBoss etc. + */ +public class ApplicationWebXml extends SpringBootServletInitializer { + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + // set a default to use when no profile is configured. + DefaultProfileUtil.addDefaultProfile(application.application()); + return application.sources(BorestopApp.class); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/BorestopApp.java b/borestop/src/main/java/com/ippon/borestop/BorestopApp.java new file mode 100644 index 00000000..015bb809 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/BorestopApp.java @@ -0,0 +1,104 @@ +package com.ippon.borestop; + +import com.ippon.borestop.config.ApplicationProperties; +import io.github.jhipster.config.DefaultProfileUtil; +import io.github.jhipster.config.JHipsterConstants; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.Collection; +import javax.annotation.PostConstruct; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.liquibase.LiquibaseProperties; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.core.env.Environment; + +@SpringBootApplication +@EnableConfigurationProperties({ LiquibaseProperties.class, ApplicationProperties.class }) +public class BorestopApp { + private static final Logger log = LoggerFactory.getLogger(BorestopApp.class); + + private final Environment env; + + public BorestopApp(Environment env) { + this.env = env; + } + + /** + * Initializes borestop. + * <p> + * Spring profiles can be configured with a program argument --spring.profiles.active=your-active-profile + * <p> + * You can find more information on how profiles work with JHipster on <a href="https://www.jhipster.tech/profiles/">https://www.jhipster.tech/profiles/</a>. + */ + @PostConstruct + public void initApplication() { + Collection<String> activeProfiles = Arrays.asList(env.getActiveProfiles()); + if ( + activeProfiles.contains(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT) && + activeProfiles.contains(JHipsterConstants.SPRING_PROFILE_PRODUCTION) + ) { + log.error( + "You have misconfigured your application! It should not run " + "with both the 'dev' and 'prod' profiles at the same time." + ); + } + if ( + activeProfiles.contains(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT) && + activeProfiles.contains(JHipsterConstants.SPRING_PROFILE_CLOUD) + ) { + log.error( + "You have misconfigured your application! It should not " + "run with both the 'dev' and 'cloud' profiles at the same time." + ); + } + } + + /** + * Main method, used to run the application. + * + * @param args the command line arguments. + */ + public static void main(String[] args) { + SpringApplication app = new SpringApplication(BorestopApp.class); + DefaultProfileUtil.addDefaultProfile(app); + Environment env = app.run(args).getEnvironment(); + logApplicationStartup(env); + } + + private static void logApplicationStartup(Environment env) { + String protocol = "http"; + if (env.getProperty("server.ssl.key-store") != null) { + protocol = "https"; + } + String serverPort = env.getProperty("server.port"); + String contextPath = env.getProperty("server.servlet.context-path"); + if (StringUtils.isBlank(contextPath)) { + contextPath = "/"; + } + String hostAddress = "localhost"; + try { + hostAddress = InetAddress.getLocalHost().getHostAddress(); + } catch (UnknownHostException e) { + log.warn("The host name could not be determined, using `localhost` as fallback"); + } + log.info( + "\n----------------------------------------------------------\n\t" + + "Application '{}' is running! Access URLs:\n\t" + + "Local: \t\t{}://localhost:{}{}\n\t" + + "External: \t{}://{}:{}{}\n\t" + + "Profile(s): \t{}\n----------------------------------------------------------", + env.getProperty("spring.application.name"), + protocol, + serverPort, + contextPath, + protocol, + hostAddress, + serverPort, + contextPath, + env.getActiveProfiles() + ); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/aop/logging/LoggingAspect.java b/borestop/src/main/java/com/ippon/borestop/aop/logging/LoggingAspect.java new file mode 100644 index 00000000..df71391a --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/aop/logging/LoggingAspect.java @@ -0,0 +1,108 @@ +package com.ippon.borestop.aop.logging; + +import io.github.jhipster.config.JHipsterConstants; +import java.util.Arrays; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.AfterThrowing; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.env.Environment; +import org.springframework.core.env.Profiles; + +/** + * Aspect for logging execution of service and repository Spring components. + * + * By default, it only runs with the "dev" profile. + */ +@Aspect +public class LoggingAspect { + private final Environment env; + + public LoggingAspect(Environment env) { + this.env = env; + } + + /** + * Pointcut that matches all repositories, services and Web REST endpoints. + */ + @Pointcut( + "within(@org.springframework.stereotype.Repository *)" + + " || within(@org.springframework.stereotype.Service *)" + + " || within(@org.springframework.web.bind.annotation.RestController *)" + ) + public void springBeanPointcut() { + // Method is empty as this is just a Pointcut, the implementations are in the advices. + } + + /** + * Pointcut that matches all Spring beans in the application's main packages. + */ + @Pointcut( + "within(com.ippon.borestop.repository..*)" + " || within(com.ippon.borestop.service..*)" + " || within(com.ippon.borestop.web.rest..*)" + ) + public void applicationPackagePointcut() { + // Method is empty as this is just a Pointcut, the implementations are in the advices. + } + + /** + * Retrieves the {@link Logger} associated to the given {@link JoinPoint}. + * + * @param joinPoint join point we want the logger for. + * @return {@link Logger} associated to the given {@link JoinPoint}. + */ + private Logger logger(JoinPoint joinPoint) { + return LoggerFactory.getLogger(joinPoint.getSignature().getDeclaringTypeName()); + } + + /** + * Advice that logs methods throwing exceptions. + * + * @param joinPoint join point for advice. + * @param e exception. + */ + @AfterThrowing(pointcut = "applicationPackagePointcut() && springBeanPointcut()", throwing = "e") + public void logAfterThrowing(JoinPoint joinPoint, Throwable e) { + if (env.acceptsProfiles(Profiles.of(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT))) { + logger(joinPoint) + .error( + "Exception in {}() with cause = \'{}\' and exception = \'{}\'", + joinPoint.getSignature().getName(), + e.getCause() != null ? e.getCause() : "NULL", + e.getMessage(), + e + ); + } else { + logger(joinPoint) + .error("Exception in {}() with cause = {}", joinPoint.getSignature().getName(), e.getCause() != null ? e.getCause() : "NULL"); + } + } + + /** + * Advice that logs when a method is entered and exited. + * + * @param joinPoint join point for advice. + * @return result. + * @throws Throwable throws {@link IllegalArgumentException}. + */ + @Around("applicationPackagePointcut() && springBeanPointcut()") + public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable { + Logger log = logger(joinPoint); + if (log.isDebugEnabled()) { + log.debug("Enter: {}() with argument[s] = {}", joinPoint.getSignature().getName(), Arrays.toString(joinPoint.getArgs())); + } + try { + Object result = joinPoint.proceed(); + if (log.isDebugEnabled()) { + log.debug("Exit: {}() with result = {}", joinPoint.getSignature().getName(), result); + } + return result; + } catch (IllegalArgumentException e) { + log.error("Illegal argument: {} in {}()", Arrays.toString(joinPoint.getArgs()), joinPoint.getSignature().getName()); + throw e; + } + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/config/ApplicationProperties.java b/borestop/src/main/java/com/ippon/borestop/config/ApplicationProperties.java new file mode 100644 index 00000000..874f412a --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/config/ApplicationProperties.java @@ -0,0 +1,12 @@ +package com.ippon.borestop.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * Properties specific to Borestop. + * <p> + * Properties are configured in the {@code application.yml} file. + * See {@link io.github.jhipster.config.JHipsterProperties} for a good example. + */ +@ConfigurationProperties(prefix = "application", ignoreUnknownFields = false) +public class ApplicationProperties {} diff --git a/borestop/src/main/java/com/ippon/borestop/config/AsyncConfiguration.java b/borestop/src/main/java/com/ippon/borestop/config/AsyncConfiguration.java new file mode 100644 index 00000000..ffc95958 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/config/AsyncConfiguration.java @@ -0,0 +1,45 @@ +package com.ippon.borestop.config; + +import io.github.jhipster.async.ExceptionHandlingAsyncTaskExecutor; +import java.util.concurrent.Executor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; +import org.springframework.aop.interceptor.SimpleAsyncUncaughtExceptionHandler; +import org.springframework.boot.autoconfigure.task.TaskExecutionProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.AsyncConfigurer; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +@Configuration +@EnableAsync +@EnableScheduling +public class AsyncConfiguration implements AsyncConfigurer { + private final Logger log = LoggerFactory.getLogger(AsyncConfiguration.class); + + private final TaskExecutionProperties taskExecutionProperties; + + public AsyncConfiguration(TaskExecutionProperties taskExecutionProperties) { + this.taskExecutionProperties = taskExecutionProperties; + } + + @Override + @Bean(name = "taskExecutor") + public Executor getAsyncExecutor() { + log.debug("Creating Async Task Executor"); + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(taskExecutionProperties.getPool().getCoreSize()); + executor.setMaxPoolSize(taskExecutionProperties.getPool().getMaxSize()); + executor.setQueueCapacity(taskExecutionProperties.getPool().getQueueCapacity()); + executor.setThreadNamePrefix(taskExecutionProperties.getThreadNamePrefix()); + return new ExceptionHandlingAsyncTaskExecutor(executor); + } + + @Override + public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { + return new SimpleAsyncUncaughtExceptionHandler(); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/config/CloudDatabaseConfiguration.java b/borestop/src/main/java/com/ippon/borestop/config/CloudDatabaseConfiguration.java new file mode 100644 index 00000000..c962ed93 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/config/CloudDatabaseConfiguration.java @@ -0,0 +1,24 @@ +package com.ippon.borestop.config; + +import io.github.jhipster.config.JHipsterConstants; +import javax.sql.DataSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.cloud.config.java.AbstractCloudConfig; +import org.springframework.context.annotation.*; + +@Configuration +@Profile(JHipsterConstants.SPRING_PROFILE_CLOUD) +public class CloudDatabaseConfiguration extends AbstractCloudConfig { + private final Logger log = LoggerFactory.getLogger(CloudDatabaseConfiguration.class); + + private static final String CLOUD_CONFIGURATION_HIKARI_PREFIX = "spring.datasource.hikari"; + + @Bean + @ConfigurationProperties(CLOUD_CONFIGURATION_HIKARI_PREFIX) + public DataSource dataSource() { + log.info("Configuring JDBC datasource from a cloud provider"); + return connectionFactory().dataSource(); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/config/Constants.java b/borestop/src/main/java/com/ippon/borestop/config/Constants.java new file mode 100644 index 00000000..34304cb3 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/config/Constants.java @@ -0,0 +1,15 @@ +package com.ippon.borestop.config; + +/** + * Application constants. + */ +public final class Constants { + // Regex for acceptable logins + public static final String LOGIN_REGEX = "^(?>[a-zA-Z0-9!$&*+=?^_`{|}~.-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*)|(?>[_.@A-Za-z0-9-]+)$"; + + public static final String SYSTEM_ACCOUNT = "system"; + public static final String DEFAULT_LANGUAGE = "en"; + public static final String ANONYMOUS_USER = "anonymoususer"; + + private Constants() {} +} diff --git a/borestop/src/main/java/com/ippon/borestop/config/DatabaseConfiguration.java b/borestop/src/main/java/com/ippon/borestop/config/DatabaseConfiguration.java new file mode 100644 index 00000000..fbdadc25 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/config/DatabaseConfiguration.java @@ -0,0 +1,56 @@ +package com.ippon.borestop.config; + +import io.github.jhipster.config.JHipsterConstants; +import io.github.jhipster.config.h2.H2ConfigurationHelper; +import java.sql.SQLException; +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.core.env.Environment; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +@Configuration +@EnableJpaRepositories("com.ippon.borestop.repository") +@EnableJpaAuditing(auditorAwareRef = "springSecurityAuditorAware") +@EnableTransactionManagement +public class DatabaseConfiguration { + private final Logger log = LoggerFactory.getLogger(DatabaseConfiguration.class); + + private final Environment env; + + public DatabaseConfiguration(Environment env) { + this.env = env; + } + + /** + * Open the TCP port for the H2 database, so it is available remotely. + * + * @return the H2 database TCP server. + * @throws SQLException if the server failed to start. + */ + @Bean(initMethod = "start", destroyMethod = "stop") + @Profile(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT) + public Object h2TCPServer() throws SQLException { + String port = getValidPortForH2(); + log.debug("H2 database is available on port {}", port); + return H2ConfigurationHelper.createServer(port); + } + + private String getValidPortForH2() { + int port = Integer.parseInt(env.getProperty("server.port")); + if (port < 10000) { + port = 10000 + port; + } else { + if (port < 63536) { + port = port + 2000; + } else { + port = port - 2000; + } + } + return String.valueOf(port); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/config/DateTimeFormatConfiguration.java b/borestop/src/main/java/com/ippon/borestop/config/DateTimeFormatConfiguration.java new file mode 100644 index 00000000..e5eb6857 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/config/DateTimeFormatConfiguration.java @@ -0,0 +1,20 @@ +package com.ippon.borestop.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.format.FormatterRegistry; +import org.springframework.format.datetime.standard.DateTimeFormatterRegistrar; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * Configure the converters to use the ISO format for dates by default. + */ +@Configuration +public class DateTimeFormatConfiguration implements WebMvcConfigurer { + + @Override + public void addFormatters(FormatterRegistry registry) { + DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar(); + registrar.setUseIsoFormat(true); + registrar.registerFormatters(registry); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/config/JacksonConfiguration.java b/borestop/src/main/java/com/ippon/borestop/config/JacksonConfiguration.java new file mode 100644 index 00000000..515b3f44 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/config/JacksonConfiguration.java @@ -0,0 +1,51 @@ +package com.ippon.borestop.config; + +import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module; +import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.zalando.problem.ProblemModule; +import org.zalando.problem.violations.ConstraintViolationProblemModule; + +@Configuration +public class JacksonConfiguration { + + /** + * Support for Java date and time API. + * @return the corresponding Jackson module. + */ + @Bean + public JavaTimeModule javaTimeModule() { + return new JavaTimeModule(); + } + + @Bean + public Jdk8Module jdk8TimeModule() { + return new Jdk8Module(); + } + + /* + * Support for Hibernate types in Jackson. + */ + @Bean + public Hibernate5Module hibernate5Module() { + return new Hibernate5Module(); + } + + /* + * Module for serialization/deserialization of RFC7807 Problem. + */ + @Bean + public ProblemModule problemModule() { + return new ProblemModule(); + } + + /* + * Module for serialization/deserialization of ConstraintViolationProblem. + */ + @Bean + public ConstraintViolationProblemModule constraintViolationProblemModule() { + return new ConstraintViolationProblemModule(); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/config/LiquibaseConfiguration.java b/borestop/src/main/java/com/ippon/borestop/config/LiquibaseConfiguration.java new file mode 100644 index 00000000..e5305f2a --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/config/LiquibaseConfiguration.java @@ -0,0 +1,68 @@ +package com.ippon.borestop.config; + +import io.github.jhipster.config.JHipsterConstants; +import io.github.jhipster.config.liquibase.SpringLiquibaseUtil; +import java.util.concurrent.Executor; +import javax.sql.DataSource; +import liquibase.integration.spring.SpringLiquibase; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; +import org.springframework.boot.autoconfigure.liquibase.LiquibaseDataSource; +import org.springframework.boot.autoconfigure.liquibase.LiquibaseProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import org.springframework.core.env.Profiles; + +@Configuration +public class LiquibaseConfiguration { + private final Logger log = LoggerFactory.getLogger(LiquibaseConfiguration.class); + + private final Environment env; + + public LiquibaseConfiguration(Environment env) { + this.env = env; + } + + @Bean + public SpringLiquibase liquibase( + @Qualifier("taskExecutor") Executor executor, + @LiquibaseDataSource ObjectProvider<DataSource> liquibaseDataSource, + LiquibaseProperties liquibaseProperties, + ObjectProvider<DataSource> dataSource, + DataSourceProperties dataSourceProperties + ) { + // If you don't want Liquibase to start asynchronously, substitute by this: + // SpringLiquibase liquibase = SpringLiquibaseUtil.createSpringLiquibase(liquibaseDataSource.getIfAvailable(), liquibaseProperties, dataSource.getIfUnique(), dataSourceProperties); + SpringLiquibase liquibase = SpringLiquibaseUtil.createAsyncSpringLiquibase( + this.env, + executor, + liquibaseDataSource.getIfAvailable(), + liquibaseProperties, + dataSource.getIfUnique(), + dataSourceProperties + ); + liquibase.setChangeLog("classpath:config/liquibase/master.xml"); + liquibase.setContexts(liquibaseProperties.getContexts()); + liquibase.setDefaultSchema(liquibaseProperties.getDefaultSchema()); + liquibase.setLiquibaseSchema(liquibaseProperties.getLiquibaseSchema()); + liquibase.setLiquibaseTablespace(liquibaseProperties.getLiquibaseTablespace()); + liquibase.setDatabaseChangeLogLockTable(liquibaseProperties.getDatabaseChangeLogLockTable()); + liquibase.setDatabaseChangeLogTable(liquibaseProperties.getDatabaseChangeLogTable()); + liquibase.setDropFirst(liquibaseProperties.isDropFirst()); + liquibase.setLabels(liquibaseProperties.getLabels()); + liquibase.setChangeLogParameters(liquibaseProperties.getParameters()); + liquibase.setRollbackFile(liquibaseProperties.getRollbackFile()); + liquibase.setTestRollbackOnUpdate(liquibaseProperties.isTestRollbackOnUpdate()); + if (env.acceptsProfiles(Profiles.of(JHipsterConstants.SPRING_PROFILE_NO_LIQUIBASE))) { + liquibase.setShouldRun(false); + } else { + liquibase.setShouldRun(liquibaseProperties.isEnabled()); + log.debug("Configuring Liquibase"); + } + return liquibase; + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/config/LocaleConfiguration.java b/borestop/src/main/java/com/ippon/borestop/config/LocaleConfiguration.java new file mode 100644 index 00000000..22c40b42 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/config/LocaleConfiguration.java @@ -0,0 +1,26 @@ +package com.ippon.borestop.config; + +import io.github.jhipster.config.locale.AngularCookieLocaleResolver; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.LocaleResolver; +import org.springframework.web.servlet.config.annotation.*; +import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; + +@Configuration +public class LocaleConfiguration implements WebMvcConfigurer { + + @Bean + public LocaleResolver localeResolver() { + AngularCookieLocaleResolver cookieLocaleResolver = new AngularCookieLocaleResolver(); + cookieLocaleResolver.setCookieName("NG_TRANSLATE_LANG_KEY"); + return cookieLocaleResolver; + } + + @Override + public void addInterceptors(InterceptorRegistry registry) { + LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor(); + localeChangeInterceptor.setParamName("language"); + registry.addInterceptor(localeChangeInterceptor); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/config/LoggingAspectConfiguration.java b/borestop/src/main/java/com/ippon/borestop/config/LoggingAspectConfiguration.java new file mode 100644 index 00000000..63268ca1 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/config/LoggingAspectConfiguration.java @@ -0,0 +1,17 @@ +package com.ippon.borestop.config; + +import com.ippon.borestop.aop.logging.LoggingAspect; +import io.github.jhipster.config.JHipsterConstants; +import org.springframework.context.annotation.*; +import org.springframework.core.env.Environment; + +@Configuration +@EnableAspectJAutoProxy +public class LoggingAspectConfiguration { + + @Bean + @Profile(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT) + public LoggingAspect loggingAspect(Environment env) { + return new LoggingAspect(env); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/config/LoggingConfiguration.java b/borestop/src/main/java/com/ippon/borestop/config/LoggingConfiguration.java new file mode 100644 index 00000000..5b584f01 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/config/LoggingConfiguration.java @@ -0,0 +1,51 @@ +package com.ippon.borestop.config; + +import static io.github.jhipster.config.logging.LoggingUtils.*; + +import ch.qos.logback.classic.LoggerContext; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.github.jhipster.config.JHipsterProperties; +import java.util.HashMap; +import java.util.Map; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; + +/* + * Configures the console and Logstash log appenders from the app properties + */ +@Configuration +public class LoggingConfiguration { + + public LoggingConfiguration( + @Value("${spring.application.name}") String appName, + @Value("${server.port}") String serverPort, + JHipsterProperties jHipsterProperties, + ObjectMapper mapper + ) + throws JsonProcessingException { + LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); + + Map<String, String> map = new HashMap<>(); + map.put("app_name", appName); + map.put("app_port", serverPort); + String customFields = mapper.writeValueAsString(map); + + JHipsterProperties.Logging loggingProperties = jHipsterProperties.getLogging(); + JHipsterProperties.Logging.Logstash logstashProperties = loggingProperties.getLogstash(); + + if (loggingProperties.isUseJsonFormat()) { + addJsonConsoleAppender(context, customFields); + } + if (logstashProperties.isEnabled()) { + addLogstashTcpSocketAppender(context, customFields, logstashProperties); + } + if (loggingProperties.isUseJsonFormat() || logstashProperties.isEnabled()) { + addContextListener(context, customFields, loggingProperties); + } + if (jHipsterProperties.getMetrics().getLogs().isEnabled()) { + setMetricsMarkerLogbackFilter(context, loggingProperties.isUseJsonFormat()); + } + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/config/SecurityConfiguration.java b/borestop/src/main/java/com/ippon/borestop/config/SecurityConfiguration.java new file mode 100644 index 00000000..728f8a2a --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/config/SecurityConfiguration.java @@ -0,0 +1,99 @@ +package com.ippon.borestop.config; + +import com.ippon.borestop.security.*; +import com.ippon.borestop.security.jwt.*; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Import; +import org.springframework.http.HttpMethod; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.builders.WebSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; +import org.springframework.security.web.header.writers.ReferrerPolicyHeaderWriter; +import org.springframework.web.filter.CorsFilter; +import org.zalando.problem.spring.web.advice.security.SecurityProblemSupport; + +@EnableWebSecurity +@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) +@Import(SecurityProblemSupport.class) +public class SecurityConfiguration extends WebSecurityConfigurerAdapter { + private final TokenProvider tokenProvider; + + private final CorsFilter corsFilter; + private final SecurityProblemSupport problemSupport; + + public SecurityConfiguration(TokenProvider tokenProvider, CorsFilter corsFilter, SecurityProblemSupport problemSupport) { + this.tokenProvider = tokenProvider; + this.corsFilter = corsFilter; + this.problemSupport = problemSupport; + } + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + + @Override + public void configure(WebSecurity web) { + web + .ignoring() + .antMatchers(HttpMethod.OPTIONS, "/**") + .antMatchers("/app/**/*.{js,html}") + .antMatchers("/i18n/**") + .antMatchers("/content/**") + .antMatchers("/h2-console/**") + .antMatchers("/swagger-ui/index.html") + .antMatchers("/test/**"); + } + + @Override + public void configure(HttpSecurity http) throws Exception { + // @formatter:off + http + .csrf() + .disable() + .addFilterBefore(corsFilter, UsernamePasswordAuthenticationFilter.class) + .exceptionHandling() + .authenticationEntryPoint(problemSupport) + .accessDeniedHandler(problemSupport) + .and() + .headers() + .contentSecurityPolicy("default-src 'self'; frame-src 'self' data:; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://storage.googleapis.com; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self' data:") + .and() + .referrerPolicy(ReferrerPolicyHeaderWriter.ReferrerPolicy.STRICT_ORIGIN_WHEN_CROSS_ORIGIN) + .and() + .featurePolicy("geolocation 'none'; midi 'none'; sync-xhr 'none'; microphone 'none'; camera 'none'; magnetometer 'none'; gyroscope 'none'; speaker 'none'; fullscreen 'self'; payment 'none'") + .and() + .frameOptions() + .deny() + .and() + .sessionManagement() + .sessionCreationPolicy(SessionCreationPolicy.STATELESS) + .and() + .authorizeRequests() + .antMatchers("/api/authenticate").permitAll() + .antMatchers("/api/register").permitAll() + .antMatchers("/api/activate").permitAll() + .antMatchers("/api/account/reset-password/init").permitAll() + .antMatchers("/api/account/reset-password/finish").permitAll() + .antMatchers("/api/**").authenticated() + .antMatchers("/management/health").permitAll() + .antMatchers("/management/info").permitAll() + .antMatchers("/management/prometheus").permitAll() + .antMatchers("/management/**").hasAuthority(AuthoritiesConstants.ADMIN) + .and() + .httpBasic() + .and() + .apply(securityConfigurerAdapter()); + // @formatter:on + } + + private JWTConfigurer securityConfigurerAdapter() { + return new JWTConfigurer(tokenProvider); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/config/StaticResourcesWebConfiguration.java b/borestop/src/main/java/com/ippon/borestop/config/StaticResourcesWebConfiguration.java new file mode 100644 index 00000000..9cc17d0f --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/config/StaticResourcesWebConfiguration.java @@ -0,0 +1,50 @@ +package com.ippon.borestop.config; + +import io.github.jhipster.config.JHipsterConstants; +import io.github.jhipster.config.JHipsterProperties; +import java.util.concurrent.TimeUnit; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; +import org.springframework.http.CacheControl; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistration; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +@Profile({ JHipsterConstants.SPRING_PROFILE_PRODUCTION }) +public class StaticResourcesWebConfiguration implements WebMvcConfigurer { + protected static final String[] RESOURCE_LOCATIONS = new String[] { + "classpath:/static/app/", + "classpath:/static/content/", + "classpath:/static/i18n/" + }; + protected static final String[] RESOURCE_PATHS = new String[] { "/app/*", "/content/*", "/i18n/*" }; + + private final JHipsterProperties jhipsterProperties; + + public StaticResourcesWebConfiguration(JHipsterProperties jHipsterProperties) { + this.jhipsterProperties = jHipsterProperties; + } + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + ResourceHandlerRegistration resourceHandlerRegistration = appendResourceHandler(registry); + initializeResourceHandler(resourceHandlerRegistration); + } + + protected ResourceHandlerRegistration appendResourceHandler(ResourceHandlerRegistry registry) { + return registry.addResourceHandler(RESOURCE_PATHS); + } + + protected void initializeResourceHandler(ResourceHandlerRegistration resourceHandlerRegistration) { + resourceHandlerRegistration.addResourceLocations(RESOURCE_LOCATIONS).setCacheControl(getCacheControl()); + } + + protected CacheControl getCacheControl() { + return CacheControl.maxAge(getJHipsterHttpCacheProperty(), TimeUnit.DAYS).cachePublic(); + } + + private int getJHipsterHttpCacheProperty() { + return jhipsterProperties.getHttp().getCache().getTimeToLiveInDays(); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/config/WebConfigurer.java b/borestop/src/main/java/com/ippon/borestop/config/WebConfigurer.java new file mode 100644 index 00000000..85a7845b --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/config/WebConfigurer.java @@ -0,0 +1,133 @@ +package com.ippon.borestop.config; + +import static java.net.URLDecoder.decode; + +import io.github.jhipster.config.JHipsterConstants; +import io.github.jhipster.config.JHipsterProperties; +import io.github.jhipster.config.h2.H2ConfigurationHelper; +import java.io.File; +import java.io.UnsupportedEncodingException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Paths; +import java.util.*; +import javax.servlet.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.web.server.*; +import org.springframework.boot.web.servlet.ServletContextInitializer; +import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import org.springframework.core.env.Profiles; +import org.springframework.http.MediaType; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; + +/** + * Configuration of web application with Servlet 3.0 APIs. + */ +@Configuration +public class WebConfigurer implements ServletContextInitializer, WebServerFactoryCustomizer<WebServerFactory> { + private final Logger log = LoggerFactory.getLogger(WebConfigurer.class); + + private final Environment env; + + private final JHipsterProperties jHipsterProperties; + + public WebConfigurer(Environment env, JHipsterProperties jHipsterProperties) { + this.env = env; + this.jHipsterProperties = jHipsterProperties; + } + + @Override + public void onStartup(ServletContext servletContext) throws ServletException { + if (env.getActiveProfiles().length != 0) { + log.info("Web application configuration, using profiles: {}", (Object[]) env.getActiveProfiles()); + } + + if (env.acceptsProfiles(Profiles.of(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT))) { + initH2Console(servletContext); + } + log.info("Web application fully configured"); + } + + /** + * Customize the Servlet engine: Mime types, the document root, the cache. + */ + @Override + public void customize(WebServerFactory server) { + setMimeMappings(server); + + // When running in an IDE or with ./mvnw spring-boot:run, set location of the static web assets. + setLocationForStaticAssets(server); + } + + private void setMimeMappings(WebServerFactory server) { + if (server instanceof ConfigurableServletWebServerFactory) { + MimeMappings mappings = new MimeMappings(MimeMappings.DEFAULT); + + // IE issue, see https://github.com/jhipster/generator-jhipster/pull/711 + mappings.add("html", MediaType.TEXT_HTML_VALUE + ";charset=" + StandardCharsets.UTF_8.name().toLowerCase()); + + // CloudFoundry issue, see https://github.com/cloudfoundry/gorouter/issues/64 + mappings.add("json", MediaType.TEXT_HTML_VALUE + ";charset=" + StandardCharsets.UTF_8.name().toLowerCase()); + ConfigurableServletWebServerFactory servletWebServer = (ConfigurableServletWebServerFactory) server; + servletWebServer.setMimeMappings(mappings); + } + } + + private void setLocationForStaticAssets(WebServerFactory server) { + if (server instanceof ConfigurableServletWebServerFactory) { + ConfigurableServletWebServerFactory servletWebServer = (ConfigurableServletWebServerFactory) server; + File root; + String prefixPath = resolvePathPrefix(); + root = new File(prefixPath + "target/classes/static/"); + if (root.exists() && root.isDirectory()) { + servletWebServer.setDocumentRoot(root); + } + } + } + + /** + * Resolve path prefix to static resources. + */ + private String resolvePathPrefix() { + String fullExecutablePath; + try { + fullExecutablePath = decode(this.getClass().getResource("").getPath(), StandardCharsets.UTF_8.name()); + } catch (UnsupportedEncodingException e) { + /* try without decoding if this ever happens */ + fullExecutablePath = this.getClass().getResource("").getPath(); + } + String rootPath = Paths.get(".").toUri().normalize().getPath(); + String extractedPath = fullExecutablePath.replace(rootPath, ""); + int extractionEndIndex = extractedPath.indexOf("target/"); + if (extractionEndIndex <= 0) { + return ""; + } + return extractedPath.substring(0, extractionEndIndex); + } + + @Bean + public CorsFilter corsFilter() { + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + CorsConfiguration config = jHipsterProperties.getCors(); + if (config.getAllowedOrigins() != null && !config.getAllowedOrigins().isEmpty()) { + log.debug("Registering CORS filter"); + source.registerCorsConfiguration("/api/**", config); + source.registerCorsConfiguration("/management/**", config); + source.registerCorsConfiguration("/v2/api-docs", config); + } + return new CorsFilter(source); + } + + /** + * Initializes H2 console. + */ + private void initH2Console(ServletContext servletContext) { + log.debug("Initialize H2 console"); + H2ConfigurationHelper.initH2Console(servletContext); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/config/audit/AuditEventConverter.java b/borestop/src/main/java/com/ippon/borestop/config/audit/AuditEventConverter.java new file mode 100644 index 00000000..56abe0e1 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/config/audit/AuditEventConverter.java @@ -0,0 +1,88 @@ +package com.ippon.borestop.config.audit; + +import com.ippon.borestop.domain.PersistentAuditEvent; +import java.util.*; +import org.springframework.boot.actuate.audit.AuditEvent; +import org.springframework.security.web.authentication.WebAuthenticationDetails; +import org.springframework.stereotype.Component; + +@Component +public class AuditEventConverter { + + /** + * Convert a list of {@link PersistentAuditEvent}s to a list of {@link AuditEvent}s. + * + * @param persistentAuditEvents the list to convert. + * @return the converted list. + */ + public List<AuditEvent> convertToAuditEvent(Iterable<PersistentAuditEvent> persistentAuditEvents) { + if (persistentAuditEvents == null) { + return Collections.emptyList(); + } + List<AuditEvent> auditEvents = new ArrayList<>(); + for (PersistentAuditEvent persistentAuditEvent : persistentAuditEvents) { + auditEvents.add(convertToAuditEvent(persistentAuditEvent)); + } + return auditEvents; + } + + /** + * Convert a {@link PersistentAuditEvent} to an {@link AuditEvent}. + * + * @param persistentAuditEvent the event to convert. + * @return the converted list. + */ + public AuditEvent convertToAuditEvent(PersistentAuditEvent persistentAuditEvent) { + if (persistentAuditEvent == null) { + return null; + } + return new AuditEvent( + persistentAuditEvent.getAuditEventDate(), + persistentAuditEvent.getPrincipal(), + persistentAuditEvent.getAuditEventType(), + convertDataToObjects(persistentAuditEvent.getData()) + ); + } + + /** + * Internal conversion. This is needed to support the current SpringBoot actuator {@code AuditEventRepository} interface. + * + * @param data the data to convert. + * @return a map of {@link String}, {@link Object}. + */ + public Map<String, Object> convertDataToObjects(Map<String, String> data) { + Map<String, Object> results = new HashMap<>(); + + if (data != null) { + for (Map.Entry<String, String> entry : data.entrySet()) { + results.put(entry.getKey(), entry.getValue()); + } + } + return results; + } + + /** + * Internal conversion. This method will allow to save additional data. + * By default, it will save the object as string. + * + * @param data the data to convert. + * @return a map of {@link String}, {@link String}. + */ + public Map<String, String> convertDataToStrings(Map<String, Object> data) { + Map<String, String> results = new HashMap<>(); + + if (data != null) { + for (Map.Entry<String, Object> entry : data.entrySet()) { + // Extract the data that will be saved. + if (entry.getValue() instanceof WebAuthenticationDetails) { + WebAuthenticationDetails authenticationDetails = (WebAuthenticationDetails) entry.getValue(); + results.put("remoteAddress", authenticationDetails.getRemoteAddress()); + results.put("sessionId", authenticationDetails.getSessionId()); + } else { + results.put(entry.getKey(), Objects.toString(entry.getValue())); + } + } + } + return results; + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/config/audit/package-info.java b/borestop/src/main/java/com/ippon/borestop/config/audit/package-info.java new file mode 100644 index 00000000..fa8b682e --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/config/audit/package-info.java @@ -0,0 +1,4 @@ +/** + * Audit specific code. + */ +package com.ippon.borestop.config.audit; diff --git a/borestop/src/main/java/com/ippon/borestop/config/package-info.java b/borestop/src/main/java/com/ippon/borestop/config/package-info.java new file mode 100644 index 00000000..a24097d9 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/config/package-info.java @@ -0,0 +1,4 @@ +/** + * Spring Framework configuration files. + */ +package com.ippon.borestop.config; diff --git a/borestop/src/main/java/com/ippon/borestop/domain/AbstractAuditingEntity.java b/borestop/src/main/java/com/ippon/borestop/domain/AbstractAuditingEntity.java new file mode 100644 index 00000000..31109e42 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/domain/AbstractAuditingEntity.java @@ -0,0 +1,75 @@ +package com.ippon.borestop.domain; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import java.io.Serializable; +import java.time.Instant; +import javax.persistence.Column; +import javax.persistence.EntityListeners; +import javax.persistence.MappedSuperclass; +import org.springframework.data.annotation.CreatedBy; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedBy; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +/** + * Base abstract class for entities which will hold definitions for created, last modified, created by, + * last modified by attributes. + */ +@MappedSuperclass +@EntityListeners(AuditingEntityListener.class) +public abstract class AbstractAuditingEntity implements Serializable { + private static final long serialVersionUID = 1L; + + @CreatedBy + @Column(name = "created_by", nullable = false, length = 50, updatable = false) + @JsonIgnore + private String createdBy; + + @CreatedDate + @Column(name = "created_date", updatable = false) + @JsonIgnore + private Instant createdDate = Instant.now(); + + @LastModifiedBy + @Column(name = "last_modified_by", length = 50) + @JsonIgnore + private String lastModifiedBy; + + @LastModifiedDate + @Column(name = "last_modified_date") + @JsonIgnore + private Instant lastModifiedDate = Instant.now(); + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Instant getCreatedDate() { + return createdDate; + } + + public void setCreatedDate(Instant createdDate) { + this.createdDate = createdDate; + } + + public String getLastModifiedBy() { + return lastModifiedBy; + } + + public void setLastModifiedBy(String lastModifiedBy) { + this.lastModifiedBy = lastModifiedBy; + } + + public Instant getLastModifiedDate() { + return lastModifiedDate; + } + + public void setLastModifiedDate(Instant lastModifiedDate) { + this.lastModifiedDate = lastModifiedDate; + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/domain/Authority.java b/borestop/src/main/java/com/ippon/borestop/domain/Authority.java new file mode 100644 index 00000000..381c6724 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/domain/Authority.java @@ -0,0 +1,57 @@ +package com.ippon.borestop.domain; + +import java.io.Serializable; +import java.util.Objects; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * An authority (a security role) used by Spring Security. + */ +@Entity +@Table(name = "jhi_authority") +public class Authority implements Serializable { + private static final long serialVersionUID = 1L; + + @NotNull + @Size(max = 50) + @Id + @Column(length = 50) + private String name; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof Authority)) { + return false; + } + return Objects.equals(name, ((Authority) o).name); + } + + @Override + public int hashCode() { + return Objects.hashCode(name); + } + + // prettier-ignore + @Override + public String toString() { + return "Authority{" + + "name='" + name + '\'' + + "}"; + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/domain/PersistentAuditEvent.java b/borestop/src/main/java/com/ippon/borestop/domain/PersistentAuditEvent.java new file mode 100644 index 00000000..917e4121 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/domain/PersistentAuditEvent.java @@ -0,0 +1,107 @@ +package com.ippon.borestop.domain; + +import java.io.Serializable; +import java.time.Instant; +import java.util.HashMap; +import java.util.Map; +import javax.persistence.*; +import javax.validation.constraints.NotNull; + +/** + * Persist AuditEvent managed by the Spring Boot actuator. + * + * @see org.springframework.boot.actuate.audit.AuditEvent + */ +@Entity +@Table(name = "jhi_persistent_audit_event") +public class PersistentAuditEvent implements Serializable { + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator") + @SequenceGenerator(name = "sequenceGenerator") + @Column(name = "event_id") + private Long id; + + @NotNull + @Column(nullable = false) + private String principal; + + @Column(name = "event_date") + private Instant auditEventDate; + + @Column(name = "event_type") + private String auditEventType; + + @ElementCollection + @MapKeyColumn(name = "name") + @Column(name = "value") + @CollectionTable(name = "jhi_persistent_audit_evt_data", joinColumns = @JoinColumn(name = "event_id")) + private Map<String, String> data = new HashMap<>(); + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getPrincipal() { + return principal; + } + + public void setPrincipal(String principal) { + this.principal = principal; + } + + public Instant getAuditEventDate() { + return auditEventDate; + } + + public void setAuditEventDate(Instant auditEventDate) { + this.auditEventDate = auditEventDate; + } + + public String getAuditEventType() { + return auditEventType; + } + + public void setAuditEventType(String auditEventType) { + this.auditEventType = auditEventType; + } + + public Map<String, String> getData() { + return data; + } + + public void setData(Map<String, String> data) { + this.data = data; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof PersistentAuditEvent)) { + return false; + } + return id != null && id.equals(((PersistentAuditEvent) o).id); + } + + @Override + public int hashCode() { + return 31; + } + + // prettier-ignore + @Override + public String toString() { + return "PersistentAuditEvent{" + + "principal='" + principal + '\'' + + ", auditEventDate=" + auditEventDate + + ", auditEventType='" + auditEventType + '\'' + + '}'; + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/domain/User.java b/borestop/src/main/java/com/ippon/borestop/domain/User.java new file mode 100644 index 00000000..a43b734d --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/domain/User.java @@ -0,0 +1,226 @@ +package com.ippon.borestop.domain; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.ippon.borestop.config.Constants; +import java.io.Serializable; +import java.time.Instant; +import java.util.HashSet; +import java.util.Locale; +import java.util.Set; +import javax.persistence.*; +import javax.validation.constraints.Email; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; +import org.apache.commons.lang3.StringUtils; +import org.hibernate.annotations.BatchSize; + +/** + * A user. + */ +@Entity +@Table(name = "jhi_user") +public class User extends AbstractAuditingEntity implements Serializable { + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator") + @SequenceGenerator(name = "sequenceGenerator") + private Long id; + + @NotNull + @Pattern(regexp = Constants.LOGIN_REGEX) + @Size(min = 1, max = 50) + @Column(length = 50, unique = true, nullable = false) + private String login; + + @JsonIgnore + @NotNull + @Size(min = 60, max = 60) + @Column(name = "password_hash", length = 60, nullable = false) + private String password; + + @Size(max = 50) + @Column(name = "first_name", length = 50) + private String firstName; + + @Size(max = 50) + @Column(name = "last_name", length = 50) + private String lastName; + + @Email + @Size(min = 5, max = 254) + @Column(length = 254, unique = true) + private String email; + + @NotNull + @Column(nullable = false) + private boolean activated = false; + + @Size(min = 2, max = 10) + @Column(name = "lang_key", length = 10) + private String langKey; + + @Size(max = 256) + @Column(name = "image_url", length = 256) + private String imageUrl; + + @Size(max = 20) + @Column(name = "activation_key", length = 20) + @JsonIgnore + private String activationKey; + + @Size(max = 20) + @Column(name = "reset_key", length = 20) + @JsonIgnore + private String resetKey; + + @Column(name = "reset_date") + private Instant resetDate = null; + + @JsonIgnore + @ManyToMany + @JoinTable( + name = "jhi_user_authority", + joinColumns = { @JoinColumn(name = "user_id", referencedColumnName = "id") }, + inverseJoinColumns = { @JoinColumn(name = "authority_name", referencedColumnName = "name") } + ) + @BatchSize(size = 20) + private Set<Authority> authorities = new HashSet<>(); + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getLogin() { + return login; + } + + // Lowercase the login before saving it in database + public void setLogin(String login) { + this.login = StringUtils.lowerCase(login, Locale.ENGLISH); + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getImageUrl() { + return imageUrl; + } + + public void setImageUrl(String imageUrl) { + this.imageUrl = imageUrl; + } + + public boolean getActivated() { + return activated; + } + + public void setActivated(boolean activated) { + this.activated = activated; + } + + public String getActivationKey() { + return activationKey; + } + + public void setActivationKey(String activationKey) { + this.activationKey = activationKey; + } + + public String getResetKey() { + return resetKey; + } + + public void setResetKey(String resetKey) { + this.resetKey = resetKey; + } + + public Instant getResetDate() { + return resetDate; + } + + public void setResetDate(Instant resetDate) { + this.resetDate = resetDate; + } + + public String getLangKey() { + return langKey; + } + + public void setLangKey(String langKey) { + this.langKey = langKey; + } + + public Set<Authority> getAuthorities() { + return authorities; + } + + public void setAuthorities(Set<Authority> authorities) { + this.authorities = authorities; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof User)) { + return false; + } + return id != null && id.equals(((User) o).id); + } + + @Override + public int hashCode() { + return 31; + } + + // prettier-ignore + @Override + public String toString() { + return "User{" + + "login='" + login + '\'' + + ", firstName='" + firstName + '\'' + + ", lastName='" + lastName + '\'' + + ", email='" + email + '\'' + + ", imageUrl='" + imageUrl + '\'' + + ", activated='" + activated + '\'' + + ", langKey='" + langKey + '\'' + + ", activationKey='" + activationKey + '\'' + + "}"; + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/domain/package-info.java b/borestop/src/main/java/com/ippon/borestop/domain/package-info.java new file mode 100644 index 00000000..8952b86c --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/domain/package-info.java @@ -0,0 +1,4 @@ +/** + * JPA domain objects. + */ +package com.ippon.borestop.domain; diff --git a/borestop/src/main/java/com/ippon/borestop/repository/AuthorityRepository.java b/borestop/src/main/java/com/ippon/borestop/repository/AuthorityRepository.java new file mode 100644 index 00000000..490eba34 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/repository/AuthorityRepository.java @@ -0,0 +1,9 @@ +package com.ippon.borestop.repository; + +import com.ippon.borestop.domain.Authority; +import org.springframework.data.jpa.repository.JpaRepository; + +/** + * Spring Data JPA repository for the {@link Authority} entity. + */ +public interface AuthorityRepository extends JpaRepository<Authority, String> {} diff --git a/borestop/src/main/java/com/ippon/borestop/repository/CustomAuditEventRepository.java b/borestop/src/main/java/com/ippon/borestop/repository/CustomAuditEventRepository.java new file mode 100644 index 00000000..aa227082 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/repository/CustomAuditEventRepository.java @@ -0,0 +1,92 @@ +package com.ippon.borestop.repository; + +import com.ippon.borestop.config.Constants; +import com.ippon.borestop.config.audit.AuditEventConverter; +import com.ippon.borestop.domain.PersistentAuditEvent; +import java.time.Instant; +import java.util.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.actuate.audit.AuditEvent; +import org.springframework.boot.actuate.audit.AuditEventRepository; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +/** + * An implementation of Spring Boot's {@link AuditEventRepository}. + */ +@Repository +public class CustomAuditEventRepository implements AuditEventRepository { + private static final String AUTHORIZATION_FAILURE = "AUTHORIZATION_FAILURE"; + + /** + * Should be the same as in Liquibase migration. + */ + protected static final int EVENT_DATA_COLUMN_MAX_LENGTH = 255; + + private final PersistenceAuditEventRepository persistenceAuditEventRepository; + + private final AuditEventConverter auditEventConverter; + + private final Logger log = LoggerFactory.getLogger(getClass()); + + public CustomAuditEventRepository( + PersistenceAuditEventRepository persistenceAuditEventRepository, + AuditEventConverter auditEventConverter + ) { + this.persistenceAuditEventRepository = persistenceAuditEventRepository; + this.auditEventConverter = auditEventConverter; + } + + @Override + public List<AuditEvent> find(String principal, Instant after, String type) { + Iterable<PersistentAuditEvent> persistentAuditEvents = persistenceAuditEventRepository.findByPrincipalAndAuditEventDateAfterAndAuditEventType( + principal, + after, + type + ); + return auditEventConverter.convertToAuditEvent(persistentAuditEvents); + } + + @Override + @Transactional(propagation = Propagation.REQUIRES_NEW) + public void add(AuditEvent event) { + if (!AUTHORIZATION_FAILURE.equals(event.getType()) && !Constants.ANONYMOUS_USER.equals(event.getPrincipal())) { + PersistentAuditEvent persistentAuditEvent = new PersistentAuditEvent(); + persistentAuditEvent.setPrincipal(event.getPrincipal()); + persistentAuditEvent.setAuditEventType(event.getType()); + persistentAuditEvent.setAuditEventDate(event.getTimestamp()); + Map<String, String> eventData = auditEventConverter.convertDataToStrings(event.getData()); + persistentAuditEvent.setData(truncate(eventData)); + persistenceAuditEventRepository.save(persistentAuditEvent); + } + } + + /** + * Truncate event data that might exceed column length. + */ + private Map<String, String> truncate(Map<String, String> data) { + Map<String, String> results = new HashMap<>(); + + if (data != null) { + for (Map.Entry<String, String> entry : data.entrySet()) { + String value = entry.getValue(); + if (value != null) { + int length = value.length(); + if (length > EVENT_DATA_COLUMN_MAX_LENGTH) { + value = value.substring(0, EVENT_DATA_COLUMN_MAX_LENGTH); + log.warn( + "Event data for {} too long ({}) has been truncated to {}. Consider increasing column width.", + entry.getKey(), + length, + EVENT_DATA_COLUMN_MAX_LENGTH + ); + } + } + results.put(entry.getKey(), value); + } + } + return results; + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/repository/PersistenceAuditEventRepository.java b/borestop/src/main/java/com/ippon/borestop/repository/PersistenceAuditEventRepository.java new file mode 100644 index 00000000..7376410f --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/repository/PersistenceAuditEventRepository.java @@ -0,0 +1,21 @@ +package com.ippon.borestop.repository; + +import com.ippon.borestop.domain.PersistentAuditEvent; +import java.time.Instant; +import java.util.List; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; + +/** + * Spring Data JPA repository for the {@link PersistentAuditEvent} entity. + */ +public interface PersistenceAuditEventRepository extends JpaRepository<PersistentAuditEvent, Long> { + List<PersistentAuditEvent> findByPrincipal(String principal); + + List<PersistentAuditEvent> findByPrincipalAndAuditEventDateAfterAndAuditEventType(String principal, Instant after, String type); + + Page<PersistentAuditEvent> findAllByAuditEventDateBetween(Instant fromDate, Instant toDate, Pageable pageable); + + List<PersistentAuditEvent> findByAuditEventDateBefore(Instant before); +} diff --git a/borestop/src/main/java/com/ippon/borestop/repository/UserRepository.java b/borestop/src/main/java/com/ippon/borestop/repository/UserRepository.java new file mode 100644 index 00000000..23542261 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/repository/UserRepository.java @@ -0,0 +1,35 @@ +package com.ippon.borestop.repository; + +import com.ippon.borestop.domain.User; +import java.time.Instant; +import java.util.List; +import java.util.Optional; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.EntityGraph; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +/** + * Spring Data JPA repository for the {@link User} entity. + */ +@Repository +public interface UserRepository extends JpaRepository<User, Long> { + Optional<User> findOneByActivationKey(String activationKey); + + List<User> findAllByActivatedIsFalseAndActivationKeyIsNotNullAndCreatedDateBefore(Instant dateTime); + + Optional<User> findOneByResetKey(String resetKey); + + Optional<User> findOneByEmailIgnoreCase(String email); + + Optional<User> findOneByLogin(String login); + + @EntityGraph(attributePaths = "authorities") + Optional<User> findOneWithAuthoritiesByLogin(String login); + + @EntityGraph(attributePaths = "authorities") + Optional<User> findOneWithAuthoritiesByEmailIgnoreCase(String email); + + Page<User> findAllByLoginNot(Pageable pageable, String login); +} diff --git a/borestop/src/main/java/com/ippon/borestop/repository/package-info.java b/borestop/src/main/java/com/ippon/borestop/repository/package-info.java new file mode 100644 index 00000000..25618cca --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/repository/package-info.java @@ -0,0 +1,4 @@ +/** + * Spring Data JPA repositories. + */ +package com.ippon.borestop.repository; diff --git a/borestop/src/main/java/com/ippon/borestop/security/AuthoritiesConstants.java b/borestop/src/main/java/com/ippon/borestop/security/AuthoritiesConstants.java new file mode 100644 index 00000000..193b052d --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/security/AuthoritiesConstants.java @@ -0,0 +1,14 @@ +package com.ippon.borestop.security; + +/** + * Constants for Spring Security authorities. + */ +public final class AuthoritiesConstants { + public static final String ADMIN = "ROLE_ADMIN"; + + public static final String USER = "ROLE_USER"; + + public static final String ANONYMOUS = "ROLE_ANONYMOUS"; + + private AuthoritiesConstants() {} +} diff --git a/borestop/src/main/java/com/ippon/borestop/security/DomainUserDetailsService.java b/borestop/src/main/java/com/ippon/borestop/security/DomainUserDetailsService.java new file mode 100644 index 00000000..29330366 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/security/DomainUserDetailsService.java @@ -0,0 +1,61 @@ +package com.ippon.borestop.security; + +import com.ippon.borestop.domain.User; +import com.ippon.borestop.repository.UserRepository; +import java.util.*; +import java.util.stream.Collectors; +import org.hibernate.validator.internal.constraintvalidators.hv.EmailValidator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +/** + * Authenticate a user from the database. + */ +@Component("userDetailsService") +public class DomainUserDetailsService implements UserDetailsService { + private final Logger log = LoggerFactory.getLogger(DomainUserDetailsService.class); + + private final UserRepository userRepository; + + public DomainUserDetailsService(UserRepository userRepository) { + this.userRepository = userRepository; + } + + @Override + @Transactional + public UserDetails loadUserByUsername(final String login) { + log.debug("Authenticating {}", login); + + if (new EmailValidator().isValid(login, null)) { + return userRepository + .findOneWithAuthoritiesByEmailIgnoreCase(login) + .map(user -> createSpringSecurityUser(login, user)) + .orElseThrow(() -> new UsernameNotFoundException("User with email " + login + " was not found in the database")); + } + + String lowercaseLogin = login.toLowerCase(Locale.ENGLISH); + return userRepository + .findOneWithAuthoritiesByLogin(lowercaseLogin) + .map(user -> createSpringSecurityUser(lowercaseLogin, user)) + .orElseThrow(() -> new UsernameNotFoundException("User " + lowercaseLogin + " was not found in the database")); + } + + private org.springframework.security.core.userdetails.User createSpringSecurityUser(String lowercaseLogin, User user) { + if (!user.getActivated()) { + throw new UserNotActivatedException("User " + lowercaseLogin + " was not activated"); + } + List<GrantedAuthority> grantedAuthorities = user + .getAuthorities() + .stream() + .map(authority -> new SimpleGrantedAuthority(authority.getName())) + .collect(Collectors.toList()); + return new org.springframework.security.core.userdetails.User(user.getLogin(), user.getPassword(), grantedAuthorities); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/security/SecurityUtils.java b/borestop/src/main/java/com/ippon/borestop/security/SecurityUtils.java new file mode 100644 index 00000000..8e4d195d --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/security/SecurityUtils.java @@ -0,0 +1,79 @@ +package com.ippon.borestop.security; + +import java.util.Optional; +import java.util.stream.Stream; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; + +/** + * Utility class for Spring Security. + */ +public final class SecurityUtils { + + private SecurityUtils() {} + + /** + * Get the login of the current user. + * + * @return the login of the current user. + */ + public static Optional<String> getCurrentUserLogin() { + SecurityContext securityContext = SecurityContextHolder.getContext(); + return Optional.ofNullable(extractPrincipal(securityContext.getAuthentication())); + } + + private static String extractPrincipal(Authentication authentication) { + if (authentication == null) { + return null; + } else if (authentication.getPrincipal() instanceof UserDetails) { + UserDetails springSecurityUser = (UserDetails) authentication.getPrincipal(); + return springSecurityUser.getUsername(); + } else if (authentication.getPrincipal() instanceof String) { + return (String) authentication.getPrincipal(); + } + return null; + } + + /** + * Get the JWT of the current user. + * + * @return the JWT of the current user. + */ + public static Optional<String> getCurrentUserJWT() { + SecurityContext securityContext = SecurityContextHolder.getContext(); + return Optional + .ofNullable(securityContext.getAuthentication()) + .filter(authentication -> authentication.getCredentials() instanceof String) + .map(authentication -> (String) authentication.getCredentials()); + } + + /** + * Check if a user is authenticated. + * + * @return true if the user is authenticated, false otherwise. + */ + public static boolean isAuthenticated() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + return authentication != null && getAuthorities(authentication).noneMatch(AuthoritiesConstants.ANONYMOUS::equals); + } + + /** + * If the current user has a specific authority (security role). + * <p> + * The name of this method comes from the {@code isUserInRole()} method in the Servlet API. + * + * @param authority the authority to check. + * @return true if the current user has the authority, false otherwise. + */ + public static boolean isCurrentUserInRole(String authority) { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + return authentication != null && getAuthorities(authentication).anyMatch(authority::equals); + } + + private static Stream<String> getAuthorities(Authentication authentication) { + return authentication.getAuthorities().stream().map(GrantedAuthority::getAuthority); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/security/SpringSecurityAuditorAware.java b/borestop/src/main/java/com/ippon/borestop/security/SpringSecurityAuditorAware.java new file mode 100644 index 00000000..13ec4606 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/security/SpringSecurityAuditorAware.java @@ -0,0 +1,18 @@ +package com.ippon.borestop.security; + +import com.ippon.borestop.config.Constants; +import java.util.Optional; +import org.springframework.data.domain.AuditorAware; +import org.springframework.stereotype.Component; + +/** + * Implementation of {@link AuditorAware} based on Spring Security. + */ +@Component +public class SpringSecurityAuditorAware implements AuditorAware<String> { + + @Override + public Optional<String> getCurrentAuditor() { + return Optional.of(SecurityUtils.getCurrentUserLogin().orElse(Constants.SYSTEM_ACCOUNT)); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/security/UserNotActivatedException.java b/borestop/src/main/java/com/ippon/borestop/security/UserNotActivatedException.java new file mode 100644 index 00000000..aa2e1cc0 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/security/UserNotActivatedException.java @@ -0,0 +1,18 @@ +package com.ippon.borestop.security; + +import org.springframework.security.core.AuthenticationException; + +/** + * This exception is thrown in case of a not activated user trying to authenticate. + */ +public class UserNotActivatedException extends AuthenticationException { + private static final long serialVersionUID = 1L; + + public UserNotActivatedException(String message) { + super(message); + } + + public UserNotActivatedException(String message, Throwable t) { + super(message, t); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/security/jwt/JWTConfigurer.java b/borestop/src/main/java/com/ippon/borestop/security/jwt/JWTConfigurer.java new file mode 100644 index 00000000..796f38b7 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/security/jwt/JWTConfigurer.java @@ -0,0 +1,20 @@ +package com.ippon.borestop.security.jwt; + +import org.springframework.security.config.annotation.SecurityConfigurerAdapter; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.web.DefaultSecurityFilterChain; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; + +public class JWTConfigurer extends SecurityConfigurerAdapter<DefaultSecurityFilterChain, HttpSecurity> { + private final TokenProvider tokenProvider; + + public JWTConfigurer(TokenProvider tokenProvider) { + this.tokenProvider = tokenProvider; + } + + @Override + public void configure(HttpSecurity http) { + JWTFilter customFilter = new JWTFilter(tokenProvider); + http.addFilterBefore(customFilter, UsernamePasswordAuthenticationFilter.class); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/security/jwt/JWTFilter.java b/borestop/src/main/java/com/ippon/borestop/security/jwt/JWTFilter.java new file mode 100644 index 00000000..16336303 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/security/jwt/JWTFilter.java @@ -0,0 +1,46 @@ +package com.ippon.borestop.security.jwt; + +import java.io.IOException; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.util.StringUtils; +import org.springframework.web.filter.GenericFilterBean; + +/** + * Filters incoming requests and installs a Spring Security principal if a header corresponding to a valid user is + * found. + */ +public class JWTFilter extends GenericFilterBean { + public static final String AUTHORIZATION_HEADER = "Authorization"; + + private final TokenProvider tokenProvider; + + public JWTFilter(TokenProvider tokenProvider) { + this.tokenProvider = tokenProvider; + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) + throws IOException, ServletException { + HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; + String jwt = resolveToken(httpServletRequest); + if (StringUtils.hasText(jwt) && this.tokenProvider.validateToken(jwt)) { + Authentication authentication = this.tokenProvider.getAuthentication(jwt); + SecurityContextHolder.getContext().setAuthentication(authentication); + } + filterChain.doFilter(servletRequest, servletResponse); + } + + private String resolveToken(HttpServletRequest request) { + String bearerToken = request.getHeader(AUTHORIZATION_HEADER); + if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) { + return bearerToken.substring(7); + } + return null; + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/security/jwt/TokenProvider.java b/borestop/src/main/java/com/ippon/borestop/security/jwt/TokenProvider.java new file mode 100644 index 00000000..77db1334 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/security/jwt/TokenProvider.java @@ -0,0 +1,103 @@ +package com.ippon.borestop.security.jwt; + +import io.github.jhipster.config.JHipsterProperties; +import io.jsonwebtoken.*; +import io.jsonwebtoken.io.Decoders; +import io.jsonwebtoken.security.Keys; +import java.nio.charset.StandardCharsets; +import java.security.Key; +import java.util.*; +import java.util.stream.Collectors; +import javax.annotation.PostConstruct; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.User; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +@Component +public class TokenProvider { + private final Logger log = LoggerFactory.getLogger(TokenProvider.class); + + private static final String AUTHORITIES_KEY = "auth"; + + private Key key; + + private long tokenValidityInMilliseconds; + + private long tokenValidityInMillisecondsForRememberMe; + + private final JHipsterProperties jHipsterProperties; + + public TokenProvider(JHipsterProperties jHipsterProperties) { + this.jHipsterProperties = jHipsterProperties; + } + + @PostConstruct + public void init() { + byte[] keyBytes; + String secret = jHipsterProperties.getSecurity().getAuthentication().getJwt().getSecret(); + if (!StringUtils.isEmpty(secret)) { + log.warn( + "Warning: the JWT key used is not Base64-encoded. " + + "We recommend using the `jhipster.security.authentication.jwt.base64-secret` key for optimum security." + ); + keyBytes = secret.getBytes(StandardCharsets.UTF_8); + } else { + log.debug("Using a Base64-encoded JWT secret key"); + keyBytes = Decoders.BASE64.decode(jHipsterProperties.getSecurity().getAuthentication().getJwt().getBase64Secret()); + } + this.key = Keys.hmacShaKeyFor(keyBytes); + this.tokenValidityInMilliseconds = 1000 * jHipsterProperties.getSecurity().getAuthentication().getJwt().getTokenValidityInSeconds(); + this.tokenValidityInMillisecondsForRememberMe = + 1000 * jHipsterProperties.getSecurity().getAuthentication().getJwt().getTokenValidityInSecondsForRememberMe(); + } + + public String createToken(Authentication authentication, boolean rememberMe) { + String authorities = authentication.getAuthorities().stream().map(GrantedAuthority::getAuthority).collect(Collectors.joining(",")); + + long now = (new Date()).getTime(); + Date validity; + if (rememberMe) { + validity = new Date(now + this.tokenValidityInMillisecondsForRememberMe); + } else { + validity = new Date(now + this.tokenValidityInMilliseconds); + } + + return Jwts + .builder() + .setSubject(authentication.getName()) + .claim(AUTHORITIES_KEY, authorities) + .signWith(key, SignatureAlgorithm.HS512) + .setExpiration(validity) + .compact(); + } + + public Authentication getAuthentication(String token) { + Claims claims = Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token).getBody(); + + Collection<? extends GrantedAuthority> authorities = Arrays + .stream(claims.get(AUTHORITIES_KEY).toString().split(",")) + .map(SimpleGrantedAuthority::new) + .collect(Collectors.toList()); + + User principal = new User(claims.getSubject(), "", authorities); + + return new UsernamePasswordAuthenticationToken(principal, token, authorities); + } + + public boolean validateToken(String authToken) { + try { + Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(authToken); + return true; + } catch (JwtException | IllegalArgumentException e) { + log.info("Invalid JWT token."); + log.trace("Invalid JWT token trace.", e); + } + return false; + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/security/package-info.java b/borestop/src/main/java/com/ippon/borestop/security/package-info.java new file mode 100644 index 00000000..34cdc243 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/security/package-info.java @@ -0,0 +1,4 @@ +/** + * Spring Security configuration. + */ +package com.ippon.borestop.security; diff --git a/borestop/src/main/java/com/ippon/borestop/service/AuditEventService.java b/borestop/src/main/java/com/ippon/borestop/service/AuditEventService.java new file mode 100644 index 00000000..337c2eb1 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/service/AuditEventService.java @@ -0,0 +1,77 @@ +package com.ippon.borestop.service; + +import com.ippon.borestop.config.audit.AuditEventConverter; +import com.ippon.borestop.repository.PersistenceAuditEventRepository; +import io.github.jhipster.config.JHipsterProperties; +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.util.Optional; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.actuate.audit.AuditEvent; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * Service for managing audit events. + * <p> + * This is the default implementation to support SpringBoot Actuator {@code AuditEventRepository}. + */ +@Service +@Transactional +public class AuditEventService { + private final Logger log = LoggerFactory.getLogger(AuditEventService.class); + + private final JHipsterProperties jHipsterProperties; + + private final PersistenceAuditEventRepository persistenceAuditEventRepository; + + private final AuditEventConverter auditEventConverter; + + public AuditEventService( + PersistenceAuditEventRepository persistenceAuditEventRepository, + AuditEventConverter auditEventConverter, + JHipsterProperties jhipsterProperties + ) { + this.persistenceAuditEventRepository = persistenceAuditEventRepository; + this.auditEventConverter = auditEventConverter; + this.jHipsterProperties = jhipsterProperties; + } + + /** + * Old audit events should be automatically deleted after 30 days. + * + * This is scheduled to get fired at 12:00 (am). + */ + @Scheduled(cron = "0 0 12 * * ?") + public void removeOldAuditEvents() { + persistenceAuditEventRepository + .findByAuditEventDateBefore(Instant.now().minus(jHipsterProperties.getAuditEvents().getRetentionPeriod(), ChronoUnit.DAYS)) + .forEach( + auditEvent -> { + log.debug("Deleting audit data {}", auditEvent); + persistenceAuditEventRepository.delete(auditEvent); + } + ); + } + + @Transactional(readOnly = true) + public Page<AuditEvent> findAll(Pageable pageable) { + return persistenceAuditEventRepository.findAll(pageable).map(auditEventConverter::convertToAuditEvent); + } + + @Transactional(readOnly = true) + public Page<AuditEvent> findByDates(Instant fromDate, Instant toDate, Pageable pageable) { + return persistenceAuditEventRepository + .findAllByAuditEventDateBetween(fromDate, toDate, pageable) + .map(auditEventConverter::convertToAuditEvent); + } + + @Transactional(readOnly = true) + public Optional<AuditEvent> find(Long id) { + return persistenceAuditEventRepository.findById(id).map(auditEventConverter::convertToAuditEvent); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/service/EmailAlreadyUsedException.java b/borestop/src/main/java/com/ippon/borestop/service/EmailAlreadyUsedException.java new file mode 100644 index 00000000..49a051ca --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/service/EmailAlreadyUsedException.java @@ -0,0 +1,9 @@ +package com.ippon.borestop.service; + +public class EmailAlreadyUsedException extends RuntimeException { + private static final long serialVersionUID = 1L; + + public EmailAlreadyUsedException() { + super("Email is already in use!"); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/service/InvalidPasswordException.java b/borestop/src/main/java/com/ippon/borestop/service/InvalidPasswordException.java new file mode 100644 index 00000000..731f85c6 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/service/InvalidPasswordException.java @@ -0,0 +1,9 @@ +package com.ippon.borestop.service; + +public class InvalidPasswordException extends RuntimeException { + private static final long serialVersionUID = 1L; + + public InvalidPasswordException() { + super("Incorrect password"); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/service/MailService.java b/borestop/src/main/java/com/ippon/borestop/service/MailService.java new file mode 100644 index 00000000..72e3f262 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/service/MailService.java @@ -0,0 +1,111 @@ +package com.ippon.borestop.service; + +import com.ippon.borestop.domain.User; +import io.github.jhipster.config.JHipsterProperties; +import java.nio.charset.StandardCharsets; +import java.util.Locale; +import javax.mail.MessagingException; +import javax.mail.internet.MimeMessage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.MessageSource; +import org.springframework.mail.MailException; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.MimeMessageHelper; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.thymeleaf.context.Context; +import org.thymeleaf.spring5.SpringTemplateEngine; + +/** + * Service for sending emails. + * <p> + * We use the {@link Async} annotation to send emails asynchronously. + */ +@Service +public class MailService { + private final Logger log = LoggerFactory.getLogger(MailService.class); + + private static final String USER = "user"; + + private static final String BASE_URL = "baseUrl"; + + private final JHipsterProperties jHipsterProperties; + + private final JavaMailSender javaMailSender; + + private final MessageSource messageSource; + + private final SpringTemplateEngine templateEngine; + + public MailService( + JHipsterProperties jHipsterProperties, + JavaMailSender javaMailSender, + MessageSource messageSource, + SpringTemplateEngine templateEngine + ) { + this.jHipsterProperties = jHipsterProperties; + this.javaMailSender = javaMailSender; + this.messageSource = messageSource; + this.templateEngine = templateEngine; + } + + @Async + public void sendEmail(String to, String subject, String content, boolean isMultipart, boolean isHtml) { + log.debug( + "Send email[multipart '{}' and html '{}'] to '{}' with subject '{}' and content={}", + isMultipart, + isHtml, + to, + subject, + content + ); + + // Prepare message using a Spring helper + MimeMessage mimeMessage = javaMailSender.createMimeMessage(); + try { + MimeMessageHelper message = new MimeMessageHelper(mimeMessage, isMultipart, StandardCharsets.UTF_8.name()); + message.setTo(to); + message.setFrom(jHipsterProperties.getMail().getFrom()); + message.setSubject(subject); + message.setText(content, isHtml); + javaMailSender.send(mimeMessage); + log.debug("Sent email to User '{}'", to); + } catch (MailException | MessagingException e) { + log.warn("Email could not be sent to user '{}'", to, e); + } + } + + @Async + public void sendEmailFromTemplate(User user, String templateName, String titleKey) { + if (user.getEmail() == null) { + log.debug("Email doesn't exist for user '{}'", user.getLogin()); + return; + } + Locale locale = Locale.forLanguageTag(user.getLangKey()); + Context context = new Context(locale); + context.setVariable(USER, user); + context.setVariable(BASE_URL, jHipsterProperties.getMail().getBaseUrl()); + String content = templateEngine.process(templateName, context); + String subject = messageSource.getMessage(titleKey, null, locale); + sendEmail(user.getEmail(), subject, content, false, true); + } + + @Async + public void sendActivationEmail(User user) { + log.debug("Sending activation email to '{}'", user.getEmail()); + sendEmailFromTemplate(user, "mail/activationEmail", "email.activation.title"); + } + + @Async + public void sendCreationEmail(User user) { + log.debug("Sending creation email to '{}'", user.getEmail()); + sendEmailFromTemplate(user, "mail/creationEmail", "email.activation.title"); + } + + @Async + public void sendPasswordResetMail(User user) { + log.debug("Sending password reset email to '{}'", user.getEmail()); + sendEmailFromTemplate(user, "mail/passwordResetEmail", "email.reset.title"); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/service/UserService.java b/borestop/src/main/java/com/ippon/borestop/service/UserService.java new file mode 100644 index 00000000..b3a5d2c4 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/service/UserService.java @@ -0,0 +1,313 @@ +package com.ippon.borestop.service; + +import com.ippon.borestop.config.Constants; +import com.ippon.borestop.domain.Authority; +import com.ippon.borestop.domain.User; +import com.ippon.borestop.repository.AuthorityRepository; +import com.ippon.borestop.repository.UserRepository; +import com.ippon.borestop.security.AuthoritiesConstants; +import com.ippon.borestop.security.SecurityUtils; +import com.ippon.borestop.service.dto.UserDTO; +import io.github.jhipster.security.RandomUtil; +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.util.*; +import java.util.stream.Collectors; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * Service class for managing users. + */ +@Service +@Transactional +public class UserService { + private final Logger log = LoggerFactory.getLogger(UserService.class); + + private final UserRepository userRepository; + + private final PasswordEncoder passwordEncoder; + + private final AuthorityRepository authorityRepository; + + public UserService(UserRepository userRepository, PasswordEncoder passwordEncoder, AuthorityRepository authorityRepository) { + this.userRepository = userRepository; + this.passwordEncoder = passwordEncoder; + this.authorityRepository = authorityRepository; + } + + public Optional<User> activateRegistration(String key) { + log.debug("Activating user for activation key {}", key); + return userRepository + .findOneByActivationKey(key) + .map( + user -> { + // activate given user for the registration key. + user.setActivated(true); + user.setActivationKey(null); + log.debug("Activated user: {}", user); + return user; + } + ); + } + + public Optional<User> completePasswordReset(String newPassword, String key) { + log.debug("Reset user password for reset key {}", key); + return userRepository + .findOneByResetKey(key) + .filter(user -> user.getResetDate().isAfter(Instant.now().minusSeconds(86400))) + .map( + user -> { + user.setPassword(passwordEncoder.encode(newPassword)); + user.setResetKey(null); + user.setResetDate(null); + return user; + } + ); + } + + public Optional<User> requestPasswordReset(String mail) { + return userRepository + .findOneByEmailIgnoreCase(mail) + .filter(User::getActivated) + .map( + user -> { + user.setResetKey(RandomUtil.generateResetKey()); + user.setResetDate(Instant.now()); + return user; + } + ); + } + + public User registerUser(UserDTO userDTO, String password) { + userRepository + .findOneByLogin(userDTO.getLogin().toLowerCase()) + .ifPresent( + existingUser -> { + boolean removed = removeNonActivatedUser(existingUser); + if (!removed) { + throw new UsernameAlreadyUsedException(); + } + } + ); + userRepository + .findOneByEmailIgnoreCase(userDTO.getEmail()) + .ifPresent( + existingUser -> { + boolean removed = removeNonActivatedUser(existingUser); + if (!removed) { + throw new EmailAlreadyUsedException(); + } + } + ); + User newUser = new User(); + String encryptedPassword = passwordEncoder.encode(password); + newUser.setLogin(userDTO.getLogin().toLowerCase()); + + // new user gets initially a generated password + newUser.setPassword(encryptedPassword); + newUser.setFirstName(userDTO.getFirstName()); + newUser.setLastName(userDTO.getLastName()); + if (userDTO.getEmail() != null) { + newUser.setEmail(userDTO.getEmail().toLowerCase()); + } + newUser.setImageUrl(userDTO.getImageUrl()); + newUser.setLangKey(userDTO.getLangKey()); + + // new user is not active + newUser.setActivated(false); + + // new user gets registration key + newUser.setActivationKey(RandomUtil.generateActivationKey()); + Set<Authority> authorities = new HashSet<>(); + authorityRepository.findById(AuthoritiesConstants.USER).ifPresent(authorities::add); + newUser.setAuthorities(authorities); + userRepository.save(newUser); + log.debug("Created Information for User: {}", newUser); + return newUser; + } + + private boolean removeNonActivatedUser(User existingUser) { + if (existingUser.getActivated()) { + return false; + } + userRepository.delete(existingUser); + userRepository.flush(); + return true; + } + + public User createUser(UserDTO userDTO) { + User user = new User(); + user.setLogin(userDTO.getLogin().toLowerCase()); + user.setFirstName(userDTO.getFirstName()); + user.setLastName(userDTO.getLastName()); + if (userDTO.getEmail() != null) { + user.setEmail(userDTO.getEmail().toLowerCase()); + } + user.setImageUrl(userDTO.getImageUrl()); + if (userDTO.getLangKey() == null) { + user.setLangKey(Constants.DEFAULT_LANGUAGE); // default language + } else { + user.setLangKey(userDTO.getLangKey()); + } + String encryptedPassword = passwordEncoder.encode(RandomUtil.generatePassword()); + user.setPassword(encryptedPassword); + user.setResetKey(RandomUtil.generateResetKey()); + user.setResetDate(Instant.now()); + user.setActivated(true); + if (userDTO.getAuthorities() != null) { + Set<Authority> authorities = userDTO + .getAuthorities() + .stream() + .map(authorityRepository::findById) + .filter(Optional::isPresent) + .map(Optional::get) + .collect(Collectors.toSet()); + user.setAuthorities(authorities); + } + userRepository.save(user); + log.debug("Created Information for User: {}", user); + return user; + } + + /** + * Update all information for a specific user, and return the modified user. + * + * @param userDTO user to update. + * @return updated user. + */ + public Optional<UserDTO> updateUser(UserDTO userDTO) { + return Optional + .of(userRepository.findById(userDTO.getId())) + .filter(Optional::isPresent) + .map(Optional::get) + .map( + user -> { + user.setLogin(userDTO.getLogin().toLowerCase()); + user.setFirstName(userDTO.getFirstName()); + user.setLastName(userDTO.getLastName()); + if (userDTO.getEmail() != null) { + user.setEmail(userDTO.getEmail().toLowerCase()); + } + user.setImageUrl(userDTO.getImageUrl()); + user.setActivated(userDTO.isActivated()); + user.setLangKey(userDTO.getLangKey()); + Set<Authority> managedAuthorities = user.getAuthorities(); + managedAuthorities.clear(); + userDTO + .getAuthorities() + .stream() + .map(authorityRepository::findById) + .filter(Optional::isPresent) + .map(Optional::get) + .forEach(managedAuthorities::add); + log.debug("Changed Information for User: {}", user); + return user; + } + ) + .map(UserDTO::new); + } + + public void deleteUser(String login) { + userRepository + .findOneByLogin(login) + .ifPresent( + user -> { + userRepository.delete(user); + log.debug("Deleted User: {}", user); + } + ); + } + + /** + * Update basic information (first name, last name, email, language) for the current user. + * + * @param firstName first name of user. + * @param lastName last name of user. + * @param email email id of user. + * @param langKey language key. + * @param imageUrl image URL of user. + */ + public void updateUser(String firstName, String lastName, String email, String langKey, String imageUrl) { + SecurityUtils + .getCurrentUserLogin() + .flatMap(userRepository::findOneByLogin) + .ifPresent( + user -> { + user.setFirstName(firstName); + user.setLastName(lastName); + if (email != null) { + user.setEmail(email.toLowerCase()); + } + user.setLangKey(langKey); + user.setImageUrl(imageUrl); + log.debug("Changed Information for User: {}", user); + } + ); + } + + @Transactional + public void changePassword(String currentClearTextPassword, String newPassword) { + SecurityUtils + .getCurrentUserLogin() + .flatMap(userRepository::findOneByLogin) + .ifPresent( + user -> { + String currentEncryptedPassword = user.getPassword(); + if (!passwordEncoder.matches(currentClearTextPassword, currentEncryptedPassword)) { + throw new InvalidPasswordException(); + } + String encryptedPassword = passwordEncoder.encode(newPassword); + user.setPassword(encryptedPassword); + log.debug("Changed password for User: {}", user); + } + ); + } + + @Transactional(readOnly = true) + public Page<UserDTO> getAllManagedUsers(Pageable pageable) { + return userRepository.findAllByLoginNot(pageable, Constants.ANONYMOUS_USER).map(UserDTO::new); + } + + @Transactional(readOnly = true) + public Optional<User> getUserWithAuthoritiesByLogin(String login) { + return userRepository.findOneWithAuthoritiesByLogin(login); + } + + @Transactional(readOnly = true) + public Optional<User> getUserWithAuthorities() { + return SecurityUtils.getCurrentUserLogin().flatMap(userRepository::findOneWithAuthoritiesByLogin); + } + + /** + * Not activated users should be automatically deleted after 3 days. + * <p> + * This is scheduled to get fired everyday, at 01:00 (am). + */ + @Scheduled(cron = "0 0 1 * * ?") + public void removeNotActivatedUsers() { + userRepository + .findAllByActivatedIsFalseAndActivationKeyIsNotNullAndCreatedDateBefore(Instant.now().minus(3, ChronoUnit.DAYS)) + .forEach( + user -> { + log.debug("Deleting not activated user {}", user.getLogin()); + userRepository.delete(user); + } + ); + } + + /** + * Gets a list of all the authorities. + * @return a list of all the authorities. + */ + @Transactional(readOnly = true) + public List<String> getAuthorities() { + return authorityRepository.findAll().stream().map(Authority::getName).collect(Collectors.toList()); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/service/UsernameAlreadyUsedException.java b/borestop/src/main/java/com/ippon/borestop/service/UsernameAlreadyUsedException.java new file mode 100644 index 00000000..ecef27e2 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/service/UsernameAlreadyUsedException.java @@ -0,0 +1,9 @@ +package com.ippon.borestop.service; + +public class UsernameAlreadyUsedException extends RuntimeException { + private static final long serialVersionUID = 1L; + + public UsernameAlreadyUsedException() { + super("Login name already used!"); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/service/dto/PasswordChangeDTO.java b/borestop/src/main/java/com/ippon/borestop/service/dto/PasswordChangeDTO.java new file mode 100644 index 00000000..6243b6d5 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/service/dto/PasswordChangeDTO.java @@ -0,0 +1,34 @@ +package com.ippon.borestop.service.dto; + +/** + * A DTO representing a password change required data - current and new password. + */ +public class PasswordChangeDTO { + private String currentPassword; + private String newPassword; + + public PasswordChangeDTO() { + // Empty constructor needed for Jackson. + } + + public PasswordChangeDTO(String currentPassword, String newPassword) { + this.currentPassword = currentPassword; + this.newPassword = newPassword; + } + + public String getCurrentPassword() { + return currentPassword; + } + + public void setCurrentPassword(String currentPassword) { + this.currentPassword = currentPassword; + } + + public String getNewPassword() { + return newPassword; + } + + public void setNewPassword(String newPassword) { + this.newPassword = newPassword; + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/service/dto/UserDTO.java b/borestop/src/main/java/com/ippon/borestop/service/dto/UserDTO.java new file mode 100644 index 00000000..730c85e1 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/service/dto/UserDTO.java @@ -0,0 +1,192 @@ +package com.ippon.borestop.service.dto; + +import com.ippon.borestop.config.Constants; +import com.ippon.borestop.domain.Authority; +import com.ippon.borestop.domain.User; +import java.time.Instant; +import java.util.Set; +import java.util.stream.Collectors; +import javax.validation.constraints.*; + +/** + * A DTO representing a user, with his authorities. + */ +public class UserDTO { + private Long id; + + @NotBlank + @Pattern(regexp = Constants.LOGIN_REGEX) + @Size(min = 1, max = 50) + private String login; + + @Size(max = 50) + private String firstName; + + @Size(max = 50) + private String lastName; + + @Email + @Size(min = 5, max = 254) + private String email; + + @Size(max = 256) + private String imageUrl; + + private boolean activated = false; + + @Size(min = 2, max = 10) + private String langKey; + + private String createdBy; + + private Instant createdDate; + + private String lastModifiedBy; + + private Instant lastModifiedDate; + + private Set<String> authorities; + + public UserDTO() { + // Empty constructor needed for Jackson. + } + + public UserDTO(User user) { + this.id = user.getId(); + this.login = user.getLogin(); + this.firstName = user.getFirstName(); + this.lastName = user.getLastName(); + this.email = user.getEmail(); + this.activated = user.getActivated(); + this.imageUrl = user.getImageUrl(); + this.langKey = user.getLangKey(); + this.createdBy = user.getCreatedBy(); + this.createdDate = user.getCreatedDate(); + this.lastModifiedBy = user.getLastModifiedBy(); + this.lastModifiedDate = user.getLastModifiedDate(); + this.authorities = user.getAuthorities().stream().map(Authority::getName).collect(Collectors.toSet()); + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getLogin() { + return login; + } + + public void setLogin(String login) { + this.login = login; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getImageUrl() { + return imageUrl; + } + + public void setImageUrl(String imageUrl) { + this.imageUrl = imageUrl; + } + + public boolean isActivated() { + return activated; + } + + public void setActivated(boolean activated) { + this.activated = activated; + } + + public String getLangKey() { + return langKey; + } + + public void setLangKey(String langKey) { + this.langKey = langKey; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Instant getCreatedDate() { + return createdDate; + } + + public void setCreatedDate(Instant createdDate) { + this.createdDate = createdDate; + } + + public String getLastModifiedBy() { + return lastModifiedBy; + } + + public void setLastModifiedBy(String lastModifiedBy) { + this.lastModifiedBy = lastModifiedBy; + } + + public Instant getLastModifiedDate() { + return lastModifiedDate; + } + + public void setLastModifiedDate(Instant lastModifiedDate) { + this.lastModifiedDate = lastModifiedDate; + } + + public Set<String> getAuthorities() { + return authorities; + } + + public void setAuthorities(Set<String> authorities) { + this.authorities = authorities; + } + + // prettier-ignore + @Override + public String toString() { + return "UserDTO{" + + "login='" + login + '\'' + + ", firstName='" + firstName + '\'' + + ", lastName='" + lastName + '\'' + + ", email='" + email + '\'' + + ", imageUrl='" + imageUrl + '\'' + + ", activated=" + activated + + ", langKey='" + langKey + '\'' + + ", createdBy=" + createdBy + + ", createdDate=" + createdDate + + ", lastModifiedBy='" + lastModifiedBy + '\'' + + ", lastModifiedDate=" + lastModifiedDate + + ", authorities=" + authorities + + "}"; + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/service/dto/package-info.java b/borestop/src/main/java/com/ippon/borestop/service/dto/package-info.java new file mode 100644 index 00000000..a9364fad --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/service/dto/package-info.java @@ -0,0 +1,4 @@ +/** + * Data Transfer Objects. + */ +package com.ippon.borestop.service.dto; diff --git a/borestop/src/main/java/com/ippon/borestop/service/mapper/UserMapper.java b/borestop/src/main/java/com/ippon/borestop/service/mapper/UserMapper.java new file mode 100644 index 00000000..91922e6c --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/service/mapper/UserMapper.java @@ -0,0 +1,78 @@ +package com.ippon.borestop.service.mapper; + +import com.ippon.borestop.domain.Authority; +import com.ippon.borestop.domain.User; +import com.ippon.borestop.service.dto.UserDTO; +import java.util.*; +import java.util.stream.Collectors; +import org.springframework.stereotype.Service; + +/** + * Mapper for the entity {@link User} and its DTO called {@link UserDTO}. + * + * Normal mappers are generated using MapStruct, this one is hand-coded as MapStruct + * support is still in beta, and requires a manual step with an IDE. + */ +@Service +public class UserMapper { + + public List<UserDTO> usersToUserDTOs(List<User> users) { + return users.stream().filter(Objects::nonNull).map(this::userToUserDTO).collect(Collectors.toList()); + } + + public UserDTO userToUserDTO(User user) { + return new UserDTO(user); + } + + public List<User> userDTOsToUsers(List<UserDTO> userDTOs) { + return userDTOs.stream().filter(Objects::nonNull).map(this::userDTOToUser).collect(Collectors.toList()); + } + + public User userDTOToUser(UserDTO userDTO) { + if (userDTO == null) { + return null; + } else { + User user = new User(); + user.setId(userDTO.getId()); + user.setLogin(userDTO.getLogin()); + user.setFirstName(userDTO.getFirstName()); + user.setLastName(userDTO.getLastName()); + user.setEmail(userDTO.getEmail()); + user.setImageUrl(userDTO.getImageUrl()); + user.setActivated(userDTO.isActivated()); + user.setLangKey(userDTO.getLangKey()); + Set<Authority> authorities = this.authoritiesFromStrings(userDTO.getAuthorities()); + user.setAuthorities(authorities); + return user; + } + } + + private Set<Authority> authoritiesFromStrings(Set<String> authoritiesAsString) { + Set<Authority> authorities = new HashSet<>(); + + if (authoritiesAsString != null) { + authorities = + authoritiesAsString + .stream() + .map( + string -> { + Authority auth = new Authority(); + auth.setName(string); + return auth; + } + ) + .collect(Collectors.toSet()); + } + + return authorities; + } + + public User userFromId(Long id) { + if (id == null) { + return null; + } + User user = new User(); + user.setId(id); + return user; + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/service/mapper/package-info.java b/borestop/src/main/java/com/ippon/borestop/service/mapper/package-info.java new file mode 100644 index 00000000..bc1386b7 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/service/mapper/package-info.java @@ -0,0 +1,4 @@ +/** + * MapStruct mappers for mapping domain objects and Data Transfer Objects. + */ +package com.ippon.borestop.service.mapper; diff --git a/borestop/src/main/java/com/ippon/borestop/service/package-info.java b/borestop/src/main/java/com/ippon/borestop/service/package-info.java new file mode 100644 index 00000000..d47ab40f --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/service/package-info.java @@ -0,0 +1,4 @@ +/** + * Service layer beans. + */ +package com.ippon.borestop.service; diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/AccountResource.java b/borestop/src/main/java/com/ippon/borestop/web/rest/AccountResource.java new file mode 100644 index 00000000..a7f2a339 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/web/rest/AccountResource.java @@ -0,0 +1,186 @@ +package com.ippon.borestop.web.rest; + +import com.ippon.borestop.domain.User; +import com.ippon.borestop.repository.UserRepository; +import com.ippon.borestop.security.SecurityUtils; +import com.ippon.borestop.service.MailService; +import com.ippon.borestop.service.UserService; +import com.ippon.borestop.service.dto.PasswordChangeDTO; +import com.ippon.borestop.service.dto.UserDTO; +import com.ippon.borestop.web.rest.errors.*; +import com.ippon.borestop.web.rest.vm.KeyAndPasswordVM; +import com.ippon.borestop.web.rest.vm.ManagedUserVM; +import java.util.*; +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; + +/** + * REST controller for managing the current user's account. + */ +@RestController +@RequestMapping("/api") +public class AccountResource { + + private static class AccountResourceException extends RuntimeException { + + private AccountResourceException(String message) { + super(message); + } + } + + private final Logger log = LoggerFactory.getLogger(AccountResource.class); + + private final UserRepository userRepository; + + private final UserService userService; + + private final MailService mailService; + + public AccountResource(UserRepository userRepository, UserService userService, MailService mailService) { + this.userRepository = userRepository; + this.userService = userService; + this.mailService = mailService; + } + + /** + * {@code POST /register} : register the user. + * + * @param managedUserVM the managed user View Model. + * @throws InvalidPasswordException {@code 400 (Bad Request)} if the password is incorrect. + * @throws EmailAlreadyUsedException {@code 400 (Bad Request)} if the email is already used. + * @throws LoginAlreadyUsedException {@code 400 (Bad Request)} if the login is already used. + */ + @PostMapping("/register") + @ResponseStatus(HttpStatus.CREATED) + public void registerAccount(@Valid @RequestBody ManagedUserVM managedUserVM) { + if (!checkPasswordLength(managedUserVM.getPassword())) { + throw new InvalidPasswordException(); + } + User user = userService.registerUser(managedUserVM, managedUserVM.getPassword()); + mailService.sendActivationEmail(user); + } + + /** + * {@code GET /activate} : activate the registered user. + * + * @param key the activation key. + * @throws RuntimeException {@code 500 (Internal Server Error)} if the user couldn't be activated. + */ + @GetMapping("/activate") + public void activateAccount(@RequestParam(value = "key") String key) { + Optional<User> user = userService.activateRegistration(key); + if (!user.isPresent()) { + throw new AccountResourceException("No user was found for this activation key"); + } + } + + /** + * {@code GET /authenticate} : check if the user is authenticated, and return its login. + * + * @param request the HTTP request. + * @return the login if the user is authenticated. + */ + @GetMapping("/authenticate") + public String isAuthenticated(HttpServletRequest request) { + log.debug("REST request to check if the current user is authenticated"); + return request.getRemoteUser(); + } + + /** + * {@code GET /account} : get the current user. + * + * @return the current user. + * @throws RuntimeException {@code 500 (Internal Server Error)} if the user couldn't be returned. + */ + @GetMapping("/account") + public UserDTO getAccount() { + return userService + .getUserWithAuthorities() + .map(UserDTO::new) + .orElseThrow(() -> new AccountResourceException("User could not be found")); + } + + /** + * {@code POST /account} : update the current user information. + * + * @param userDTO the current user information. + * @throws EmailAlreadyUsedException {@code 400 (Bad Request)} if the email is already used. + * @throws RuntimeException {@code 500 (Internal Server Error)} if the user login wasn't found. + */ + @PostMapping("/account") + public void saveAccount(@Valid @RequestBody UserDTO userDTO) { + String userLogin = SecurityUtils.getCurrentUserLogin().orElseThrow(() -> new AccountResourceException("Current user login not found")); + Optional<User> existingUser = userRepository.findOneByEmailIgnoreCase(userDTO.getEmail()); + if (existingUser.isPresent() && (!existingUser.get().getLogin().equalsIgnoreCase(userLogin))) { + throw new EmailAlreadyUsedException(); + } + Optional<User> user = userRepository.findOneByLogin(userLogin); + if (!user.isPresent()) { + throw new AccountResourceException("User could not be found"); + } + userService.updateUser(userDTO.getFirstName(), userDTO.getLastName(), userDTO.getEmail(), userDTO.getLangKey(), userDTO.getImageUrl()); + } + + /** + * {@code POST /account/change-password} : changes the current user's password. + * + * @param passwordChangeDto current and new password. + * @throws InvalidPasswordException {@code 400 (Bad Request)} if the new password is incorrect. + */ + @PostMapping(path = "/account/change-password") + public void changePassword(@RequestBody PasswordChangeDTO passwordChangeDto) { + if (!checkPasswordLength(passwordChangeDto.getNewPassword())) { + throw new InvalidPasswordException(); + } + userService.changePassword(passwordChangeDto.getCurrentPassword(), passwordChangeDto.getNewPassword()); + } + + /** + * {@code POST /account/reset-password/init} : Send an email to reset the password of the user. + * + * @param mail the mail of the user. + */ + @PostMapping(path = "/account/reset-password/init") + public void requestPasswordReset(@RequestBody String mail) { + Optional<User> user = userService.requestPasswordReset(mail); + if (user.isPresent()) { + mailService.sendPasswordResetMail(user.get()); + } else { + // Pretend the request has been successful to prevent checking which emails really exist + // but log that an invalid attempt has been made + log.warn("Password reset requested for non existing mail"); + } + } + + /** + * {@code POST /account/reset-password/finish} : Finish to reset the password of the user. + * + * @param keyAndPassword the generated key and the new password. + * @throws InvalidPasswordException {@code 400 (Bad Request)} if the password is incorrect. + * @throws RuntimeException {@code 500 (Internal Server Error)} if the password could not be reset. + */ + @PostMapping(path = "/account/reset-password/finish") + public void finishPasswordReset(@RequestBody KeyAndPasswordVM keyAndPassword) { + if (!checkPasswordLength(keyAndPassword.getNewPassword())) { + throw new InvalidPasswordException(); + } + Optional<User> user = userService.completePasswordReset(keyAndPassword.getNewPassword(), keyAndPassword.getKey()); + + if (!user.isPresent()) { + throw new AccountResourceException("No user was found for this reset key"); + } + } + + private static boolean checkPasswordLength(String password) { + return ( + !StringUtils.isEmpty(password) && + password.length() >= ManagedUserVM.PASSWORD_MIN_LENGTH && + password.length() <= ManagedUserVM.PASSWORD_MAX_LENGTH + ); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/AuditResource.java b/borestop/src/main/java/com/ippon/borestop/web/rest/AuditResource.java new file mode 100644 index 00000000..eadb1438 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/web/rest/AuditResource.java @@ -0,0 +1,76 @@ +package com.ippon.borestop.web.rest; + +import com.ippon.borestop.service.AuditEventService; +import io.github.jhipster.web.util.PaginationUtil; +import io.github.jhipster.web.util.ResponseUtil; +import java.time.Instant; +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.List; +import org.springframework.boot.actuate.audit.AuditEvent; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.support.ServletUriComponentsBuilder; + +/** + * REST controller for getting the {@link AuditEvent}s. + */ +@RestController +@RequestMapping("/management/audits") +public class AuditResource { + private final AuditEventService auditEventService; + + public AuditResource(AuditEventService auditEventService) { + this.auditEventService = auditEventService; + } + + /** + * {@code GET /audits} : get a page of {@link AuditEvent}s. + * + * @param pageable the pagination information. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and the list of {@link AuditEvent}s in body. + */ + @GetMapping + public ResponseEntity<List<AuditEvent>> getAll(Pageable pageable) { + Page<AuditEvent> page = auditEventService.findAll(pageable); + HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(ServletUriComponentsBuilder.fromCurrentRequest(), page); + return new ResponseEntity<>(page.getContent(), headers, HttpStatus.OK); + } + + /** + * {@code GET /audits} : get a page of {@link AuditEvent} between the {@code fromDate} and {@code toDate}. + * + * @param fromDate the start of the time period of {@link AuditEvent} to get. + * @param toDate the end of the time period of {@link AuditEvent} to get. + * @param pageable the pagination information. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and the list of {@link AuditEvent} in body. + */ + @GetMapping(params = { "fromDate", "toDate" }) + public ResponseEntity<List<AuditEvent>> getByDates( + @RequestParam(value = "fromDate") LocalDate fromDate, + @RequestParam(value = "toDate") LocalDate toDate, + Pageable pageable + ) { + Instant from = fromDate.atStartOfDay(ZoneId.systemDefault()).toInstant(); + Instant to = toDate.atStartOfDay(ZoneId.systemDefault()).plusDays(1).toInstant(); + + Page<AuditEvent> page = auditEventService.findByDates(from, to, pageable); + HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(ServletUriComponentsBuilder.fromCurrentRequest(), page); + return new ResponseEntity<>(page.getContent(), headers, HttpStatus.OK); + } + + /** + * {@code GET /audits/:id} : get an {@link AuditEvent} by id. + * + * @param id the id of the entity to get. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and the {@link AuditEvent} in body, or status {@code 404 (Not Found)}. + */ + @GetMapping("/{id:.+}") + public ResponseEntity<AuditEvent> get(@PathVariable Long id) { + return ResponseUtil.wrapOrNotFound(auditEventService.find(id)); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/ClientForwardController.java b/borestop/src/main/java/com/ippon/borestop/web/rest/ClientForwardController.java new file mode 100644 index 00000000..f5ea63d4 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/web/rest/ClientForwardController.java @@ -0,0 +1,17 @@ +package com.ippon.borestop.web.rest; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class ClientForwardController { + + /** + * Forwards any unmapped paths (except those containing a period) to the client {@code index.html}. + * @return forward to client {@code index.html}. + */ + @GetMapping(value = "/**/{path:[^\\.]*}") + public String forward() { + return "forward:/"; + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/UserJWTController.java b/borestop/src/main/java/com/ippon/borestop/web/rest/UserJWTController.java new file mode 100644 index 00000000..e2a6aa37 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/web/rest/UserJWTController.java @@ -0,0 +1,67 @@ +package com.ippon.borestop.web.rest; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.ippon.borestop.security.jwt.JWTFilter; +import com.ippon.borestop.security.jwt.TokenProvider; +import com.ippon.borestop.web.rest.vm.LoginVM; +import javax.validation.Valid; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.web.bind.annotation.*; + +/** + * Controller to authenticate users. + */ +@RestController +@RequestMapping("/api") +public class UserJWTController { + private final TokenProvider tokenProvider; + + private final AuthenticationManagerBuilder authenticationManagerBuilder; + + public UserJWTController(TokenProvider tokenProvider, AuthenticationManagerBuilder authenticationManagerBuilder) { + this.tokenProvider = tokenProvider; + this.authenticationManagerBuilder = authenticationManagerBuilder; + } + + @PostMapping("/authenticate") + public ResponseEntity<JWTToken> authorize(@Valid @RequestBody LoginVM loginVM) { + UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken( + loginVM.getUsername(), + loginVM.getPassword() + ); + + Authentication authentication = authenticationManagerBuilder.getObject().authenticate(authenticationToken); + SecurityContextHolder.getContext().setAuthentication(authentication); + boolean rememberMe = (loginVM.isRememberMe() == null) ? false : loginVM.isRememberMe(); + String jwt = tokenProvider.createToken(authentication, rememberMe); + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.add(JWTFilter.AUTHORIZATION_HEADER, "Bearer " + jwt); + return new ResponseEntity<>(new JWTToken(jwt), httpHeaders, HttpStatus.OK); + } + + /** + * Object to return as body in JWT Authentication. + */ + static class JWTToken { + private String idToken; + + JWTToken(String idToken) { + this.idToken = idToken; + } + + @JsonProperty("id_token") + String getIdToken() { + return idToken; + } + + void setIdToken(String idToken) { + this.idToken = idToken; + } + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/UserResource.java b/borestop/src/main/java/com/ippon/borestop/web/rest/UserResource.java new file mode 100644 index 00000000..5f84615b --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/web/rest/UserResource.java @@ -0,0 +1,183 @@ +package com.ippon.borestop.web.rest; + +import com.ippon.borestop.config.Constants; +import com.ippon.borestop.domain.User; +import com.ippon.borestop.repository.UserRepository; +import com.ippon.borestop.security.AuthoritiesConstants; +import com.ippon.borestop.service.MailService; +import com.ippon.borestop.service.UserService; +import com.ippon.borestop.service.dto.UserDTO; +import com.ippon.borestop.web.rest.errors.BadRequestAlertException; +import com.ippon.borestop.web.rest.errors.EmailAlreadyUsedException; +import com.ippon.borestop.web.rest.errors.LoginAlreadyUsedException; +import io.github.jhipster.web.util.HeaderUtil; +import io.github.jhipster.web.util.PaginationUtil; +import io.github.jhipster.web.util.ResponseUtil; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.*; +import javax.validation.Valid; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.support.ServletUriComponentsBuilder; + +/** + * REST controller for managing users. + * <p> + * This class accesses the {@link User} entity, and needs to fetch its collection of authorities. + * <p> + * For a normal use-case, it would be better to have an eager relationship between User and Authority, + * and send everything to the client side: there would be no View Model and DTO, a lot less code, and an outer-join + * which would be good for performance. + * <p> + * We use a View Model and a DTO for 3 reasons: + * <ul> + * <li>We want to keep a lazy association between the user and the authorities, because people will + * quite often do relationships with the user, and we don't want them to get the authorities all + * the time for nothing (for performance reasons). This is the #1 goal: we should not impact our users' + * application because of this use-case.</li> + * <li> Not having an outer join causes n+1 requests to the database. This is not a real issue as + * we have by default a second-level cache. This means on the first HTTP call we do the n+1 requests, + * but then all authorities come from the cache, so in fact it's much better than doing an outer join + * (which will get lots of data from the database, for each HTTP call).</li> + * <li> As this manages users, for security reasons, we'd rather have a DTO layer.</li> + * </ul> + * <p> + * Another option would be to have a specific JPA entity graph to handle this case. + */ +@RestController +@RequestMapping("/api") +public class UserResource { + private final Logger log = LoggerFactory.getLogger(UserResource.class); + + @Value("${jhipster.clientApp.name}") + private String applicationName; + + private final UserService userService; + + private final UserRepository userRepository; + + private final MailService mailService; + + public UserResource(UserService userService, UserRepository userRepository, MailService mailService) { + this.userService = userService; + this.userRepository = userRepository; + this.mailService = mailService; + } + + /** + * {@code POST /users} : Creates a new user. + * <p> + * Creates a new user if the login and email are not already used, and sends an + * mail with an activation link. + * The user needs to be activated on creation. + * + * @param userDTO the user to create. + * @return the {@link ResponseEntity} with status {@code 201 (Created)} and with body the new user, or with status {@code 400 (Bad Request)} if the login or email is already in use. + * @throws URISyntaxException if the Location URI syntax is incorrect. + * @throws BadRequestAlertException {@code 400 (Bad Request)} if the login or email is already in use. + */ + @PostMapping("/users") + @PreAuthorize("hasAuthority(\"" + AuthoritiesConstants.ADMIN + "\")") + public ResponseEntity<User> createUser(@Valid @RequestBody UserDTO userDTO) throws URISyntaxException { + log.debug("REST request to save User : {}", userDTO); + + if (userDTO.getId() != null) { + throw new BadRequestAlertException("A new user cannot already have an ID", "userManagement", "idexists"); + // Lowercase the user login before comparing with database + } else if (userRepository.findOneByLogin(userDTO.getLogin().toLowerCase()).isPresent()) { + throw new LoginAlreadyUsedException(); + } else if (userRepository.findOneByEmailIgnoreCase(userDTO.getEmail()).isPresent()) { + throw new EmailAlreadyUsedException(); + } else { + User newUser = userService.createUser(userDTO); + mailService.sendCreationEmail(newUser); + return ResponseEntity + .created(new URI("/api/users/" + newUser.getLogin())) + .headers(HeaderUtil.createAlert(applicationName, "userManagement.created", newUser.getLogin())) + .body(newUser); + } + } + + /** + * {@code PUT /users} : Updates an existing User. + * + * @param userDTO the user to update. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated user. + * @throws EmailAlreadyUsedException {@code 400 (Bad Request)} if the email is already in use. + * @throws LoginAlreadyUsedException {@code 400 (Bad Request)} if the login is already in use. + */ + @PutMapping("/users") + @PreAuthorize("hasAuthority(\"" + AuthoritiesConstants.ADMIN + "\")") + public ResponseEntity<UserDTO> updateUser(@Valid @RequestBody UserDTO userDTO) { + log.debug("REST request to update User : {}", userDTO); + Optional<User> existingUser = userRepository.findOneByEmailIgnoreCase(userDTO.getEmail()); + if (existingUser.isPresent() && (!existingUser.get().getId().equals(userDTO.getId()))) { + throw new EmailAlreadyUsedException(); + } + existingUser = userRepository.findOneByLogin(userDTO.getLogin().toLowerCase()); + if (existingUser.isPresent() && (!existingUser.get().getId().equals(userDTO.getId()))) { + throw new LoginAlreadyUsedException(); + } + Optional<UserDTO> updatedUser = userService.updateUser(userDTO); + + return ResponseUtil.wrapOrNotFound(updatedUser, HeaderUtil.createAlert(applicationName, "userManagement.updated", userDTO.getLogin())); + } + + /** + * {@code GET /users} : get all users. + * + * @param pageable the pagination information. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body all users. + */ + @GetMapping("/users") + public ResponseEntity<List<UserDTO>> getAllUsers(Pageable pageable) { + final Page<UserDTO> page = userService.getAllManagedUsers(pageable); + HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(ServletUriComponentsBuilder.fromCurrentRequest(), page); + return new ResponseEntity<>(page.getContent(), headers, HttpStatus.OK); + } + + /** + * Gets a list of all roles. + * @return a string list of all roles. + */ + @GetMapping("/users/authorities") + @PreAuthorize("hasAuthority(\"" + AuthoritiesConstants.ADMIN + "\")") + public List<String> getAuthorities() { + return userService.getAuthorities(); + } + + /** + * {@code GET /users/:login} : get the "login" user. + * + * @param login the login of the user to find. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the "login" user, or with status {@code 404 (Not Found)}. + */ + @GetMapping("/users/{login:" + Constants.LOGIN_REGEX + "}") + public ResponseEntity<UserDTO> getUser(@PathVariable String login) { + log.debug("REST request to get User : {}", login); + return ResponseUtil.wrapOrNotFound(userService.getUserWithAuthoritiesByLogin(login).map(UserDTO::new)); + } + + /** + * {@code DELETE /users/:login} : delete the "login" User. + * + * @param login the login of the user to delete. + * @return the {@link ResponseEntity} with status {@code 204 (NO_CONTENT)}. + */ + @DeleteMapping("/users/{login:" + Constants.LOGIN_REGEX + "}") + @PreAuthorize("hasAuthority(\"" + AuthoritiesConstants.ADMIN + "\")") + public ResponseEntity<Void> deleteUser(@PathVariable String login) { + log.debug("REST request to delete User: {}", login); + userService.deleteUser(login); + return ResponseEntity.noContent().headers(HeaderUtil.createAlert(applicationName, "userManagement.deleted", login)).build(); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/errors/BadRequestAlertException.java b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/BadRequestAlertException.java new file mode 100644 index 00000000..2dab39d0 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/BadRequestAlertException.java @@ -0,0 +1,40 @@ +package com.ippon.borestop.web.rest.errors; + +import java.net.URI; +import java.util.HashMap; +import java.util.Map; +import org.zalando.problem.AbstractThrowableProblem; +import org.zalando.problem.Status; + +public class BadRequestAlertException extends AbstractThrowableProblem { + private static final long serialVersionUID = 1L; + + private final String entityName; + + private final String errorKey; + + public BadRequestAlertException(String defaultMessage, String entityName, String errorKey) { + this(ErrorConstants.DEFAULT_TYPE, defaultMessage, entityName, errorKey); + } + + public BadRequestAlertException(URI type, String defaultMessage, String entityName, String errorKey) { + super(type, defaultMessage, Status.BAD_REQUEST, null, null, null, getAlertParameters(entityName, errorKey)); + this.entityName = entityName; + this.errorKey = errorKey; + } + + public String getEntityName() { + return entityName; + } + + public String getErrorKey() { + return errorKey; + } + + private static Map<String, Object> getAlertParameters(String entityName, String errorKey) { + Map<String, Object> parameters = new HashMap<>(); + parameters.put("message", "error." + errorKey); + parameters.put("params", entityName); + return parameters; + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/errors/EmailAlreadyUsedException.java b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/EmailAlreadyUsedException.java new file mode 100644 index 00000000..8d061fed --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/EmailAlreadyUsedException.java @@ -0,0 +1,9 @@ +package com.ippon.borestop.web.rest.errors; + +public class EmailAlreadyUsedException extends BadRequestAlertException { + private static final long serialVersionUID = 1L; + + public EmailAlreadyUsedException() { + super(ErrorConstants.EMAIL_ALREADY_USED_TYPE, "Email is already in use!", "userManagement", "emailexists"); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/errors/ErrorConstants.java b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/ErrorConstants.java new file mode 100644 index 00000000..8f88c930 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/ErrorConstants.java @@ -0,0 +1,16 @@ +package com.ippon.borestop.web.rest.errors; + +import java.net.URI; + +public final class ErrorConstants { + public static final String ERR_CONCURRENCY_FAILURE = "error.concurrencyFailure"; + public static final String ERR_VALIDATION = "error.validation"; + public static final String PROBLEM_BASE_URL = "https://www.jhipster.tech/problem"; + public static final URI DEFAULT_TYPE = URI.create(PROBLEM_BASE_URL + "/problem-with-message"); + public static final URI CONSTRAINT_VIOLATION_TYPE = URI.create(PROBLEM_BASE_URL + "/constraint-violation"); + public static final URI INVALID_PASSWORD_TYPE = URI.create(PROBLEM_BASE_URL + "/invalid-password"); + public static final URI EMAIL_ALREADY_USED_TYPE = URI.create(PROBLEM_BASE_URL + "/email-already-used"); + public static final URI LOGIN_ALREADY_USED_TYPE = URI.create(PROBLEM_BASE_URL + "/login-already-used"); + + private ErrorConstants() {} +} diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/errors/ExceptionTranslator.java b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/ExceptionTranslator.java new file mode 100644 index 00000000..b63464c5 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/ExceptionTranslator.java @@ -0,0 +1,134 @@ +package com.ippon.borestop.web.rest.errors; + +import io.github.jhipster.web.util.HeaderUtil; +import java.util.List; +import java.util.stream.Collectors; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import javax.servlet.http.HttpServletRequest; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.dao.ConcurrencyFailureException; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.context.request.NativeWebRequest; +import org.zalando.problem.DefaultProblem; +import org.zalando.problem.Problem; +import org.zalando.problem.ProblemBuilder; +import org.zalando.problem.Status; +import org.zalando.problem.spring.web.advice.ProblemHandling; +import org.zalando.problem.spring.web.advice.security.SecurityAdviceTrait; +import org.zalando.problem.violations.ConstraintViolationProblem; + +/** + * Controller advice to translate the server side exceptions to client-friendly json structures. + * The error response follows RFC7807 - Problem Details for HTTP APIs (https://tools.ietf.org/html/rfc7807). + */ +@ControllerAdvice +public class ExceptionTranslator implements ProblemHandling, SecurityAdviceTrait { + private static final String FIELD_ERRORS_KEY = "fieldErrors"; + private static final String MESSAGE_KEY = "message"; + private static final String PATH_KEY = "path"; + private static final String VIOLATIONS_KEY = "violations"; + + @Value("${jhipster.clientApp.name}") + private String applicationName; + + /** + * Post-process the Problem payload to add the message key for the front-end if needed. + */ + @Override + public ResponseEntity<Problem> process(@Nullable ResponseEntity<Problem> entity, NativeWebRequest request) { + if (entity == null) { + return entity; + } + Problem problem = entity.getBody(); + if (!(problem instanceof ConstraintViolationProblem || problem instanceof DefaultProblem)) { + return entity; + } + ProblemBuilder builder = Problem + .builder() + .withType(Problem.DEFAULT_TYPE.equals(problem.getType()) ? ErrorConstants.DEFAULT_TYPE : problem.getType()) + .withStatus(problem.getStatus()) + .withTitle(problem.getTitle()) + .with(PATH_KEY, request.getNativeRequest(HttpServletRequest.class).getRequestURI()); + + if (problem instanceof ConstraintViolationProblem) { + builder.with(VIOLATIONS_KEY, ((ConstraintViolationProblem) problem).getViolations()).with(MESSAGE_KEY, ErrorConstants.ERR_VALIDATION); + } else { + builder.withCause(((DefaultProblem) problem).getCause()).withDetail(problem.getDetail()).withInstance(problem.getInstance()); + problem.getParameters().forEach(builder::with); + if (!problem.getParameters().containsKey(MESSAGE_KEY) && problem.getStatus() != null) { + builder.with(MESSAGE_KEY, "error.http." + problem.getStatus().getStatusCode()); + } + } + return new ResponseEntity<>(builder.build(), entity.getHeaders(), entity.getStatusCode()); + } + + @Override + public ResponseEntity<Problem> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, @Nonnull NativeWebRequest request) { + BindingResult result = ex.getBindingResult(); + List<FieldErrorVM> fieldErrors = result + .getFieldErrors() + .stream() + .map(f -> new FieldErrorVM(f.getObjectName().replaceFirst("DTO$", ""), f.getField(), f.getCode())) + .collect(Collectors.toList()); + + Problem problem = Problem + .builder() + .withType(ErrorConstants.CONSTRAINT_VIOLATION_TYPE) + .withTitle("Method argument not valid") + .withStatus(defaultConstraintViolationStatus()) + .with(MESSAGE_KEY, ErrorConstants.ERR_VALIDATION) + .with(FIELD_ERRORS_KEY, fieldErrors) + .build(); + return create(ex, problem, request); + } + + @ExceptionHandler + public ResponseEntity<Problem> handleEmailAlreadyUsedException( + com.ippon.borestop.service.EmailAlreadyUsedException ex, + NativeWebRequest request + ) { + EmailAlreadyUsedException problem = new EmailAlreadyUsedException(); + return create( + problem, + request, + HeaderUtil.createFailureAlert(applicationName, true, problem.getEntityName(), problem.getErrorKey(), problem.getMessage()) + ); + } + + @ExceptionHandler + public ResponseEntity<Problem> handleUsernameAlreadyUsedException( + com.ippon.borestop.service.UsernameAlreadyUsedException ex, + NativeWebRequest request + ) { + LoginAlreadyUsedException problem = new LoginAlreadyUsedException(); + return create( + problem, + request, + HeaderUtil.createFailureAlert(applicationName, true, problem.getEntityName(), problem.getErrorKey(), problem.getMessage()) + ); + } + + @ExceptionHandler + public ResponseEntity<Problem> handleInvalidPasswordException( + com.ippon.borestop.service.InvalidPasswordException ex, + NativeWebRequest request + ) { + return create(new InvalidPasswordException(), request); + } + + @ExceptionHandler + public ResponseEntity<Problem> handleBadRequestAlertException(BadRequestAlertException ex, NativeWebRequest request) { + return create(ex, request, HeaderUtil.createFailureAlert(applicationName, true, ex.getEntityName(), ex.getErrorKey(), ex.getMessage())); + } + + @ExceptionHandler + public ResponseEntity<Problem> handleConcurrencyFailure(ConcurrencyFailureException ex, NativeWebRequest request) { + Problem problem = Problem.builder().withStatus(Status.CONFLICT).with(MESSAGE_KEY, ErrorConstants.ERR_CONCURRENCY_FAILURE).build(); + return create(ex, problem, request); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/errors/FieldErrorVM.java b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/FieldErrorVM.java new file mode 100644 index 00000000..46a2bf76 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/FieldErrorVM.java @@ -0,0 +1,31 @@ +package com.ippon.borestop.web.rest.errors; + +import java.io.Serializable; + +public class FieldErrorVM implements Serializable { + private static final long serialVersionUID = 1L; + + private final String objectName; + + private final String field; + + private final String message; + + public FieldErrorVM(String dto, String field, String message) { + this.objectName = dto; + this.field = field; + this.message = message; + } + + public String getObjectName() { + return objectName; + } + + public String getField() { + return field; + } + + public String getMessage() { + return message; + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/errors/InvalidPasswordException.java b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/InvalidPasswordException.java new file mode 100644 index 00000000..8d5ae466 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/InvalidPasswordException.java @@ -0,0 +1,12 @@ +package com.ippon.borestop.web.rest.errors; + +import org.zalando.problem.AbstractThrowableProblem; +import org.zalando.problem.Status; + +public class InvalidPasswordException extends AbstractThrowableProblem { + private static final long serialVersionUID = 1L; + + public InvalidPasswordException() { + super(ErrorConstants.INVALID_PASSWORD_TYPE, "Incorrect password", Status.BAD_REQUEST); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/errors/LoginAlreadyUsedException.java b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/LoginAlreadyUsedException.java new file mode 100644 index 00000000..7c22b6c9 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/LoginAlreadyUsedException.java @@ -0,0 +1,9 @@ +package com.ippon.borestop.web.rest.errors; + +public class LoginAlreadyUsedException extends BadRequestAlertException { + private static final long serialVersionUID = 1L; + + public LoginAlreadyUsedException() { + super(ErrorConstants.LOGIN_ALREADY_USED_TYPE, "Login name already used!", "userManagement", "userexists"); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/errors/package-info.java b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/package-info.java new file mode 100644 index 00000000..a5553029 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/package-info.java @@ -0,0 +1,6 @@ +/** + * Specific errors used with Zalando's "problem-spring-web" library. + * + * More information on https://github.com/zalando/problem-spring-web + */ +package com.ippon.borestop.web.rest.errors; diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/package-info.java b/borestop/src/main/java/com/ippon/borestop/web/rest/package-info.java new file mode 100644 index 00000000..ef7b3513 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/web/rest/package-info.java @@ -0,0 +1,4 @@ +/** + * Spring MVC REST controllers. + */ +package com.ippon.borestop.web.rest; diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/vm/KeyAndPasswordVM.java b/borestop/src/main/java/com/ippon/borestop/web/rest/vm/KeyAndPasswordVM.java new file mode 100644 index 00000000..72f6d0a0 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/web/rest/vm/KeyAndPasswordVM.java @@ -0,0 +1,26 @@ +package com.ippon.borestop.web.rest.vm; + +/** + * View Model object for storing the user's key and password. + */ +public class KeyAndPasswordVM { + private String key; + + private String newPassword; + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getNewPassword() { + return newPassword; + } + + public void setNewPassword(String newPassword) { + this.newPassword = newPassword; + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/vm/LoginVM.java b/borestop/src/main/java/com/ippon/borestop/web/rest/vm/LoginVM.java new file mode 100644 index 00000000..1e1b8bb8 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/web/rest/vm/LoginVM.java @@ -0,0 +1,52 @@ +package com.ippon.borestop.web.rest.vm; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * View Model object for storing a user's credentials. + */ +public class LoginVM { + @NotNull + @Size(min = 1, max = 50) + private String username; + + @NotNull + @Size(min = 4, max = 100) + private String password; + + private Boolean rememberMe; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public Boolean isRememberMe() { + return rememberMe; + } + + public void setRememberMe(Boolean rememberMe) { + this.rememberMe = rememberMe; + } + + // prettier-ignore + @Override + public String toString() { + return "LoginVM{" + + "username='" + username + '\'' + + ", rememberMe=" + rememberMe + + '}'; + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/vm/ManagedUserVM.java b/borestop/src/main/java/com/ippon/borestop/web/rest/vm/ManagedUserVM.java new file mode 100644 index 00000000..9e3482cd --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/web/rest/vm/ManagedUserVM.java @@ -0,0 +1,34 @@ +package com.ippon.borestop.web.rest.vm; + +import com.ippon.borestop.service.dto.UserDTO; +import javax.validation.constraints.Size; + +/** + * View Model extending the UserDTO, which is meant to be used in the user management UI. + */ +public class ManagedUserVM extends UserDTO { + public static final int PASSWORD_MIN_LENGTH = 4; + + public static final int PASSWORD_MAX_LENGTH = 100; + + @Size(min = PASSWORD_MIN_LENGTH, max = PASSWORD_MAX_LENGTH) + private String password; + + public ManagedUserVM() { + // Empty constructor needed for Jackson. + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + // prettier-ignore + @Override + public String toString() { + return "ManagedUserVM{" + super.toString() + "} "; + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/vm/package-info.java b/borestop/src/main/java/com/ippon/borestop/web/rest/vm/package-info.java new file mode 100644 index 00000000..02e51249 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/web/rest/vm/package-info.java @@ -0,0 +1,4 @@ +/** + * View Models used by Spring MVC REST controllers. + */ +package com.ippon.borestop.web.rest.vm; diff --git a/borestop/src/main/jib/entrypoint.sh b/borestop/src/main/jib/entrypoint.sh new file mode 100644 index 00000000..ab662b40 --- /dev/null +++ b/borestop/src/main/jib/entrypoint.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +echo "The application will start in ${JHIPSTER_SLEEP}s..." && sleep ${JHIPSTER_SLEEP} +exec java ${JAVA_OPTS} -noverify -XX:+AlwaysPreTouch -Djava.security.egd=file:/dev/./urandom -cp /app/resources/:/app/classes/:/app/libs/* "com.ippon.borestop.BorestopApp" "$@" diff --git a/borestop/src/main/resources/.h2.server.properties b/borestop/src/main/resources/.h2.server.properties new file mode 100644 index 00000000..da85d0d2 --- /dev/null +++ b/borestop/src/main/resources/.h2.server.properties @@ -0,0 +1,5 @@ +#H2 Server Properties +0=JHipster H2 (Disk)|org.h2.Driver|jdbc\:h2\:file\:./target/h2db/db/borestop|borestop +webAllowOthers=true +webPort=8082 +webSSL=false diff --git a/borestop/src/main/resources/banner.txt b/borestop/src/main/resources/banner.txt new file mode 100644 index 00000000..e0bc55aa --- /dev/null +++ b/borestop/src/main/resources/banner.txt @@ -0,0 +1,10 @@ + + ${AnsiColor.GREEN} ██╗${AnsiColor.RED} ██╗ ██╗ ████████╗ ███████╗ ██████╗ ████████╗ ████████╗ ███████╗ + ${AnsiColor.GREEN} ██║${AnsiColor.RED} ██║ ██║ â•šâ•â•â–ˆâ–ˆâ•”â•â•â• ██╔â•â•â•â–ˆâ–ˆâ•— ██╔â•â•â•â•â• â•šâ•â•â–ˆâ–ˆâ•”â•â•â• ██╔â•â•â•â•â•â• ██╔â•â•â•â–ˆâ–ˆâ•— + ${AnsiColor.GREEN} ██║${AnsiColor.RED} ████████║ ██║ ███████╔╠╚█████╗ ██║ ██████╗ ███████╔╠+ ${AnsiColor.GREEN}██╗ ██║${AnsiColor.RED} ██╔â•â•â•â–ˆâ–ˆâ•‘ ██║ ██╔â•â•â•â•â• â•šâ•â•â•â–ˆâ–ˆâ•— ██║ ██╔â•â•â•â• ██╔â•â•â–ˆâ–ˆâ•‘ + ${AnsiColor.GREEN}╚██████╔â•${AnsiColor.RED} ██║ ██║ ████████╗ ██║ ██████╔╠██║ ████████╗ ██║ ╚██╗ + ${AnsiColor.GREEN} â•šâ•â•â•â•â•â• ${AnsiColor.RED} â•šâ•â• â•šâ•â• â•šâ•â•â•â•â•â•â•â• â•šâ•â• â•šâ•â•â•â•â•â• â•šâ•â• â•šâ•â•â•â•â•â•â•â• â•šâ•â• â•šâ•â• + +${AnsiColor.BRIGHT_BLUE}:: JHipster 🤓 :: Running Spring Boot ${spring-boot.version} :: +:: https://www.jhipster.tech ::${AnsiColor.DEFAULT} diff --git a/borestop/src/main/resources/config/application-dev.yml b/borestop/src/main/resources/config/application-dev.yml new file mode 100644 index 00000000..a98fd1a4 --- /dev/null +++ b/borestop/src/main/resources/config/application-dev.yml @@ -0,0 +1,116 @@ +# =================================================================== +# Spring Boot configuration for the "dev" profile. +# +# This configuration overrides the application.yml file. +# +# More information on profiles: https://www.jhipster.tech/profiles/ +# More information on configuration properties: https://www.jhipster.tech/common-application-properties/ +# =================================================================== + +# =================================================================== +# Standard Spring Boot properties. +# Full reference is available at: +# http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html +# =================================================================== + +logging: + level: + ROOT: DEBUG + io.github.jhipster: DEBUG + com.ippon.borestop: DEBUG + +spring: + profiles: + active: dev + include: + - swagger + # Uncomment to activate TLS for the dev profile + #- tls + devtools: + restart: + enabled: true + additional-exclude: static/**,.h2.server.properties + livereload: + enabled: false # we use Webpack dev server + BrowserSync for livereload + jackson: + serialization: + indent-output: true + datasource: + type: com.zaxxer.hikari.HikariDataSource + url: jdbc:h2:file:./target/h2db/db/borestop;DB_CLOSE_DELAY=-1 + username: borestop + password: + hikari: + poolName: Hikari + auto-commit: false + h2: + console: + enabled: false + jpa: + database-platform: io.github.jhipster.domain.util.FixedH2Dialect + show-sql: true + liquibase: + # Remove 'faker' if you do not want the sample data to be loaded automatically + contexts: dev, faker + mail: + host: localhost + port: 25 + username: + password: + messages: + cache-duration: PT1S # 1 second, see the ISO 8601 standard + thymeleaf: + cache: false + +server: + port: 8080 + +# =================================================================== +# JHipster specific properties +# +# Full reference is available at: https://www.jhipster.tech/common-application-properties/ +# =================================================================== + +jhipster: + # CORS is only enabled by default with the "dev" profile, so BrowserSync can access the API + cors: + allowed-origins: '*' + allowed-methods: '*' + allowed-headers: '*' + exposed-headers: 'Authorization,Link,X-Total-Count' + allow-credentials: true + max-age: 1800 + security: + authentication: + jwt: + # This token must be encoded using Base64 and be at least 256 bits long (you can type `openssl rand -base64 64` on your command line to generate a 512 bits one) + base64-secret: NzdiMjRkMmMxZDNkMGY2ZWIyYTcxYWNhYzM4YTBiZjMzOWQzZDQyM2VjY2UwOGRlZDVjZTNiOTdkMWMzNWEzZGNkNzg4YTk2ZDFhZWYwMjUxZjU1ZWFiY2U1ZjA2ZDI1MzFiNTJmMTk5NzE2ZmIzMTE0YzMwYTMzODliYzhhY2E= + # Token is valid 24 hours + token-validity-in-seconds: 86400 + token-validity-in-seconds-for-remember-me: 2592000 + mail: # specific JHipster mail property, for standard properties see MailProperties + base-url: http://127.0.0.1:8080 + metrics: + logs: # Reports metrics in the logs + enabled: false + report-frequency: 60 # in seconds + logging: + use-json-format: false # By default, logs are not in Json format + logstash: # Forward logs to logstash over a socket, used by LoggingConfiguration + enabled: false + host: localhost + port: 5000 + queue-size: 512 + audit-events: + retention-period: 30 # Number of days before audit events are deleted. + +# =================================================================== +# Application specific properties +# Add your own application properties here, see the ApplicationProperties class +# to have type-safe configuration, like in the JHipsterProperties above +# +# More documentation is available at: +# https://www.jhipster.tech/common-application-properties/ +# =================================================================== + +# application: diff --git a/borestop/src/main/resources/config/application-prod.yml b/borestop/src/main/resources/config/application-prod.yml new file mode 100644 index 00000000..e57f6a80 --- /dev/null +++ b/borestop/src/main/resources/config/application-prod.yml @@ -0,0 +1,129 @@ +# =================================================================== +# Spring Boot configuration for the "prod" profile. +# +# This configuration overrides the application.yml file. +# +# More information on profiles: https://www.jhipster.tech/profiles/ +# More information on configuration properties: https://www.jhipster.tech/common-application-properties/ +# =================================================================== + +# =================================================================== +# Standard Spring Boot properties. +# Full reference is available at: +# http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html +# =================================================================== + +logging: + level: + ROOT: INFO + io.github.jhipster: INFO + com.ippon.borestop: INFO + +management: + metrics: + export: + prometheus: + enabled: false + +spring: + devtools: + restart: + enabled: false + livereload: + enabled: false + datasource: + type: com.zaxxer.hikari.HikariDataSource + url: jdbc:postgresql://localhost:5432/borestop + username: borestop + password: + hikari: + poolName: Hikari + auto-commit: false + jpa: + database-platform: io.github.jhipster.domain.util.FixedPostgreSQL10Dialect + show-sql: false + # Replace by 'prod, faker' to add the faker context and have sample data loaded in production + liquibase: + contexts: prod + mail: + host: localhost + port: 25 + username: + password: + thymeleaf: + cache: true + +# =================================================================== +# To enable TLS in production, generate a certificate using: +# keytool -genkey -alias borestop -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650 +# +# You can also use Let's Encrypt: +# https://maximilian-boehm.com/hp2121/Create-a-Java-Keystore-JKS-from-Let-s-Encrypt-Certificates.htm +# +# Then, modify the server.ssl properties so your "server" configuration looks like: +# +# server: +# port: 443 +# ssl: +# key-store: classpath:config/tls/keystore.p12 +# key-store-password: password +# key-store-type: PKCS12 +# key-alias: selfsigned +# # The ciphers suite enforce the security by deactivating some old and deprecated SSL cipher, this list was tested against SSL Labs (https://www.ssllabs.com/ssltest/) +# ciphers: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 ,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 ,TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 ,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_DHE_RSA_WITH_AES_128_CBC_SHA256,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_RSA_WITH_AES_256_CBC_SHA256,TLS_DHE_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA,TLS_RSA_WITH_CAMELLIA_256_CBC_SHA,TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA,TLS_RSA_WITH_CAMELLIA_128_CBC_SHA +# =================================================================== +server: + port: 8080 + compression: + enabled: true + mime-types: text/html,text/xml,text/plain,text/css, application/javascript, application/json + min-response-size: 1024 + +# =================================================================== +# JHipster specific properties +# +# Full reference is available at: https://www.jhipster.tech/common-application-properties/ +# =================================================================== + +jhipster: + http: + cache: # Used by the CachingHttpHeadersFilter + timeToLiveInDays: 1461 + security: + authentication: + jwt: + # This token must be encoded using Base64 and be at least 256 bits long (you can type `openssl rand -base64 64` on your command line to generate a 512 bits one) + # As this is the PRODUCTION configuration, you MUST change the default key, and store it securely: + # - In the JHipster Registry (which includes a Spring Cloud Config server) + # - In a separate `application-prod.yml` file, in the same folder as your executable JAR file + # - In the `JHIPSTER_SECURITY_AUTHENTICATION_JWT_BASE64_SECRET` environment variable + base64-secret: NzdiMjRkMmMxZDNkMGY2ZWIyYTcxYWNhYzM4YTBiZjMzOWQzZDQyM2VjY2UwOGRlZDVjZTNiOTdkMWMzNWEzZGNkNzg4YTk2ZDFhZWYwMjUxZjU1ZWFiY2U1ZjA2ZDI1MzFiNTJmMTk5NzE2ZmIzMTE0YzMwYTMzODliYzhhY2E= + # Token is valid 24 hours + token-validity-in-seconds: 86400 + token-validity-in-seconds-for-remember-me: 2592000 + mail: # specific JHipster mail property, for standard properties see MailProperties + base-url: http://my-server-url-to-change # Modify according to your server's URL + metrics: + logs: # Reports metrics in the logs + enabled: false + report-frequency: 60 # in seconds + logging: + use-json-format: false # By default, logs are not in Json format + logstash: # Forward logs to logstash over a socket, used by LoggingConfiguration + enabled: false + host: localhost + port: 5000 + queue-size: 512 + audit-events: + retention-period: 30 # Number of days before audit events are deleted. + +# =================================================================== +# Application specific properties +# Add your own application properties here, see the ApplicationProperties class +# to have type-safe configuration, like in the JHipsterProperties above +# +# More documentation is available at: +# https://www.jhipster.tech/common-application-properties/ +# =================================================================== + +# application: diff --git a/borestop/src/main/resources/config/application-tls.yml b/borestop/src/main/resources/config/application-tls.yml new file mode 100644 index 00000000..27c9cd85 --- /dev/null +++ b/borestop/src/main/resources/config/application-tls.yml @@ -0,0 +1,19 @@ +# =================================================================== +# Activate this profile to enable TLS and HTTP/2. +# +# JHipster has generated a self-signed certificate, which will be used to encrypt traffic. +# As your browser will not understand this certificate, you will need to import it. +# +# Another (easiest) solution with Chrome is to enable the "allow-insecure-localhost" flag +# at chrome://flags/#allow-insecure-localhost +# =================================================================== +server: + ssl: + key-store: classpath:config/tls/keystore.p12 + key-store-password: password + key-store-type: PKCS12 + key-alias: selfsigned + ciphers: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_256_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 + enabled-protocols: TLSv1.2 + http2: + enabled: true diff --git a/borestop/src/main/resources/config/application.yml b/borestop/src/main/resources/config/application.yml new file mode 100644 index 00000000..aac8814b --- /dev/null +++ b/borestop/src/main/resources/config/application.yml @@ -0,0 +1,165 @@ +# =================================================================== +# Spring Boot configuration. +# +# This configuration will be overridden by the Spring profile you use, +# for example application-dev.yml if you use the "dev" profile. +# +# More information on profiles: https://www.jhipster.tech/profiles/ +# More information on configuration properties: https://www.jhipster.tech/common-application-properties/ +# =================================================================== + +# =================================================================== +# Standard Spring Boot properties. +# Full reference is available at: +# http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html +# =================================================================== + +management: + endpoints: + web: + base-path: /management + exposure: + include: ['configprops', 'env', 'health', 'info', 'jhimetrics', 'logfile', 'loggers', 'prometheus', 'threaddump'] + endpoint: + health: + show-details: when_authorized + roles: 'ROLE_ADMIN' + jhimetrics: + enabled: true + info: + git: + mode: full + health: + mail: + enabled: false # When using the MailService, configure an SMTP server and set this to true + metrics: + export: + # Prometheus is the default metrics backend + prometheus: + enabled: true + step: 60 + enable: + http: true + jvm: true + logback: true + process: true + system: true + distribution: + percentiles-histogram: + all: true + percentiles: + all: 0, 0.5, 0.75, 0.95, 0.99, 1.0 + tags: + application: ${spring.application.name} + web: + server: + request: + autotime: + enabled: true + +spring: + application: + name: borestop + profiles: + # The commented value for `active` can be replaced with valid Spring profiles to load. + # Otherwise, it will be filled in by maven when building the JAR file + # Either way, it can be overridden by `--spring.profiles.active` value passed in the commandline or `-Dspring.profiles.active` set in `JAVA_OPTS` + active: #spring.profiles.active# + jmx: + enabled: false + data: + jpa: + repositories: + bootstrap-mode: deferred + jpa: + open-in-view: false + properties: + hibernate.jdbc.time_zone: UTC + hibernate.id.new_generator_mappings: true + hibernate.connection.provider_disables_autocommit: true + hibernate.cache.use_second_level_cache: false + hibernate.cache.use_query_cache: false + hibernate.generate_statistics: false + # modify batch size as necessary + hibernate.jdbc.batch_size: 25 + hibernate.order_inserts: true + hibernate.order_updates: true + hibernate.query.fail_on_pagination_over_collection_fetch: true + hibernate.query.in_clause_parameter_padding: true + hibernate: + ddl-auto: none + naming: + physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy + implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy + messages: + basename: i18n/messages + main: + allow-bean-definition-overriding: true + task: + execution: + thread-name-prefix: borestop-task- + pool: + core-size: 2 + max-size: 50 + queue-capacity: 10000 + scheduling: + thread-name-prefix: borestop-scheduling- + pool: + size: 2 + thymeleaf: + mode: HTML + output: + ansi: + console-available: true + +server: + servlet: + session: + cookie: + http-only: true + +# Properties to be exposed on the /info management endpoint +info: + # Comma separated list of profiles that will trigger the ribbon to show + display-ribbon-on-profiles: 'dev' + +# =================================================================== +# JHipster specific properties +# +# Full reference is available at: https://www.jhipster.tech/common-application-properties/ +# =================================================================== + +jhipster: + clientApp: + name: 'borestopApp' + # By default CORS is disabled. Uncomment to enable. + # cors: + # allowed-origins: "*" + # allowed-methods: "*" + # allowed-headers: "*" + # exposed-headers: "Authorization,Link,X-Total-Count" + # allow-credentials: true + # max-age: 1800 + mail: + from: borestop@localhost + swagger: + default-include-pattern: /api/.* + title: borestop API + description: borestop API documentation + version: 0.0.1 + terms-of-service-url: + contact-name: + contact-url: + contact-email: + license: unlicensed + license-url: +# =================================================================== +# Application specific properties +# Add your own application properties here, see the ApplicationProperties class +# to have type-safe configuration, like in the JHipsterProperties above +# +# More documentation is available at: +# https://www.jhipster.tech/common-application-properties/ +# =================================================================== + +# application: diff --git a/borestop/src/main/resources/config/liquibase/changelog/00000000000000_initial_schema.xml b/borestop/src/main/resources/config/liquibase/changelog/00000000000000_initial_schema.xml new file mode 100644 index 00000000..e2762c96 --- /dev/null +++ b/borestop/src/main/resources/config/liquibase/changelog/00000000000000_initial_schema.xml @@ -0,0 +1,159 @@ +<?xml version="1.0" encoding="utf-8"?> +<databaseChangeLog + xmlns="http://www.liquibase.org/xml/ns/dbchangelog" + xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.9.xsd + http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd"> + + <changeSet id="00000000000000" author="jhipster"> + <createSequence sequenceName="sequence_generator" startValue="1050" incrementBy="50"/> + </changeSet> + + <!-- + JHipster core tables. + The initial schema has the '00000000000001' id, so that it is over-written if we re-generate it. + --> + <changeSet id="00000000000001" author="jhipster"> + <createTable tableName="jhi_user"> + <column name="id" type="bigint" > + <constraints primaryKey="true" nullable="false"/> + </column> + <column name="login" type="varchar(50)"> + <constraints unique="true" nullable="false" uniqueConstraintName="ux_user_login"/> + </column> + <column name="password_hash" type="varchar(60)"/> + <column name="first_name" type="varchar(50)"/> + <column name="last_name" type="varchar(50)"/> + <column name="email" type="varchar(191)"> + <constraints unique="true" nullable="true" uniqueConstraintName="ux_user_email"/> + </column> + <column name="image_url" type="varchar(256)"/> + <column name="activated" type="boolean" valueBoolean="false"> + <constraints nullable="false" /> + </column> + <column name="lang_key" type="varchar(10)"/> + <column name="activation_key" type="varchar(20)"/> + <column name="reset_key" type="varchar(20)"/> + <column name="created_by" type="varchar(50)"> + <constraints nullable="false"/> + </column> + <column name="created_date" type="timestamp"/> + <column name="reset_date" type="timestamp"> + <constraints nullable="true"/> + </column> + <column name="last_modified_by" type="varchar(50)"/> + <column name="last_modified_date" type="timestamp"/> + </createTable> + + <createTable tableName="jhi_authority"> + <column name="name" type="varchar(50)"> + <constraints primaryKey="true" nullable="false"/> + </column> + </createTable> + + <createTable tableName="jhi_user_authority"> + <column name="user_id" type="bigint"> + <constraints nullable="false"/> + </column> + <column name="authority_name" type="varchar(50)"> + <constraints nullable="false"/> + </column> + </createTable> + + <addPrimaryKey columnNames="user_id, authority_name" tableName="jhi_user_authority"/> + + <addForeignKeyConstraint baseColumnNames="authority_name" + baseTableName="jhi_user_authority" + constraintName="fk_authority_name" + referencedColumnNames="name" + referencedTableName="jhi_authority"/> + + <addForeignKeyConstraint baseColumnNames="user_id" + baseTableName="jhi_user_authority" + constraintName="fk_user_id" + referencedColumnNames="id" + referencedTableName="jhi_user"/> + + <addNotNullConstraint columnName="password_hash" + columnDataType="varchar(60)" + tableName="jhi_user"/> + <loadData + file="config/liquibase/data/user.csv" + separator=";" + tableName="jhi_user"> + <column name="id" type="numeric"/> + <column name="activated" type="boolean"/> + <column name="created_date" type="timestamp"/> + </loadData> + <dropDefaultValue tableName="jhi_user" columnName="created_date" columnDataType="datetime"/> + <loadData + file="config/liquibase/data/authority.csv" + separator=";" + tableName="jhi_authority"> + <column name="name" type="string"/> + </loadData> + + <loadData + file="config/liquibase/data/user_authority.csv" + separator=";" + tableName="jhi_user_authority"> + <column name="user_id" type="numeric"/> + </loadData> + <createTable tableName="jhi_persistent_audit_event"> + <column name="event_id" type="bigint" > + <constraints primaryKey="true" nullable="false"/> + </column> + <column name="principal" type="varchar(50)"> + <constraints nullable="false" /> + </column> + <column name="event_date" type="timestamp"/> + <column name="event_type" type="varchar(255)"/> + </createTable> + + <createTable tableName="jhi_persistent_audit_evt_data"> + <column name="event_id" type="bigint"> + <constraints nullable="false"/> + </column> + <column name="name" type="varchar(150)"> + <constraints nullable="false"/> + </column> + <column name="value" type="varchar(255)"/> + </createTable> + <addPrimaryKey columnNames="event_id, name" tableName="jhi_persistent_audit_evt_data"/> + + <createIndex indexName="idx_persistent_audit_event" + tableName="jhi_persistent_audit_event" + unique="false"> + <column name="principal" type="varchar(50)"/> + <column name="event_date" type="timestamp"/> + </createIndex> + + <createIndex indexName="idx_persistent_audit_evt_data" + tableName="jhi_persistent_audit_evt_data" + unique="false"> + <column name="event_id" type="bigint"/> + </createIndex> + + <addForeignKeyConstraint baseColumnNames="event_id" + baseTableName="jhi_persistent_audit_evt_data" + constraintName="fk_evt_pers_audit_evt_data" + referencedColumnNames="event_id" + referencedTableName="jhi_persistent_audit_event"/> + </changeSet> + + <changeSet author="jhipster" id="00000000000002" context="test"> + <createTable tableName="jhi_date_time_wrapper"> + <column name="id" type="BIGINT"> + <constraints primaryKey="true" primaryKeyName="jhi_date_time_wrapperPK"/> + </column> + <column name="instant" type="timestamp"/> + <column name="local_date_time" type="timestamp"/> + <column name="offset_date_time" type="timestamp"/> + <column name="zoned_date_time" type="timestamp"/> + <column name="local_time" type="time"/> + <column name="offset_time" type="time"/> + <column name="local_date" type="date"/> + </createTable> + </changeSet> +</databaseChangeLog> diff --git a/borestop/src/main/resources/config/liquibase/data/authority.csv b/borestop/src/main/resources/config/liquibase/data/authority.csv new file mode 100644 index 00000000..af5c6dfa --- /dev/null +++ b/borestop/src/main/resources/config/liquibase/data/authority.csv @@ -0,0 +1,3 @@ +name +ROLE_ADMIN +ROLE_USER diff --git a/borestop/src/main/resources/config/liquibase/data/user.csv b/borestop/src/main/resources/config/liquibase/data/user.csv new file mode 100644 index 00000000..b25922b6 --- /dev/null +++ b/borestop/src/main/resources/config/liquibase/data/user.csv @@ -0,0 +1,5 @@ +id;login;password_hash;first_name;last_name;email;image_url;activated;lang_key;created_by;last_modified_by +1;system;$2a$10$mE.qmcV0mFU5NcKh73TZx.z4ueI/.bDWbj0T1BYyqP481kGGarKLG;System;System;system@localhost;;true;en;system;system +2;anonymoususer;$2a$10$j8S5d7Sr7.8VTOYNviDPOeWX8KcYILUVJBsYV83Y5NtECayypx9lO;Anonymous;User;anonymous@localhost;;true;en;system;system +3;admin;$2a$10$gSAhZrxMllrbgj/kkK9UceBPpChGWJA7SYIb1Mqo.n5aNLq1/oRrC;Administrator;Administrator;admin@localhost;;true;en;system;system +4;user;$2a$10$VEjxo0jq2YG9Rbk2HmX9S.k1uZBGYUHdUcid3g/vfiEl7lwWgOH/K;User;User;user@localhost;;true;en;system;system diff --git a/borestop/src/main/resources/config/liquibase/data/user_authority.csv b/borestop/src/main/resources/config/liquibase/data/user_authority.csv new file mode 100644 index 00000000..06c5feee --- /dev/null +++ b/borestop/src/main/resources/config/liquibase/data/user_authority.csv @@ -0,0 +1,6 @@ +user_id;authority_name +1;ROLE_ADMIN +1;ROLE_USER +3;ROLE_ADMIN +3;ROLE_USER +4;ROLE_USER diff --git a/borestop/src/main/resources/config/liquibase/master.xml b/borestop/src/main/resources/config/liquibase/master.xml new file mode 100644 index 00000000..ed94bf4b --- /dev/null +++ b/borestop/src/main/resources/config/liquibase/master.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<databaseChangeLog + xmlns="http://www.liquibase.org/xml/ns/dbchangelog" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.9.xsd"> + + <property name="now" value="now()" dbms="h2"/> + <property name="now" value="current_timestamp" dbms="postgresql"/> + + <property name="floatType" value="float4" dbms="postgresql, h2"/> + <property name="floatType" value="float" dbms="mysql, oracle, mssql, mariadb"/> + <property name="clobType" value="longvarchar" dbms="h2"/> + <property name="clobType" value="clob" dbms="mysql, oracle, mssql, mariadb, postgresql"/> + <property name="uuidType" value="uuid" dbms="h2, postgresql"/> + + <include file="config/liquibase/changelog/00000000000000_initial_schema.xml" relativeToChangelogFile="false"/> + <!-- jhipster-needle-liquibase-add-changelog - JHipster will add liquibase changelogs here --> + <!-- jhipster-needle-liquibase-add-constraints-changelog - JHipster will add liquibase constraints changelogs here --> + <!-- jhipster-needle-liquibase-add-incremental-changelog - JHipster will add incremental liquibase changelogs here --> +</databaseChangeLog> diff --git a/borestop/src/main/resources/config/tls/keystore.p12 b/borestop/src/main/resources/config/tls/keystore.p12 new file mode 100644 index 0000000000000000000000000000000000000000..ef47ed6c55c3757c2659d62308309cc0387489d4 GIT binary patch literal 2607 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 DkDR)h literal 0 HcmV?d00001 diff --git a/borestop/src/main/resources/i18n/messages.properties b/borestop/src/main/resources/i18n/messages.properties new file mode 100644 index 00000000..ea138657 --- /dev/null +++ b/borestop/src/main/resources/i18n/messages.properties @@ -0,0 +1,21 @@ +# Error page +error.title=Your request cannot be processed +error.subtitle=Sorry, an error has occurred. +error.status=Status: +error.message=Message: + +# Activation email +email.activation.title=borestop account activation is required +email.activation.greeting=Dear {0} +email.activation.text1=Your borestop account has been created, please click on the URL below to activate it: +email.activation.text2=Regards, +email.signature=borestop Team. + +# Creation email +email.creation.text1=Your borestop account has been created, please click on the URL below to access it: + +# Reset email +email.reset.title=borestop password reset +email.reset.greeting=Dear {0} +email.reset.text1=For your borestop account a password reset was requested, please click on the URL below to reset it: +email.reset.text2=Regards, diff --git a/borestop/src/main/resources/i18n/messages_en.properties b/borestop/src/main/resources/i18n/messages_en.properties new file mode 100644 index 00000000..73f69f64 --- /dev/null +++ b/borestop/src/main/resources/i18n/messages_en.properties @@ -0,0 +1,21 @@ +# Error page +error.title=Your request cannot be processed +error.subtitle=Sorry, an error has occurred. +error.status=Status: +error.message=Message: + +# Activation email +email.activation.title=borestop account activation +email.activation.greeting=Dear {0} +email.activation.text1=Your borestop account has been created, please click on the URL below to activate it: +email.activation.text2=Regards, +email.signature=borestop Team. + +# Creation email +email.creation.text1=Your borestop account has been created, please click on the URL below to access it: + +# Reset email +email.reset.title=borestop password reset +email.reset.greeting=Dear {0} +email.reset.text1=For your borestop account a password reset was requested, please click on the URL below to reset it: +email.reset.text2=Regards, diff --git a/borestop/src/main/resources/logback-spring.xml b/borestop/src/main/resources/logback-spring.xml new file mode 100644 index 00000000..46f66b0e --- /dev/null +++ b/borestop/src/main/resources/logback-spring.xml @@ -0,0 +1,68 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE configuration> + +<configuration scan="true"> + <include resource="org/springframework/boot/logging/logback/base.xml"/> + +<!-- The FILE and ASYNC appenders are here as examples for a production configuration --> +<!-- + <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> + <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern> + <maxHistory>90</maxHistory> + </rollingPolicy> + <encoder> + <charset>utf-8</charset> + <Pattern>%d %-5level [%thread] %logger{0}: %msg%n</Pattern> + </encoder> + </appender> + + <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender"> + <queueSize>512</queueSize> + <appender-ref ref="FILE"/> + </appender> + + <root level="${logging.level.root}"> + <appender-ref ref="ASYNC"/> + </root> +--> + + <logger name="javax.activation" level="WARN"/> + <logger name="javax.mail" level="WARN"/> + <logger name="javax.management.remote" level="WARN"/> + <logger name="javax.xml.bind" level="WARN"/> + <logger name="ch.qos.logback" level="WARN"/> + <logger name="com.ryantenney" level="WARN"/> + <logger name="com.sun" level="WARN"/> + <logger name="com.zaxxer" level="WARN"/> + <logger name="io.undertow" level="WARN"/> + <logger name="io.undertow.websockets.jsr" level="ERROR"/> + <logger name="org.apache" level="WARN"/> + <logger name="org.apache.catalina.startup.DigesterFactory" level="OFF"/> + <logger name="org.bson" level="WARN"/> + <logger name="org.hibernate.validator" level="WARN"/> + <logger name="org.hibernate" level="WARN"/> + <logger name="org.hibernate.ejb.HibernatePersistence" level="OFF"/> + <logger name="org.postgresql" level="WARN"/> + <logger name="org.springframework" level="WARN"/> + <logger name="org.springframework.web" level="WARN"/> + <logger name="org.springframework.security" level="WARN"/> + <logger name="org.springframework.cache" level="WARN"/> + <logger name="org.thymeleaf" level="WARN"/> + <logger name="org.xnio" level="WARN"/> + <logger name="springfox" level="WARN"/> + <logger name="sun.rmi" level="WARN"/> + <logger name="liquibase" level="WARN"/> + <logger name="LiquibaseSchemaResolver" level="INFO"/> + <logger name="springfox.documentation.schema.property" level="ERROR"/> + <logger name="sun.rmi.transport" level="WARN"/> + <!-- jhipster-needle-logback-add-log - JHipster will add a new log with level --> + + <!-- https://logback.qos.ch/manual/configuration.html#shutdownHook and https://jira.qos.ch/browse/LOGBACK-1090 --> + <shutdownHook class="ch.qos.logback.core.hook.DelayingShutdownHook"/> + + <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"> + <resetJUL>true</resetJUL> + </contextListener> + +</configuration> diff --git a/borestop/src/main/resources/templates/error.html b/borestop/src/main/resources/templates/error.html new file mode 100644 index 00000000..a421bd26 --- /dev/null +++ b/borestop/src/main/resources/templates/error.html @@ -0,0 +1,87 @@ +<!DOCTYPE html> +<html xmlns:th="http://www.thymeleaf.org" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.thymeleaf.org" th:lang="${#locale.language}" lang="en"> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> + <link rel="icon" href="${baseUrl}/favicon.ico" /> + <title>Your request cannot be processed</title> + <style> + ::-moz-selection { + background: #b3d4fc; + text-shadow: none; + } + + ::selection { + background: #b3d4fc; + text-shadow: none; + } + + html { + padding: 30px 10px; + font-size: 20px; + line-height: 1.4; + color: #737373; + background: #3E8ACC; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; + } + + html, + input { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + } + + body { + max-width: 1000px; + _width: 500px; + padding: 30px 20px 50px; + border: 1px solid #b3b3b3; + border-radius: 4px; + margin: 0 auto; + box-shadow: 0 1px 10px #a7a7a7, inset 0 1px 0 #fff; + background: #fcfcfc; + } + + h1 { + margin: 0 10px; + font-size: 50px; + text-align: center; + } + + h1 span { + color: #bbb; + } + + h3 { + margin: 1.5em 0 0.5em; + } + + p { + margin: 1em 0; + } + + ul { + padding: 0 0 0 40px; + margin: 1em 0; + } + + .container { + max-width: 800px; + _width: 380px; + margin: 0 auto; + } + </style> +</head> +<body> +<div class="container"> + <h1 th:text="#{error.title}">Your request cannot be processed <span>:(</span></h1> + + <p th:text="#{error.subtitle}">Sorry, an error has occurred.</p> + + <span th:text="#{error.status}">Status:</span> <span th:text="${error}"></span> (<span th:text="${error}"></span>)<br/> + <span th:if="${!#strings.isEmpty(message)}"> + <span th:text="#{error.message}">Message:</span> <span th:text="${message}"></span><br/> + </span> +</div> +</body> +</html> diff --git a/borestop/src/main/resources/templates/mail/activationEmail.html b/borestop/src/main/resources/templates/mail/activationEmail.html new file mode 100644 index 00000000..07d8d3b1 --- /dev/null +++ b/borestop/src/main/resources/templates/mail/activationEmail.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<html xmlns:th="http://www.thymeleaf.org" th:lang="${#locale.language}" lang="en"> + <head> + <title th:text="#{email.activation.title}">JHipster activation</title> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> + <link rel="icon" th:href="@{|${baseUrl}/favicon.ico|}" /> + </head> + <body> + <p th:text="#{email.activation.greeting(${user.login})}"> + Dear + </p> + <p th:text="#{email.activation.text1}"> + Your JHipster account has been created, please click on the URL below to activate it: + </p> + <p> + <a th:with="url=(@{|${baseUrl}/account/activate?key=${user.activationKey}|})" th:href="${url}" + th:text="${url}">Activation link</a> + </p> + <p> + <span th:text="#{email.activation.text2}">Regards, </span> + <br/> + <em th:text="#{email.signature}">JHipster.</em> + </p> + </body> +</html> diff --git a/borestop/src/main/resources/templates/mail/creationEmail.html b/borestop/src/main/resources/templates/mail/creationEmail.html new file mode 100644 index 00000000..1d9276e3 --- /dev/null +++ b/borestop/src/main/resources/templates/mail/creationEmail.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<html xmlns:th="http://www.thymeleaf.org" th:lang="${#locale.language}" lang="en"> + <head> + <title th:text="#{email.activation.title}">JHipster creation</title> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> + <link rel="icon" th:href="@{|${baseUrl}/favicon.ico|}" /> + </head> + <body> + <p th:text="#{email.activation.greeting(${user.login})}"> + Dear + </p> + <p th:text="#{email.creation.text1}"> + Your JHipster account has been created, please click on the URL below to access it: + </p> + <p> + <a th:with="url=(@{|${baseUrl}/account/reset/finish?key=${user.resetKey}|})" th:href="${url}" + th:text="${url}">Login link</a> + </p> + <p> + <span th:text="#{email.activation.text2}">Regards, </span> + <br/> + <em th:text="#{email.signature}">JHipster.</em> + </p> + </body> +</html> diff --git a/borestop/src/main/resources/templates/mail/passwordResetEmail.html b/borestop/src/main/resources/templates/mail/passwordResetEmail.html new file mode 100644 index 00000000..4e709cf0 --- /dev/null +++ b/borestop/src/main/resources/templates/mail/passwordResetEmail.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<html xmlns:th="http://www.thymeleaf.org" th:lang="${#locale.language}" lang="en"> + <head> + <title th:text="#{email.reset.title}">JHipster password reset</title> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> + <link rel="icon" th:href="@{|${baseUrl}/favicon.ico|}" /> + </head> + <body> + <p th:text="#{email.reset.greeting(${user.login})}"> + Dear + </p> + <p th:text="#{email.reset.text1}"> + For your JHipster account a password reset was requested, please click on the URL below to reset it: + </p> + <p> + <a th:with="url=(@{|${baseUrl}/account/reset/finish?key=${user.resetKey}|})" th:href="${url}" + th:text="${url}">Login link</a> + </p> + <p> + <span th:text="#{email.reset.text2}">Regards, </span> + <br/> + <em th:text="#{email.signature}">JHipster.</em> + </p> + </body> +</html> diff --git a/borestop/src/main/webapp/404.html b/borestop/src/main/webapp/404.html new file mode 100644 index 00000000..21a47e54 --- /dev/null +++ b/borestop/src/main/webapp/404.html @@ -0,0 +1,61 @@ +<!doctype html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <title>Page Not Found</title> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <link rel="icon" href="favicon.ico" /> + <style> + + * { + line-height: 1.2; + margin: 0; + } + + html { + color: #888; + display: table; + font-family: sans-serif; + height: 100%; + text-align: center; + width: 100%; + } + + body { + display: table-cell; + vertical-align: middle; + margin: 2em auto; + } + + h1 { + color: #555; + font-size: 2em; + font-weight: 400; + } + + p { + margin: 0 auto; + width: 280px; + } + + @media only screen and (max-width: 280px) { + + body, p { + width: 95%; + } + + h1 { + font-size: 1.5em; + margin: 0 0 0.3em; + } + + } + + </style> +</head> +<body> + <h1>Page Not Found</h1> + <p>Sorry, but the page you were trying to view does not exist.</p> +</body> +</html> +<!-- IE needs 512+ bytes: http://blogs.msdn.com/b/ieinternals/archive/2010/08/19/http-error-pages-in-internet-explorer.aspx --> diff --git a/borestop/src/main/webapp/WEB-INF/web.xml b/borestop/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 00000000..f1611b51 --- /dev/null +++ b/borestop/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="UTF-8"?> +<web-app + xmlns="http://java.sun.com/xml/ns/javaee" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" + version="3.0"> + + <mime-mapping> + <extension>html</extension> + <mime-type>text/html;charset=utf-8</mime-type> + </mime-mapping> + +</web-app> diff --git a/borestop/src/main/webapp/app/account/account.module.ts b/borestop/src/main/webapp/app/account/account.module.ts new file mode 100644 index 00000000..179347b4 --- /dev/null +++ b/borestop/src/main/webapp/app/account/account.module.ts @@ -0,0 +1,27 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import { BorestopSharedModule } from 'app/shared/shared.module'; + +import { PasswordStrengthBarComponent } from './password/password-strength-bar.component'; +import { RegisterComponent } from './register/register.component'; +import { ActivateComponent } from './activate/activate.component'; +import { PasswordComponent } from './password/password.component'; +import { PasswordResetInitComponent } from './password-reset/init/password-reset-init.component'; +import { PasswordResetFinishComponent } from './password-reset/finish/password-reset-finish.component'; +import { SettingsComponent } from './settings/settings.component'; +import { accountState } from './account.route'; + +@NgModule({ + imports: [BorestopSharedModule, RouterModule.forChild(accountState)], + declarations: [ + ActivateComponent, + RegisterComponent, + PasswordComponent, + PasswordStrengthBarComponent, + PasswordResetInitComponent, + PasswordResetFinishComponent, + SettingsComponent + ] +}) +export class AccountModule {} diff --git a/borestop/src/main/webapp/app/account/account.route.ts b/borestop/src/main/webapp/app/account/account.route.ts new file mode 100644 index 00000000..3c15bb74 --- /dev/null +++ b/borestop/src/main/webapp/app/account/account.route.ts @@ -0,0 +1,17 @@ +import { Routes } from '@angular/router'; + +import { activateRoute } from './activate/activate.route'; +import { passwordRoute } from './password/password.route'; +import { passwordResetFinishRoute } from './password-reset/finish/password-reset-finish.route'; +import { passwordResetInitRoute } from './password-reset/init/password-reset-init.route'; +import { registerRoute } from './register/register.route'; +import { settingsRoute } from './settings/settings.route'; + +const ACCOUNT_ROUTES = [activateRoute, passwordRoute, passwordResetFinishRoute, passwordResetInitRoute, registerRoute, settingsRoute]; + +export const accountState: Routes = [ + { + path: '', + children: ACCOUNT_ROUTES + } +]; diff --git a/borestop/src/main/webapp/app/account/activate/activate.component.html b/borestop/src/main/webapp/app/account/activate/activate.component.html new file mode 100644 index 00000000..92b942b2 --- /dev/null +++ b/borestop/src/main/webapp/app/account/activate/activate.component.html @@ -0,0 +1,16 @@ +<div> + <div class="row justify-content-center"> + <div class="col-md-8"> + <h1 jhiTranslate="activate.title">Activation</h1> + + <div class="alert alert-success" *ngIf="success"> + <span jhiTranslate="activate.messages.success"><strong>Your user account has been activated.</strong> Please </span> + <a class="alert-link" (click)="login()" jhiTranslate="global.messages.info.authenticated.link">sign in</a>. + </div> + + <div class="alert alert-danger" *ngIf="error" jhiTranslate="activate.messages.error"> + <strong>Your user could not be activated.</strong> Please use the registration form to sign up. + </div> + </div> + </div> +</div> diff --git a/borestop/src/main/webapp/app/account/activate/activate.component.ts b/borestop/src/main/webapp/app/account/activate/activate.component.ts new file mode 100644 index 00000000..8020af1d --- /dev/null +++ b/borestop/src/main/webapp/app/account/activate/activate.component.ts @@ -0,0 +1,28 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { flatMap } from 'rxjs/operators'; + +import { LoginModalService } from 'app/core/login/login-modal.service'; +import { ActivateService } from './activate.service'; + +@Component({ + selector: 'jhi-activate', + templateUrl: './activate.component.html' +}) +export class ActivateComponent implements OnInit { + error = false; + success = false; + + constructor(private activateService: ActivateService, private loginModalService: LoginModalService, private route: ActivatedRoute) {} + + ngOnInit(): void { + this.route.queryParams.pipe(flatMap(params => this.activateService.get(params.key))).subscribe( + () => (this.success = true), + () => (this.error = true) + ); + } + + login(): void { + this.loginModalService.open(); + } +} diff --git a/borestop/src/main/webapp/app/account/activate/activate.route.ts b/borestop/src/main/webapp/app/account/activate/activate.route.ts new file mode 100644 index 00000000..a988352d --- /dev/null +++ b/borestop/src/main/webapp/app/account/activate/activate.route.ts @@ -0,0 +1,12 @@ +import { Route } from '@angular/router'; + +import { ActivateComponent } from './activate.component'; + +export const activateRoute: Route = { + path: 'activate', + component: ActivateComponent, + data: { + authorities: [], + pageTitle: 'activate.title' + } +}; diff --git a/borestop/src/main/webapp/app/account/activate/activate.service.ts b/borestop/src/main/webapp/app/account/activate/activate.service.ts new file mode 100644 index 00000000..9cac51ef --- /dev/null +++ b/borestop/src/main/webapp/app/account/activate/activate.service.ts @@ -0,0 +1,16 @@ +import { Injectable } from '@angular/core'; +import { HttpClient, HttpParams } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +import { SERVER_API_URL } from 'app/app.constants'; + +@Injectable({ providedIn: 'root' }) +export class ActivateService { + constructor(private http: HttpClient) {} + + get(key: string): Observable<{}> { + return this.http.get(SERVER_API_URL + 'api/activate', { + params: new HttpParams().set('key', key) + }); + } +} diff --git a/borestop/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.html b/borestop/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.html new file mode 100644 index 00000000..61c54ad6 --- /dev/null +++ b/borestop/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.html @@ -0,0 +1,90 @@ +<div> + <div class="row justify-content-center"> + <div class="col-md-4"> + <h1 jhiTranslate="reset.finish.title">Reset password</h1> + + <div class="alert alert-danger" jhiTranslate="reset.finish.messages.keymissing" *ngIf="initialized && !key"> + <strong>The password reset key is missing.</strong> + </div> + + <div class="alert alert-warning" *ngIf="key && !success"> + <span jhiTranslate="reset.finish.messages.info">Choose a new password</span> + </div> + + <div class="alert alert-danger" *ngIf="error"> + <span jhiTranslate="reset.finish.messages.error">Your password couldn't be reset. Remember a password request is only valid for 24 hours.</span> + </div> + + <div class="alert alert-success" *ngIf="success"> + <span jhiTranslate="reset.finish.messages.success"><strong>Your password has been reset.</strong> Please </span> + <a class="alert-link" (click)="login()" jhiTranslate="global.messages.info.authenticated.link">sign in</a>. + </div> + + <div class="alert alert-danger" *ngIf="doNotMatch" jhiTranslate="global.messages.error.dontmatch"> + The password and its confirmation do not match! + </div> + + <div *ngIf="key && !success"> + <form name="form" role="form" (ngSubmit)="finishReset()" [formGroup]="passwordForm"> + <div class="form-group"> + <label class="form-control-label" for="newPassword" jhiTranslate="global.form.newpassword.label">New password</label> + <input type="password" class="form-control" id="newPassword" name="newPassword" + placeholder="{{ 'global.form.newpassword.placeholder' | translate }}" + formControlName="newPassword" #newPassword> + + <div *ngIf="passwordForm.get('newPassword')!.invalid && (passwordForm.get('newPassword')!.dirty || passwordForm.get('newPassword')!.touched)"> + <small class="form-text text-danger" + *ngIf="passwordForm.get('newPassword')?.errors?.required" + jhiTranslate="global.messages.validate.newpassword.required"> + Your password is required. + </small> + + <small class="form-text text-danger" + *ngIf="passwordForm.get('newPassword')?.errors?.minlength" + jhiTranslate="global.messages.validate.newpassword.minlength"> + Your password is required to be at least 4 characters. + </small> + + <small class="form-text text-danger" + *ngIf="passwordForm.get('newPassword')?.errors?.maxlength" + jhiTranslate="global.messages.validate.newpassword.maxlength"> + Your password cannot be longer than 50 characters. + </small> + </div> + + <jhi-password-strength-bar [passwordToCheck]="passwordForm.get('newPassword')!.value"></jhi-password-strength-bar> + </div> + + <div class="form-group"> + <label class="form-control-label" for="confirmPassword" jhiTranslate="global.form.confirmpassword.label">New password confirmation</label> + <input type="password" class="form-control" id="confirmPassword" name="confirmPassword" + placeholder="{{ 'global.form.confirmpassword.placeholder' | translate }}" + formControlName="confirmPassword"> + + <div *ngIf="passwordForm.get('confirmPassword')!.invalid && (passwordForm.get('confirmPassword')!.dirty || passwordForm.get('confirmPassword')!.touched)"> + <small class="form-text text-danger" + *ngIf="passwordForm.get('confirmPassword')?.errors?.required" + jhiTranslate="global.messages.validate.confirmpassword.required"> + Your password confirmation is required. + </small> + + <small class="form-text text-danger" + *ngIf="passwordForm.get('confirmPassword')?.errors?.minlength" + jhiTranslate="global.messages.validate.confirmpassword.minlength"> + Your password confirmation is required to be at least 4 characters. + </small> + + <small class="form-text text-danger" + *ngIf="passwordForm.get('confirmPassword')?.errors?.maxlength" + jhiTranslate="global.messages.validate.confirmpassword.maxlength"> + Your password confirmation cannot be longer than 50 characters. + </small> + </div> + </div> + + <button type="submit" [disabled]="passwordForm.invalid" class="btn btn-primary" jhiTranslate="reset.finish.form.button">Reset Password</button> + </form> + </div> + </div> + </div> +</div> diff --git a/borestop/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.ts b/borestop/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.ts new file mode 100644 index 00000000..579d141e --- /dev/null +++ b/borestop/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.ts @@ -0,0 +1,69 @@ +import { Component, OnInit, AfterViewInit, ElementRef, ViewChild } from '@angular/core'; +import { FormBuilder, Validators } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; + +import { LoginModalService } from 'app/core/login/login-modal.service'; +import { PasswordResetFinishService } from './password-reset-finish.service'; + +@Component({ + selector: 'jhi-password-reset-finish', + templateUrl: './password-reset-finish.component.html' +}) +export class PasswordResetFinishComponent implements OnInit, AfterViewInit { + @ViewChild('newPassword', { static: false }) + newPassword?: ElementRef; + + initialized = false; + doNotMatch = false; + error = false; + success = false; + key = ''; + + passwordForm = this.fb.group({ + newPassword: ['', [Validators.required, Validators.minLength(4), Validators.maxLength(50)]], + confirmPassword: ['', [Validators.required, Validators.minLength(4), Validators.maxLength(50)]] + }); + + constructor( + private passwordResetFinishService: PasswordResetFinishService, + private loginModalService: LoginModalService, + private route: ActivatedRoute, + private fb: FormBuilder + ) {} + + ngOnInit(): void { + this.route.queryParams.subscribe(params => { + if (params['key']) { + this.key = params['key']; + } + this.initialized = true; + }); + } + + ngAfterViewInit(): void { + if (this.newPassword) { + this.newPassword.nativeElement.focus(); + } + } + + finishReset(): void { + this.doNotMatch = false; + this.error = false; + + const newPassword = this.passwordForm.get(['newPassword'])!.value; + const confirmPassword = this.passwordForm.get(['confirmPassword'])!.value; + + if (newPassword !== confirmPassword) { + this.doNotMatch = true; + } else { + this.passwordResetFinishService.save(this.key, newPassword).subscribe( + () => (this.success = true), + () => (this.error = true) + ); + } + } + + login(): void { + this.loginModalService.open(); + } +} diff --git a/borestop/src/main/webapp/app/account/password-reset/finish/password-reset-finish.route.ts b/borestop/src/main/webapp/app/account/password-reset/finish/password-reset-finish.route.ts new file mode 100644 index 00000000..0cff2b07 --- /dev/null +++ b/borestop/src/main/webapp/app/account/password-reset/finish/password-reset-finish.route.ts @@ -0,0 +1,12 @@ +import { Route } from '@angular/router'; + +import { PasswordResetFinishComponent } from './password-reset-finish.component'; + +export const passwordResetFinishRoute: Route = { + path: 'reset/finish', + component: PasswordResetFinishComponent, + data: { + authorities: [], + pageTitle: 'global.menu.account.password' + } +}; diff --git a/borestop/src/main/webapp/app/account/password-reset/finish/password-reset-finish.service.ts b/borestop/src/main/webapp/app/account/password-reset/finish/password-reset-finish.service.ts new file mode 100644 index 00000000..24736292 --- /dev/null +++ b/borestop/src/main/webapp/app/account/password-reset/finish/password-reset-finish.service.ts @@ -0,0 +1,14 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +import { SERVER_API_URL } from 'app/app.constants'; + +@Injectable({ providedIn: 'root' }) +export class PasswordResetFinishService { + constructor(private http: HttpClient) {} + + save(key: string, newPassword: string): Observable<{}> { + return this.http.post(SERVER_API_URL + 'api/account/reset-password/finish', { key, newPassword }); + } +} diff --git a/borestop/src/main/webapp/app/account/password-reset/init/password-reset-init.component.html b/borestop/src/main/webapp/app/account/password-reset/init/password-reset-init.component.html new file mode 100644 index 00000000..3c05c6d9 --- /dev/null +++ b/borestop/src/main/webapp/app/account/password-reset/init/password-reset-init.component.html @@ -0,0 +1,53 @@ +<div> + <div class="row justify-content-center"> + <div class="col-md-8"> + <h1 jhiTranslate="reset.request.title">Reset your password</h1> + + <jhi-alert-error></jhi-alert-error> + + <div class="alert alert-warning" *ngIf="!success"> + <span jhiTranslate="reset.request.messages.info">Enter the email address you used to register.</span> + </div> + + <div class="alert alert-success" *ngIf="success"> + <span jhiTranslate="reset.request.messages.success">Check your emails for details on how to reset your password.</span> + </div> + + <form *ngIf="!success" name="form" role="form" (ngSubmit)="requestReset()" [formGroup]="resetRequestForm"> + <div class="form-group"> + <label class="form-control-label" for="email" jhiTranslate="global.form.email.label">Email</label> + <input type="email" class="form-control" id="email" name="email" placeholder="{{ 'global.form.email.placeholder' | translate }}" + formControlName="email" #email> + + <div *ngIf="resetRequestForm.get('email')!.invalid && (resetRequestForm.get('email')!.dirty || resetRequestForm.get('email')!.touched)"> + <small class="form-text text-danger" + *ngIf="resetRequestForm.get('email')?.errors?.required" + jhiTranslate="global.messages.validate.email.required"> + Your email is required. + </small> + + <small class="form-text text-danger" + *ngIf="resetRequestForm.get('email')?.errors?.email" + jhiTranslate="global.messages.validate.email.invalid"> + Your email is invalid. + </small> + + <small class="form-text text-danger" + *ngIf="resetRequestForm.get('email')?.errors?.minlength" + jhiTranslate="global.messages.validate.email.minlength"> + Your email is required to be at least 5 characters. + </small> + + <small class="form-text text-danger" + *ngIf="resetRequestForm.get('email')?.errors?.maxlength" + jhiTranslate="global.messages.validate.email.maxlength"> + Your email cannot be longer than 100 characters. + </small> + </div> + </div> + + <button type="submit" [disabled]="resetRequestForm.invalid" class="btn btn-primary" jhiTranslate="reset.request.form.button">Reset</button> + </form> + </div> + </div> +</div> diff --git a/borestop/src/main/webapp/app/account/password-reset/init/password-reset-init.component.ts b/borestop/src/main/webapp/app/account/password-reset/init/password-reset-init.component.ts new file mode 100644 index 00000000..e8d4fb40 --- /dev/null +++ b/borestop/src/main/webapp/app/account/password-reset/init/password-reset-init.component.ts @@ -0,0 +1,30 @@ +import { Component, AfterViewInit, ElementRef, ViewChild } from '@angular/core'; +import { FormBuilder, Validators } from '@angular/forms'; + +import { PasswordResetInitService } from './password-reset-init.service'; + +@Component({ + selector: 'jhi-password-reset-init', + templateUrl: './password-reset-init.component.html' +}) +export class PasswordResetInitComponent implements AfterViewInit { + @ViewChild('email', { static: false }) + email?: ElementRef; + + success = false; + resetRequestForm = this.fb.group({ + email: ['', [Validators.required, Validators.minLength(5), Validators.maxLength(254), Validators.email]] + }); + + constructor(private passwordResetInitService: PasswordResetInitService, private fb: FormBuilder) {} + + ngAfterViewInit(): void { + if (this.email) { + this.email.nativeElement.focus(); + } + } + + requestReset(): void { + this.passwordResetInitService.save(this.resetRequestForm.get(['email'])!.value).subscribe(() => (this.success = true)); + } +} diff --git a/borestop/src/main/webapp/app/account/password-reset/init/password-reset-init.route.ts b/borestop/src/main/webapp/app/account/password-reset/init/password-reset-init.route.ts new file mode 100644 index 00000000..887c77bc --- /dev/null +++ b/borestop/src/main/webapp/app/account/password-reset/init/password-reset-init.route.ts @@ -0,0 +1,12 @@ +import { Route } from '@angular/router'; + +import { PasswordResetInitComponent } from './password-reset-init.component'; + +export const passwordResetInitRoute: Route = { + path: 'reset/request', + component: PasswordResetInitComponent, + data: { + authorities: [], + pageTitle: 'global.menu.account.password' + } +}; diff --git a/borestop/src/main/webapp/app/account/password-reset/init/password-reset-init.service.ts b/borestop/src/main/webapp/app/account/password-reset/init/password-reset-init.service.ts new file mode 100644 index 00000000..368500c3 --- /dev/null +++ b/borestop/src/main/webapp/app/account/password-reset/init/password-reset-init.service.ts @@ -0,0 +1,14 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +import { SERVER_API_URL } from 'app/app.constants'; + +@Injectable({ providedIn: 'root' }) +export class PasswordResetInitService { + constructor(private http: HttpClient) {} + + save(mail: string): Observable<{}> { + return this.http.post(SERVER_API_URL + 'api/account/reset-password/init', mail); + } +} diff --git a/borestop/src/main/webapp/app/account/password/password-strength-bar.component.ts b/borestop/src/main/webapp/app/account/password/password-strength-bar.component.ts new file mode 100644 index 00000000..ebeca929 --- /dev/null +++ b/borestop/src/main/webapp/app/account/password/password-strength-bar.component.ts @@ -0,0 +1,85 @@ +import { Component, ElementRef, Input, Renderer2 } from '@angular/core'; + +@Component({ + selector: 'jhi-password-strength-bar', + template: ` + <div id="strength"> + <small jhiTranslate="global.messages.validate.newpassword.strength">Password strength:</small> + <ul id="strengthBar"> + <li class="point"></li> + <li class="point"></li> + <li class="point"></li> + <li class="point"></li> + <li class="point"></li> + </ul> + </div> + `, + styleUrls: ['password-strength-bar.scss'] +}) +export class PasswordStrengthBarComponent { + colors = ['#F00', '#F90', '#FF0', '#9F0', '#0F0']; + + constructor(private renderer: Renderer2, private elementRef: ElementRef) {} + + measureStrength(p: string): number { + let force = 0; + const regex = /[$-/:-?{-~!"^_`[\]]/g; // " + const lowerLetters = /[a-z]+/.test(p); + const upperLetters = /[A-Z]+/.test(p); + const numbers = /[0-9]+/.test(p); + const symbols = regex.test(p); + + const flags = [lowerLetters, upperLetters, numbers, symbols]; + const passedMatches = flags.filter((isMatchedFlag: boolean) => { + return isMatchedFlag === true; + }).length; + + force += 2 * p.length + (p.length >= 10 ? 1 : 0); + force += passedMatches * 10; + + // penalty (short password) + force = p.length <= 6 ? Math.min(force, 10) : force; + + // penalty (poor variety of characters) + force = passedMatches === 1 ? Math.min(force, 10) : force; + force = passedMatches === 2 ? Math.min(force, 20) : force; + force = passedMatches === 3 ? Math.min(force, 40) : force; + + return force; + } + + getColor(s: number): { idx: number; color: string } { + let idx = 0; + if (s <= 10) { + idx = 0; + } else if (s <= 20) { + idx = 1; + } else if (s <= 30) { + idx = 2; + } else if (s <= 40) { + idx = 3; + } else { + idx = 4; + } + return { idx: idx + 1, color: this.colors[idx] }; + } + + @Input() + set passwordToCheck(password: string) { + if (password) { + const c = this.getColor(this.measureStrength(password)); + const element = this.elementRef.nativeElement; + if (element.className) { + this.renderer.removeClass(element, element.className); + } + const lis = element.getElementsByTagName('li'); + for (let i = 0; i < lis.length; i++) { + if (i < c.idx) { + this.renderer.setStyle(lis[i], 'backgroundColor', c.color); + } else { + this.renderer.setStyle(lis[i], 'backgroundColor', '#DDD'); + } + } + } + } +} diff --git a/borestop/src/main/webapp/app/account/password/password-strength-bar.scss b/borestop/src/main/webapp/app/account/password/password-strength-bar.scss new file mode 100644 index 00000000..67ce4687 --- /dev/null +++ b/borestop/src/main/webapp/app/account/password/password-strength-bar.scss @@ -0,0 +1,23 @@ +/* ========================================================================== +start Password strength bar style +========================================================================== */ +ul#strength { + display: inline; + list-style: none; + margin: 0; + margin-left: 15px; + padding: 0; + vertical-align: 2px; +} + +.point { + background: #ddd; + border-radius: 2px; + display: inline-block; + height: 5px; + margin-right: 1px; + width: 20px; + &:last-child { + margin: 0 !important; + } +} diff --git a/borestop/src/main/webapp/app/account/password/password.component.html b/borestop/src/main/webapp/app/account/password/password.component.html new file mode 100644 index 00000000..020d32f4 --- /dev/null +++ b/borestop/src/main/webapp/app/account/password/password.component.html @@ -0,0 +1,94 @@ +<div> + <div class="row justify-content-center"> + <div class="col-md-8" *ngIf="account$ | async as account"> + <h2 jhiTranslate="password.title" [translateValues]="{ username: account.login }">Password for [<strong>{{ account.login }}</strong>]</h2> + + <div class="alert alert-success" *ngIf="success" jhiTranslate="password.messages.success"> + <strong>Password changed!</strong> + </div> + + <div class="alert alert-danger" *ngIf="error" jhiTranslate="password.messages.error"> + <strong>An error has occurred!</strong> The password could not be changed. + </div> + + <div class="alert alert-danger" *ngIf="doNotMatch" jhiTranslate="global.messages.error.dontmatch"> + The password and its confirmation do not match! + </div> + + <form name="form" role="form" (ngSubmit)="changePassword()" [formGroup]="passwordForm"> + <div class="form-group"> + <label class="form-control-label" for="currentPassword" jhiTranslate="global.form.currentpassword.label">Current password</label> + <input type="password" class="form-control" id="currentPassword" name="currentPassword" + placeholder="{{ 'global.form.currentpassword.placeholder' | translate }}" + formControlName="currentPassword"> + + <div *ngIf="passwordForm.get('currentPassword')!.invalid && (passwordForm.get('currentPassword')!.dirty || passwordForm.get('currentPassword')!.touched)" > + <small class="form-text text-danger" + *ngIf="passwordForm.get('currentPassword')?.errors?.required" + jhiTranslate="global.messages.validate.newpassword.required"> + Your password is required. + </small> + </div> + </div> + + <div class="form-group"> + <label class="form-control-label" for="newPassword" jhiTranslate="global.form.newpassword.label">New password</label> + <input type="password" class="form-control" id="newPassword" name="newPassword" + placeholder="{{ 'global.form.newpassword.placeholder' | translate }}" + formControlName="newPassword"> + + <div *ngIf="passwordForm.get('newPassword')!.invalid && (passwordForm.get('newPassword')!.dirty || passwordForm.get('newPassword')!.touched)"> + <small class="form-text text-danger" + *ngIf="passwordForm.get('newPassword')?.errors?.required" + jhiTranslate="global.messages.validate.newpassword.required"> + Your password is required. + </small> + + <small class="form-text text-danger" + *ngIf="passwordForm.get('newPassword')?.errors?.minlength" + jhiTranslate="global.messages.validate.newpassword.minlength"> + Your password is required to be at least 4 characters. + </small> + + <small class="form-text text-danger" + *ngIf="passwordForm.get('newPassword')?.errors?.maxlength" + jhiTranslate="global.messages.validate.newpassword.maxlength"> + Your password cannot be longer than 50 characters. + </small> + </div> + + <jhi-password-strength-bar [passwordToCheck]="passwordForm.get('newPassword')!.value"></jhi-password-strength-bar> + </div> + + <div class="form-group"> + <label class="form-control-label" for="confirmPassword" jhiTranslate="global.form.confirmpassword.label">New password confirmation</label> + <input type="password" class="form-control" id="confirmPassword" name="confirmPassword" + placeholder="{{ 'global.form.confirmpassword.placeholder' | translate }}" + formControlName="confirmPassword"> + + <div *ngIf="passwordForm.get('confirmPassword')!.invalid && (passwordForm.get('confirmPassword')!.dirty || passwordForm.get('confirmPassword')!.touched)"> + <small class="form-text text-danger" + *ngIf="passwordForm.get('confirmPassword')?.errors?.required" + jhiTranslate="global.messages.validate.confirmpassword.required"> + Your confirmation password is required. + </small> + + <small class="form-text text-danger" + *ngIf="passwordForm.get('confirmPassword')?.errors?.minlength" + jhiTranslate="global.messages.validate.confirmpassword.minlength"> + Your confirmation password is required to be at least 4 characters. + </small> + + <small class="form-text text-danger" + *ngIf="passwordForm.get('confirmPassword')?.errors?.maxlength" + jhiTranslate="global.messages.validate.confirmpassword.maxlength"> + Your confirmation password cannot be longer than 50 characters. + </small> + </div> + </div> + + <button type="submit" [disabled]="passwordForm.invalid" class="btn btn-primary" jhiTranslate="password.form.button">Save</button> + </form> + </div> + </div> +</div> diff --git a/borestop/src/main/webapp/app/account/password/password.component.ts b/borestop/src/main/webapp/app/account/password/password.component.ts new file mode 100644 index 00000000..5ceca303 --- /dev/null +++ b/borestop/src/main/webapp/app/account/password/password.component.ts @@ -0,0 +1,45 @@ +import { Component, OnInit } from '@angular/core'; +import { FormBuilder, Validators } from '@angular/forms'; +import { Observable } from 'rxjs'; + +import { AccountService } from 'app/core/auth/account.service'; +import { Account } from 'app/core/user/account.model'; +import { PasswordService } from './password.service'; + +@Component({ + selector: 'jhi-password', + templateUrl: './password.component.html' +}) +export class PasswordComponent implements OnInit { + doNotMatch = false; + error = false; + success = false; + account$?: Observable<Account | null>; + passwordForm = this.fb.group({ + currentPassword: ['', [Validators.required]], + newPassword: ['', [Validators.required, Validators.minLength(4), Validators.maxLength(50)]], + confirmPassword: ['', [Validators.required, Validators.minLength(4), Validators.maxLength(50)]] + }); + + constructor(private passwordService: PasswordService, private accountService: AccountService, private fb: FormBuilder) {} + + ngOnInit(): void { + this.account$ = this.accountService.identity(); + } + + changePassword(): void { + this.error = false; + this.success = false; + this.doNotMatch = false; + + const newPassword = this.passwordForm.get(['newPassword'])!.value; + if (newPassword !== this.passwordForm.get(['confirmPassword'])!.value) { + this.doNotMatch = true; + } else { + this.passwordService.save(newPassword, this.passwordForm.get(['currentPassword'])!.value).subscribe( + () => (this.success = true), + () => (this.error = true) + ); + } + } +} diff --git a/borestop/src/main/webapp/app/account/password/password.route.ts b/borestop/src/main/webapp/app/account/password/password.route.ts new file mode 100644 index 00000000..ab3b6264 --- /dev/null +++ b/borestop/src/main/webapp/app/account/password/password.route.ts @@ -0,0 +1,15 @@ +import { Route } from '@angular/router'; + +import { UserRouteAccessService } from 'app/core/auth/user-route-access-service'; +import { PasswordComponent } from './password.component'; +import { Authority } from 'app/shared/constants/authority.constants'; + +export const passwordRoute: Route = { + path: 'password', + component: PasswordComponent, + data: { + authorities: [Authority.USER], + pageTitle: 'global.menu.account.password' + }, + canActivate: [UserRouteAccessService] +}; diff --git a/borestop/src/main/webapp/app/account/password/password.service.ts b/borestop/src/main/webapp/app/account/password/password.service.ts new file mode 100644 index 00000000..13017f8c --- /dev/null +++ b/borestop/src/main/webapp/app/account/password/password.service.ts @@ -0,0 +1,14 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +import { SERVER_API_URL } from 'app/app.constants'; + +@Injectable({ providedIn: 'root' }) +export class PasswordService { + constructor(private http: HttpClient) {} + + save(newPassword: string, currentPassword: string): Observable<{}> { + return this.http.post(SERVER_API_URL + 'api/account/change-password', { currentPassword, newPassword }); + } +} diff --git a/borestop/src/main/webapp/app/account/register/register.component.html b/borestop/src/main/webapp/app/account/register/register.component.html new file mode 100644 index 00000000..7f8c8136 --- /dev/null +++ b/borestop/src/main/webapp/app/account/register/register.component.html @@ -0,0 +1,158 @@ +<div> + <div class="row justify-content-center"> + <div class="col-md-8"> + <h1 jhiTranslate="register.title">Registration</h1> + + <div class="alert alert-success" *ngIf="success" jhiTranslate="register.messages.success"> + <strong>Registration saved!</strong> Please check your email for confirmation. + </div> + + <div class="alert alert-danger" *ngIf="error" jhiTranslate="register.messages.error.fail"> + <strong>Registration failed!</strong> Please try again later. + </div> + + <div class="alert alert-danger" *ngIf="errorUserExists" jhiTranslate="register.messages.error.userexists"> + <strong>Login name already registered!</strong> Please choose another one. + </div> + + <div class="alert alert-danger" *ngIf="errorEmailExists" jhiTranslate="register.messages.error.emailexists"> + <strong>Email is already in use!</strong> Please choose another one. + </div> + + <div class="alert alert-danger" *ngIf="doNotMatch" jhiTranslate="global.messages.error.dontmatch"> + The password and its confirmation do not match! + </div> + </div> + </div> + + <div class="row justify-content-center"> + <div class="col-md-8"> + <form name="form" role="form" (ngSubmit)="register()" [formGroup]="registerForm" *ngIf="!success"> + <div class="form-group"> + <label class="form-control-label" for="login" jhiTranslate="global.form.username.label">Username</label> + <input type="text" class="form-control" id="login" name="login" placeholder="{{ 'global.form.username.placeholder' | translate }}" + formControlName="login" #login> + + <div *ngIf="registerForm.get('login')!.invalid && (registerForm.get('login')!.dirty || registerForm.get('login')!.touched)"> + <small class="form-text text-danger" + *ngIf="registerForm.get('login')?.errors?.required" + jhiTranslate="register.messages.validate.login.required"> + Your username is required. + </small> + + <small class="form-text text-danger" + *ngIf="registerForm.get('login')?.errors?.minlength" + jhiTranslate="register.messages.validate.login.minlength"> + Your username is required to be at least 1 character. + </small> + + <small class="form-text text-danger" + *ngIf="registerForm.get('login')?.errors?.maxlength" + jhiTranslate="register.messages.validate.login.maxlength"> + Your username cannot be longer than 50 characters. + </small> + + <small class="form-text text-danger" + *ngIf="registerForm.get('login')?.errors?.pattern" + jhiTranslate="register.messages.validate.login.pattern"> + Your username can only contain letters and digits. + </small> + </div> + </div> + + <div class="form-group"> + <label class="form-control-label" for="email" jhiTranslate="global.form.email.label">Email</label> + <input type="email" class="form-control" id="email" name="email" placeholder="{{ 'global.form.email.placeholder' | translate }}" + formControlName="email"> + + <div *ngIf="registerForm.get('email')!.invalid && (registerForm.get('email')!.dirty || registerForm.get('email')!.touched)"> + <small class="form-text text-danger" + *ngIf="registerForm.get('email')?.errors?.required" + jhiTranslate="global.messages.validate.email.required"> + Your email is required. + </small> + + <small class="form-text text-danger" + *ngIf="registerForm.get('email')?.errors?.invalid" + jhiTranslate="global.messages.validate.email.invalid"> + Your email is invalid. + </small> + + <small class="form-text text-danger" + *ngIf="registerForm.get('email')?.errors?.minlength" + jhiTranslate="global.messages.validate.email.minlength"> + Your email is required to be at least 5 characters. + </small> + + <small class="form-text text-danger" + *ngIf="registerForm.get('email')?.errors?.maxlength" + jhiTranslate="global.messages.validate.email.maxlength"> + Your email cannot be longer than 100 characters. + </small> + </div> + </div> + + <div class="form-group"> + <label class="form-control-label" for="password" jhiTranslate="global.form.newpassword.label">New password</label> + <input type="password" class="form-control" id="password" name="password" placeholder="{{ 'global.form.newpassword.placeholder' | translate }}" + formControlName="password"> + + <div *ngIf="registerForm.get('password')!.invalid && (registerForm.get('password')!.dirty || registerForm.get('password')!.touched)"> + <small class="form-text text-danger" + *ngIf="registerForm.get('password')?.errors?.required" + jhiTranslate="global.messages.validate.newpassword.required"> + Your password is required. + </small> + + <small class="form-text text-danger" + *ngIf="registerForm.get('password')?.errors?.minlength" + jhiTranslate="global.messages.validate.newpassword.minlength"> + Your password is required to be at least 4 characters. + </small> + + <small class="form-text text-danger" + *ngIf="registerForm.get('password')?.errors?.maxlength" + jhiTranslate="global.messages.validate.newpassword.maxlength"> + Your password cannot be longer than 50 characters. + </small> + </div> + + <jhi-password-strength-bar [passwordToCheck]="registerForm.get('password')!.value"></jhi-password-strength-bar> + </div> + + <div class="form-group"> + <label class="form-control-label" for="confirmPassword" jhiTranslate="global.form.confirmpassword.label">New password confirmation</label> + <input type="password" class="form-control" id="confirmPassword" name="confirmPassword" placeholder="{{ 'global.form.confirmpassword.placeholder' | translate }}" + formControlName="confirmPassword"> + + <div *ngIf="registerForm.get('confirmPassword')!.invalid && (registerForm.get('confirmPassword')!.dirty || registerForm.get('confirmPassword')!.touched)"> + <small class="form-text text-danger" + *ngIf="registerForm.get('confirmPassword')?.errors?.required" + jhiTranslate="global.messages.validate.confirmpassword.required"> + Your confirmation password is required. + </small> + + <small class="form-text text-danger" + *ngIf="registerForm.get('confirmPassword')?.errors?.minlength" + jhiTranslate="global.messages.validate.confirmpassword.minlength"> + Your confirmation password is required to be at least 4 characters. + </small> + + <small class="form-text text-danger" + *ngIf="registerForm.get('confirmPassword')?.errors?.maxlength" + jhiTranslate="global.messages.validate.confirmpassword.maxlength"> + Your confirmation password cannot be longer than 50 characters. + </small> + </div> + </div> + + <button type="submit" [disabled]="registerForm.invalid" class="btn btn-primary" jhiTranslate="register.form.button">Register</button> + </form> + + <div class="mt-3 alert alert-warning"> + <span jhiTranslate="global.messages.info.authenticated.prefix">If you want to </span> + <a class="alert-link" (click)="openLogin()" jhiTranslate="global.messages.info.authenticated.link">sign in</a><span jhiTranslate="global.messages.info.authenticated.suffix">, you can try the default accounts:<br/>- Administrator (login="admin" and password="admin") <br/>- User (login="user" and password="user").</span> + </div> + </div> + </div> +</div> diff --git a/borestop/src/main/webapp/app/account/register/register.component.ts b/borestop/src/main/webapp/app/account/register/register.component.ts new file mode 100644 index 00000000..5c54223f --- /dev/null +++ b/borestop/src/main/webapp/app/account/register/register.component.ts @@ -0,0 +1,84 @@ +import { Component, AfterViewInit, ElementRef, ViewChild } from '@angular/core'; +import { HttpErrorResponse } from '@angular/common/http'; +import { FormBuilder, Validators } from '@angular/forms'; +import { JhiLanguageService } from 'ng-jhipster'; + +import { EMAIL_ALREADY_USED_TYPE, LOGIN_ALREADY_USED_TYPE } from 'app/shared/constants/error.constants'; +import { LoginModalService } from 'app/core/login/login-modal.service'; +import { RegisterService } from './register.service'; + +@Component({ + selector: 'jhi-register', + templateUrl: './register.component.html' +}) +export class RegisterComponent implements AfterViewInit { + @ViewChild('login', { static: false }) + login?: ElementRef; + + doNotMatch = false; + error = false; + errorEmailExists = false; + errorUserExists = false; + success = false; + + registerForm = this.fb.group({ + login: [ + '', + [ + Validators.required, + Validators.minLength(1), + Validators.maxLength(50), + Validators.pattern('^[a-zA-Z0-9!$&*+=?^_`{|}~.-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$|^[_.@A-Za-z0-9-]+$') + ] + ], + email: ['', [Validators.required, Validators.minLength(5), Validators.maxLength(254), Validators.email]], + password: ['', [Validators.required, Validators.minLength(4), Validators.maxLength(50)]], + confirmPassword: ['', [Validators.required, Validators.minLength(4), Validators.maxLength(50)]] + }); + + constructor( + private languageService: JhiLanguageService, + private loginModalService: LoginModalService, + private registerService: RegisterService, + private fb: FormBuilder + ) {} + + ngAfterViewInit(): void { + if (this.login) { + this.login.nativeElement.focus(); + } + } + + register(): void { + this.doNotMatch = false; + this.error = false; + this.errorEmailExists = false; + this.errorUserExists = false; + + const password = this.registerForm.get(['password'])!.value; + if (password !== this.registerForm.get(['confirmPassword'])!.value) { + this.doNotMatch = true; + } else { + const login = this.registerForm.get(['login'])!.value; + const email = this.registerForm.get(['email'])!.value; + this.registerService.save({ login, email, password, langKey: this.languageService.getCurrentLanguage() }).subscribe( + () => (this.success = true), + response => this.processError(response) + ); + } + } + + openLogin(): void { + this.loginModalService.open(); + } + + private processError(response: HttpErrorResponse): void { + if (response.status === 400 && response.error.type === LOGIN_ALREADY_USED_TYPE) { + this.errorUserExists = true; + } else if (response.status === 400 && response.error.type === EMAIL_ALREADY_USED_TYPE) { + this.errorEmailExists = true; + } else { + this.error = true; + } + } +} diff --git a/borestop/src/main/webapp/app/account/register/register.route.ts b/borestop/src/main/webapp/app/account/register/register.route.ts new file mode 100644 index 00000000..f4ede9d3 --- /dev/null +++ b/borestop/src/main/webapp/app/account/register/register.route.ts @@ -0,0 +1,12 @@ +import { Route } from '@angular/router'; + +import { RegisterComponent } from './register.component'; + +export const registerRoute: Route = { + path: 'register', + component: RegisterComponent, + data: { + authorities: [], + pageTitle: 'register.title' + } +}; diff --git a/borestop/src/main/webapp/app/account/register/register.service.ts b/borestop/src/main/webapp/app/account/register/register.service.ts new file mode 100644 index 00000000..9a519152 --- /dev/null +++ b/borestop/src/main/webapp/app/account/register/register.service.ts @@ -0,0 +1,15 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +import { SERVER_API_URL } from 'app/app.constants'; +import { IUser } from 'app/core/user/user.model'; + +@Injectable({ providedIn: 'root' }) +export class RegisterService { + constructor(private http: HttpClient) {} + + save(account: IUser): Observable<{}> { + return this.http.post(SERVER_API_URL + 'api/register', account); + } +} diff --git a/borestop/src/main/webapp/app/account/settings/settings.component.html b/borestop/src/main/webapp/app/account/settings/settings.component.html new file mode 100644 index 00000000..e7665a3e --- /dev/null +++ b/borestop/src/main/webapp/app/account/settings/settings.component.html @@ -0,0 +1,108 @@ +<div> + <div class="row justify-content-center"> + <div class="col-md-8"> + <h2 jhiTranslate="settings.title" [translateValues]="{ username: account.login }" *ngIf="account">User settings for [<b>{{ account.login }}</b>]</h2> + + <div class="alert alert-success" *ngIf="success" jhiTranslate="settings.messages.success"> + <strong>Settings saved!</strong> + </div> + + <jhi-alert-error></jhi-alert-error> + + <form name="form" role="form" (ngSubmit)="save()" [formGroup]="settingsForm" *ngIf="account" novalidate> + <div class="form-group"> + <label class="form-control-label" for="firstName" jhiTranslate="settings.form.firstname">First Name</label> + <input type="text" class="form-control" id="firstName" name="firstName" placeholder="{{ 'settings.form.firstname.placeholder' | translate }}" + formControlName="firstName"> + + <div *ngIf="settingsForm.get('firstName')!.invalid && (settingsForm.get('firstName')!.dirty || settingsForm.get('firstName')!.touched)"> + <small class="form-text text-danger" + *ngIf="settingsForm.get('firstName')?.errors?.required" + jhiTranslate="settings.messages.validate.firstname.required"> + Your first name is required. + </small> + + <small class="form-text text-danger" + *ngIf="settingsForm.get('firstName')?.errors?.minlength" + jhiTranslate="settings.messages.validate.firstname.minlength"> + Your first name is required to be at least 1 character. + </small> + + <small class="form-text text-danger" + *ngIf="settingsForm.get('firstName')?.errors?.maxlength" + jhiTranslate="settings.messages.validate.firstname.maxlength"> + Your first name cannot be longer than 50 characters. + </small> + </div> + </div> + + <div class="form-group"> + <label class="form-control-label" for="lastName" jhiTranslate="settings.form.lastname">Last Name</label> + <input type="text" class="form-control" id="lastName" name="lastName" placeholder="{{ 'settings.form.lastname.placeholder' | translate }}" + formControlName="lastName"> + + <div *ngIf="settingsForm.get('lastName')!.invalid && (settingsForm.get('lastName')!.dirty || settingsForm.get('lastName')!.touched)"> + <small class="form-text text-danger" + *ngIf="settingsForm.get('lastName')?.errors?.required" + jhiTranslate="settings.messages.validate.lastname.required"> + Your last name is required. + </small> + + <small class="form-text text-danger" + *ngIf="settingsForm.get('lastName')?.errors?.minlength" + jhiTranslate="settings.messages.validate.lastname.minlength"> + Your last name is required to be at least 1 character. + </small> + + <small class="form-text text-danger" + *ngIf="settingsForm.get('lastName')?.errors?.maxlength" + jhiTranslate="settings.messages.validate.lastname.maxlength"> + Your last name cannot be longer than 50 characters. + </small> + </div> + </div> + + <div class="form-group"> + <label class="form-control-label" for="email" jhiTranslate="global.form.email.label">Email</label> + <input type="email" class="form-control" id="email" name="email" placeholder="{{ 'global.form.email.placeholder' | translate }}" + formControlName="email"> + + <div *ngIf="settingsForm.get('email')!.invalid && (settingsForm.get('email')!.dirty || settingsForm.get('email')!.touched)"> + <small class="form-text text-danger" + *ngIf="settingsForm.get('email')?.errors?.required" + jhiTranslate="global.messages.validate.email.required"> + Your email is required. + </small> + + <small class="form-text text-danger" + *ngIf="settingsForm.get('email')?.errors?.email" + jhiTranslate="global.messages.validate.email.invalid"> + Your email is invalid. + </small> + + <small class="form-text text-danger" + *ngIf="settingsForm.get('email')?.errors?.minlength" + jhiTranslate="global.messages.validate.email.minlength"> + Your email is required to be at least 5 characters. + </small> + + <small class="form-text text-danger" + *ngIf="settingsForm.get('email')?.errors?.maxlength" + jhiTranslate="global.messages.validate.email.maxlength"> + Your email cannot be longer than 100 characters. + </small> + </div> + </div> + + <div class="form-group" *ngIf="languages && languages.length > 0"> + <label for="langKey" jhiTranslate="settings.form.language">Language</label> + <select class="form-control" id="langKey" name="langKey" formControlName="langKey"> + <option *ngFor="let language of languages" [value]="language">{{ language | findLanguageFromKey }}</option> + </select> + </div> + + <button type="submit" [disabled]="settingsForm.invalid" class="btn btn-primary" jhiTranslate="settings.form.button">Save</button> + </form> + </div> + </div> +</div> diff --git a/borestop/src/main/webapp/app/account/settings/settings.component.ts b/borestop/src/main/webapp/app/account/settings/settings.component.ts new file mode 100644 index 00000000..b40197f6 --- /dev/null +++ b/borestop/src/main/webapp/app/account/settings/settings.component.ts @@ -0,0 +1,59 @@ +import { Component, OnInit } from '@angular/core'; +import { FormBuilder, Validators } from '@angular/forms'; +import { JhiLanguageService } from 'ng-jhipster'; + +import { AccountService } from 'app/core/auth/account.service'; +import { Account } from 'app/core/user/account.model'; +import { LANGUAGES } from 'app/core/language/language.constants'; + +@Component({ + selector: 'jhi-settings', + templateUrl: './settings.component.html' +}) +export class SettingsComponent implements OnInit { + account!: Account; + success = false; + languages = LANGUAGES; + settingsForm = this.fb.group({ + firstName: [undefined, [Validators.required, Validators.minLength(1), Validators.maxLength(50)]], + lastName: [undefined, [Validators.required, Validators.minLength(1), Validators.maxLength(50)]], + email: [undefined, [Validators.required, Validators.minLength(5), Validators.maxLength(254), Validators.email]], + langKey: [undefined] + }); + + constructor(private accountService: AccountService, private fb: FormBuilder, private languageService: JhiLanguageService) {} + + ngOnInit(): void { + this.accountService.identity().subscribe(account => { + if (account) { + this.settingsForm.patchValue({ + firstName: account.firstName, + lastName: account.lastName, + email: account.email, + langKey: account.langKey + }); + + this.account = account; + } + }); + } + + save(): void { + this.success = false; + + this.account.firstName = this.settingsForm.get('firstName')!.value; + this.account.lastName = this.settingsForm.get('lastName')!.value; + this.account.email = this.settingsForm.get('email')!.value; + this.account.langKey = this.settingsForm.get('langKey')!.value; + + this.accountService.save(this.account).subscribe(() => { + this.success = true; + + this.accountService.authenticate(this.account); + + if (this.account.langKey !== this.languageService.getCurrentLanguage()) { + this.languageService.changeLanguage(this.account.langKey); + } + }); + } +} diff --git a/borestop/src/main/webapp/app/account/settings/settings.route.ts b/borestop/src/main/webapp/app/account/settings/settings.route.ts new file mode 100644 index 00000000..2deeda95 --- /dev/null +++ b/borestop/src/main/webapp/app/account/settings/settings.route.ts @@ -0,0 +1,15 @@ +import { Route } from '@angular/router'; + +import { UserRouteAccessService } from 'app/core/auth/user-route-access-service'; +import { SettingsComponent } from './settings.component'; +import { Authority } from 'app/shared/constants/authority.constants'; + +export const settingsRoute: Route = { + path: 'settings', + component: SettingsComponent, + data: { + authorities: [Authority.USER], + pageTitle: 'global.menu.account.settings' + }, + canActivate: [UserRouteAccessService] +}; diff --git a/borestop/src/main/webapp/app/admin/admin-routing.module.ts b/borestop/src/main/webapp/app/admin/admin-routing.module.ts new file mode 100644 index 00000000..f10ae684 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/admin-routing.module.ts @@ -0,0 +1,44 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +/* jhipster-needle-add-admin-module-import - JHipster will add admin modules imports here */ + +@NgModule({ + imports: [ + /* jhipster-needle-add-admin-module - JHipster will add admin modules here */ + RouterModule.forChild([ + { + path: 'user-management', + loadChildren: () => import('./user-management/user-management.module').then(m => m.UserManagementModule), + data: { + pageTitle: 'userManagement.home.title' + } + }, + { + path: 'audits', + loadChildren: () => import('./audits/audits.module').then(m => m.AuditsModule) + }, + { + path: 'configuration', + loadChildren: () => import('./configuration/configuration.module').then(m => m.ConfigurationModule) + }, + { + path: 'docs', + loadChildren: () => import('./docs/docs.module').then(m => m.DocsModule) + }, + { + path: 'health', + loadChildren: () => import('./health/health.module').then(m => m.HealthModule) + }, + { + path: 'logs', + loadChildren: () => import('./logs/logs.module').then(m => m.LogsModule) + }, + { + path: 'metrics', + loadChildren: () => import('./metrics/metrics.module').then(m => m.MetricsModule) + } + /* jhipster-needle-add-admin-route - JHipster will add admin routes here */ + ]) + ] +}) +export class AdminRoutingModule {} diff --git a/borestop/src/main/webapp/app/admin/audits/audit-data.model.ts b/borestop/src/main/webapp/app/admin/audits/audit-data.model.ts new file mode 100644 index 00000000..7d5bef46 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/audits/audit-data.model.ts @@ -0,0 +1,3 @@ +export class AuditData { + constructor(public remoteAddress?: string, public sessionId?: string, public message?: string) {} +} diff --git a/borestop/src/main/webapp/app/admin/audits/audit.model.ts b/borestop/src/main/webapp/app/admin/audits/audit.model.ts new file mode 100644 index 00000000..5c641074 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/audits/audit.model.ts @@ -0,0 +1,5 @@ +import { AuditData } from './audit-data.model'; + +export class Audit { + constructor(public data: AuditData, public principal: string, public timestamp: string, public type: string) {} +} diff --git a/borestop/src/main/webapp/app/admin/audits/audits.component.html b/borestop/src/main/webapp/app/admin/audits/audits.component.html new file mode 100644 index 00000000..48842223 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/audits/audits.component.html @@ -0,0 +1,67 @@ +<div> + <h2 id="audits-page-heading" jhiTranslate="audits.title">Audits</h2> + + <jhi-alert-error></jhi-alert-error> + + <div class="row"> + <div class="col-md-5"> + <h4 jhiTranslate="audits.filter.title">Filter by date</h4> + + <div class="input-group mb-3"> + <div class="input-group-prepend"> + <span class="input-group-text" jhiTranslate="audits.filter.from">from</span> + </div> + <input type="date" class="form-control" name="start" [(ngModel)]="fromDate" (ngModelChange)="transition()" required/> + + <div class="input-group-append"> + <span class="input-group-text" jhiTranslate="audits.filter.to">To</span> + </div> + <input type="date" class="form-control" name="end" [(ngModel)]="toDate" (ngModelChange)="transition()" required/> + </div> + </div> + </div> + + <div class="alert alert-warning" *ngIf="audits?.length === 0"> + <span jhiTranslate="audits.notFound">No audit found</span> + </div> + + <div class="table-responsive" *ngIf="audits && audits.length > 0"> + <table class="table table-sm table-striped" aria-describedby="audits-page-heading"> + <thead [ngSwitch]="canLoad()"> + <tr jhiSort [(predicate)]="predicate" [(ascending)]="ascending" [callback]="transition.bind(this)" *ngSwitchCase="true"> + <th scope="col" jhiSortBy="auditEventDate"><span jhiTranslate="audits.table.header.date">Date</span> <fa-icon icon="sort"></fa-icon></th> + <th scope="col" jhiSortBy="principal"><span jhiTranslate="audits.table.header.principal">User</span> <fa-icon icon="sort"></fa-icon></th> + <th scope="col" jhiSortBy="auditEventType"><span jhiTranslate="audits.table.header.status">State</span> <fa-icon icon="sort"></fa-icon></th> + <th scope="col"><span jhiTranslate="audits.table.header.data">Extra data</span></th> + </tr> + <tr *ngSwitchCase="false"> + <th scope="col"><span jhiTranslate="audits.table.header.date">Date</span></th> + <th scope="col"><span jhiTranslate="audits.table.header.principal">User</span></th> + <th scope="col"><span jhiTranslate="audits.table.header.status">State</span></th> + <th scope="col"><span jhiTranslate="audits.table.header.data">Extra data</span></th> + </tr> + </thead> + <tbody> + <tr *ngFor="let audit of audits"> + <td><span>{{ audit.timestamp | date:'medium' }}</span></td> + <td><small>{{ audit.principal }}</small></td> + <td>{{ audit.type }}</td> + <td> + <span *ngIf="audit.data?.message">{{ audit.data.message }}</span> + <span *ngIf="audit.data?.remoteAddress"><span jhiTranslate="audits.table.data.remoteAddress">Remote Address</span> {{ audit.data.remoteAddress }}</span> + </td> + </tr> + </tbody> + </table> + </div> + + <div *ngIf="audits && audits.length > 0"> + <div class="row justify-content-center"> + <jhi-item-count [page]="page" [total]="totalItems" [itemsPerPage]="itemsPerPage"></jhi-item-count> + </div> + + <div class="row justify-content-center"> + <ngb-pagination [collectionSize]="totalItems" [(page)]="page" [pageSize]="itemsPerPage" [maxSize]="5" [rotate]="true" [boundaryLinks]="true" (pageChange)="transition()" [disabled]="!canLoad()"></ngb-pagination> + </div> + </div> +</div> diff --git a/borestop/src/main/webapp/app/admin/audits/audits.component.ts b/borestop/src/main/webapp/app/admin/audits/audits.component.ts new file mode 100644 index 00000000..f9683c18 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/audits/audits.component.ts @@ -0,0 +1,115 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpResponse, HttpHeaders } from '@angular/common/http'; +import { DatePipe } from '@angular/common'; +import { ActivatedRoute, ParamMap, Router, Data } from '@angular/router'; +import { combineLatest } from 'rxjs'; + +import { ITEMS_PER_PAGE } from 'app/shared/constants/pagination.constants'; +import { Audit } from './audit.model'; +import { AuditsService } from './audits.service'; + +@Component({ + selector: 'jhi-audit', + templateUrl: './audits.component.html' +}) +export class AuditsComponent implements OnInit { + audits?: Audit[]; + fromDate = ''; + itemsPerPage = ITEMS_PER_PAGE; + page!: number; + predicate!: string; + ascending!: boolean; + toDate = ''; + totalItems = 0; + + private dateFormat = 'yyyy-MM-dd'; + + constructor( + private auditsService: AuditsService, + private activatedRoute: ActivatedRoute, + private datePipe: DatePipe, + private router: Router + ) {} + + ngOnInit(): void { + this.toDate = this.today(); + this.fromDate = this.previousMonth(); + this.handleNavigation(); + } + + canLoad(): boolean { + return this.fromDate !== '' && this.toDate !== ''; + } + + transition(): void { + if (this.canLoad()) { + this.router.navigate(['/admin/audits'], { + queryParams: { + page: this.page, + sort: this.predicate + ',' + (this.ascending ? 'asc' : 'desc'), + from: this.fromDate, + to: this.toDate + } + }); + } + } + + private previousMonth(): string { + let date = new Date(); + if (date.getMonth() === 0) { + date = new Date(date.getFullYear() - 1, 11, date.getDate()); + } else { + date = new Date(date.getFullYear(), date.getMonth() - 1, date.getDate()); + } + return this.datePipe.transform(date, this.dateFormat)!; + } + + private today(): string { + // Today + 1 day - needed if the current day must be included + const date = new Date(); + date.setDate(date.getDate() + 1); + return this.datePipe.transform(date, this.dateFormat)!; + } + + private handleNavigation(): void { + combineLatest(this.activatedRoute.data, this.activatedRoute.queryParamMap, (data: Data, params: ParamMap) => { + const page = params.get('page'); + this.page = page !== null ? +page : 1; + const sort = (params.get('sort') ?? data['defaultSort']).split(','); + this.predicate = sort[0]; + this.ascending = sort[1] === 'asc'; + if (params.get('from')) { + this.fromDate = this.datePipe.transform(params.get('from'), this.dateFormat)!; + } + if (params.get('to')) { + this.toDate = this.datePipe.transform(params.get('to'), this.dateFormat)!; + } + this.loadData(); + }).subscribe(); + } + + private loadData(): void { + this.auditsService + .query({ + page: this.page - 1, + size: this.itemsPerPage, + sort: this.sort(), + fromDate: this.fromDate, + toDate: this.toDate + }) + .subscribe((res: HttpResponse<Audit[]>) => this.onSuccess(res.body, res.headers)); + } + + private sort(): string[] { + const result = [this.predicate + ',' + (this.ascending ? 'asc' : 'desc')]; + if (this.predicate !== 'id') { + result.push('id'); + } + return result; + } + + private onSuccess(audits: Audit[] | null, headers: HttpHeaders): void { + this.totalItems = Number(headers.get('X-Total-Count')); + this.audits = audits || []; + } +} diff --git a/borestop/src/main/webapp/app/admin/audits/audits.module.ts b/borestop/src/main/webapp/app/admin/audits/audits.module.ts new file mode 100644 index 00000000..15d1fbe6 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/audits/audits.module.ts @@ -0,0 +1,13 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { BorestopSharedModule } from 'app/shared/shared.module'; + +import { AuditsComponent } from './audits.component'; + +import { auditsRoute } from './audits.route'; + +@NgModule({ + imports: [BorestopSharedModule, RouterModule.forChild([auditsRoute])], + declarations: [AuditsComponent] +}) +export class AuditsModule {} diff --git a/borestop/src/main/webapp/app/admin/audits/audits.route.ts b/borestop/src/main/webapp/app/admin/audits/audits.route.ts new file mode 100644 index 00000000..14e86977 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/audits/audits.route.ts @@ -0,0 +1,12 @@ +import { Route } from '@angular/router'; + +import { AuditsComponent } from './audits.component'; + +export const auditsRoute: Route = { + path: '', + component: AuditsComponent, + data: { + pageTitle: 'audits.title', + defaultSort: 'auditEventDate,desc' + } +}; diff --git a/borestop/src/main/webapp/app/admin/audits/audits.service.ts b/borestop/src/main/webapp/app/admin/audits/audits.service.ts new file mode 100644 index 00000000..d86bf47b --- /dev/null +++ b/borestop/src/main/webapp/app/admin/audits/audits.service.ts @@ -0,0 +1,28 @@ +import { Injectable } from '@angular/core'; +import { HttpClient, HttpParams, HttpResponse } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +import { createRequestOption, Pagination } from 'app/shared/util/request-util'; +import { SERVER_API_URL } from 'app/app.constants'; +import { Audit } from './audit.model'; + +export interface AuditsQuery extends Pagination { + fromDate: string; + toDate: string; +} + +@Injectable({ providedIn: 'root' }) +export class AuditsService { + constructor(private http: HttpClient) {} + + query(req: AuditsQuery): Observable<HttpResponse<Audit[]>> { + const params: HttpParams = createRequestOption(req); + + const requestURL = SERVER_API_URL + 'management/audits'; + + return this.http.get<Audit[]>(requestURL, { + params, + observe: 'response' + }); + } +} diff --git a/borestop/src/main/webapp/app/admin/configuration/configuration.component.html b/borestop/src/main/webapp/app/admin/configuration/configuration.component.html new file mode 100644 index 00000000..1002f7a0 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/configuration/configuration.component.html @@ -0,0 +1,50 @@ +<div *ngIf="allBeans"> + <h2 id="configuration-page-heading" jhiTranslate="configuration.title">Configuration</h2> + + <span jhiTranslate="configuration.filter">Filter (by prefix)</span> <input type="text" [(ngModel)]="beansFilter" (ngModelChange)="filterAndSortBeans()" class="form-control"> + + <h3 id="spring-configuration">Spring configuration</h3> + + <table class="table table-striped table-bordered table-responsive d-table" aria-describedby="spring-configuration"> + <thead> + <tr jhiSort predicate="prefix" [(ascending)]="beansAscending" [callback]="filterAndSortBeans.bind(this)"> + <th jhiSortBy="prefix" scope="col" class="w-40"><span jhiTranslate="configuration.table.prefix">Prefix</span> <fa-icon icon="sort"></fa-icon></th> + <th scope="col" class="w-60"><span jhiTranslate="configuration.table.properties">Properties</span></th> + </tr> + </thead> + <tbody> + <tr *ngFor="let bean of beans"> + <td><span>{{ bean.prefix }}</span></td> + <td> + <div class="row" *ngFor="let property of bean.properties | keys"> + <div class="col-md-4">{{ property.key }}</div> + <div class="col-md-8"> + <span class="float-right badge-secondary break">{{ property.value | json }}</span> + </div> + </div> + </td> + </tr> + </tbody> + </table> + + <div *ngFor="let propertySource of propertySources; let i = index"> + <h4 [id]="'property-source-' + i"><span>{{ propertySource.name }}</span></h4> + + <table class="table table-sm table-striped table-bordered table-responsive d-table" [attr.aria-describedby]="'property-source-' + i"><!-- //NOSONAR --> + <thead> + <tr> + <th scope="col" class="w-40">Property</th> + <th scope="col" class="w-60">Value</th> + </tr> + </thead> + <tbody> + <tr *ngFor="let property of propertySource.properties | keys"> + <td class="break">{{ property.key }}</td> + <td class="break"> + <span class="float-right badge-secondary break">{{ property.value.value }}</span> + </td> + </tr> + </tbody> + </table> + </div> +</div> diff --git a/borestop/src/main/webapp/app/admin/configuration/configuration.component.ts b/borestop/src/main/webapp/app/admin/configuration/configuration.component.ts new file mode 100644 index 00000000..679e71ab --- /dev/null +++ b/borestop/src/main/webapp/app/admin/configuration/configuration.component.ts @@ -0,0 +1,32 @@ +import { Component, OnInit } from '@angular/core'; + +import { ConfigurationService, Bean, PropertySource } from './configuration.service'; + +@Component({ + selector: 'jhi-configuration', + templateUrl: './configuration.component.html' +}) +export class ConfigurationComponent implements OnInit { + allBeans!: Bean[]; + beans: Bean[] = []; + beansFilter = ''; + beansAscending = true; + propertySources: PropertySource[] = []; + + constructor(private configurationService: ConfigurationService) {} + + ngOnInit(): void { + this.configurationService.getBeans().subscribe(beans => { + this.allBeans = beans; + this.filterAndSortBeans(); + }); + + this.configurationService.getPropertySources().subscribe(propertySources => (this.propertySources = propertySources)); + } + + filterAndSortBeans(): void { + this.beans = this.allBeans + .filter(bean => !this.beansFilter || bean.prefix.toLowerCase().includes(this.beansFilter.toLowerCase())) + .sort((a, b) => (a.prefix < b.prefix ? (this.beansAscending ? -1 : 1) : this.beansAscending ? 1 : -1)); + } +} diff --git a/borestop/src/main/webapp/app/admin/configuration/configuration.module.ts b/borestop/src/main/webapp/app/admin/configuration/configuration.module.ts new file mode 100644 index 00000000..ab8f02c8 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/configuration/configuration.module.ts @@ -0,0 +1,13 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { BorestopSharedModule } from 'app/shared/shared.module'; + +import { ConfigurationComponent } from './configuration.component'; + +import { configurationRoute } from './configuration.route'; + +@NgModule({ + imports: [BorestopSharedModule, RouterModule.forChild([configurationRoute])], + declarations: [ConfigurationComponent] +}) +export class ConfigurationModule {} diff --git a/borestop/src/main/webapp/app/admin/configuration/configuration.route.ts b/borestop/src/main/webapp/app/admin/configuration/configuration.route.ts new file mode 100644 index 00000000..17238c93 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/configuration/configuration.route.ts @@ -0,0 +1,11 @@ +import { Route } from '@angular/router'; + +import { ConfigurationComponent } from './configuration.component'; + +export const configurationRoute: Route = { + path: '', + component: ConfigurationComponent, + data: { + pageTitle: 'configuration.title' + } +}; diff --git a/borestop/src/main/webapp/app/admin/configuration/configuration.service.ts b/borestop/src/main/webapp/app/admin/configuration/configuration.service.ts new file mode 100644 index 00000000..69ea43a0 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/configuration/configuration.service.ts @@ -0,0 +1,68 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; + +import { SERVER_API_URL } from 'app/app.constants'; + +export interface ConfigProps { + contexts: Contexts; +} + +export interface Contexts { + [key: string]: Context; +} + +export interface Context { + beans: Beans; + parentId?: any; +} + +export interface Beans { + [key: string]: Bean; +} + +export interface Bean { + prefix: string; + properties: any; +} + +export interface Env { + activeProfiles?: string[]; + propertySources: PropertySource[]; +} + +export interface PropertySource { + name: string; + properties: Properties; +} + +export interface Properties { + [key: string]: Property; +} + +export interface Property { + value: string; + origin?: string; +} + +@Injectable({ providedIn: 'root' }) +export class ConfigurationService { + constructor(private http: HttpClient) {} + + getBeans(): Observable<Bean[]> { + return this.http.get<ConfigProps>(SERVER_API_URL + 'management/configprops').pipe( + map(configProps => + Object.values( + Object.values(configProps.contexts) + .map(context => context.beans) + .reduce((allBeans: Beans, contextBeans: Beans) => ({ ...allBeans, ...contextBeans })) + ) + ) + ); + } + + getPropertySources(): Observable<PropertySource[]> { + return this.http.get<Env>(SERVER_API_URL + 'management/env').pipe(map(env => env.propertySources)); + } +} diff --git a/borestop/src/main/webapp/app/admin/docs/docs.component.html b/borestop/src/main/webapp/app/admin/docs/docs.component.html new file mode 100644 index 00000000..9d1600b8 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/docs/docs.component.html @@ -0,0 +1,2 @@ +<iframe src="swagger-ui/index.html" width="100%" height="900" seamless + target="_top" title="Swagger UI" class="border-0"></iframe> diff --git a/borestop/src/main/webapp/app/admin/docs/docs.component.ts b/borestop/src/main/webapp/app/admin/docs/docs.component.ts new file mode 100644 index 00000000..8942f1a4 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/docs/docs.component.ts @@ -0,0 +1,8 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'jhi-docs', + templateUrl: './docs.component.html', + styleUrls: ['docs.scss'] +}) +export class DocsComponent {} diff --git a/borestop/src/main/webapp/app/admin/docs/docs.module.ts b/borestop/src/main/webapp/app/admin/docs/docs.module.ts new file mode 100644 index 00000000..0ddab0ba --- /dev/null +++ b/borestop/src/main/webapp/app/admin/docs/docs.module.ts @@ -0,0 +1,13 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { BorestopSharedModule } from 'app/shared/shared.module'; + +import { DocsComponent } from './docs.component'; + +import { docsRoute } from './docs.route'; + +@NgModule({ + imports: [BorestopSharedModule, RouterModule.forChild([docsRoute])], + declarations: [DocsComponent] +}) +export class DocsModule {} diff --git a/borestop/src/main/webapp/app/admin/docs/docs.route.ts b/borestop/src/main/webapp/app/admin/docs/docs.route.ts new file mode 100644 index 00000000..b2aead9d --- /dev/null +++ b/borestop/src/main/webapp/app/admin/docs/docs.route.ts @@ -0,0 +1,11 @@ +import { Route } from '@angular/router'; + +import { DocsComponent } from './docs.component'; + +export const docsRoute: Route = { + path: '', + component: DocsComponent, + data: { + pageTitle: 'global.menu.admin.apidocs' + } +}; diff --git a/borestop/src/main/webapp/app/admin/docs/docs.scss b/borestop/src/main/webapp/app/admin/docs/docs.scss new file mode 100644 index 00000000..541c3d79 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/docs/docs.scss @@ -0,0 +1,6 @@ +@import '~bootstrap/scss/functions'; +@import '~bootstrap/scss/variables'; + +iframe { + background: white; +} diff --git a/borestop/src/main/webapp/app/admin/health/health-modal.component.html b/borestop/src/main/webapp/app/admin/health/health-modal.component.html new file mode 100644 index 00000000..5556f47d --- /dev/null +++ b/borestop/src/main/webapp/app/admin/health/health-modal.component.html @@ -0,0 +1,36 @@ +<div class="modal-header"> + <h4 class="modal-title" id="showHealthLabel" *ngIf="health"> + {{ 'health.indicator.' + health.key | translate }} + </h4> + + <button aria-label="Close" data-dismiss="modal" class="close" type="button" (click)="dismiss()"> + <span aria-hidden="true">×</span> + </button> +</div> + +<div class="modal-body pad"> + <div *ngIf="health"> + <h5 jhiTranslate="health.details.properties">Properties</h5> + + <div class="table-responsive"> + <table class="table table-striped" aria-describedby="showHealthLabel"> + <thead> + <tr> + <th scope="col" class="text-left" jhiTranslate="health.details.name">Name</th> + <th scope="col" class="text-left" jhiTranslate="health.details.value">Value</th> + </tr> + </thead> + <tbody> + <tr *ngFor="let healthDetail of health.value.details | keys"> + <td class="text-left">{{ healthDetail.key }}</td> + <td class="text-left">{{ readableValue(healthDetail.value) }}</td> + </tr> + </tbody> + </table> + </div> + </div> +</div> + +<div class="modal-footer"> + <button data-dismiss="modal" class="btn btn-secondary float-left" type="button" (click)="dismiss()">Done</button> +</div> diff --git a/borestop/src/main/webapp/app/admin/health/health-modal.component.ts b/borestop/src/main/webapp/app/admin/health/health-modal.component.ts new file mode 100644 index 00000000..54f360f9 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/health/health-modal.component.ts @@ -0,0 +1,37 @@ +import { Component } from '@angular/core'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +import { HealthKey, HealthDetails } from './health.service'; + +@Component({ + selector: 'jhi-health-modal', + templateUrl: './health-modal.component.html' +}) +export class HealthModalComponent { + health?: { key: HealthKey; value: HealthDetails }; + + constructor(public activeModal: NgbActiveModal) {} + + readableValue(value: any): string { + if (this.health && this.health.key === 'diskSpace') { + // Should display storage space in an human readable unit + const val = value / 1073741824; + if (val > 1) { + // Value + return val.toFixed(2) + ' GB'; + } else { + return (value / 1048576).toFixed(2) + ' MB'; + } + } + + if (typeof value === 'object') { + return JSON.stringify(value); + } else { + return value.toString(); + } + } + + dismiss(): void { + this.activeModal.dismiss(); + } +} diff --git a/borestop/src/main/webapp/app/admin/health/health.component.html b/borestop/src/main/webapp/app/admin/health/health.component.html new file mode 100644 index 00000000..b686fcbb --- /dev/null +++ b/borestop/src/main/webapp/app/admin/health/health.component.html @@ -0,0 +1,38 @@ +<div> + <h2> + <span id="health-page-heading" jhiTranslate="health.title">Health Checks</span> + + <button class="btn btn-primary float-right" (click)="refresh()"> + <fa-icon icon="sync"></fa-icon> <span jhiTranslate="health.refresh.button">Refresh</span> + </button> + </h2> + + <div class="table-responsive"> + <table id="healthCheck" class="table table-striped" aria-describedby="health-page-heading"> + <thead> + <tr> + <th scope="col" jhiTranslate="health.table.service">Service Name</th> + <th scope="col" class="text-center" jhiTranslate="health.table.status">Status</th> + <th scope="col" class="text-center" jhiTranslate="health.details.details">Details</th> + </tr> + </thead> + <tbody *ngIf="health"> + <tr *ngFor="let componentHealth of health.components | keys"> + <td> + {{ 'health.indicator.' + componentHealth.key | translate }} + </td> + <td class="text-center"> + <span class="badge" [ngClass]="getBadgeClass(componentHealth.value.status)" jhiTranslate="{{ 'health.status.' + componentHealth.value.status }}"> + {{ componentHealth.value.status }} + </span> + </td> + <td class="text-center"> + <a class="hand" (click)="showHealth(componentHealth)" *ngIf="componentHealth.value.details"> + <fa-icon icon="eye"></fa-icon> + </a> + </td> + </tr> + </tbody> + </table> + </div> +</div> diff --git a/borestop/src/main/webapp/app/admin/health/health.component.ts b/borestop/src/main/webapp/app/admin/health/health.component.ts new file mode 100644 index 00000000..d33b6322 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/health/health.component.ts @@ -0,0 +1,44 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpErrorResponse } from '@angular/common/http'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; + +import { HealthService, HealthStatus, Health, HealthKey, HealthDetails } from './health.service'; +import { HealthModalComponent } from './health-modal.component'; + +@Component({ + selector: 'jhi-health', + templateUrl: './health.component.html' +}) +export class HealthComponent implements OnInit { + health?: Health; + + constructor(private modalService: NgbModal, private healthService: HealthService) {} + + ngOnInit(): void { + this.refresh(); + } + + getBadgeClass(statusState: HealthStatus): string { + if (statusState === 'UP') { + return 'badge-success'; + } else { + return 'badge-danger'; + } + } + + refresh(): void { + this.healthService.checkHealth().subscribe( + health => (this.health = health), + (error: HttpErrorResponse) => { + if (error.status === 503) { + this.health = error.error; + } + } + ); + } + + showHealth(health: { key: HealthKey; value: HealthDetails }): void { + const modalRef = this.modalService.open(HealthModalComponent); + modalRef.componentInstance.health = health; + } +} diff --git a/borestop/src/main/webapp/app/admin/health/health.module.ts b/borestop/src/main/webapp/app/admin/health/health.module.ts new file mode 100644 index 00000000..24fdd6b3 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/health/health.module.ts @@ -0,0 +1,15 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { BorestopSharedModule } from 'app/shared/shared.module'; + +import { HealthComponent } from './health.component'; +import { HealthModalComponent } from './health-modal.component'; + +import { healthRoute } from './health.route'; + +@NgModule({ + imports: [BorestopSharedModule, RouterModule.forChild([healthRoute])], + declarations: [HealthComponent, HealthModalComponent], + entryComponents: [HealthModalComponent] +}) +export class HealthModule {} diff --git a/borestop/src/main/webapp/app/admin/health/health.route.ts b/borestop/src/main/webapp/app/admin/health/health.route.ts new file mode 100644 index 00000000..1055dcc0 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/health/health.route.ts @@ -0,0 +1,11 @@ +import { Route } from '@angular/router'; + +import { HealthComponent } from './health.component'; + +export const healthRoute: Route = { + path: '', + component: HealthComponent, + data: { + pageTitle: 'health.title' + } +}; diff --git a/borestop/src/main/webapp/app/admin/health/health.service.ts b/borestop/src/main/webapp/app/admin/health/health.service.ts new file mode 100644 index 00000000..25005f64 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/health/health.service.ts @@ -0,0 +1,30 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +import { SERVER_API_URL } from 'app/app.constants'; + +export type HealthStatus = 'UP' | 'DOWN' | 'UNKNOWN' | 'OUT_OF_SERVICE'; + +export type HealthKey = 'diskSpace' | 'mail' | 'ping' | 'db'; + +export interface Health { + status: HealthStatus; + components: { + [key in HealthKey]?: HealthDetails; + }; +} + +export interface HealthDetails { + status: HealthStatus; + details: any; +} + +@Injectable({ providedIn: 'root' }) +export class HealthService { + constructor(private http: HttpClient) {} + + checkHealth(): Observable<Health> { + return this.http.get<Health>(SERVER_API_URL + 'management/health'); + } +} diff --git a/borestop/src/main/webapp/app/admin/logs/log.model.ts b/borestop/src/main/webapp/app/admin/logs/log.model.ts new file mode 100644 index 00000000..83f2e154 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/logs/log.model.ts @@ -0,0 +1,15 @@ +export type Level = 'TRACE' | 'DEBUG' | 'INFO' | 'WARN' | 'ERROR' | 'OFF'; + +export interface Logger { + configuredLevel: Level | null; + effectiveLevel: Level; +} + +export interface LoggersResponse { + levels: Level[]; + loggers: { [key: string]: Logger }; +} + +export class Log { + constructor(public name: string, public level: Level) {} +} diff --git a/borestop/src/main/webapp/app/admin/logs/logs.component.html b/borestop/src/main/webapp/app/admin/logs/logs.component.html new file mode 100644 index 00000000..b0473e3a --- /dev/null +++ b/borestop/src/main/webapp/app/admin/logs/logs.component.html @@ -0,0 +1,28 @@ +<div class="table-responsive" *ngIf="loggers"> + <h2 id="logs-page-heading" jhiTranslate="logs.title">Logs</h2> + + <p jhiTranslate="logs.nbloggers" [translateValues]="{ total: loggers.length }">There are {{ loggers.length }} loggers.</p> + + <span jhiTranslate="logs.filter">Filter</span> <input type="text" [(ngModel)]="filter" class="form-control"> + + <table class="table table-sm table-striped table-bordered" aria-describedby="logs-page-heading"> + <thead> + <tr title="click to order"> + <th scope="col" (click)="orderProp = 'name'; reverse=!reverse"><span jhiTranslate="logs.table.name">Name</span></th> + <th scope="col" (click)="orderProp = 'level'; reverse=!reverse"><span jhiTranslate="logs.table.level">Level</span></th> + </tr> + </thead> + + <tr *ngFor="let logger of (loggers | pureFilter:filter:'name' | orderBy:orderProp:reverse)"> + <td><small>{{ logger.name | slice:0:140 }}</small></td> + <td> + <button (click)="changeLevel(logger.name, 'TRACE')" [ngClass]="(logger.level=='TRACE') ? 'btn-primary' : 'btn-light'" class="btn btn-sm">TRACE</button> + <button (click)="changeLevel(logger.name, 'DEBUG')" [ngClass]="(logger.level=='DEBUG') ? 'btn-success' : 'btn-light'" class="btn btn-sm">DEBUG</button> + <button (click)="changeLevel(logger.name, 'INFO')" [ngClass]="(logger.level=='INFO') ? 'btn-info' : 'btn-light'" class="btn btn-sm">INFO</button> + <button (click)="changeLevel(logger.name, 'WARN')" [ngClass]="(logger.level=='WARN') ? 'btn-warning' : 'btn-light'" class="btn btn-sm">WARN</button> + <button (click)="changeLevel(logger.name, 'ERROR')" [ngClass]="(logger.level=='ERROR') ? 'btn-danger' : 'btn-light'" class="btn btn-sm">ERROR</button> + <button (click)="changeLevel(logger.name, 'OFF')" [ngClass]="(logger.level=='OFF') ? 'btn-secondary' : 'btn-light'" class="btn btn-sm">OFF</button> + </td> + </tr> + </table> +</div> diff --git a/borestop/src/main/webapp/app/admin/logs/logs.component.ts b/borestop/src/main/webapp/app/admin/logs/logs.component.ts new file mode 100644 index 00000000..13b7102c --- /dev/null +++ b/borestop/src/main/webapp/app/admin/logs/logs.component.ts @@ -0,0 +1,34 @@ +import { Component, OnInit } from '@angular/core'; + +import { Log, LoggersResponse, Logger, Level } from './log.model'; +import { LogsService } from './logs.service'; + +@Component({ + selector: 'jhi-logs', + templateUrl: './logs.component.html' +}) +export class LogsComponent implements OnInit { + loggers?: Log[]; + filter = ''; + orderProp = 'name'; + reverse = false; + + constructor(private logsService: LogsService) {} + + ngOnInit(): void { + this.findAndExtractLoggers(); + } + + changeLevel(name: string, level: Level): void { + this.logsService.changeLevel(name, level).subscribe(() => this.findAndExtractLoggers()); + } + + private findAndExtractLoggers(): void { + this.logsService + .findAll() + .subscribe( + (response: LoggersResponse) => + (this.loggers = Object.entries(response.loggers).map((logger: [string, Logger]) => new Log(logger[0], logger[1].effectiveLevel))) + ); + } +} diff --git a/borestop/src/main/webapp/app/admin/logs/logs.module.ts b/borestop/src/main/webapp/app/admin/logs/logs.module.ts new file mode 100644 index 00000000..ba914e10 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/logs/logs.module.ts @@ -0,0 +1,13 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { BorestopSharedModule } from 'app/shared/shared.module'; + +import { LogsComponent } from './logs.component'; + +import { logsRoute } from './logs.route'; + +@NgModule({ + imports: [BorestopSharedModule, RouterModule.forChild([logsRoute])], + declarations: [LogsComponent] +}) +export class LogsModule {} diff --git a/borestop/src/main/webapp/app/admin/logs/logs.route.ts b/borestop/src/main/webapp/app/admin/logs/logs.route.ts new file mode 100644 index 00000000..d1cf0241 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/logs/logs.route.ts @@ -0,0 +1,11 @@ +import { Route } from '@angular/router'; + +import { LogsComponent } from './logs.component'; + +export const logsRoute: Route = { + path: '', + component: LogsComponent, + data: { + pageTitle: 'logs.title' + } +}; diff --git a/borestop/src/main/webapp/app/admin/logs/logs.service.ts b/borestop/src/main/webapp/app/admin/logs/logs.service.ts new file mode 100644 index 00000000..dc9956de --- /dev/null +++ b/borestop/src/main/webapp/app/admin/logs/logs.service.ts @@ -0,0 +1,19 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +import { SERVER_API_URL } from 'app/app.constants'; +import { LoggersResponse, Level } from './log.model'; + +@Injectable({ providedIn: 'root' }) +export class LogsService { + constructor(private http: HttpClient) {} + + changeLevel(name: string, configuredLevel: Level): Observable<{}> { + return this.http.post(SERVER_API_URL + 'management/loggers/' + name, { configuredLevel }); + } + + findAll(): Observable<LoggersResponse> { + return this.http.get<LoggersResponse>(SERVER_API_URL + 'management/loggers'); + } +} diff --git a/borestop/src/main/webapp/app/admin/metrics/metrics.component.html b/borestop/src/main/webapp/app/admin/metrics/metrics.component.html new file mode 100644 index 00000000..731a7a9e --- /dev/null +++ b/borestop/src/main/webapp/app/admin/metrics/metrics.component.html @@ -0,0 +1,65 @@ +<div> + <h2> + <span id="metrics-page-heading" jhiTranslate="metrics.title">Application Metrics</span> + + <button class="btn btn-primary float-right" (click)="refresh()"> + <fa-icon icon="sync"></fa-icon> <span jhiTranslate="metrics.refresh.button">Refresh</span> + </button> + </h2> + + <h3 jhiTranslate="metrics.jvm.title">JVM Metrics</h3> + + <div class="row" *ngIf="metrics && !updatingMetrics"> + <jhi-jvm-memory + class="col-md-4" + [updating]="updatingMetrics" + [jvmMemoryMetrics]="metrics.jvm"> + </jhi-jvm-memory> + + <jhi-jvm-threads + class="col-md-4" + [threadData]="threads"> + </jhi-jvm-threads> + + <jhi-metrics-system + class="col-md-4" + [updating]="updatingMetrics" + [systemMetrics]="metrics.processMetrics"> + </jhi-metrics-system> + </div> + + <div *ngIf="metrics && metricsKeyExists('garbageCollector')"> + <h3 jhiTranslate="metrics.jvm.gc.title">Garbage collector statistics</h3> + + <jhi-metrics-garbagecollector + [updating]="updatingMetrics" + [garbageCollectorMetrics]="metrics.garbageCollector"> + </jhi-metrics-garbagecollector> + </div> + + <div class="well well-lg" *ngIf="updatingMetrics" jhiTranslate="metrics.updating">Updating...</div> + + <jhi-metrics-request + *ngIf="metrics && metricsKeyExists('http.server.requests')" + [updating]="updatingMetrics" + [requestMetrics]="metrics['http.server.requests']"> + </jhi-metrics-request> + + <jhi-metrics-endpoints-requests + *ngIf="metrics && metricsKeyExists('services')" + [updating]="updatingMetrics" + [endpointsRequestsMetrics]="metrics.services"> + </jhi-metrics-endpoints-requests> + + <jhi-metrics-cache + *ngIf="metrics && metricsKeyExists('cache')" + [updating]="updatingMetrics" + [cacheMetrics]="metrics.cache"> + </jhi-metrics-cache> + + <jhi-metrics-datasource + *ngIf="metrics && metricsKeyExistsAndObjectNotEmpty('databases')" + [updating]="updatingMetrics" + [datasourceMetrics]="metrics.databases"> + </jhi-metrics-datasource> +</div> diff --git a/borestop/src/main/webapp/app/admin/metrics/metrics.component.ts b/borestop/src/main/webapp/app/admin/metrics/metrics.component.ts new file mode 100644 index 00000000..130e65d6 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/metrics/metrics.component.ts @@ -0,0 +1,47 @@ +import { Component, OnInit, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core'; +import { flatMap } from 'rxjs/operators'; + +import { MetricsService, Metrics, MetricsKey, ThreadDump, Thread } from './metrics.service'; + +@Component({ + selector: 'jhi-metrics', + templateUrl: './metrics.component.html', + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class MetricsComponent implements OnInit { + metrics?: Metrics; + threads?: Thread[]; + updatingMetrics = true; + + constructor(private metricsService: MetricsService, private changeDetector: ChangeDetectorRef) {} + + ngOnInit(): void { + this.refresh(); + } + + refresh(): void { + this.updatingMetrics = true; + this.metricsService + .getMetrics() + .pipe( + flatMap( + () => this.metricsService.threadDump(), + (metrics: Metrics, threadDump: ThreadDump) => { + this.metrics = metrics; + this.threads = threadDump.threads; + this.updatingMetrics = false; + this.changeDetector.detectChanges(); + } + ) + ) + .subscribe(); + } + + metricsKeyExists(key: MetricsKey): boolean { + return this.metrics && this.metrics[key]; + } + + metricsKeyExistsAndObjectNotEmpty(key: MetricsKey): boolean { + return this.metrics && this.metrics[key] && JSON.stringify(this.metrics[key]) !== '{}'; + } +} diff --git a/borestop/src/main/webapp/app/admin/metrics/metrics.module.ts b/borestop/src/main/webapp/app/admin/metrics/metrics.module.ts new file mode 100644 index 00000000..9cf7be4c --- /dev/null +++ b/borestop/src/main/webapp/app/admin/metrics/metrics.module.ts @@ -0,0 +1,13 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { BorestopSharedModule } from 'app/shared/shared.module'; + +import { MetricsComponent } from './metrics.component'; + +import { metricsRoute } from './metrics.route'; + +@NgModule({ + imports: [BorestopSharedModule, RouterModule.forChild([metricsRoute])], + declarations: [MetricsComponent] +}) +export class MetricsModule {} diff --git a/borestop/src/main/webapp/app/admin/metrics/metrics.route.ts b/borestop/src/main/webapp/app/admin/metrics/metrics.route.ts new file mode 100644 index 00000000..f85fd61d --- /dev/null +++ b/borestop/src/main/webapp/app/admin/metrics/metrics.route.ts @@ -0,0 +1,11 @@ +import { Route } from '@angular/router'; + +import { MetricsComponent } from './metrics.component'; + +export const metricsRoute: Route = { + path: '', + component: MetricsComponent, + data: { + pageTitle: 'metrics.title' + } +}; diff --git a/borestop/src/main/webapp/app/admin/metrics/metrics.service.ts b/borestop/src/main/webapp/app/admin/metrics/metrics.service.ts new file mode 100644 index 00000000..a8d0c99a --- /dev/null +++ b/borestop/src/main/webapp/app/admin/metrics/metrics.service.ts @@ -0,0 +1,23 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +import { SERVER_API_URL } from 'app/app.constants'; + +export type MetricsKey = 'jvm' | 'http.server.requests' | 'cache' | 'services' | 'databases' | 'garbageCollector' | 'processMetrics'; +export type Metrics = { [key in MetricsKey]: any }; +export type Thread = any; +export type ThreadDump = { threads: Thread[] }; + +@Injectable({ providedIn: 'root' }) +export class MetricsService { + constructor(private http: HttpClient) {} + + getMetrics(): Observable<Metrics> { + return this.http.get<Metrics>(SERVER_API_URL + 'management/jhimetrics'); + } + + threadDump(): Observable<ThreadDump> { + return this.http.get<ThreadDump>(SERVER_API_URL + 'management/threaddump'); + } +} diff --git a/borestop/src/main/webapp/app/admin/user-management/user-management-delete-dialog.component.html b/borestop/src/main/webapp/app/admin/user-management/user-management-delete-dialog.component.html new file mode 100644 index 00000000..ad7d3cd4 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/user-management/user-management-delete-dialog.component.html @@ -0,0 +1,23 @@ +<form *ngIf="user" name="deleteForm" (ngSubmit)="confirmDelete(user?.login!)"> + <div class="modal-header"> + <h4 class="modal-title" jhiTranslate="entity.delete.title">Confirm delete operation</h4> + + <button type="button" class="close" data-dismiss="modal" aria-hidden="true" (click)="cancel()">×</button> + </div> + + <div class="modal-body"> + <jhi-alert-error></jhi-alert-error> + + <p jhiTranslate="userManagement.delete.question" [translateValues]="{ login: user.login }">Are you sure you want to delete this User?</p> + </div> + + <div class="modal-footer"> + <button type="button" class="btn btn-secondary" data-dismiss="modal" (click)="cancel()"> + <fa-icon icon="ban"></fa-icon> <span jhiTranslate="entity.action.cancel">Cancel</span> + </button> + + <button type="submit" class="btn btn-danger"> + <fa-icon icon="times"></fa-icon> <span jhiTranslate="entity.action.delete">Delete</span> + </button> + </div> +</form> diff --git a/borestop/src/main/webapp/app/admin/user-management/user-management-delete-dialog.component.ts b/borestop/src/main/webapp/app/admin/user-management/user-management-delete-dialog.component.ts new file mode 100644 index 00000000..fdda5fb5 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/user-management/user-management-delete-dialog.component.ts @@ -0,0 +1,27 @@ +import { Component } from '@angular/core'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; +import { JhiEventManager } from 'ng-jhipster'; + +import { User } from 'app/core/user/user.model'; +import { UserService } from 'app/core/user/user.service'; + +@Component({ + selector: 'jhi-user-mgmt-delete-dialog', + templateUrl: './user-management-delete-dialog.component.html' +}) +export class UserManagementDeleteDialogComponent { + user?: User; + + constructor(private userService: UserService, public activeModal: NgbActiveModal, private eventManager: JhiEventManager) {} + + cancel(): void { + this.activeModal.dismiss(); + } + + confirmDelete(login: string): void { + this.userService.delete(login).subscribe(() => { + this.eventManager.broadcast('userListModification'); + this.activeModal.close(); + }); + } +} diff --git a/borestop/src/main/webapp/app/admin/user-management/user-management-detail.component.html b/borestop/src/main/webapp/app/admin/user-management/user-management-detail.component.html new file mode 100644 index 00000000..7fda1fe3 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/user-management/user-management-detail.component.html @@ -0,0 +1,58 @@ +<div class="row justify-content-center"> + <div class="col-8"> + <div *ngIf="user"> + <h2> + <span jhiTranslate="userManagement.detail.title">User</span> [<b>{{ user.login }}</b>] + </h2> + + <dl class="row-md jh-entity-details"> + <dt><span jhiTranslate="userManagement.login">Login</span></dt> + <dd> + <span>{{ user.login }}</span> + <jhi-boolean + [value]="user.activated ? true : false" + [textTrue]="'userManagement.activated' | translate" + [textFalse]="'userManagement.deactivated' | translate"> + </jhi-boolean> + </dd> + + <dt><span jhiTranslate="userManagement.firstName">First Name</span></dt> + <dd>{{ user.firstName }}</dd> + + <dt><span jhiTranslate="userManagement.lastName">Last Name</span></dt> + <dd>{{ user.lastName }}</dd> + + <dt><span jhiTranslate="userManagement.email">Email</span></dt> + <dd>{{ user.email }}</dd> + + <dt><span jhiTranslate="userManagement.langKey">Lang Key</span></dt> + <dd>{{ user.langKey }}</dd> + + <dt><span jhiTranslate="userManagement.createdBy">Created By</span></dt> + <dd>{{ user.createdBy }}</dd> + + <dt><span jhiTranslate="userManagement.createdDate">Created Date</span></dt> + <dd>{{ user.createdDate | date:'dd/MM/yy HH:mm' }}</dd> + + <dt><span jhiTranslate="userManagement.lastModifiedBy">Last Modified By</span></dt> + <dd>{{ user.lastModifiedBy }}</dd> + + <dt><span jhiTranslate="userManagement.lastModifiedDate">Last Modified Date</span></dt> + <dd>{{ user.lastModifiedDate | date:'dd/MM/yy HH:mm' }}</dd> + + <dt><span jhiTranslate="userManagement.profiles">Profiles</span></dt> + <dd> + <ul class="list-unstyled"> + <li *ngFor="let authority of user.authorities"> + <span class="badge badge-info">{{ authority }}</span> + </li> + </ul> + </dd> + </dl> + + <button type="submit" routerLink="../../" class="btn btn-info"> + <fa-icon icon="arrow-left"></fa-icon> <span jhiTranslate="entity.action.back">Back</span> + </button> + </div> + </div> +</div> diff --git a/borestop/src/main/webapp/app/admin/user-management/user-management-detail.component.ts b/borestop/src/main/webapp/app/admin/user-management/user-management-detail.component.ts new file mode 100644 index 00000000..19cc78a3 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/user-management/user-management-detail.component.ts @@ -0,0 +1,18 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; + +import { User } from 'app/core/user/user.model'; + +@Component({ + selector: 'jhi-user-mgmt-detail', + templateUrl: './user-management-detail.component.html' +}) +export class UserManagementDetailComponent implements OnInit { + user: User | null = null; + + constructor(private route: ActivatedRoute) {} + + ngOnInit(): void { + this.route.data.subscribe(({ user }) => (this.user = user)); + } +} diff --git a/borestop/src/main/webapp/app/admin/user-management/user-management-update.component.html b/borestop/src/main/webapp/app/admin/user-management/user-management-update.component.html new file mode 100644 index 00000000..41647a9a --- /dev/null +++ b/borestop/src/main/webapp/app/admin/user-management/user-management-update.component.html @@ -0,0 +1,140 @@ +<div class="row justify-content-center"> + <div class="col-8"> + <form name="editForm" role="form" novalidate (ngSubmit)="save()" [formGroup]="editForm"> + <h2 id="myUserLabel" jhiTranslate="userManagement.home.createOrEditLabel"> + Create or edit a User + </h2> + + <div *ngIf="user"> + <jhi-alert-error></jhi-alert-error> + + <div class="form-group" [hidden]="!user.id"> + <label jhiTranslate="global.field.id">ID</label> + <input type="text" class="form-control" name="id" formControlName="id" readonly> + </div> + + <div class="form-group"> + <label class="form-control-label" jhiTranslate="userManagement.login">Login</label> + <input type="text" class="form-control" name="login" + formControlName="login"> + + <div *ngIf="editForm.get('login')!.invalid && (editForm.get('login')!.dirty || editForm.get('login')!.touched)"> + <small class="form-text text-danger" + *ngIf="editForm.get('login')?.errors?.required" + jhiTranslate="entity.validation.required"> + This field is required. + </small> + + <small class="form-text text-danger" + *ngIf="editForm.get('login')?.errors?.maxlength" + jhiTranslate="entity.validation.maxlength" + [translateValues]="{ max: 50 }"> + This field cannot be longer than 50 characters. + </small> + + <small class="form-text text-danger" + *ngIf="editForm.get('login')?.errors?.pattern" + jhiTranslate="entity.validation.patternLogin"> + This field can only contain letters, digits and e-mail addresses. + </small> + </div> + </div> + + <div class="form-group"> + <label class="form-control-label" jhiTranslate="userManagement.firstName">First Name</label> + <input type="text" class="form-control" name="firstName" + formControlName="firstName"> + + <div *ngIf="editForm.get('firstName')!.invalid && (editForm.get('firstName')!.dirty || editForm.get('firstName')!.touched)"> + <small class="form-text text-danger" + *ngIf="editForm.get('firstName')?.errors?.maxlength" + jhiTranslate="entity.validation.maxlength" + [translateValues]="{ max: 50 }"> + This field cannot be longer than 50 characters. + </small> + </div> + </div> + + <div class="form-group"> + <label jhiTranslate="userManagement.lastName">Last Name</label> + <input type="text" class="form-control" name="lastName" + formControlName="lastName"> + + <div *ngIf="editForm.get('lastName')!.invalid && (editForm.get('lastName')!.dirty || editForm.get('lastName')!.touched)"> + <small class="form-text text-danger" + *ngIf="editForm.get('lastName')?.errors?.maxlength" + jhiTranslate="entity.validation.maxlength" + [translateValues]="{ max: 50 }"> + This field cannot be longer than 50 characters. + </small> + </div> + </div> + + <div class="form-group"> + <label class="form-control-label" jhiTranslate="userManagement.email">Email</label> + <input type="email" class="form-control" name="email" formControlName="email"> + + <div *ngIf="editForm.get('email')!.invalid && (editForm.get('email')!.dirty || editForm.get('email')!.touched)"> + <small class="form-text text-danger" + *ngIf="editForm.get('email')?.errors?.required" + jhiTranslate="entity.validation.required"> + This field is required. + </small> + + <small class="form-text text-danger" + *ngIf="editForm.get('email')?.errors?.maxlength" + jhiTranslate="entity.validation.maxlength" + [translateValues]="{ max: 100 }"> + This field cannot be longer than 100 characters. + </small> + + <small class="form-text text-danger" + *ngIf="editForm.get('email')?.errors?.minlength" + jhiTranslate="entity.validation.minlength" + [translateValues]="{ min: 5 }"> + This field is required to be at least 5 characters. + </small> + + <small class="form-text text-danger" + *ngIf="editForm.get('email')?.errors?.email" + jhiTranslate="global.messages.validate.email.invalid"> + Your email is invalid. + </small> + </div> + </div> + + <div class="form-check"> + <label class="form-check-label" for="activated"> + <input class="form-check-input" [attr.disabled]="user.id === undefined ? 'disabled' : null" + type="checkbox" id="activated" name="activated" formControlName="activated"> + <span jhiTranslate="userManagement.activated">Activated</span> + </label> + </div> + + <div class="form-group" *ngIf="languages && languages.length > 0"> + <label jhiTranslate="userManagement.langKey">Lang Key</label> + <select class="form-control" id="langKey" name="langKey" formControlName="langKey"> + <option *ngFor="let language of languages" [value]="language">{{ language | findLanguageFromKey }}</option> + </select> + </div> + + <div class="form-group"> + <label jhiTranslate="userManagement.profiles">Profiles</label> + <select class="form-control" multiple name="authority" formControlName="authorities"> + <option *ngFor="let authority of authorities" [value]="authority">{{ authority }}</option> + </select> + </div> + </div> + + <div *ngIf="user"> + <button type="button" class="btn btn-secondary" (click)="previousState()"> + <fa-icon icon="ban"></fa-icon> <span jhiTranslate="entity.action.cancel">Cancel</span> + </button> + + <button type="submit" [disabled]="editForm.invalid || isSaving" class="btn btn-primary"> + <fa-icon icon="save"></fa-icon> <span jhiTranslate="entity.action.save">Save</span> + </button> + </div> + </form> + </div> +</div> diff --git a/borestop/src/main/webapp/app/admin/user-management/user-management-update.component.ts b/borestop/src/main/webapp/app/admin/user-management/user-management-update.component.ts new file mode 100644 index 00000000..cefd387c --- /dev/null +++ b/borestop/src/main/webapp/app/admin/user-management/user-management-update.component.ts @@ -0,0 +1,106 @@ +import { Component, OnInit } from '@angular/core'; +import { FormBuilder, Validators } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; + +import { LANGUAGES } from 'app/core/language/language.constants'; +import { User } from 'app/core/user/user.model'; +import { UserService } from 'app/core/user/user.service'; + +@Component({ + selector: 'jhi-user-mgmt-update', + templateUrl: './user-management-update.component.html' +}) +export class UserManagementUpdateComponent implements OnInit { + user!: User; + languages = LANGUAGES; + authorities: string[] = []; + isSaving = false; + + editForm = this.fb.group({ + id: [], + login: [ + '', + [ + Validators.required, + Validators.minLength(1), + Validators.maxLength(50), + Validators.pattern('^[a-zA-Z0-9!$&*+=?^_`{|}~.-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$|^[_.@A-Za-z0-9-]+$') + ] + ], + firstName: ['', [Validators.maxLength(50)]], + lastName: ['', [Validators.maxLength(50)]], + email: ['', [Validators.minLength(5), Validators.maxLength(254), Validators.email]], + activated: [], + langKey: [], + authorities: [] + }); + + constructor(private userService: UserService, private route: ActivatedRoute, private fb: FormBuilder) {} + + ngOnInit(): void { + this.route.data.subscribe(({ user }) => { + if (user) { + this.user = user; + if (this.user.id === undefined) { + this.user.activated = true; + } + this.updateForm(user); + } + }); + this.userService.authorities().subscribe(authorities => { + this.authorities = authorities; + }); + } + + previousState(): void { + window.history.back(); + } + + save(): void { + this.isSaving = true; + this.updateUser(this.user); + if (this.user.id !== undefined) { + this.userService.update(this.user).subscribe( + () => this.onSaveSuccess(), + () => this.onSaveError() + ); + } else { + this.userService.create(this.user).subscribe( + () => this.onSaveSuccess(), + () => this.onSaveError() + ); + } + } + + private updateForm(user: User): void { + this.editForm.patchValue({ + id: user.id, + login: user.login, + firstName: user.firstName, + lastName: user.lastName, + email: user.email, + activated: user.activated, + langKey: user.langKey, + authorities: user.authorities + }); + } + + private updateUser(user: User): void { + user.login = this.editForm.get(['login'])!.value; + user.firstName = this.editForm.get(['firstName'])!.value; + user.lastName = this.editForm.get(['lastName'])!.value; + user.email = this.editForm.get(['email'])!.value; + user.activated = this.editForm.get(['activated'])!.value; + user.langKey = this.editForm.get(['langKey'])!.value; + user.authorities = this.editForm.get(['authorities'])!.value; + } + + private onSaveSuccess(): void { + this.isSaving = false; + this.previousState(); + } + + private onSaveError(): void { + this.isSaving = false; + } +} diff --git a/borestop/src/main/webapp/app/admin/user-management/user-management.component.html b/borestop/src/main/webapp/app/admin/user-management/user-management.component.html new file mode 100644 index 00000000..751712b6 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/user-management/user-management.component.html @@ -0,0 +1,88 @@ +<div> + <h2> + <span id="user-management-page-heading" jhiTranslate="userManagement.home.title">Users</span> + + <button class="btn btn-primary float-right jh-create-entity" [routerLink]="['./new']"> + <fa-icon icon="plus"></fa-icon> <span jhiTranslate="userManagement.home.createLabel">Create a new User</span> + </button> + </h2> + + <jhi-alert-error></jhi-alert-error> + + <jhi-alert></jhi-alert> + + <div class="table-responsive" *ngIf="users"> + <table class="table table-striped" aria-describedby="user-management-page-heading"> + <thead> + <tr jhiSort [(predicate)]="predicate" [(ascending)]="ascending" [callback]="transition.bind(this)"> + <th scope="col" jhiSortBy="id"><span jhiTranslate="global.field.id">ID</span> <fa-icon icon="sort"></fa-icon></th> + <th scope="col" jhiSortBy="login"><span jhiTranslate="userManagement.login">Login</span> <fa-icon icon="sort"></fa-icon></th> + <th scope="col" jhiSortBy="email"><span jhiTranslate="userManagement.email">Email</span> <fa-icon icon="sort"></fa-icon></th> + <th scope="col"></th> + <th scope="col" jhiSortBy="langKey"> <span jhiTranslate="userManagement.langKey">Lang Key</span> <fa-icon icon="sort"></fa-icon></th> + <th scope="col"><span jhiTranslate="userManagement.profiles">Profiles</span></th> + <th scope="col" jhiSortBy="createdDate"><span jhiTranslate="userManagement.createdDate">Created Date</span> <fa-icon icon="sort"></fa-icon></th> + <th scope="col" jhiSortBy="lastModifiedBy"><span jhiTranslate="userManagement.lastModifiedBy">Last Modified By</span> <fa-icon icon="sort"></fa-icon></th> + <th scope="col" jhiSortBy="lastModifiedDate"><span jhiTranslate="userManagement.lastModifiedDate">Last Modified Date</span> <fa-icon icon="sort"></fa-icon></th> + <th scope="col"></th> + </tr> + </thead> + <tbody *ngIf="users"> + <tr *ngFor="let user of users; trackBy: trackIdentity"> + <td><a [routerLink]="['./', user.login, 'view']">{{ user.id }}</a></td> + <td>{{ user.login }}</td> + <td>{{ user.email }}</td> + <td> + <button class="btn btn-danger btn-sm" (click)="setActive(user, true)" *ngIf="!user.activated" + jhiTranslate="userManagement.deactivated">Deactivated</button> + <button class="btn btn-success btn-sm" (click)="setActive(user, false)" *ngIf="user.activated" + [disabled]="!currentAccount || currentAccount.login === user.login" jhiTranslate="userManagement.activated">Activated</button> + </td> + <td>{{ user.langKey }}</td> + <td> + <div *ngFor="let authority of user.authorities"> + <span class="badge badge-info">{{ authority }}</span> + </div> + </td> + <td>{{ user.createdDate | date:'dd/MM/yy HH:mm' }}</td> + <td>{{ user.lastModifiedBy }}</td> + <td>{{ user.lastModifiedDate | date:'dd/MM/yy HH:mm' }}</td> + <td class="text-right"> + <div class="btn-group"> + <button type="submit" + [routerLink]="['./', user.login, 'view']" + class="btn btn-info btn-sm"> + <fa-icon icon="eye"></fa-icon> + <span class="d-none d-md-inline" jhiTranslate="entity.action.view">View</span> + </button> + + <button type="submit" + [routerLink]="['./', user.login, 'edit']" + queryParamsHandling="merge" + class="btn btn-primary btn-sm"> + <fa-icon icon="pencil-alt"></fa-icon> + <span class="d-none d-md-inline" jhiTranslate="entity.action.edit">Edit</span> + </button> + + <button type="button" (click)="deleteUser(user)" + class="btn btn-danger btn-sm" [disabled]="!currentAccount || currentAccount.login === user.login"> + <fa-icon icon="times"></fa-icon> + <span class="d-none d-md-inline" jhiTranslate="entity.action.delete">Delete</span> + </button> + </div> + </td> + </tr> + </tbody> + </table> + </div> + + <div *ngIf="users"> + <div class="row justify-content-center"> + <jhi-item-count [page]="page" [total]="totalItems" [itemsPerPage]="itemsPerPage"></jhi-item-count> + </div> + + <div class="row justify-content-center"> + <ngb-pagination [collectionSize]="totalItems" [(page)]="page" [pageSize]="itemsPerPage" [maxSize]="5" [rotate]="true" [boundaryLinks]="true" (pageChange)="transition()"></ngb-pagination> + </div> + </div> +</div> diff --git a/borestop/src/main/webapp/app/admin/user-management/user-management.component.ts b/borestop/src/main/webapp/app/admin/user-management/user-management.component.ts new file mode 100644 index 00000000..68554e1f --- /dev/null +++ b/borestop/src/main/webapp/app/admin/user-management/user-management.component.ts @@ -0,0 +1,106 @@ +import { Component, OnInit, OnDestroy } from '@angular/core'; +import { HttpResponse, HttpHeaders } from '@angular/common/http'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; +import { Subscription, combineLatest } from 'rxjs'; +import { ActivatedRoute, ParamMap, Router, Data } from '@angular/router'; +import { JhiEventManager } from 'ng-jhipster'; + +import { ITEMS_PER_PAGE } from 'app/shared/constants/pagination.constants'; +import { AccountService } from 'app/core/auth/account.service'; +import { Account } from 'app/core/user/account.model'; +import { UserService } from 'app/core/user/user.service'; +import { User } from 'app/core/user/user.model'; +import { UserManagementDeleteDialogComponent } from './user-management-delete-dialog.component'; + +@Component({ + selector: 'jhi-user-mgmt', + templateUrl: './user-management.component.html' +}) +export class UserManagementComponent implements OnInit, OnDestroy { + currentAccount: Account | null = null; + users: User[] | null = null; + userListSubscription?: Subscription; + totalItems = 0; + itemsPerPage = ITEMS_PER_PAGE; + page!: number; + predicate!: string; + ascending!: boolean; + + constructor( + private userService: UserService, + private accountService: AccountService, + private activatedRoute: ActivatedRoute, + private router: Router, + private eventManager: JhiEventManager, + private modalService: NgbModal + ) {} + + ngOnInit(): void { + this.accountService.identity().subscribe(account => (this.currentAccount = account)); + this.userListSubscription = this.eventManager.subscribe('userListModification', () => this.loadAll()); + this.handleNavigation(); + } + + ngOnDestroy(): void { + if (this.userListSubscription) { + this.eventManager.destroy(this.userListSubscription); + } + } + + setActive(user: User, isActivated: boolean): void { + this.userService.update({ ...user, activated: isActivated }).subscribe(() => this.loadAll()); + } + + trackIdentity(index: number, item: User): any { + return item.id; + } + + deleteUser(user: User): void { + const modalRef = this.modalService.open(UserManagementDeleteDialogComponent, { size: 'lg', backdrop: 'static' }); + modalRef.componentInstance.user = user; + } + + transition(): void { + this.router.navigate(['./'], { + relativeTo: this.activatedRoute.parent, + queryParams: { + page: this.page, + sort: this.predicate + ',' + (this.ascending ? 'asc' : 'desc') + } + }); + } + + private handleNavigation(): void { + combineLatest(this.activatedRoute.data, this.activatedRoute.queryParamMap, (data: Data, params: ParamMap) => { + const page = params.get('page'); + this.page = page !== null ? +page : 1; + const sort = (params.get('sort') ?? data['defaultSort']).split(','); + this.predicate = sort[0]; + this.ascending = sort[1] === 'asc'; + this.loadAll(); + }).subscribe(); + } + + private loadAll(): void { + this.userService + .query({ + page: this.page - 1, + size: this.itemsPerPage, + sort: this.sort() + }) + .subscribe((res: HttpResponse<User[]>) => this.onSuccess(res.body, res.headers)); + } + + private sort(): string[] { + const result = [this.predicate + ',' + (this.ascending ? 'asc' : 'desc')]; + if (this.predicate !== 'id') { + result.push('id'); + } + return result; + } + + private onSuccess(users: User[] | null, headers: HttpHeaders): void { + this.totalItems = Number(headers.get('X-Total-Count')); + this.users = users; + } +} diff --git a/borestop/src/main/webapp/app/admin/user-management/user-management.module.ts b/borestop/src/main/webapp/app/admin/user-management/user-management.module.ts new file mode 100644 index 00000000..4967467f --- /dev/null +++ b/borestop/src/main/webapp/app/admin/user-management/user-management.module.ts @@ -0,0 +1,21 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import { BorestopSharedModule } from 'app/shared/shared.module'; +import { UserManagementComponent } from './user-management.component'; +import { UserManagementDetailComponent } from './user-management-detail.component'; +import { UserManagementUpdateComponent } from './user-management-update.component'; +import { UserManagementDeleteDialogComponent } from './user-management-delete-dialog.component'; +import { userManagementRoute } from './user-management.route'; + +@NgModule({ + imports: [BorestopSharedModule, RouterModule.forChild(userManagementRoute)], + declarations: [ + UserManagementComponent, + UserManagementDetailComponent, + UserManagementUpdateComponent, + UserManagementDeleteDialogComponent + ], + entryComponents: [UserManagementDeleteDialogComponent] +}) +export class UserManagementModule {} diff --git a/borestop/src/main/webapp/app/admin/user-management/user-management.route.ts b/borestop/src/main/webapp/app/admin/user-management/user-management.route.ts new file mode 100644 index 00000000..6e3dcab9 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/user-management/user-management.route.ts @@ -0,0 +1,53 @@ +import { Injectable } from '@angular/core'; +import { Resolve, ActivatedRouteSnapshot, Routes } from '@angular/router'; +import { Observable, of } from 'rxjs'; + +import { User, IUser } from 'app/core/user/user.model'; +import { UserService } from 'app/core/user/user.service'; +import { UserManagementComponent } from './user-management.component'; +import { UserManagementDetailComponent } from './user-management-detail.component'; +import { UserManagementUpdateComponent } from './user-management-update.component'; + +@Injectable({ providedIn: 'root' }) +export class UserManagementResolve implements Resolve<IUser> { + constructor(private service: UserService) {} + + resolve(route: ActivatedRouteSnapshot): Observable<IUser> { + const id = route.params['login']; + if (id) { + return this.service.find(id); + } + return of(new User()); + } +} + +export const userManagementRoute: Routes = [ + { + path: '', + component: UserManagementComponent, + data: { + defaultSort: 'id,asc' + } + }, + { + path: ':login/view', + component: UserManagementDetailComponent, + resolve: { + user: UserManagementResolve + } + }, + { + path: 'new', + component: UserManagementUpdateComponent, + resolve: { + user: UserManagementResolve + } + }, + { + path: ':login/edit', + component: UserManagementUpdateComponent, + resolve: { + user: UserManagementResolve + } + } +]; diff --git a/borestop/src/main/webapp/app/app-routing.module.ts b/borestop/src/main/webapp/app/app-routing.module.ts new file mode 100644 index 00000000..78765447 --- /dev/null +++ b/borestop/src/main/webapp/app/app-routing.module.ts @@ -0,0 +1,35 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { errorRoute } from './layouts/error/error.route'; +import { navbarRoute } from './layouts/navbar/navbar.route'; +import { DEBUG_INFO_ENABLED } from 'app/app.constants'; +import { Authority } from 'app/shared/constants/authority.constants'; + +import { UserRouteAccessService } from 'app/core/auth/user-route-access-service'; + +const LAYOUT_ROUTES = [navbarRoute, ...errorRoute]; + +@NgModule({ + imports: [ + RouterModule.forRoot( + [ + { + path: 'admin', + data: { + authorities: [Authority.ADMIN] + }, + canActivate: [UserRouteAccessService], + loadChildren: () => import('./admin/admin-routing.module').then(m => m.AdminRoutingModule) + }, + { + path: 'account', + loadChildren: () => import('./account/account.module').then(m => m.AccountModule) + }, + ...LAYOUT_ROUTES + ], + { enableTracing: DEBUG_INFO_ENABLED } + ) + ], + exports: [RouterModule] +}) +export class BorestopAppRoutingModule {} diff --git a/borestop/src/main/webapp/app/app.constants.ts b/borestop/src/main/webapp/app/app.constants.ts new file mode 100644 index 00000000..4b34b657 --- /dev/null +++ b/borestop/src/main/webapp/app/app.constants.ts @@ -0,0 +1,8 @@ +// These constants are injected via webpack environment variables. +// You can add more variables in webpack.common.js or in profile specific webpack.<dev|prod>.js files. +// If you change the values in the webpack config files, you need to re run webpack to update the application + +export const VERSION = process.env.VERSION; +export const DEBUG_INFO_ENABLED = Boolean(process.env.DEBUG_INFO_ENABLED); +export const SERVER_API_URL = process.env.SERVER_API_URL; +export const BUILD_TIMESTAMP = process.env.BUILD_TIMESTAMP; diff --git a/borestop/src/main/webapp/app/app.main.ts b/borestop/src/main/webapp/app/app.main.ts new file mode 100644 index 00000000..533cd323 --- /dev/null +++ b/borestop/src/main/webapp/app/app.main.ts @@ -0,0 +1,16 @@ +import './polyfills'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; +import { ProdConfig } from './blocks/config/prod.config'; +import { BorestopAppModule } from './app.module'; + +ProdConfig(); + +if (module['hot']) { + module['hot'].accept(); +} + +platformBrowserDynamic() + .bootstrapModule(BorestopAppModule, { preserveWhitespaces: true }) + // eslint-disable-next-line no-console + .then(() => console.log('Application started')) + .catch(err => console.error(err)); diff --git a/borestop/src/main/webapp/app/app.module.ts b/borestop/src/main/webapp/app/app.module.ts new file mode 100644 index 00000000..6af86dab --- /dev/null +++ b/borestop/src/main/webapp/app/app.module.ts @@ -0,0 +1,31 @@ +import { NgModule } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser'; + +import './vendor'; +import { BorestopSharedModule } from 'app/shared/shared.module'; +import { BorestopCoreModule } from 'app/core/core.module'; +import { BorestopAppRoutingModule } from './app-routing.module'; +import { BorestopHomeModule } from './home/home.module'; +import { BorestopEntityModule } from './entities/entity.module'; +// jhipster-needle-angular-add-module-import JHipster will add new module here +import { MainComponent } from './layouts/main/main.component'; +import { NavbarComponent } from './layouts/navbar/navbar.component'; +import { FooterComponent } from './layouts/footer/footer.component'; +import { PageRibbonComponent } from './layouts/profiles/page-ribbon.component'; +import { ActiveMenuDirective } from './layouts/navbar/active-menu.directive'; +import { ErrorComponent } from './layouts/error/error.component'; + +@NgModule({ + imports: [ + BrowserModule, + BorestopSharedModule, + BorestopCoreModule, + BorestopHomeModule, + // jhipster-needle-angular-add-module JHipster will add new module here + BorestopEntityModule, + BorestopAppRoutingModule + ], + declarations: [MainComponent, NavbarComponent, ErrorComponent, PageRibbonComponent, ActiveMenuDirective, FooterComponent], + bootstrap: [MainComponent] +}) +export class BorestopAppModule {} diff --git a/borestop/src/main/webapp/app/blocks/config/prod.config.ts b/borestop/src/main/webapp/app/blocks/config/prod.config.ts new file mode 100644 index 00000000..b1ccef11 --- /dev/null +++ b/borestop/src/main/webapp/app/blocks/config/prod.config.ts @@ -0,0 +1,9 @@ +import { enableProdMode } from '@angular/core'; +import { DEBUG_INFO_ENABLED } from 'app/app.constants'; + +export function ProdConfig(): void { + // disable debug data on prod profile to improve performance + if (!DEBUG_INFO_ENABLED) { + enableProdMode(); + } +} diff --git a/borestop/src/main/webapp/app/blocks/config/uib-pagination.config.ts b/borestop/src/main/webapp/app/blocks/config/uib-pagination.config.ts new file mode 100644 index 00000000..002c5cf8 --- /dev/null +++ b/borestop/src/main/webapp/app/blocks/config/uib-pagination.config.ts @@ -0,0 +1,13 @@ +import { Injectable } from '@angular/core'; +import { NgbPaginationConfig } from '@ng-bootstrap/ng-bootstrap'; +import { ITEMS_PER_PAGE } from 'app/shared/constants/pagination.constants'; + +@Injectable({ providedIn: 'root' }) +export class PaginationConfig { + constructor(config: NgbPaginationConfig) { + config.boundaryLinks = true; + config.maxSize = 5; + config.pageSize = ITEMS_PER_PAGE; + config.size = 'sm'; + } +} diff --git a/borestop/src/main/webapp/app/blocks/interceptor/auth-expired.interceptor.ts b/borestop/src/main/webapp/app/blocks/interceptor/auth-expired.interceptor.ts new file mode 100644 index 00000000..a9fa62b6 --- /dev/null +++ b/borestop/src/main/webapp/app/blocks/interceptor/auth-expired.interceptor.ts @@ -0,0 +1,32 @@ +import { Injectable } from '@angular/core'; +import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpErrorResponse } from '@angular/common/http'; +import { Observable } from 'rxjs'; +import { tap } from 'rxjs/operators'; +import { Router } from '@angular/router'; + +import { LoginService } from 'app/core/login/login.service'; +import { LoginModalService } from 'app/core/login/login-modal.service'; +import { StateStorageService } from 'app/core/auth/state-storage.service'; + +@Injectable() +export class AuthExpiredInterceptor implements HttpInterceptor { + constructor( + private loginService: LoginService, + private loginModalService: LoginModalService, + private stateStorageService: StateStorageService, + private router: Router + ) {} + + intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { + return next.handle(request).pipe( + tap(null, (err: HttpErrorResponse) => { + if (err.status === 401 && err.url && !err.url.includes('api/account')) { + this.stateStorageService.storeUrl(this.router.routerState.snapshot.url); + this.loginService.logout(); + this.router.navigate(['']); + this.loginModalService.open(); + } + }) + ); + } +} diff --git a/borestop/src/main/webapp/app/blocks/interceptor/auth.interceptor.ts b/borestop/src/main/webapp/app/blocks/interceptor/auth.interceptor.ts new file mode 100644 index 00000000..3dd7aff0 --- /dev/null +++ b/borestop/src/main/webapp/app/blocks/interceptor/auth.interceptor.ts @@ -0,0 +1,27 @@ +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; +import { LocalStorageService, SessionStorageService } from 'ngx-webstorage'; +import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http'; + +import { SERVER_API_URL } from 'app/app.constants'; + +@Injectable() +export class AuthInterceptor implements HttpInterceptor { + constructor(private localStorage: LocalStorageService, private sessionStorage: SessionStorageService) {} + + intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { + if (!request || !request.url || (request.url.startsWith('http') && !(SERVER_API_URL && request.url.startsWith(SERVER_API_URL)))) { + return next.handle(request); + } + + const token = this.localStorage.retrieve('authenticationToken') || this.sessionStorage.retrieve('authenticationToken'); + if (token) { + request = request.clone({ + setHeaders: { + Authorization: 'Bearer ' + token + } + }); + } + return next.handle(request); + } +} diff --git a/borestop/src/main/webapp/app/blocks/interceptor/errorhandler.interceptor.ts b/borestop/src/main/webapp/app/blocks/interceptor/errorhandler.interceptor.ts new file mode 100644 index 00000000..d8b147d8 --- /dev/null +++ b/borestop/src/main/webapp/app/blocks/interceptor/errorhandler.interceptor.ts @@ -0,0 +1,20 @@ +import { Injectable } from '@angular/core'; +import { JhiEventManager, JhiEventWithContent } from 'ng-jhipster'; +import { HttpInterceptor, HttpRequest, HttpErrorResponse, HttpHandler, HttpEvent } from '@angular/common/http'; +import { Observable } from 'rxjs'; +import { tap } from 'rxjs/operators'; + +@Injectable() +export class ErrorHandlerInterceptor implements HttpInterceptor { + constructor(private eventManager: JhiEventManager) {} + + intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { + return next.handle(request).pipe( + tap(null, (err: HttpErrorResponse) => { + if (!(err.status === 401 && (err.message === '' || (err.url && err.url.includes('api/account'))))) { + this.eventManager.broadcast(new JhiEventWithContent('borestopApp.httpError', err)); + } + }) + ); + } +} diff --git a/borestop/src/main/webapp/app/blocks/interceptor/notification.interceptor.ts b/borestop/src/main/webapp/app/blocks/interceptor/notification.interceptor.ts new file mode 100644 index 00000000..5eb735bd --- /dev/null +++ b/borestop/src/main/webapp/app/blocks/interceptor/notification.interceptor.ts @@ -0,0 +1,33 @@ +import { JhiAlertService } from 'ng-jhipster'; +import { HttpInterceptor, HttpRequest, HttpResponse, HttpHandler, HttpEvent } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; +import { tap } from 'rxjs/operators'; + +@Injectable() +export class NotificationInterceptor implements HttpInterceptor { + constructor(private alertService: JhiAlertService) {} + + intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { + return next.handle(request).pipe( + tap((event: HttpEvent<any>) => { + if (event instanceof HttpResponse) { + let alert: string | null = null; + let alertParams: string | null = null; + + event.headers.keys().forEach(entry => { + if (entry.toLowerCase().endsWith('app-alert')) { + alert = event.headers.get(entry); + } else if (entry.toLowerCase().endsWith('app-params')) { + alertParams = decodeURIComponent(event.headers.get(entry)!.replace(/\+/g, ' ')); + } + }); + + if (alert) { + this.alertService.success(alert, { param: alertParams }); + } + } + }) + ); + } +} diff --git a/borestop/src/main/webapp/app/core/auth/account.service.ts b/borestop/src/main/webapp/app/core/auth/account.service.ts new file mode 100644 index 00000000..8af48d39 --- /dev/null +++ b/borestop/src/main/webapp/app/core/auth/account.service.ts @@ -0,0 +1,97 @@ +import { Injectable } from '@angular/core'; +import { Router } from '@angular/router'; +import { HttpClient } from '@angular/common/http'; +import { JhiLanguageService } from 'ng-jhipster'; +import { SessionStorageService } from 'ngx-webstorage'; +import { Observable, ReplaySubject, of } from 'rxjs'; +import { shareReplay, tap, catchError } from 'rxjs/operators'; +import { StateStorageService } from 'app/core/auth/state-storage.service'; + +import { SERVER_API_URL } from 'app/app.constants'; +import { Account } from 'app/core/user/account.model'; + +@Injectable({ providedIn: 'root' }) +export class AccountService { + private userIdentity: Account | null = null; + private authenticationState = new ReplaySubject<Account | null>(1); + private accountCache$?: Observable<Account | null>; + + constructor( + private languageService: JhiLanguageService, + private sessionStorage: SessionStorageService, + private http: HttpClient, + private stateStorageService: StateStorageService, + private router: Router + ) {} + + save(account: Account): Observable<{}> { + return this.http.post(SERVER_API_URL + 'api/account', account); + } + + authenticate(identity: Account | null): void { + this.userIdentity = identity; + this.authenticationState.next(this.userIdentity); + } + + hasAnyAuthority(authorities: string[] | string): boolean { + if (!this.userIdentity || !this.userIdentity.authorities) { + return false; + } + if (!Array.isArray(authorities)) { + authorities = [authorities]; + } + return this.userIdentity.authorities.some((authority: string) => authorities.includes(authority)); + } + + identity(force?: boolean): Observable<Account | null> { + if (!this.accountCache$ || force || !this.isAuthenticated()) { + this.accountCache$ = this.fetch().pipe( + catchError(() => { + return of(null); + }), + tap((account: Account | null) => { + this.authenticate(account); + + // After retrieve the account info, the language will be changed to + // the user's preferred language configured in the account setting + if (account && account.langKey) { + const langKey = this.sessionStorage.retrieve('locale') || account.langKey; + this.languageService.changeLanguage(langKey); + } + + if (account) { + this.navigateToStoredUrl(); + } + }), + shareReplay() + ); + } + return this.accountCache$; + } + + isAuthenticated(): boolean { + return this.userIdentity !== null; + } + + getAuthenticationState(): Observable<Account | null> { + return this.authenticationState.asObservable(); + } + + getImageUrl(): string { + return this.userIdentity ? this.userIdentity.imageUrl : ''; + } + + private fetch(): Observable<Account> { + return this.http.get<Account>(SERVER_API_URL + 'api/account'); + } + + private navigateToStoredUrl(): void { + // previousState can be set in the authExpiredInterceptor and in the userRouteAccessService + // if login is successful, go to stored previousState and clear previousState + const previousUrl = this.stateStorageService.getUrl(); + if (previousUrl) { + this.stateStorageService.clearUrl(); + this.router.navigateByUrl(previousUrl); + } + } +} diff --git a/borestop/src/main/webapp/app/core/auth/auth-jwt.service.ts b/borestop/src/main/webapp/app/core/auth/auth-jwt.service.ts new file mode 100644 index 00000000..5fb3e6f8 --- /dev/null +++ b/borestop/src/main/webapp/app/core/auth/auth-jwt.service.ts @@ -0,0 +1,44 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { LocalStorageService, SessionStorageService } from 'ngx-webstorage'; + +import { SERVER_API_URL } from 'app/app.constants'; +import { Login } from 'app/core/login/login.model'; + +type JwtToken = { + id_token: string; +}; + +@Injectable({ providedIn: 'root' }) +export class AuthServerProvider { + constructor(private http: HttpClient, private $localStorage: LocalStorageService, private $sessionStorage: SessionStorageService) {} + + getToken(): string { + return this.$localStorage.retrieve('authenticationToken') || this.$sessionStorage.retrieve('authenticationToken') || ''; + } + + login(credentials: Login): Observable<void> { + return this.http + .post<JwtToken>(SERVER_API_URL + 'api/authenticate', credentials) + .pipe(map(response => this.authenticateSuccess(response, credentials.rememberMe))); + } + + logout(): Observable<void> { + return new Observable(observer => { + this.$localStorage.clear('authenticationToken'); + this.$sessionStorage.clear('authenticationToken'); + observer.complete(); + }); + } + + private authenticateSuccess(response: JwtToken, rememberMe: boolean): void { + const jwt = response.id_token; + if (rememberMe) { + this.$localStorage.store('authenticationToken', jwt); + } else { + this.$sessionStorage.store('authenticationToken', jwt); + } + } +} diff --git a/borestop/src/main/webapp/app/core/auth/csrf.service.ts b/borestop/src/main/webapp/app/core/auth/csrf.service.ts new file mode 100644 index 00000000..0a491627 --- /dev/null +++ b/borestop/src/main/webapp/app/core/auth/csrf.service.ts @@ -0,0 +1,11 @@ +import { Injectable } from '@angular/core'; +import { CookieService } from 'ngx-cookie-service'; + +@Injectable({ providedIn: 'root' }) +export class CSRFService { + constructor(private cookieService: CookieService) {} + + getCSRF(name = 'XSRF-TOKEN'): string { + return this.cookieService.get(name); + } +} diff --git a/borestop/src/main/webapp/app/core/auth/state-storage.service.ts b/borestop/src/main/webapp/app/core/auth/state-storage.service.ts new file mode 100644 index 00000000..5d8861de --- /dev/null +++ b/borestop/src/main/webapp/app/core/auth/state-storage.service.ts @@ -0,0 +1,21 @@ +import { Injectable } from '@angular/core'; +import { SessionStorageService } from 'ngx-webstorage'; + +@Injectable({ providedIn: 'root' }) +export class StateStorageService { + private previousUrlKey = 'previousUrl'; + + constructor(private $sessionStorage: SessionStorageService) {} + + storeUrl(url: string): void { + this.$sessionStorage.store(this.previousUrlKey, url); + } + + getUrl(): string | null | undefined { + return this.$sessionStorage.retrieve(this.previousUrlKey); + } + + clearUrl(): void { + this.$sessionStorage.clear(this.previousUrlKey); + } +} diff --git a/borestop/src/main/webapp/app/core/auth/user-route-access-service.ts b/borestop/src/main/webapp/app/core/auth/user-route-access-service.ts new file mode 100644 index 00000000..30d7b7eb --- /dev/null +++ b/borestop/src/main/webapp/app/core/auth/user-route-access-service.ts @@ -0,0 +1,53 @@ +import { Injectable, isDevMode } from '@angular/core'; +import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; + +import { AccountService } from 'app/core/auth/account.service'; +import { LoginModalService } from 'app/core/login/login-modal.service'; +import { StateStorageService } from './state-storage.service'; + +@Injectable({ providedIn: 'root' }) +export class UserRouteAccessService implements CanActivate { + constructor( + private router: Router, + private loginModalService: LoginModalService, + private accountService: AccountService, + private stateStorageService: StateStorageService + ) {} + + canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> { + const authorities = route.data['authorities']; + // We need to call the checkLogin / and so the accountService.identity() function, to ensure, + // that the client has a principal too, if they already logged in by the server. + // This could happen on a page refresh. + return this.checkLogin(authorities, state.url); + } + + checkLogin(authorities: string[], url: string): Observable<boolean> { + return this.accountService.identity().pipe( + map(account => { + if (!authorities || authorities.length === 0) { + return true; + } + + if (account) { + const hasAnyAuthority = this.accountService.hasAnyAuthority(authorities); + if (hasAnyAuthority) { + return true; + } + if (isDevMode()) { + console.error('User has not any of required authorities: ', authorities); + } + this.router.navigate(['accessdenied']); + return false; + } + + this.stateStorageService.storeUrl(url); + this.router.navigate(['']); + this.loginModalService.open(); + return false; + }) + ); + } +} diff --git a/borestop/src/main/webapp/app/core/core.module.ts b/borestop/src/main/webapp/app/core/core.module.ts new file mode 100644 index 00000000..3798d2a8 --- /dev/null +++ b/borestop/src/main/webapp/app/core/core.module.ts @@ -0,0 +1,85 @@ +import { NgModule, LOCALE_ID } from '@angular/core'; +import { DatePipe, registerLocaleData } from '@angular/common'; +import { HttpClient, HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http'; +import { Title } from '@angular/platform-browser'; +import { FaIconLibrary } from '@fortawesome/angular-fontawesome'; +import { CookieService } from 'ngx-cookie-service'; +import { TranslateModule, TranslateLoader, MissingTranslationHandler } from '@ngx-translate/core'; +import { NgxWebstorageModule } from 'ngx-webstorage'; +import { NgJhipsterModule, translatePartialLoader, missingTranslationHandler, JhiConfigService, JhiLanguageService } from 'ng-jhipster'; +import locale from '@angular/common/locales/en'; + +import * as moment from 'moment'; +import { NgbDateAdapter, NgbDatepickerConfig } from '@ng-bootstrap/ng-bootstrap'; +import { NgbDateMomentAdapter } from 'app/shared/util/datepicker-adapter'; + +import { AuthInterceptor } from 'app/blocks/interceptor/auth.interceptor'; +import { AuthExpiredInterceptor } from 'app/blocks/interceptor/auth-expired.interceptor'; +import { ErrorHandlerInterceptor } from 'app/blocks/interceptor/errorhandler.interceptor'; +import { NotificationInterceptor } from 'app/blocks/interceptor/notification.interceptor'; + +import { fontAwesomeIcons } from './icons/font-awesome-icons'; + +@NgModule({ + imports: [ + HttpClientModule, + NgxWebstorageModule.forRoot({ prefix: 'jhi', separator: '-' }), + NgJhipsterModule.forRoot({ + // set below to true to make alerts look like toast + alertAsToast: false, + alertTimeout: 5000, + i18nEnabled: true, + defaultI18nLang: 'en' + }), + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useFactory: translatePartialLoader, + deps: [HttpClient] + }, + missingTranslationHandler: { + provide: MissingTranslationHandler, + useFactory: missingTranslationHandler, + deps: [JhiConfigService] + } + }) + ], + providers: [ + Title, + CookieService, + { + provide: LOCALE_ID, + useValue: 'en' + }, + { provide: NgbDateAdapter, useClass: NgbDateMomentAdapter }, + DatePipe, + { + provide: HTTP_INTERCEPTORS, + useClass: AuthInterceptor, + multi: true + }, + { + provide: HTTP_INTERCEPTORS, + useClass: AuthExpiredInterceptor, + multi: true + }, + { + provide: HTTP_INTERCEPTORS, + useClass: ErrorHandlerInterceptor, + multi: true + }, + { + provide: HTTP_INTERCEPTORS, + useClass: NotificationInterceptor, + multi: true + } + ] +}) +export class BorestopCoreModule { + constructor(iconLibrary: FaIconLibrary, dpConfig: NgbDatepickerConfig, languageService: JhiLanguageService) { + registerLocaleData(locale); + iconLibrary.addIcons(...fontAwesomeIcons); + dpConfig.minDate = { year: moment().year() - 100, month: 1, day: 1 }; + languageService.init(); + } +} diff --git a/borestop/src/main/webapp/app/core/icons/font-awesome-icons.ts b/borestop/src/main/webapp/app/core/icons/font-awesome-icons.ts new file mode 100644 index 00000000..96d0b13e --- /dev/null +++ b/borestop/src/main/webapp/app/core/icons/font-awesome-icons.ts @@ -0,0 +1,75 @@ +import { + faUser, + faSort, + faSortUp, + faSortDown, + faSync, + faEye, + faBan, + faTimes, + faArrowLeft, + faSave, + faPlus, + faPencilAlt, + faBars, + faThList, + faUserPlus, + faRoad, + faTachometerAlt, + faHeart, + faList, + faBell, + faBook, + faHdd, + faFlag, + faWrench, + faLock, + faCloud, + faSignOutAlt, + faSignInAlt, + faCalendarAlt, + faSearch, + faTrashAlt, + faAsterisk, + faTasks, + // jhipster-needle-add-icon-import + faHome +} from '@fortawesome/free-solid-svg-icons'; + +export const fontAwesomeIcons = [ + faUser, + faSort, + faSortUp, + faSortDown, + faSync, + faEye, + faBan, + faTimes, + faArrowLeft, + faSave, + faPlus, + faPencilAlt, + faBars, + faHome, + faThList, + faUserPlus, + faRoad, + faTachometerAlt, + faHeart, + faList, + faBell, + faTasks, + faBook, + faHdd, + faFlag, + faWrench, + faLock, + faCloud, + faSignOutAlt, + faSignInAlt, + faCalendarAlt, + faSearch, + faTrashAlt, + // jhipster-needle-add-icon-import + faAsterisk +]; diff --git a/borestop/src/main/webapp/app/core/language/language.constants.ts b/borestop/src/main/webapp/app/core/language/language.constants.ts new file mode 100644 index 00000000..fb355fbd --- /dev/null +++ b/borestop/src/main/webapp/app/core/language/language.constants.ts @@ -0,0 +1,8 @@ +/* + Languages codes are ISO_639-1 codes, see http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes + They are written in English to avoid character encoding issues (not a perfect solution) +*/ +export const LANGUAGES: string[] = [ + 'en' + // jhipster-needle-i18n-language-constant - JHipster will add/remove languages in this array +]; diff --git a/borestop/src/main/webapp/app/core/login/login-modal.service.ts b/borestop/src/main/webapp/app/core/login/login-modal.service.ts new file mode 100644 index 00000000..73af6ae4 --- /dev/null +++ b/borestop/src/main/webapp/app/core/login/login-modal.service.ts @@ -0,0 +1,20 @@ +import { Injectable } from '@angular/core'; +import { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; + +import { LoginModalComponent } from 'app/shared/login/login.component'; + +@Injectable({ providedIn: 'root' }) +export class LoginModalService { + private isOpen = false; + + constructor(private modalService: NgbModal) {} + + open(): void { + if (this.isOpen) { + return; + } + this.isOpen = true; + const modalRef: NgbModalRef = this.modalService.open(LoginModalComponent); + modalRef.result.finally(() => (this.isOpen = false)); + } +} diff --git a/borestop/src/main/webapp/app/core/login/login.model.ts b/borestop/src/main/webapp/app/core/login/login.model.ts new file mode 100644 index 00000000..422fce9a --- /dev/null +++ b/borestop/src/main/webapp/app/core/login/login.model.ts @@ -0,0 +1,3 @@ +export class Login { + constructor(public username: string, public password: string, public rememberMe: boolean) {} +} diff --git a/borestop/src/main/webapp/app/core/login/login.service.ts b/borestop/src/main/webapp/app/core/login/login.service.ts new file mode 100644 index 00000000..600f4f7e --- /dev/null +++ b/borestop/src/main/webapp/app/core/login/login.service.ts @@ -0,0 +1,21 @@ +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; +import { flatMap } from 'rxjs/operators'; + +import { Account } from 'app/core/user/account.model'; +import { AccountService } from 'app/core/auth/account.service'; +import { AuthServerProvider } from 'app/core/auth/auth-jwt.service'; +import { Login } from './login.model'; + +@Injectable({ providedIn: 'root' }) +export class LoginService { + constructor(private accountService: AccountService, private authServerProvider: AuthServerProvider) {} + + login(credentials: Login): Observable<Account | null> { + return this.authServerProvider.login(credentials).pipe(flatMap(() => this.accountService.identity(true))); + } + + logout(): void { + this.authServerProvider.logout().subscribe(null, null, () => this.accountService.authenticate(null)); + } +} diff --git a/borestop/src/main/webapp/app/core/user/account.model.ts b/borestop/src/main/webapp/app/core/user/account.model.ts new file mode 100644 index 00000000..4d2c8333 --- /dev/null +++ b/borestop/src/main/webapp/app/core/user/account.model.ts @@ -0,0 +1,12 @@ +export class Account { + constructor( + public activated: boolean, + public authorities: string[], + public email: string, + public firstName: string, + public langKey: string, + public lastName: string, + public login: string, + public imageUrl: string + ) {} +} diff --git a/borestop/src/main/webapp/app/core/user/user.model.ts b/borestop/src/main/webapp/app/core/user/user.model.ts new file mode 100644 index 00000000..585f7edd --- /dev/null +++ b/borestop/src/main/webapp/app/core/user/user.model.ts @@ -0,0 +1,33 @@ +export interface IUser { + id?: any; + login?: string; + firstName?: string; + lastName?: string; + email?: string; + activated?: boolean; + langKey?: string; + authorities?: string[]; + createdBy?: string; + createdDate?: Date; + lastModifiedBy?: string; + lastModifiedDate?: Date; + password?: string; +} + +export class User implements IUser { + constructor( + public id?: any, + public login?: string, + public firstName?: string, + public lastName?: string, + public email?: string, + public activated?: boolean, + public langKey?: string, + public authorities?: string[], + public createdBy?: string, + public createdDate?: Date, + public lastModifiedBy?: string, + public lastModifiedDate?: Date, + public password?: string + ) {} +} diff --git a/borestop/src/main/webapp/app/core/user/user.service.ts b/borestop/src/main/webapp/app/core/user/user.service.ts new file mode 100644 index 00000000..b5987698 --- /dev/null +++ b/borestop/src/main/webapp/app/core/user/user.service.ts @@ -0,0 +1,39 @@ +import { Injectable } from '@angular/core'; +import { HttpClient, HttpResponse } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +import { SERVER_API_URL } from 'app/app.constants'; +import { createRequestOption, Pagination } from 'app/shared/util/request-util'; +import { IUser } from './user.model'; + +@Injectable({ providedIn: 'root' }) +export class UserService { + public resourceUrl = SERVER_API_URL + 'api/users'; + + constructor(private http: HttpClient) {} + + create(user: IUser): Observable<IUser> { + return this.http.post<IUser>(this.resourceUrl, user); + } + + update(user: IUser): Observable<IUser> { + return this.http.put<IUser>(this.resourceUrl, user); + } + + find(login: string): Observable<IUser> { + return this.http.get<IUser>(`${this.resourceUrl}/${login}`); + } + + query(req?: Pagination): Observable<HttpResponse<IUser[]>> { + const options = createRequestOption(req); + return this.http.get<IUser[]>(this.resourceUrl, { params: options, observe: 'response' }); + } + + delete(login: string): Observable<{}> { + return this.http.delete(`${this.resourceUrl}/${login}`); + } + + authorities(): Observable<string[]> { + return this.http.get<string[]>(SERVER_API_URL + 'api/users/authorities'); + } +} diff --git a/borestop/src/main/webapp/app/entities/entity.module.ts b/borestop/src/main/webapp/app/entities/entity.module.ts new file mode 100644 index 00000000..efd5534c --- /dev/null +++ b/borestop/src/main/webapp/app/entities/entity.module.ts @@ -0,0 +1,11 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + /* jhipster-needle-add-entity-route - JHipster will add entity modules routes here */ + ]) + ] +}) +export class BorestopEntityModule {} diff --git a/borestop/src/main/webapp/app/home/home.component.html b/borestop/src/main/webapp/app/home/home.component.html new file mode 100644 index 00000000..0f54094b --- /dev/null +++ b/borestop/src/main/webapp/app/home/home.component.html @@ -0,0 +1,44 @@ +<div class="row"> + <div class="col-md-3"> + <span class="hipster img-fluid rounded"></span> + </div> + + <div class="col-md-9"> + <h1 class="display-4" jhiTranslate="home.title">Welcome, Java Hipster!</h1> + + <p class="lead" jhiTranslate="home.subtitle">This is your homepage</p> + + <div [ngSwitch]="isAuthenticated()"> + <div class="alert alert-success" *ngSwitchCase="true"> + <span id="home-logged-message" *ngIf="account" jhiTranslate="home.logged.message" + [translateValues]="{ username: account.login }">You are logged in as user "{{ account.login }}".</span> + </div> + + <div class="alert alert-warning" *ngSwitchCase="false"> + <span jhiTranslate="global.messages.info.authenticated.prefix">If you want to </span> + <a class="alert-link" (click)="login()" jhiTranslate="global.messages.info.authenticated.link">sign in</a><span jhiTranslate="global.messages.info.authenticated.suffix">, you can try the default accounts:<br/>- Administrator (login="admin" and password="admin") <br/>- User (login="user" and password="user").</span> + </div> + + <div class="alert alert-warning" *ngSwitchCase="false"> + <span jhiTranslate="global.messages.info.register.noaccount">You don't have an account yet?</span> + <a class="alert-link" routerLink="account/register" jhiTranslate="global.messages.info.register.link">Register a new account</a> + </div> + </div> + + <p jhiTranslate="home.question"> + If you have any question on JHipster: + </p> + + <ul> + <li><a href="https://www.jhipster.tech/" target="_blank" rel="noopener noreferrer" jhiTranslate="home.link.homepage">JHipster homepage</a></li> + <li><a href="http://stackoverflow.com/tags/jhipster/info" target="_blank" rel="noopener noreferrer" jhiTranslate="home.link.stackoverflow">JHipster on Stack Overflow</a></li> + <li><a href="https://github.com/jhipster/generator-jhipster/issues?state=open" target="_blank" rel="noopener noreferrer" jhiTranslate="home.link.bugtracker">JHipster bug tracker</a></li> + <li><a href="https://gitter.im/jhipster/generator-jhipster" target="_blank" rel="noopener noreferrer" jhiTranslate="home.link.chat">JHipster public chat room</a></li> + <li><a href="https://twitter.com/jhipster" target="_blank" rel="noopener noreferrer" jhiTranslate="home.link.follow">follow @jhipster on Twitter</a></li> + </ul> + + <p> + <span jhiTranslate="home.like">If you like JHipster, don't forget to give us a star on</span> <a href="https://github.com/jhipster/generator-jhipster" target="_blank" rel="noopener noreferrer" jhiTranslate="home.github">GitHub</a>! + </p> + </div> +</div> diff --git a/borestop/src/main/webapp/app/home/home.component.ts b/borestop/src/main/webapp/app/home/home.component.ts new file mode 100644 index 00000000..d6f4469b --- /dev/null +++ b/borestop/src/main/webapp/app/home/home.component.ts @@ -0,0 +1,36 @@ +import { Component, OnInit, OnDestroy } from '@angular/core'; +import { Subscription } from 'rxjs'; + +import { LoginModalService } from 'app/core/login/login-modal.service'; +import { AccountService } from 'app/core/auth/account.service'; +import { Account } from 'app/core/user/account.model'; + +@Component({ + selector: 'jhi-home', + templateUrl: './home.component.html', + styleUrls: ['home.scss'] +}) +export class HomeComponent implements OnInit, OnDestroy { + account: Account | null = null; + authSubscription?: Subscription; + + constructor(private accountService: AccountService, private loginModalService: LoginModalService) {} + + ngOnInit(): void { + this.authSubscription = this.accountService.getAuthenticationState().subscribe(account => (this.account = account)); + } + + isAuthenticated(): boolean { + return this.accountService.isAuthenticated(); + } + + login(): void { + this.loginModalService.open(); + } + + ngOnDestroy(): void { + if (this.authSubscription) { + this.authSubscription.unsubscribe(); + } + } +} diff --git a/borestop/src/main/webapp/app/home/home.module.ts b/borestop/src/main/webapp/app/home/home.module.ts new file mode 100644 index 00000000..3cf8ccff --- /dev/null +++ b/borestop/src/main/webapp/app/home/home.module.ts @@ -0,0 +1,12 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import { BorestopSharedModule } from 'app/shared/shared.module'; +import { HOME_ROUTE } from './home.route'; +import { HomeComponent } from './home.component'; + +@NgModule({ + imports: [BorestopSharedModule, RouterModule.forChild([HOME_ROUTE])], + declarations: [HomeComponent] +}) +export class BorestopHomeModule {} diff --git a/borestop/src/main/webapp/app/home/home.route.ts b/borestop/src/main/webapp/app/home/home.route.ts new file mode 100644 index 00000000..aefa2b7e --- /dev/null +++ b/borestop/src/main/webapp/app/home/home.route.ts @@ -0,0 +1,12 @@ +import { Route } from '@angular/router'; + +import { HomeComponent } from './home.component'; + +export const HOME_ROUTE: Route = { + path: '', + component: HomeComponent, + data: { + authorities: [], + pageTitle: 'home.title' + } +}; diff --git a/borestop/src/main/webapp/app/home/home.scss b/borestop/src/main/webapp/app/home/home.scss new file mode 100644 index 00000000..066c9aa8 --- /dev/null +++ b/borestop/src/main/webapp/app/home/home.scss @@ -0,0 +1,23 @@ +/* ========================================================================== +Main page styles +========================================================================== */ + +.hipster { + display: inline-block; + width: 347px; + height: 497px; + background: url('../../content/images/jhipster_family_member_2.svg') no-repeat center top; + background-size: contain; +} + +/* wait autoprefixer update to allow simple generation of high pixel density media query */ +@media only screen and (-webkit-min-device-pixel-ratio: 2), + only screen and (-moz-min-device-pixel-ratio: 2), + only screen and (-o-min-device-pixel-ratio: 2/1), + only screen and (min-resolution: 192dpi), + only screen and (min-resolution: 2dppx) { + .hipster { + background: url('../../content/images/jhipster_family_member_2.svg') no-repeat center top; + background-size: contain; + } +} diff --git a/borestop/src/main/webapp/app/layouts/error/error.component.html b/borestop/src/main/webapp/app/layouts/error/error.component.html new file mode 100644 index 00000000..b51ae9d0 --- /dev/null +++ b/borestop/src/main/webapp/app/layouts/error/error.component.html @@ -0,0 +1,15 @@ +<div> + <div class="row"> + <div class="col-md-4"> + <span class="hipster img-fluid rounded"></span> + </div> + + <div class="col-md-8"> + <h1 jhiTranslate="error.title">Error Page!</h1> + + <div *ngIf="errorMessage"> + <div class="alert alert-danger">{{ errorMessage }}</div> + </div> + </div> + </div> +</div> diff --git a/borestop/src/main/webapp/app/layouts/error/error.component.ts b/borestop/src/main/webapp/app/layouts/error/error.component.ts new file mode 100644 index 00000000..cb3dfe2a --- /dev/null +++ b/borestop/src/main/webapp/app/layouts/error/error.component.ts @@ -0,0 +1,39 @@ +import { Component, OnInit, OnDestroy } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { Subscription } from 'rxjs'; +import { TranslateService } from '@ngx-translate/core'; + +@Component({ + selector: 'jhi-error', + templateUrl: './error.component.html' +}) +export class ErrorComponent implements OnInit, OnDestroy { + errorMessage?: string; + errorKey?: string; + langChangeSubscription?: Subscription; + + constructor(private translateService: TranslateService, private route: ActivatedRoute) {} + + ngOnInit(): void { + this.route.data.subscribe(routeData => { + if (routeData.errorMessage) { + this.errorKey = routeData.errorMessage; + this.getErrorMessageTranslation(); + this.langChangeSubscription = this.translateService.onLangChange.subscribe(() => this.getErrorMessageTranslation()); + } + }); + } + + ngOnDestroy(): void { + if (this.langChangeSubscription) { + this.langChangeSubscription.unsubscribe(); + } + } + + private getErrorMessageTranslation(): void { + this.errorMessage = ''; + if (this.errorKey) { + this.translateService.get(this.errorKey).subscribe(translatedErrorMessage => (this.errorMessage = translatedErrorMessage)); + } + } +} diff --git a/borestop/src/main/webapp/app/layouts/error/error.route.ts b/borestop/src/main/webapp/app/layouts/error/error.route.ts new file mode 100644 index 00000000..4828cc7d --- /dev/null +++ b/borestop/src/main/webapp/app/layouts/error/error.route.ts @@ -0,0 +1,36 @@ +import { Routes } from '@angular/router'; + +import { ErrorComponent } from './error.component'; + +export const errorRoute: Routes = [ + { + path: 'error', + component: ErrorComponent, + data: { + authorities: [], + pageTitle: 'error.title' + } + }, + { + path: 'accessdenied', + component: ErrorComponent, + data: { + authorities: [], + pageTitle: 'error.title', + errorMessage: 'error.http.403' + } + }, + { + path: '404', + component: ErrorComponent, + data: { + authorities: [], + pageTitle: 'error.title', + errorMessage: 'error.http.404' + } + }, + { + path: '**', + redirectTo: '/404' + } +]; diff --git a/borestop/src/main/webapp/app/layouts/footer/footer.component.html b/borestop/src/main/webapp/app/layouts/footer/footer.component.html new file mode 100644 index 00000000..9312ad06 --- /dev/null +++ b/borestop/src/main/webapp/app/layouts/footer/footer.component.html @@ -0,0 +1,3 @@ +<div class="footer"> + <p jhiTranslate="footer">This is your footer</p> +</div> diff --git a/borestop/src/main/webapp/app/layouts/footer/footer.component.ts b/borestop/src/main/webapp/app/layouts/footer/footer.component.ts new file mode 100644 index 00000000..ac9a85ec --- /dev/null +++ b/borestop/src/main/webapp/app/layouts/footer/footer.component.ts @@ -0,0 +1,7 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'jhi-footer', + templateUrl: './footer.component.html' +}) +export class FooterComponent {} diff --git a/borestop/src/main/webapp/app/layouts/main/main.component.html b/borestop/src/main/webapp/app/layouts/main/main.component.html new file mode 100644 index 00000000..d8bcc221 --- /dev/null +++ b/borestop/src/main/webapp/app/layouts/main/main.component.html @@ -0,0 +1,13 @@ +<jhi-page-ribbon></jhi-page-ribbon> + +<div> + <router-outlet name="navbar"></router-outlet> +</div> + +<div class="container-fluid"> + <div class="card jh-card"> + <router-outlet></router-outlet> + </div> + + <jhi-footer></jhi-footer> +</div> diff --git a/borestop/src/main/webapp/app/layouts/main/main.component.ts b/borestop/src/main/webapp/app/layouts/main/main.component.ts new file mode 100644 index 00000000..0c1b2115 --- /dev/null +++ b/borestop/src/main/webapp/app/layouts/main/main.component.ts @@ -0,0 +1,60 @@ +import { Component, OnInit, RendererFactory2, Renderer2 } from '@angular/core'; +import { Title } from '@angular/platform-browser'; +import { Router, ActivatedRouteSnapshot, NavigationEnd, NavigationError } from '@angular/router'; +import { TranslateService, LangChangeEvent } from '@ngx-translate/core'; + +import { AccountService } from 'app/core/auth/account.service'; + +@Component({ + selector: 'jhi-main', + templateUrl: './main.component.html' +}) +export class MainComponent implements OnInit { + private renderer: Renderer2; + + constructor( + private accountService: AccountService, + private titleService: Title, + private router: Router, + private translateService: TranslateService, + rootRenderer: RendererFactory2 + ) { + this.renderer = rootRenderer.createRenderer(document.querySelector('html'), null); + } + + ngOnInit(): void { + // try to log in automatically + this.accountService.identity().subscribe(); + + this.router.events.subscribe(event => { + if (event instanceof NavigationEnd) { + this.updateTitle(); + } + if (event instanceof NavigationError && event.error.status === 404) { + this.router.navigate(['/404']); + } + }); + + this.translateService.onLangChange.subscribe((langChangeEvent: LangChangeEvent) => { + this.updateTitle(); + + this.renderer.setAttribute(document.querySelector('html'), 'lang', langChangeEvent.lang); + }); + } + + private getPageTitle(routeSnapshot: ActivatedRouteSnapshot): string { + let title: string = routeSnapshot.data && routeSnapshot.data['pageTitle'] ? routeSnapshot.data['pageTitle'] : ''; + if (routeSnapshot.firstChild) { + title = this.getPageTitle(routeSnapshot.firstChild) || title; + } + return title; + } + + private updateTitle(): void { + let pageTitle = this.getPageTitle(this.router.routerState.snapshot.root); + if (!pageTitle) { + pageTitle = 'global.title'; + } + this.translateService.get(pageTitle).subscribe(title => this.titleService.setTitle(title)); + } +} diff --git a/borestop/src/main/webapp/app/layouts/navbar/active-menu.directive.ts b/borestop/src/main/webapp/app/layouts/navbar/active-menu.directive.ts new file mode 100644 index 00000000..7e2a2f9d --- /dev/null +++ b/borestop/src/main/webapp/app/layouts/navbar/active-menu.directive.ts @@ -0,0 +1,27 @@ +import { Directive, OnInit, ElementRef, Renderer2, Input } from '@angular/core'; +import { TranslateService, LangChangeEvent } from '@ngx-translate/core'; + +@Directive({ + selector: '[jhiActiveMenu]' +}) +export class ActiveMenuDirective implements OnInit { + @Input() jhiActiveMenu?: string; + + constructor(private el: ElementRef, private renderer: Renderer2, private translateService: TranslateService) {} + + ngOnInit(): void { + this.translateService.onLangChange.subscribe((event: LangChangeEvent) => { + this.updateActiveFlag(event.lang); + }); + + this.updateActiveFlag(this.translateService.currentLang); + } + + updateActiveFlag(selectedLanguage: string): void { + if (this.jhiActiveMenu === selectedLanguage) { + this.renderer.addClass(this.el.nativeElement, 'active'); + } else { + this.renderer.removeClass(this.el.nativeElement, 'active'); + } + } +} diff --git a/borestop/src/main/webapp/app/layouts/navbar/navbar.component.html b/borestop/src/main/webapp/app/layouts/navbar/navbar.component.html new file mode 100644 index 00000000..9661ba9a --- /dev/null +++ b/borestop/src/main/webapp/app/layouts/navbar/navbar.component.html @@ -0,0 +1,152 @@ +<nav class="navbar navbar-dark navbar-expand-md bg-dark"> + <a class="navbar-brand logo" routerLink="/" (click)="collapseNavbar()"> + <span class="logo-img"></span> + <span jhiTranslate="global.title" class="navbar-title">Borestop</span> <span class="navbar-version">{{ version }}</span> + </a> + <a class="navbar-toggler d-lg-none" href="javascript:void(0);" data-toggle="collapse" data-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation" (click)="toggleNavbar()"> + <fa-icon icon="bars"></fa-icon> + </a> + <div class="navbar-collapse collapse" id="navbarResponsive" [ngbCollapse]="isNavbarCollapsed" [ngSwitch]="isAuthenticated()"> + <ul class="navbar-nav ml-auto"> + <li class="nav-item" routerLinkActive="active" [routerLinkActiveOptions]="{ exact: true }"> + <a class="nav-link" routerLink="/" (click)="collapseNavbar()"> + <span> + <fa-icon icon="home"></fa-icon> + <span jhiTranslate="global.menu.home">Home</span> + </span> + </a> + </li> + <!-- jhipster-needle-add-element-to-menu - JHipster will add new menu items here --> + <li *ngSwitchCase="true" ngbDropdown class="nav-item dropdown pointer" display="dynamic" routerLinkActive="active" [routerLinkActiveOptions]="{ exact: true }"> + <a class="nav-link dropdown-toggle" ngbDropdownToggle href="javascript:void(0);" id="entity-menu"> + <span> + <fa-icon icon="th-list"></fa-icon> + <span jhiTranslate="global.menu.entities.main"> + Entities + </span> + </span> + </a> + <ul class="dropdown-menu" ngbDropdownMenu aria-labelledby="entity-menu"> + <!-- jhipster-needle-add-entity-to-menu - JHipster will add entities to the menu here --> + </ul> + </li> + <li *jhiHasAnyAuthority="'ROLE_ADMIN'" ngbDropdown class="nav-item dropdown pointer" display="dynamic" routerLinkActive="active" [routerLinkActiveOptions]="{ exact: true }"> + <a class="nav-link dropdown-toggle" ngbDropdownToggle href="javascript:void(0);" id="admin-menu"> + <span> + <fa-icon icon="user-plus"></fa-icon> + <span jhiTranslate="global.menu.admin.main">Administration</span> + </span> + </a> + <ul class="dropdown-menu" ngbDropdownMenu aria-labelledby="admin-menu"> + <li> + <a class="dropdown-item" routerLink="admin/user-management" routerLinkActive="active" (click)="collapseNavbar()"> + <fa-icon icon="user" [fixedWidth]="true"></fa-icon> + <span jhiTranslate="global.menu.admin.userManagement">User management</span> + </a> + </li> + <li> + <a class="dropdown-item" routerLink="admin/metrics" routerLinkActive="active" (click)="collapseNavbar()"> + <fa-icon icon="tachometer-alt" [fixedWidth]="true"></fa-icon> + <span jhiTranslate="global.menu.admin.metrics">Metrics</span> + </a> + </li> + <li> + <a class="dropdown-item" routerLink="admin/health" routerLinkActive="active" (click)="collapseNavbar()"> + <fa-icon icon="heart" [fixedWidth]="true"></fa-icon> + <span jhiTranslate="global.menu.admin.health">Health</span> + </a> + </li> + <li> + <a class="dropdown-item" routerLink="admin/configuration" routerLinkActive="active" (click)="collapseNavbar()"> + <fa-icon icon="list" [fixedWidth]="true"></fa-icon> + <span jhiTranslate="global.menu.admin.configuration">Configuration</span> + </a> + </li> + <li> + <a class="dropdown-item" routerLink="admin/audits" routerLinkActive="active" (click)="collapseNavbar()"> + <fa-icon icon="bell" [fixedWidth]="true"></fa-icon> + <span jhiTranslate="global.menu.admin.audits">Audits</span> + </a> + </li> + <li> + <a class="dropdown-item" routerLink="admin/logs" routerLinkActive="active" (click)="collapseNavbar()"> + <fa-icon icon="tasks" [fixedWidth]="true"></fa-icon> + <span jhiTranslate="global.menu.admin.logs">Logs</span> + </a> + </li> + <li *ngIf="swaggerEnabled"> + <a class="dropdown-item" routerLink="admin/docs" routerLinkActive="active" (click)="collapseNavbar()"> + <fa-icon icon="book" [fixedWidth]="true"></fa-icon> + <span jhiTranslate="global.menu.admin.apidocs">API</span> + </a> + </li> + <!-- jhipster-needle-add-element-to-admin-menu - JHipster will add entities to the admin menu here --> + <li *ngIf="!inProduction"> + <a class="dropdown-item" href='./h2-console' target="_tab" (click)="collapseNavbar()"> + <fa-icon icon="hdd" [fixedWidth]="true"></fa-icon> + <span jhiTranslate="global.menu.admin.database">Database</span> + </a> + </li> + </ul> + </li> + <li ngbDropdown class="nav-item dropdown pointer" display="dynamic" *ngIf="languages && languages.length > 1"> + <a class="nav-link dropdown-toggle" ngbDropdownToggle href="javascript:void(0);" id="languagesnavBarDropdown"> + <span> + <fa-icon icon="flag"></fa-icon> + <span jhiTranslate="global.menu.language">Language</span> + </span> + </a> + <ul class="dropdown-menu" ngbDropdownMenu aria-labelledby="languagesnavBarDropdown"> + <li *ngFor="let language of languages"> + <a class="dropdown-item" [jhiActiveMenu]="language" href="javascript:void(0);" (click)="changeLanguage(language);collapseNavbar();">{{ language | findLanguageFromKey }}</a> + </li> + </ul> + </li> + <li ngbDropdown class="nav-item dropdown pointer" display="dynamic" routerLinkActive="active" [routerLinkActiveOptions]="{ exact: true }"> + <a class="nav-link dropdown-toggle" ngbDropdownToggle href="javascript:void(0);" id="account-menu"> + <span *ngIf="!getImageUrl()"> + <fa-icon icon="user"></fa-icon> + <span jhiTranslate="global.menu.account.main"> + Account + </span> + </span> + <span *ngIf="getImageUrl()"> + <img [src]="getImageUrl()" class="profile-image rounded-circle" alt="Avatar"> + </span> + </a> + <ul class="dropdown-menu" ngbDropdownMenu aria-labelledby="account-menu"> + <li *ngSwitchCase="true"> + <a class="dropdown-item" routerLink="account/settings" routerLinkActive="active" (click)="collapseNavbar()"> + <fa-icon icon="wrench" [fixedWidth]="true"></fa-icon> + <span jhiTranslate="global.menu.account.settings">Settings</span> + </a> + </li> + <li *ngSwitchCase="true"> + <a class="dropdown-item" routerLink="account/password" routerLinkActive="active" (click)="collapseNavbar()"> + <fa-icon icon="lock" [fixedWidth]="true"></fa-icon> + <span jhiTranslate="global.menu.account.password">Password</span> + </a> + </li> + <li *ngSwitchCase="true"> + <a class="dropdown-item" (click)="logout()" id="logout"> + <fa-icon icon="sign-out-alt" [fixedWidth]="true"></fa-icon> + <span jhiTranslate="global.menu.account.logout">Sign out</span> + </a> + </li> + <li *ngSwitchCase="false"> + <a class="dropdown-item" (click)="login()" id="login"> + <fa-icon icon="sign-in-alt" [fixedWidth]="true"></fa-icon> + <span jhiTranslate="global.menu.account.login">Sign in</span> + </a> + </li> + <li *ngSwitchCase="false"> + <a class="dropdown-item" routerLink="account/register" routerLinkActive="active" (click)="collapseNavbar()"> + <fa-icon icon="user-plus" [fixedWidth]="true"></fa-icon> + <span jhiTranslate="global.menu.account.register">Register</span> + </a> + </li> + </ul> + </li> + </ul> + </div> +</nav> diff --git a/borestop/src/main/webapp/app/layouts/navbar/navbar.component.ts b/borestop/src/main/webapp/app/layouts/navbar/navbar.component.ts new file mode 100644 index 00000000..52f8bafb --- /dev/null +++ b/borestop/src/main/webapp/app/layouts/navbar/navbar.component.ts @@ -0,0 +1,74 @@ +import { Component, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; +import { JhiLanguageService } from 'ng-jhipster'; +import { SessionStorageService } from 'ngx-webstorage'; + +import { VERSION } from 'app/app.constants'; +import { LANGUAGES } from 'app/core/language/language.constants'; +import { AccountService } from 'app/core/auth/account.service'; +import { LoginModalService } from 'app/core/login/login-modal.service'; +import { LoginService } from 'app/core/login/login.service'; +import { ProfileService } from 'app/layouts/profiles/profile.service'; + +@Component({ + selector: 'jhi-navbar', + templateUrl: './navbar.component.html', + styleUrls: ['navbar.scss'] +}) +export class NavbarComponent implements OnInit { + inProduction?: boolean; + isNavbarCollapsed = true; + languages = LANGUAGES; + swaggerEnabled?: boolean; + version: string; + + constructor( + private loginService: LoginService, + private languageService: JhiLanguageService, + private sessionStorage: SessionStorageService, + private accountService: AccountService, + private loginModalService: LoginModalService, + private profileService: ProfileService, + private router: Router + ) { + this.version = VERSION ? (VERSION.toLowerCase().startsWith('v') ? VERSION : 'v' + VERSION) : ''; + } + + ngOnInit(): void { + this.profileService.getProfileInfo().subscribe(profileInfo => { + this.inProduction = profileInfo.inProduction; + this.swaggerEnabled = profileInfo.swaggerEnabled; + }); + } + + changeLanguage(languageKey: string): void { + this.sessionStorage.store('locale', languageKey); + this.languageService.changeLanguage(languageKey); + } + + collapseNavbar(): void { + this.isNavbarCollapsed = true; + } + + isAuthenticated(): boolean { + return this.accountService.isAuthenticated(); + } + + login(): void { + this.loginModalService.open(); + } + + logout(): void { + this.collapseNavbar(); + this.loginService.logout(); + this.router.navigate(['']); + } + + toggleNavbar(): void { + this.isNavbarCollapsed = !this.isNavbarCollapsed; + } + + getImageUrl(): string { + return this.isAuthenticated() ? this.accountService.getImageUrl() : ''; + } +} diff --git a/borestop/src/main/webapp/app/layouts/navbar/navbar.route.ts b/borestop/src/main/webapp/app/layouts/navbar/navbar.route.ts new file mode 100644 index 00000000..35191434 --- /dev/null +++ b/borestop/src/main/webapp/app/layouts/navbar/navbar.route.ts @@ -0,0 +1,9 @@ +import { Route } from '@angular/router'; + +import { NavbarComponent } from './navbar.component'; + +export const navbarRoute: Route = { + path: '', + component: NavbarComponent, + outlet: 'navbar' +}; diff --git a/borestop/src/main/webapp/app/layouts/navbar/navbar.scss b/borestop/src/main/webapp/app/layouts/navbar/navbar.scss new file mode 100644 index 00000000..1ff209b7 --- /dev/null +++ b/borestop/src/main/webapp/app/layouts/navbar/navbar.scss @@ -0,0 +1,42 @@ +@import '~bootstrap/scss/functions'; +@import '~bootstrap/scss/variables'; + +/* ========================================================================== +Navbar +========================================================================== */ + +.navbar-version { + font-size: 0.65em; + color: $navbar-dark-color; +} + +.profile-image { + height: 1.75em; + width: 1.75em; +} + +.navbar { + padding: 0.2rem 1rem; + + ul.navbar-nav { + .nav-item { + margin-left: 0.5em; + } + } + + a.nav-link { + font-weight: 400; + } +} + +/* ========================================================================== +Logo styles +========================================================================== */ +.logo-img { + height: 45px; + width: 45px; + display: inline-block; + vertical-align: middle; + background: url('../../../content/images/logo-jhipster.png') no-repeat center center; + background-size: contain; +} diff --git a/borestop/src/main/webapp/app/layouts/profiles/page-ribbon.component.ts b/borestop/src/main/webapp/app/layouts/profiles/page-ribbon.component.ts new file mode 100644 index 00000000..040a82f3 --- /dev/null +++ b/borestop/src/main/webapp/app/layouts/profiles/page-ribbon.component.ts @@ -0,0 +1,23 @@ +import { Component, OnInit } from '@angular/core'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { ProfileService } from './profile.service'; + +@Component({ + selector: 'jhi-page-ribbon', + template: ` + <div class="ribbon" *ngIf="ribbonEnv$ | async as ribbonEnv"> + <a href="" jhiTranslate="global.ribbon.{{ ribbonEnv }}">{{ ribbonEnv }}</a> + </div> + `, + styleUrls: ['page-ribbon.scss'] +}) +export class PageRibbonComponent implements OnInit { + ribbonEnv$?: Observable<string | undefined>; + + constructor(private profileService: ProfileService) {} + + ngOnInit(): void { + this.ribbonEnv$ = this.profileService.getProfileInfo().pipe(map(profileInfo => profileInfo.ribbonEnv)); + } +} diff --git a/borestop/src/main/webapp/app/layouts/profiles/page-ribbon.scss b/borestop/src/main/webapp/app/layouts/profiles/page-ribbon.scss new file mode 100644 index 00000000..a78f2680 --- /dev/null +++ b/borestop/src/main/webapp/app/layouts/profiles/page-ribbon.scss @@ -0,0 +1,31 @@ +/* ========================================================================== +Developement Ribbon +========================================================================== */ +.ribbon { + background-color: rgba(170, 0, 0, 0.5); + left: -3.5em; + -moz-transform: rotate(-45deg); + -ms-transform: rotate(-45deg); + -o-transform: rotate(-45deg); + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); + overflow: hidden; + position: absolute; + top: 40px; + white-space: nowrap; + width: 15em; + z-index: 9999; + pointer-events: none; + opacity: 0.75; + a { + color: #fff; + display: block; + font-weight: 400; + margin: 1px 0; + padding: 10px 50px; + text-align: center; + text-decoration: none; + text-shadow: 0 0 5px #444; + pointer-events: none; + } +} diff --git a/borestop/src/main/webapp/app/layouts/profiles/profile-info.model.ts b/borestop/src/main/webapp/app/layouts/profiles/profile-info.model.ts new file mode 100644 index 00000000..e7763eea --- /dev/null +++ b/borestop/src/main/webapp/app/layouts/profiles/profile-info.model.ts @@ -0,0 +1,15 @@ +export interface InfoResponse { + 'display-ribbon-on-profiles'?: string; + git?: any; + build?: any; + activeProfiles?: string[]; +} + +export class ProfileInfo { + constructor( + public activeProfiles?: string[], + public ribbonEnv?: string, + public inProduction?: boolean, + public swaggerEnabled?: boolean + ) {} +} diff --git a/borestop/src/main/webapp/app/layouts/profiles/profile.service.ts b/borestop/src/main/webapp/app/layouts/profiles/profile.service.ts new file mode 100644 index 00000000..f1512d33 --- /dev/null +++ b/borestop/src/main/webapp/app/layouts/profiles/profile.service.ts @@ -0,0 +1,43 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { map, shareReplay } from 'rxjs/operators'; +import { Observable } from 'rxjs'; + +import { SERVER_API_URL } from 'app/app.constants'; +import { ProfileInfo, InfoResponse } from './profile-info.model'; + +@Injectable({ providedIn: 'root' }) +export class ProfileService { + private infoUrl = SERVER_API_URL + 'management/info'; + private profileInfo$!: Observable<ProfileInfo>; + + constructor(private http: HttpClient) {} + + getProfileInfo(): Observable<ProfileInfo> { + if (this.profileInfo$) { + return this.profileInfo$; + } + + this.profileInfo$ = this.http.get<InfoResponse>(this.infoUrl).pipe( + map((response: InfoResponse) => { + const profileInfo: ProfileInfo = { + activeProfiles: response.activeProfiles, + inProduction: response.activeProfiles && response.activeProfiles.includes('prod'), + swaggerEnabled: response.activeProfiles && response.activeProfiles.includes('swagger') + }; + if (response.activeProfiles && response['display-ribbon-on-profiles']) { + const displayRibbonOnProfiles = response['display-ribbon-on-profiles'].split(','); + const ribbonProfiles = displayRibbonOnProfiles.filter( + profile => response.activeProfiles && response.activeProfiles.includes(profile) + ); + if (ribbonProfiles.length > 0) { + profileInfo.ribbonEnv = ribbonProfiles[0]; + } + } + return profileInfo; + }), + shareReplay() + ); + return this.profileInfo$; + } +} diff --git a/borestop/src/main/webapp/app/polyfills.ts b/borestop/src/main/webapp/app/polyfills.ts new file mode 100644 index 00000000..f8a8d65e --- /dev/null +++ b/borestop/src/main/webapp/app/polyfills.ts @@ -0,0 +1,3 @@ +import 'zone.js/dist/zone'; +import '@angular/localize/init'; +require('../manifest.webapp'); diff --git a/borestop/src/main/webapp/app/shared/alert/alert-error.component.ts b/borestop/src/main/webapp/app/shared/alert/alert-error.component.ts new file mode 100644 index 00000000..7e2fe87f --- /dev/null +++ b/borestop/src/main/webapp/app/shared/alert/alert-error.component.ts @@ -0,0 +1,123 @@ +import { Component, OnDestroy } from '@angular/core'; +import { HttpErrorResponse } from '@angular/common/http'; +import { TranslateService } from '@ngx-translate/core'; +import { JhiEventManager, JhiAlert, JhiAlertService, JhiEventWithContent } from 'ng-jhipster'; +import { Subscription } from 'rxjs'; + +import { AlertError } from './alert-error.model'; + +@Component({ + selector: 'jhi-alert-error', + template: ` + <div class="alerts" role="alert"> + <div *ngFor="let alert of alerts" [ngClass]="setClasses(alert)"> + <ngb-alert *ngIf="alert && alert.type && alert.msg" [type]="alert.type" (close)="close(alert)"> + <pre [innerHTML]="alert.msg"></pre> + </ngb-alert> + </div> + </div> + ` +}) +export class AlertErrorComponent implements OnDestroy { + alerts: JhiAlert[] = []; + errorListener: Subscription; + httpErrorListener: Subscription; + + constructor(private alertService: JhiAlertService, private eventManager: JhiEventManager, translateService: TranslateService) { + this.errorListener = eventManager.subscribe('borestopApp.error', (response: JhiEventWithContent<AlertError>) => { + const errorResponse = response.content; + this.addErrorAlert(errorResponse.message, errorResponse.key, errorResponse.params); + }); + + this.httpErrorListener = eventManager.subscribe('borestopApp.httpError', (response: JhiEventWithContent<HttpErrorResponse>) => { + const httpErrorResponse = response.content; + switch (httpErrorResponse.status) { + // connection refused, server not reachable + case 0: + this.addErrorAlert('Server not reachable', 'error.server.not.reachable'); + break; + + case 400: { + const arr = httpErrorResponse.headers.keys(); + let errorHeader = null; + let entityKey = null; + arr.forEach(entry => { + if (entry.toLowerCase().endsWith('app-error')) { + errorHeader = httpErrorResponse.headers.get(entry); + } else if (entry.toLowerCase().endsWith('app-params')) { + entityKey = httpErrorResponse.headers.get(entry); + } + }); + if (errorHeader) { + const entityName = translateService.instant('global.menu.entities.' + entityKey); + this.addErrorAlert(errorHeader, errorHeader, { entityName }); + } else if (httpErrorResponse.error !== '' && httpErrorResponse.error.fieldErrors) { + const fieldErrors = httpErrorResponse.error.fieldErrors; + for (const fieldError of fieldErrors) { + if (['Min', 'Max', 'DecimalMin', 'DecimalMax'].includes(fieldError.message)) { + fieldError.message = 'Size'; + } + // convert 'something[14].other[4].id' to 'something[].other[].id' so translations can be written to it + const convertedField = fieldError.field.replace(/\[\d*\]/g, '[]'); + const fieldName = translateService.instant('borestopApp.' + fieldError.objectName + '.' + convertedField); + this.addErrorAlert('Error on field "' + fieldName + '"', 'error.' + fieldError.message, { fieldName }); + } + } else if (httpErrorResponse.error !== '' && httpErrorResponse.error.message) { + this.addErrorAlert(httpErrorResponse.error.message, httpErrorResponse.error.message, httpErrorResponse.error.params); + } else { + this.addErrorAlert(httpErrorResponse.error); + } + break; + } + + case 404: + this.addErrorAlert('Not found', 'error.url.not.found'); + break; + + default: + if (httpErrorResponse.error !== '' && httpErrorResponse.error.message) { + this.addErrorAlert(httpErrorResponse.error.message); + } else { + this.addErrorAlert(httpErrorResponse.error); + } + } + }); + } + + setClasses(alert: JhiAlert): { [key: string]: boolean } { + const classes = { 'jhi-toast': Boolean(alert.toast) }; + if (alert.position) { + return { ...classes, [alert.position]: true }; + } + return classes; + } + + ngOnDestroy(): void { + if (this.errorListener) { + this.eventManager.destroy(this.errorListener); + } + if (this.httpErrorListener) { + this.eventManager.destroy(this.httpErrorListener); + } + } + + addErrorAlert(message: string, key?: string, data?: any): void { + message = key && key !== null ? key : message; + + const newAlert: JhiAlert = { + type: 'danger', + msg: message, + params: data, + timeout: 5000, + toast: this.alertService.isToast(), + scoped: true + }; + + this.alerts.push(this.alertService.addAlert(newAlert, this.alerts)); + } + + close(alert: JhiAlert): void { + // NOSONAR can be removed after https://github.com/SonarSource/SonarJS/issues/1930 is resolved + alert.close?.(this.alerts); // NOSONAR + } +} diff --git a/borestop/src/main/webapp/app/shared/alert/alert-error.model.ts b/borestop/src/main/webapp/app/shared/alert/alert-error.model.ts new file mode 100644 index 00000000..e76241a2 --- /dev/null +++ b/borestop/src/main/webapp/app/shared/alert/alert-error.model.ts @@ -0,0 +1,3 @@ +export class AlertError { + constructor(public message: string, public key?: string, public params?: any) {} +} diff --git a/borestop/src/main/webapp/app/shared/alert/alert.component.ts b/borestop/src/main/webapp/app/shared/alert/alert.component.ts new file mode 100644 index 00000000..3cc5bbc7 --- /dev/null +++ b/borestop/src/main/webapp/app/shared/alert/alert.component.ts @@ -0,0 +1,41 @@ +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { JhiAlertService, JhiAlert } from 'ng-jhipster'; + +@Component({ + selector: 'jhi-alert', + template: ` + <div class="alerts" role="alert"> + <div *ngFor="let alert of alerts" [ngClass]="setClasses(alert)"> + <ngb-alert *ngIf="alert && alert.type && alert.msg" [type]="alert.type" (close)="close(alert)"> + <pre [innerHTML]="alert.msg"></pre> + </ngb-alert> + </div> + </div> + ` +}) +export class AlertComponent implements OnInit, OnDestroy { + alerts: JhiAlert[] = []; + + constructor(private alertService: JhiAlertService) {} + + ngOnInit(): void { + this.alerts = this.alertService.get(); + } + + setClasses(alert: JhiAlert): { [key: string]: boolean } { + const classes = { 'jhi-toast': Boolean(alert.toast) }; + if (alert.position) { + return { ...classes, [alert.position]: true }; + } + return classes; + } + + ngOnDestroy(): void { + this.alertService.clear(); + } + + close(alert: JhiAlert): void { + // NOSONAR can be removed after https://github.com/SonarSource/SonarJS/issues/1930 is resolved + alert.close?.(this.alerts); // NOSONAR + } +} diff --git a/borestop/src/main/webapp/app/shared/auth/has-any-authority.directive.ts b/borestop/src/main/webapp/app/shared/auth/has-any-authority.directive.ts new file mode 100644 index 00000000..568c81c4 --- /dev/null +++ b/borestop/src/main/webapp/app/shared/auth/has-any-authority.directive.ts @@ -0,0 +1,47 @@ +import { Directive, Input, TemplateRef, ViewContainerRef, OnDestroy } from '@angular/core'; +import { Subscription } from 'rxjs'; + +import { AccountService } from 'app/core/auth/account.service'; + +/** + * @whatItDoes Conditionally includes an HTML element if current user has any + * of the authorities passed as the `expression`. + * + * @howToUse + * ``` + * <some-element *jhiHasAnyAuthority="'ROLE_ADMIN'">...</some-element> + * + * <some-element *jhiHasAnyAuthority="['ROLE_ADMIN', 'ROLE_USER']">...</some-element> + * ``` + */ +@Directive({ + selector: '[jhiHasAnyAuthority]' +}) +export class HasAnyAuthorityDirective implements OnDestroy { + private authorities: string[] = []; + private authenticationSubscription?: Subscription; + + constructor(private accountService: AccountService, private templateRef: TemplateRef<any>, private viewContainerRef: ViewContainerRef) {} + + @Input() + set jhiHasAnyAuthority(value: string | string[]) { + this.authorities = typeof value === 'string' ? [value] : value; + this.updateView(); + // Get notified each time authentication state changes. + this.authenticationSubscription = this.accountService.getAuthenticationState().subscribe(() => this.updateView()); + } + + ngOnDestroy(): void { + if (this.authenticationSubscription) { + this.authenticationSubscription.unsubscribe(); + } + } + + private updateView(): void { + const hasAnyAuthority = this.accountService.hasAnyAuthority(this.authorities); + this.viewContainerRef.clear(); + if (hasAnyAuthority) { + this.viewContainerRef.createEmbeddedView(this.templateRef); + } + } +} diff --git a/borestop/src/main/webapp/app/shared/constants/authority.constants.ts b/borestop/src/main/webapp/app/shared/constants/authority.constants.ts new file mode 100644 index 00000000..9f672ce7 --- /dev/null +++ b/borestop/src/main/webapp/app/shared/constants/authority.constants.ts @@ -0,0 +1,4 @@ +export enum Authority { + ADMIN = 'ROLE_ADMIN', + USER = 'ROLE_USER' +} diff --git a/borestop/src/main/webapp/app/shared/constants/error.constants.ts b/borestop/src/main/webapp/app/shared/constants/error.constants.ts new file mode 100644 index 00000000..42d91d97 --- /dev/null +++ b/borestop/src/main/webapp/app/shared/constants/error.constants.ts @@ -0,0 +1,3 @@ +export const PROBLEM_BASE_URL = 'https://www.jhipster.tech/problem'; +export const EMAIL_ALREADY_USED_TYPE = PROBLEM_BASE_URL + '/email-already-used'; +export const LOGIN_ALREADY_USED_TYPE = PROBLEM_BASE_URL + '/login-already-used'; diff --git a/borestop/src/main/webapp/app/shared/constants/input.constants.ts b/borestop/src/main/webapp/app/shared/constants/input.constants.ts new file mode 100644 index 00000000..1e3978a9 --- /dev/null +++ b/borestop/src/main/webapp/app/shared/constants/input.constants.ts @@ -0,0 +1,2 @@ +export const DATE_FORMAT = 'YYYY-MM-DD'; +export const DATE_TIME_FORMAT = 'YYYY-MM-DDTHH:mm'; diff --git a/borestop/src/main/webapp/app/shared/constants/pagination.constants.ts b/borestop/src/main/webapp/app/shared/constants/pagination.constants.ts new file mode 100644 index 00000000..a148d457 --- /dev/null +++ b/borestop/src/main/webapp/app/shared/constants/pagination.constants.ts @@ -0,0 +1 @@ +export const ITEMS_PER_PAGE = 20; diff --git a/borestop/src/main/webapp/app/shared/language/find-language-from-key.pipe.ts b/borestop/src/main/webapp/app/shared/language/find-language-from-key.pipe.ts new file mode 100644 index 00000000..bfefb96d --- /dev/null +++ b/borestop/src/main/webapp/app/shared/language/find-language-from-key.pipe.ts @@ -0,0 +1,13 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ name: 'findLanguageFromKey' }) +export class FindLanguageFromKeyPipe implements PipeTransform { + private languages: { [key: string]: { name: string; rtl?: boolean } } = { + en: { name: 'English' } + // jhipster-needle-i18n-language-key-pipe - JHipster will add/remove languages in this object + }; + + transform(lang: string): string { + return this.languages[lang].name; + } +} diff --git a/borestop/src/main/webapp/app/shared/login/login.component.html b/borestop/src/main/webapp/app/shared/login/login.component.html new file mode 100644 index 00000000..dcd23c13 --- /dev/null +++ b/borestop/src/main/webapp/app/shared/login/login.component.html @@ -0,0 +1,51 @@ +<div class="modal-header"> + <h4 class="modal-title" jhiTranslate="login.title">Sign in</h4> + + <button aria-label="Close" data-dismiss="modal" class="close" type="button" (click)="activeModal.dismiss('closed')"> + <span aria-hidden="true">x</span> + </button> +</div> + +<div class="modal-body"> + <div class="row justify-content-center"> + <div class="col-md-8"> + <div class="alert alert-danger" *ngIf="authenticationError" jhiTranslate="login.messages.error.authentication"> + <strong>Failed to sign in!</strong> Please check your credentials and try again. + </div> + </div> + + <div class="col-md-8"> + <form class="form" role="form" (ngSubmit)="login()" [formGroup]="loginForm"> + <div class="form-group"> + <label class="username-label" for="username" jhiTranslate="global.form.username.label">Login</label> + <input type="text" class="form-control" name="username" id="username" placeholder="{{ 'global.form.username.placeholder' | translate }}" + formControlName="username" #username> + </div> + + <div class="form-group"> + <label for="password" jhiTranslate="login.form.password">Password</label> + <input type="password" class="form-control" name="password" id="password" placeholder="{{ 'login.form.password.placeholder' | translate }}" + formControlName="password"> + </div> + + <div class="form-check"> + <label class="form-check-label" for="rememberMe"> + <input class="form-check-input" type="checkbox" name="rememberMe" id="rememberMe" formControlName="rememberMe"> + <span jhiTranslate="login.form.rememberme">Remember me</span> + </label> + </div> + + <button type="submit" class="btn btn-primary" jhiTranslate="login.form.button">Sign in</button> + </form> + + <div class="mt-3 alert alert-warning"> + <a class="alert-link" (click)="requestResetPassword()" jhiTranslate="login.password.forgot">Did you forget your password?</a> + </div> + + <div class="alert alert-warning"> + <span jhiTranslate="global.messages.info.register.noaccount">You don't have an account yet?</span> + <a class="alert-link" (click)="register()" jhiTranslate="global.messages.info.register.link">Register a new account</a> + </div> + </div> + </div> +</div> diff --git a/borestop/src/main/webapp/app/shared/login/login.component.ts b/borestop/src/main/webapp/app/shared/login/login.component.ts new file mode 100644 index 00000000..9fffdae9 --- /dev/null +++ b/borestop/src/main/webapp/app/shared/login/login.component.ts @@ -0,0 +1,73 @@ +import { Component, AfterViewInit, ElementRef, ViewChild } from '@angular/core'; +import { FormBuilder } from '@angular/forms'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; +import { Router } from '@angular/router'; + +import { LoginService } from 'app/core/login/login.service'; + +@Component({ + selector: 'jhi-login-modal', + templateUrl: './login.component.html' +}) +export class LoginModalComponent implements AfterViewInit { + @ViewChild('username', { static: false }) + username?: ElementRef; + + authenticationError = false; + + loginForm = this.fb.group({ + username: [''], + password: [''], + rememberMe: [false] + }); + + constructor(private loginService: LoginService, private router: Router, public activeModal: NgbActiveModal, private fb: FormBuilder) {} + + ngAfterViewInit(): void { + if (this.username) { + this.username.nativeElement.focus(); + } + } + + cancel(): void { + this.authenticationError = false; + this.loginForm.patchValue({ + username: '', + password: '' + }); + this.activeModal.dismiss('cancel'); + } + + login(): void { + this.loginService + .login({ + username: this.loginForm.get('username')!.value, + password: this.loginForm.get('password')!.value, + rememberMe: this.loginForm.get('rememberMe')!.value + }) + .subscribe( + () => { + this.authenticationError = false; + this.activeModal.close(); + if ( + this.router.url === '/account/register' || + this.router.url.startsWith('/account/activate') || + this.router.url.startsWith('/account/reset/') + ) { + this.router.navigate(['']); + } + }, + () => (this.authenticationError = true) + ); + } + + register(): void { + this.activeModal.dismiss('to state register'); + this.router.navigate(['/account/register']); + } + + requestResetPassword(): void { + this.activeModal.dismiss('to state requestReset'); + this.router.navigate(['/account/reset', 'request']); + } +} diff --git a/borestop/src/main/webapp/app/shared/shared-libs.module.ts b/borestop/src/main/webapp/app/shared/shared-libs.module.ts new file mode 100644 index 00000000..8c3e9955 --- /dev/null +++ b/borestop/src/main/webapp/app/shared/shared-libs.module.ts @@ -0,0 +1,22 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; +import { NgJhipsterModule } from 'ng-jhipster'; +import { InfiniteScrollModule } from 'ngx-infinite-scroll'; +import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; +import { TranslateModule } from '@ngx-translate/core'; + +@NgModule({ + exports: [ + FormsModule, + CommonModule, + NgbModule, + NgJhipsterModule, + InfiniteScrollModule, + FontAwesomeModule, + ReactiveFormsModule, + TranslateModule + ] +}) +export class BorestopSharedLibsModule {} diff --git a/borestop/src/main/webapp/app/shared/shared.module.ts b/borestop/src/main/webapp/app/shared/shared.module.ts new file mode 100644 index 00000000..d9b9ac2e --- /dev/null +++ b/borestop/src/main/webapp/app/shared/shared.module.ts @@ -0,0 +1,22 @@ +import { NgModule } from '@angular/core'; +import { BorestopSharedLibsModule } from './shared-libs.module'; +import { FindLanguageFromKeyPipe } from './language/find-language-from-key.pipe'; +import { AlertComponent } from './alert/alert.component'; +import { AlertErrorComponent } from './alert/alert-error.component'; +import { LoginModalComponent } from './login/login.component'; +import { HasAnyAuthorityDirective } from './auth/has-any-authority.directive'; + +@NgModule({ + imports: [BorestopSharedLibsModule], + declarations: [FindLanguageFromKeyPipe, AlertComponent, AlertErrorComponent, LoginModalComponent, HasAnyAuthorityDirective], + entryComponents: [LoginModalComponent], + exports: [ + BorestopSharedLibsModule, + FindLanguageFromKeyPipe, + AlertComponent, + AlertErrorComponent, + LoginModalComponent, + HasAnyAuthorityDirective + ] +}) +export class BorestopSharedModule {} diff --git a/borestop/src/main/webapp/app/shared/util/datepicker-adapter.ts b/borestop/src/main/webapp/app/shared/util/datepicker-adapter.ts new file mode 100644 index 00000000..027f1231 --- /dev/null +++ b/borestop/src/main/webapp/app/shared/util/datepicker-adapter.ts @@ -0,0 +1,23 @@ +/** + * Angular bootstrap Date adapter + */ +import { Injectable } from '@angular/core'; +import { NgbDateAdapter, NgbDateStruct } from '@ng-bootstrap/ng-bootstrap'; +import { Moment } from 'moment'; +import * as moment from 'moment'; + +@Injectable() +export class NgbDateMomentAdapter extends NgbDateAdapter<Moment> { + fromModel(date: Moment): NgbDateStruct { + if (date && moment.isMoment(date) && date.isValid()) { + return { year: date.year(), month: date.month() + 1, day: date.date() }; + } + // ! can be removed after https://github.com/ng-bootstrap/ng-bootstrap/issues/1544 is resolved + return null!; + } + + toModel(date: NgbDateStruct): Moment { + // ! after null can be removed after https://github.com/ng-bootstrap/ng-bootstrap/issues/1544 is resolved + return date ? moment(date.year + '-' + date.month + '-' + date.day, 'YYYY-MM-DD') : null!; + } +} diff --git a/borestop/src/main/webapp/app/shared/util/request-util.ts b/borestop/src/main/webapp/app/shared/util/request-util.ts new file mode 100644 index 00000000..f839fd6c --- /dev/null +++ b/borestop/src/main/webapp/app/shared/util/request-util.ts @@ -0,0 +1,33 @@ +import { HttpParams } from '@angular/common/http'; + +export interface Pagination { + page: number; + size: number; + sort: string[]; +} + +export interface Search { + query: string; +} + +export interface SearchWithPagination extends Search, Pagination {} + +export const createRequestOption = (req?: any): HttpParams => { + let options: HttpParams = new HttpParams(); + + if (req) { + Object.keys(req).forEach(key => { + if (key !== 'sort') { + options = options.set(key, req[key]); + } + }); + + if (req.sort) { + req.sort.forEach((val: string) => { + options = options.append('sort', val); + }); + } + } + + return options; +}; diff --git a/borestop/src/main/webapp/app/vendor.ts b/borestop/src/main/webapp/app/vendor.ts new file mode 100644 index 00000000..a89c6da3 --- /dev/null +++ b/borestop/src/main/webapp/app/vendor.ts @@ -0,0 +1,2 @@ +/* after changing this file run 'npm run webpack:build' */ +import '../content/scss/vendor.scss'; diff --git a/borestop/src/main/webapp/content/css/loading.css b/borestop/src/main/webapp/content/css/loading.css new file mode 100644 index 00000000..b2c66268 --- /dev/null +++ b/borestop/src/main/webapp/content/css/loading.css @@ -0,0 +1,152 @@ +@keyframes lds-pacman-1 { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 50% { + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); + } + 100% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } +} +@-webkit-keyframes lds-pacman-1 { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 50% { + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); + } + 100% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } +} +@keyframes lds-pacman-2 { + 0% { + -webkit-transform: rotate(180deg); + transform: rotate(180deg); + } + 50% { + -webkit-transform: rotate(225deg); + transform: rotate(225deg); + } + 100% { + -webkit-transform: rotate(180deg); + transform: rotate(180deg); + } +} +@-webkit-keyframes lds-pacman-2 { + 0% { + -webkit-transform: rotate(180deg); + transform: rotate(180deg); + } + 50% { + -webkit-transform: rotate(225deg); + transform: rotate(225deg); + } + 100% { + -webkit-transform: rotate(180deg); + transform: rotate(180deg); + } +} +@keyframes lds-pacman-3 { + 0% { + -webkit-transform: translate(190px, 0); + transform: translate(190px, 0); + opacity: 0; + } + 20% { + opacity: 1; + } + 100% { + -webkit-transform: translate(70px, 0); + transform: translate(70px, 0); + opacity: 1; + } +} +@-webkit-keyframes lds-pacman-3 { + 0% { + -webkit-transform: translate(190px, 0); + transform: translate(190px, 0); + opacity: 0; + } + 20% { + opacity: 1; + } + 100% { + -webkit-transform: translate(70px, 0); + transform: translate(70px, 0); + opacity: 1; + } +} + +.app-loading { + font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; + position: relative; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + top: 10em; +} +.app-loading p { + display: block; + font-size: 1.17em; + margin-inline-start: 0px; + margin-inline-end: 0px; + font-weight: normal; +} + +.app-loading .lds-pacman { + position: relative; + margin: auto; + width: 200px !important; + height: 200px !important; + -webkit-transform: translate(-100px, -100px) scale(1) translate(100px, 100px); + transform: translate(-100px, -100px) scale(1) translate(100px, 100px); +} +.app-loading .lds-pacman > div:nth-child(2) div { + position: absolute; + top: 40px; + left: 40px; + width: 120px; + height: 60px; + border-radius: 120px 120px 0 0; + background: #bbcedd; + -webkit-animation: lds-pacman-1 1s linear infinite; + animation: lds-pacman-1 1s linear infinite; + -webkit-transform-origin: 60px 60px; + transform-origin: 60px 60px; +} +.app-loading .lds-pacman > div:nth-child(2) div:nth-child(2) { + -webkit-animation: lds-pacman-2 1s linear infinite; + animation: lds-pacman-2 1s linear infinite; +} +.app-loading .lds-pacman > div:nth-child(1) div { + position: absolute; + top: 97px; + left: -8px; + width: 24px; + height: 10px; + background-image: url('../images/logo-jhipster.png'); + background-size: contain; + -webkit-animation: lds-pacman-3 1s linear infinite; + animation: lds-pacman-3 1.5s linear infinite; +} +.app-loading .lds-pacman > div:nth-child(1) div:nth-child(1) { + -webkit-animation-delay: -0.67s; + animation-delay: -1s; +} +.app-loading .lds-pacman > div:nth-child(1) div:nth-child(2) { + -webkit-animation-delay: -0.33s; + animation-delay: -0.5s; +} +.app-loading .lds-pacman > div:nth-child(1) div:nth-child(3) { + -webkit-animation-delay: 0s; + animation-delay: 0s; +} diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_0.svg b/borestop/src/main/webapp/content/images/jhipster_family_member_0.svg new file mode 100755 index 00000000..d6df83ce --- /dev/null +++ b/borestop/src/main/webapp/content/images/jhipster_family_member_0.svg @@ -0,0 +1 @@ +<svg enable-background="new 0 0 792 1135.9" viewBox="0 0 792 1135.9" xmlns="http://www.w3.org/2000/svg"><path d="m647.1 432.5s51.7 519.9 75.8 573.3c3 67-55.3 19-55.3 19l-43.1-151.5s-50.5-195.2-51-208.9c-.4-13.7 73.6-231.9 73.6-231.9z" fill="#eac6ad"/><path d="m44.1 768.7s112.3-241.2 106.6-279.7c-5.8-38.5-.7-54.5 12.3-61.6 13.1-7 150.4 13.1 150.4 13.1s37.9 25.4 35.4 36.2 8.2 318.5-10 356.7-26.2 181.6-23.6 178.7l-109.2-30.5s33.6-221.7 23.5-264.1-18.5-68.1-18.5-68.1l-116.9 145.5z" fill="#fff"/><path d="m183.1 678.5c3.6-13.2-34.5-224.7-34.5-224.7s-2.8 92.6-42.5 169.3c-.1.3-51 77.3-50.7 77.4 10.1 2.1 79.2 43.9 79.2 43.9" fill="#f1f1f1"/><path d="m619.9 509.2s1.3-34.4-24.2-56.6-87.8-48.5-178.5-47.1 35.3 101.7 35.3 101.7z" fill="#fff"/><path d="m218.4 509.2s-1.3-34.4 24.2-56.6 87.8-48.6 178.6-47.2-35.3 101.8-35.3 101.8-56.7.7-104.1 1.3c-34.1.3-63.4.7-63.4.7z" fill="#fff"/><path d="m419.2 415.6c110.9 0 200.8 42.8 200.8 95.6s-89.9 95.6-200.8 95.6-200.8-42.8-200.8-95.6 89.9-95.6 200.8-95.6z" fill="#fff"/><path d="m306.7 223.1s-11.4-4.6-20.1.8-11.9 29.1-4.5 39.5 15 22.9 23 23.9 17.2-1.6 17.2-1.6l-3.3-31.7z" fill="#f2c2a0"/><path d="m525.9 223.1s11.5-4.6 20.1.8c8.7 5.4 11.9 29.1 4.5 39.4s-15 22.8-23 23.8-17.2-1.6-17.2-1.6l3.3-31.6z" fill="#f2c2a0"/><path d="m340.6 445.8 63 33h55.1l7.4-55.8 6.1-10.8s136.9 9.4 158.4 8.7c6.6 1.4 35 12.1 28.6 40-6.8 30.1-71.1 316.8-71.1 316.8l19.1 170s25.3 31.6 10.1 38.6c-15.2 7.1-174.8 32-225 30.5-50.1-1.5-205.8 1.7-211-18.9s34.5-130.4 34.5-130.4l77.4-378.7z" fill="#fff"/><path d="m576.3 700.7c0-13.7 84.4-248.2 84.4-248.2s40.7 424.2 56.8 459c.1.3-.1.6-.4.6-10.3-.7-84.9 27.5-84.9 27.5" fill="#f1f1f1"/><path d="m543.3 411.6c12.9.4 25.5 2.8 69.2 5.2 0 0-.9 77.4-13.1 161.2-11.3 78.2-8.7 155.9-8.7 196s43.7 193.2 45.3 207.5-134.1 36-159.3 37.4c-51.1-1.4-65.3-142.8-69.6-256.2-7.4-75.8-13.3-72.4-.8-115.3" fill="#3d4251"/><path d="m535 279.3c4.1 0 7.4 3.3 7.4 7.4s-3.3 7.4-7.4 7.4-7.4-3.3-7.4-7.4 3.3-7.4 7.4-7.4z" fill="#4189c6"/><path d="m471.3 367.1h-110.4v83.2l55.3 25 55.1-25z" fill="#f2c2a0"/><path d="m411 64.6c69.7-1.1 109.2 34.3 125.6 86.6 20.2 64.3-9.4 137.5-33.7 179-9.9 17-18.8 33.6-34.5 44.7-10.6 7.5-25.5 12.1-40.6 14.8-19.1 3.4-45.2-4-55.8-10.3-37.9-22.4-67.7-95.9-78.8-146.5-5-22.8-4-55.3 2.1-75.9 11.9-40.5 34.3-69 71.8-83.7 9.2-3.6 19.7-5.4 30.4-7.4 4.4-.5 9-.9 13.5-1.3z" fill="#f2c2a0"/><path d="m365.2 209.1c12.8 0 23.2 10.4 23.2 23.2s-10.4 23.2-23.2 23.2-23.2-10.4-23.2-23.2 10.4-23.2 23.2-23.2z" fill="#fff"/><path d="m374.4 232.1c0 5.4-4.4 9.9-9.9 9.9-4 0-7.5-2.4-9-5.9.6.3 1.3.5 2 .5 2.3 0 4.1-1.8 4.1-4.1s-1.8-4.1-4.1-4.1c-.9 0-1.7.3-2.4.8 1.2-4 5-7 9.4-7 5.5 0 9.9 4.4 9.9 9.9z" fill="#333"/><path d="m470.1 209.1c12.8 0 23.2 10.4 23.2 23.2s-10.4 23.2-23.2 23.2-23.2-10.4-23.2-23.2 10.3-23.2 23.2-23.2z" fill="#fff"/><path d="m479.3 232.1c0 5.4-4.4 9.9-9.9 9.9-4 0-7.5-2.4-9-5.9.6.3 1.3.5 2 .5 2.3 0 4.1-1.8 4.1-4.1s-1.8-4.1-4.1-4.1c-.9 0-1.7.3-2.4.8 1.2-4 5-7 9.4-7 5.5 0 9.9 4.4 9.9 9.9z" fill="#333"/><path d="m406 232.9h25v10.3h-25z" fill="#4189c6"/><path d="m398.7 200.9h-66.5c-4.5 0-8.2 3.7-8.2 8.2v50.9c0 4.5 3.7 8.2 8.2 8.2h66.5c4.5 0 8.2-3.7 8.2-8.2v-50.9c0-4.5-3.7-8.2-8.2-8.2zm-1.8 52c0 3.4-2.8 6.1-6.2 6.1h-50.3c-3.4 0-6.2-2.7-6.2-6.1v-37.7c0-3.4 2.8-6.1 6.2-6.1h50.3c3.4 0 6.2 2.7 6.2 6.1z" fill="#4189c6"/><path d="m502.5 200.9h-66.5c-4.5 0-8.2 3.7-8.2 8.2v50.9c0 4.5 3.7 8.2 8.2 8.2h66.5c4.5 0 8.2-3.7 8.2-8.2v-50.9c0-4.5-3.7-8.2-8.2-8.2zm-1.7 52c0 3.4-2.8 6.1-6.2 6.1h-50.3c-3.4 0-6.2-2.7-6.2-6.1v-37.7c0-3.4 2.8-6.1 6.2-6.1h50.3c3.4 0 6.2 2.7 6.2 6.1z" fill="#4189c6"/><path d="m367 170.3c-24.7.5-39 8.6-39 16.9 0 8.4 13.1 6 23 2.1 9.8-3.9 22.8-3.6 28.3.4s17.1 5.2 17.6-3.3-21.5-16.3-29.9-16.1z" fill="#a3634d"/><path d="m467.6 170.1c24.7.5 39 8.5 39 16.8s-13.1 6-23 2.1c-9.8-3.9-22.9-3.6-28.3.4s-17.2 5.1-17.7-3.3c-.4-8.4 21.6-16.2 30-16z" fill="#a3634d"/><path d="m346 377.5 74.4 97.3-45.7 12.6-50.8-62.9s.1-18.3 4.1-26.9c4.1-8.7 18-20.1 18-20.1z" fill="#fff"/><path d="m488.9 390.6-76.7 85.7 44.7 11.1 49.7-55.5s-.1-16.1-4-23.7c-4-7.6-13.7-17.6-13.7-17.6z" fill="#fff"/><path d="m529.5 272.5c-7.7 22.3-12.4 57.2-21.1 76.9-7 22.8-26 77.3-41.6 88.4-10.6 7.5-25.5 12.1-40.6 14.8-19.1 3.4-54.7-.7-65.3-6.9-27.2-16-39.1-124.5-54-165.9 0-2.8.1-5.5.7-7.8.4-.1.8-.3 1.2-.4 6.1-2.3 12.3 4.2 15.6 6.6 11.9 8.8 20.5 20 31.2 30-2.2-8.2 4.4-26.4 12.7-19.3 3.8 2.7.5 12.2 1.6 17.2 18.1 12.2 20-9.9 28.7-14.4 5.9-1.1 11.4 3.9 17.2 4.9 9.5 1.7 14-4.9 22.2-5.3 8.2 4.7 8.2 20.1 22.6 17.2 3.6-.7 5.2-.5 6.6-3.3 2.7-5.2-1.7-13.5 1.2-16.8 2.9-3.4 3.3-.5 4.9-.8 6 2.8 11.4 11.2 8.2 20.1 3.4-3.7 6.8-7.4 10.3-11.1 10.4-10.5 19.9-18.8 34.1-25.9.8.1 1.6.3 2.5.4.4.5.7.9 1.1 1.4z" fill="#a3634d"/><path d="m385.9 322.8s8.3 14.5 31.6 14 31.2-14 31.2-14-15.2-4.9-27.5-4.9c-5.3 0-10.7 2.9-17.7 4.1-6.9 1.2-17.6.8-17.6.8z" fill="#f2c2a0"/><path d="m290.7 214.8s6.1-17 6.6-23.8c.4-6.8 5.2-46.9 19.7-66.9 9.4-14.4 23-17.4 36.5-14.4s29.1 11.2 45.2 9c16-2.1 56.7-22.6 73.5-14.8 16.7 7.8 44.9 21.4 48 47.2s21.3 66.5 21.3 66.5 9.4-65.8 9.4-83.3-45.7-69.1-55-79.2-39.5-36.6-57.5-35.7-42.2 15.5-51.7 16.4-15.8-3.6-26.3-1.6c-10.5 1.9-21.6 1.4-53.4 34.5s-28.5 82.7-26.3 110.4 10 35.7 10 35.7z" fill="#a3634d"/><path d="m377.3 107.3s-7.8-11.7 2.1-33.3c9.9-21.5 10.3-31.6 10.3-31.6s-5.7 14-13.2 31.6.8 33.3.8 33.3z" fill="#b27362"/><path d="m406 110.6s22.2-25.6 36.5-36.9 32-24.2 32-24.2-13.9 3.4-34.9 21.3c-20.8 17.9-33.6 39.8-33.6 39.8z" fill="#b27362"/><path d="m390.9 106.9s-.5-23.8 11.1-50.1 34.9-30.4 34.9-30.4-17.1 7.8-29.1 31.2-16.9 49.3-16.9 49.3z" fill="#b27362"/><path d="m433.2 485.4s-92.3-40.2-96.2-8.1-9.5 56.8 14 58.5c23.6 1.8 82.2-50.4 82.2-50.4z" fill="#3373aa"/><path d="m417.4 479.6c23.4-15.7 69.9-43.4 78.2-20.7 11.2 30.5 22.4 53.3-.1 60.5-15.8 5-54.6-12-76.2-22.5-1.8-15.3-.2-2.3-1.9-17.3z" fill="#4189c6"/><path d="m278.3 431c-23-2.1-30.1-4-81.1-5.7 0 0 3.4 78.5 11.7 153.4 7 63.2 8.7 100.1 19.4 167.5 5.4 58.5-57.7 215.4-57.7 249.6 0 14.4 69.8 23.2 189.2 28.4 33.3 0 52.4-87 60.6-188.1-.5-92.5-.9-180.2-8.2-192.5" fill="#3d4251"/><path d="m55.5 700.5s160.9-149.3 188.8-200.9c51.4-43 48.7 32.4 48.7 32.4l-94.3 126.1s-77 101.6-87.6 110.3c-10.7 8.8-55.6-67.9-55.6-67.9z" fill="#eac6ad"/><path d="m152.4 578.1s-170.1 176.1-117.2 228.4 85.2-9.8 85.2-9.8l97.9-162.5s-13.9-6.8-28.1-20.5c-14.1-13.8-37.8-35.6-37.8-35.6z" fill="#f1f1f1"/><path d="m133.4 585.7-38.5 46.5s11.2 29.8 40.1 54.6 56.7 20.2 56.7 20.2l44.3-72-68-52.8c-10.8-8.4-26.1-6.9-34.6 3.5z" fill="#fff"/><path d="m401.2 818.3c0 6.1 4.9 11 11 11s11-4.9 11-11-4.9-11-11-11-11 5-11 11z" fill="#474b56"/><path d="m397.7 707.1c0 6.1 4.9 11 11 11s11-4.9 11-11-4.9-11-11-11c-6 0-11 4.9-11 11z" fill="#474b56"/><path d="m295.9 378.5c7.5 46.7 15.1 93.2 22.7 139.4 19.2 1.7 38.6 1.7 57.8 0 7.6-46.2 15.2-92.7 22.7-139.4-34.2 5.4-69 5.4-103.2 0z" fill="#fff"/><path d="m383.9 475.1c3.7-22.6 7.4-45.2 11-67.9-31.4 5-63.4 5-94.8 0 3.7 22.7 7.3 45.4 11 67.9 24.2 3 48.6 3 72.8 0z" fill="#ccc"/><path d="m407.7 374.7c0-3.7-27.1-6.7-60.4-6.7s-60.4 3-60.4 6.7v6.8c0 3.7 27.1 6.7 60.4 6.7s60.4-3 60.4-6.7c0-2 0-4.8 0-6.8z" fill="#ccc"/><ellipse cx="347.3" cy="374.7" fill="#e6e6e6" rx="60.4" ry="6.7"/><path d="m398.4 363.5c-.1-3.1-23-5.7-51.2-5.7s-51.1 2.5-51.2 5.7c0 1.7-1.2 8.7-1.2 10.4 0 3.2 23.4 5.8 52.3 5.8s52.3-2.6 52.3-5.8c.2-1.8-.9-8.7-1-10.4z" fill="#ccc"/><path d="m398.4 363.5c.1 3.1-22.8 5.7-51.2 5.7-28.3 0-51.2-2.6-51.2-5.7.1-3.1 23-5.7 51.2-5.7s51.1 2.5 51.2 5.7z" fill="#e6e6e6"/><path d="m389.7 355.1c-.5-2.1-19.5-3.8-42.4-3.8s-41.9 1.7-42.4 3.8c-.3 1.2-4.2 6.5-4.2 7.8 0 2.3 20.8 4.2 46.6 4.2 25.7 0 46.6-1.9 46.6-4.2-.1-1.3-3.9-6.7-4.2-7.8z" fill="#ccc"/><path d="m389.7 355.1c.5 2.2-18.4 4-42.4 4s-42.9-1.8-42.4-4c.5-2.1 19.5-3.8 42.4-3.8s41.8 1.6 42.4 3.8z" fill="#e6e6e6"/><ellipse cx="378.5" cy="354.8" fill="#666" rx="6.8" ry="1"/><path d="m244.5 542.1c-7.2-15.4-6-119.1 12.7-127s46.5-20.6 58.9-20c12.3.6 21.4.1 27.7 6.5 6.3 6.5 22.1 26.9 20 38.9-2.1 11.9-38.2 21.1-46.2 29.6s-12 41.8-17.3 49.2-19.4 40.1-38.1 35.4c-18.7-4.6-10.5 2.8-17.7-12.6z" fill="#f2c2a0"/><g fill="#333"><path d="m217 595c-1.1.7-2 1.3-2.7 1.7-.8.4-1.4.7-2 .9-.6.1-1.1.2-1.5 0-.4-.1-.9-.3-1.4-.7-.4-.3-.7-.7-.8-1.1s-.1-.8-.1-1.3c.1-.4.2-.9.3-1.4.2-.5.3-1 .4-1.6 0 0 0-.2.1-.6s.2-.8.3-1.4.3-1.2.5-1.9.3-1.4.5-2.1.3-1.3.5-1.9.3-1 .4-1.4c.1-.2.2-.4.3-.6.2-.2.3-.3.5-.4s.4-.1.6-.1.4 0 .6.1.4.1.5.2c.2.1.3.2.4.2.1.1.1.1.2.1.3.2.5.5.5.7 0 .3 0 .6-.1.9l-3.8 11.3 8.2-5.4c.1-.1.3-.2.6-.3.2-.1.5-.1.8-.2h.9c.3 0 .6.2.8.4.3.2.4.5.4.8s-.1.7-.4 1c-.2.3-.6.6-1 .9s-.9.6-1.4.9-1 .6-1.5.9c-.7.7-1.2 1-1.6 1.4z"/><path d="m230.4 589.5c-1-.8-1.9-1.7-2.7-2.9s-1.4-2.5-1.8-3.9-.6-2.9-.6-4.5.3-3.1.8-4.6c-1 .3-2 .4-3 .6-1 .1-1.9.2-2.8.1-.9 0-1.8-.2-2.5-.4-.8-.2-1.5-.5-2.1-1-.8-.6-1.4-1.2-2-1.9s-1-1.4-1.4-2.1-.6-1.5-.8-2.3-.3-1.5-.2-2.2c0-.7.1-1.4.3-2s.5-1.2.9-1.7c.5-.7 1.2-1.2 2-1.6s1.8-.5 2.9-.4 2.4.4 3.8 1 3 1.5 4.7 2.8c1.2.9 2.4 1.8 3.4 2.7s2 1.8 2.9 2.7c.6-.2 1.3-.5 1.9-.8s1.3-.5 1.9-.8c.1-.1.3-.1.5-.2s.4-.2.6-.2c.2-.1.4-.1.5-.1h.4c.1.1.1.1.1.3v.4.4.3c0 .2-.1.4-.3.6-.3.4-.8.9-1.4 1.3-.6.5-1.3.9-2.1 1.4 1.1 1.4 2.1 2.7 2.9 4.1.8 1.3 1.5 2.6 2 3.8s.9 2.4 1.1 3.5.3 2.2.3 3.1c0 1-.1 1.8-.4 2.6-.2.8-.6 1.5-1 2-.4.6-1 1.1-1.6 1.4s-1.3.5-2.1.5-1.6-.1-2.4-.4c-.8-.4-1.8-.9-2.7-1.6zm2.9-2.4c.8.6 1.5.9 2.1.9s1.1-.2 1.5-.7.6-1.2.6-2.2-.2-2.1-.6-3.4-1.2-2.8-2.1-4.4c-1-1.6-2.3-3.4-3.9-5.2l-.6.2c-.4.9-.7 1.8-.9 2.8-.1 1-.2 2-.1 2.9.1 1 .2 1.9.5 2.9.3.9.6 1.8.9 2.6.4.8.8 1.5 1.2 2.2.4.6.9 1.1 1.4 1.4zm-16.1-17.6c.6.5 1.3.8 2.1.9.8.2 1.7.3 2.6.2.9 0 1.9-.2 3-.4s2.2-.5 3.3-.9c-1-.9-2-1.8-3.1-2.8-1.1-.9-2.3-1.9-3.6-2.9-.9-.7-1.7-1.2-2.4-1.5s-1.3-.6-1.8-.7-1-.1-1.3.1c-.4.1-.7.3-.9.6s-.4.6-.4 1c-.1.4-.1.8-.1 1.3s.1.9.3 1.4c.1.5.3.9.5 1.4.2.4.5.9.8 1.3s.6.7 1 1z"/><path d="m245.8 545.1c.7 1 1.4 1.8 2.1 2.6s1.3 1.4 1.9 1.8c.5.4 1 .6 1.4.6.5 0 .9-.2 1.2-.7.1-.2.3-.5.3-.8.1-.3.1-.8.2-1.3 0-.5 0-1.1-.1-1.8s-.1-1.5-.3-2.4c.1 0 .2 0 .4.1.2 0 .5.1.8.2.4.1.9.3 1.5.4.2 1 .3 2 .3 2.9s0 1.7-.1 2.5-.3 1.5-.5 2.1-.5 1.1-.8 1.5c-.4.5-.8.8-1.3 1.1s-1 .4-1.6.5c-.6 0-1.2 0-1.8-.2s-1.3-.5-1.9-1c-.2-.2-.5-.4-.8-.7s-.6-.6-1-1-.7-.9-1.1-1.4-.8-1-1.3-1.6c-.6 1.1-1.3 2.1-1.9 3.1s-1.2 2-1.8 3c.5.7.9 1.4 1.4 2 .5.7.9 1.3 1.3 1.9s.7 1.1 1.1 1.6c.3.5.6.9.8 1.3.5 1 .8 1.7.9 2.3s0 1-.2 1.3c-.1.2-.3.3-.5.5-.2.1-.4.2-.6.3s-.4.1-.6 0c-.2 0-.4-.1-.6-.3-.1-.1-.2-.2-.3-.3-.9-1.2-1.8-2.4-2.6-3.5-.8-1.2-1.6-2.3-2.3-3.5-.3.4-.6.8-1 1.1-.3.3-.7.6-1.1.8s-.8.3-1.3.4c-.5 0-1 0-1.5-.2-.2-.1-.3-.1-.4-.2s-.2-.1-.3-.2c-.3-.2-.4-.5-.2-.7.1-.1.3-.2.6-.3s.7-.1 1.2-.1c.2-.4.5-.7.8-1.1s.5-.7.8-1.2l.8-1.1c-.5-.8-1-1.6-1.5-2.3s-.9-1.4-1.4-2.1c-.3-.4-.6-.8-1-1.2-.3-.4-.7-.7-1.1-1-.3-.2-.6-.4-.9-.5s-.6-.2-.8-.2c-.3 0-.5 0-.8.2-.2.1-.5.3-.7.6-.2.2-.3.5-.5.9-.1.4-.3.8-.4 1.3s-.2 1-.2 1.7v2.1c0 .3 0 .5-.1.7 0 .2-.1.3-.2.5 0 .1-.2 0-.4-.1s-.5-.3-.8-.5c-.4-.3-.7-.7-.9-1.1s-.4-.9-.4-1.5c-.1-.5-.1-1.1 0-1.7s.2-1.2.3-1.7c.1-.6.3-1.1.6-1.6.2-.5.5-.9.7-1.3.4-.5.8-1 1.3-1.4s1.1-.6 1.6-.8c.6-.1 1.2-.1 1.9.1s1.4.5 2.1 1.1c.3.3.7.6 1.2 1 .4.4.9 1 1.4 1.5.5.6 1 1.2 1.5 1.9s1 1.4 1.6 2.1c.5-.8 1.1-1.7 1.8-2.7s1.4-2 2-3c-1-1.3-2-2.7-3-4.2s-2-2.9-2.9-4.4c-.3-.5-.5-1-.5-1.5s.1-.9.4-1.3c.1-.2.3-.3.4-.4.2-.1.3-.2.5-.2h.6c.2 0 .4.1.6.3.2.1.4.3.6.5s.4.4.6.7c.3.5.7 1.1 1.1 1.7s.8 1.2 1.2 1.8.8 1.2 1.3 1.9c.4.6.9 1.3 1.3 1.9.3-.5.6-.9.8-1.3s.4-.7.5-.8.1-.2.2-.2c0-.1.1-.1.1-.2.2-.2.3-.4.5-.5.1-.1.3-.2.4-.2s.3 0 .4.1.3.1.4.2c.2.1.3.3.3.4.1.1.1.3.1.4s0 .3-.1.4-.1.3-.2.4c-.1.2-.2.4-.3.5s-.1.2-.1.2v.1s0 0-.1.1c0 0-.1.1-.2.3-.1.1-.2.3-.3.6-.2.3-.3.6-.5.9.4 0 .2.2 0 .5z"/><path d="m262.8 533.2c-.2.6-.4 1.1-.5 1.7-.2.6-.3 1.2-.5 1.7-.2.6-.3 1.1-.5 1.6s-.4.9-.6 1.2c-.3.4-.6.6-.9.7s-.6 0-.9-.2c-.2-.2-.4-.4-.6-.6-.1-.2-.3-.4-.3-.7-.1-.2-.1-.4-.1-.6s0-.4 0-.5l3-9.9-8.5 6.4c-.3.2-.6.3-.8.4-.3.1-.5 0-.8-.2 0 0-.1 0-.1-.1-.1-.1-.2-.2-.3-.3s-.2-.3-.3-.4c-.1-.2-.2-.3-.3-.5s-.1-.4-.1-.6.1-.4.3-.6c.1-.2.3-.3.4-.4.3-.2.6-.4 1-.7s.9-.6 1.4-.9 1-.6 1.5-1c.5-.3 1-.6 1.4-.9s.8-.5 1.1-.6.4-.3.4-.3c.5-.3 1-.6 1.4-.9s.9-.5 1.3-.7.8-.3 1.2-.3.8.1 1.2.5c.5.3.8.7 1.1 1.1.2.4.4.9.4 1.5s0 1.3-.2 2.1c-.1.8-.4 1.8-.8 3z"/></g><path d="m720.3 998.2s36.3 42.5 34.7 62.7c-1.5 20.1-3.5 53.9-19.3 61.4s-71.2 6.8-80.2-15.9 6.4-100.7 6.4-100.7z" fill="#f2c2a0"/><path d="m717.4 906.7-5.7-50.8s-24.4-10.6-55.9-7.4c-31.6 3.2-44.9 22.9-44.9 22.9l17.7 69.3 71-10.7c11.2-1.8 19.1-12 17.8-23.3z" fill="#fff"/></svg> \ No newline at end of file diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_0_head-192.png b/borestop/src/main/webapp/content/images/jhipster_family_member_0_head-192.png new file mode 100644 index 0000000000000000000000000000000000000000..6d90ab36d37914257d5f3d0356e7895ccc0596f2 GIT binary patch literal 13439 zcmV-_G=R&AP)<h;3K|Lk000e1NJLTq006)M006)U1^@s6Qrv6@001;bNkl<ZcmeF& z1$5)a76xD~zgOn=P??#TxsIeTqaaMnd#KFJOtu_Ombc8z%*@Qpo&JBiDn+J^<#p`I zIiF!{Neg#IckWCS`IEjsj-{;!J3(>S)Xu>3qwpPk>)6^Ij;VFv^&VkMTL%;=aePQ4 z5`uaK1hoq1!G|E?@HWhL3~fzd#~BAoY!V-&^spH$fY;%B5U!A^im;t4x*G~&b%b}} z3{b`b*#V^0VNb`>Ly>~It3F>0w3dmX_6p(HY>Uf>uoWm$Dms8P4*my|;{5(bj;+qY z^UEN}Ys4Sws1ysP)r#)M0=Dt9MEnx6^%FpmB3s4-CFJW32(oUt6P|`w;01UT7Q^Mp z=L6T++G@ua&zR6<YTKdh0(clc0}(0s`<hF{!s&*XH?@Wxf$gL5gk$Aw3W_vRykC@T zo$1O!un>e_`dSeDGb{vubu!QUIqW}Zs^dVB{ubj4QmCVR97g+cj_@G-!jZqfrBp1M zX(RY+{kqOcph$8K5GQ?4JU<1$fEXQJgdt+^x0WIJE#&-lnE2-U)d7Boc~R#ovI9sx zbvffgmR^vYz;~-Tc@gvZu7-TEV7h_S#}GYDEOn}&`KjA6w3R{0b{>sV$kr}NYI<Yj zV1zFfjy>`Y5Jnp(yBz%oS?V;^q^4CkKmGSEAmE8EOJ4_+Y{my5DQM)Zjlg&e1SNCy zpVwLAS<38fDqNcP*CcV|S8=TzF}Jf46{X^6-+d8QmnjfQ8^N=FOl}$6z0E}<1Kd=R z_L#%E8}gHKJ&g9~R7Fgu_>AiZVjXi2Ci$z#y+BzEfp{<i;Uf^q#=L(%CbmH%Fk+M* zXe(#xgOQpgPkq!Kt*5DwlW10vc-Kkf_$Of{c?ZZ!`jL445=8Q;tm_kBj~J=vBTyGi zH?h*2KdNgurZ#++Svb?;wcMOPQMbVVWe3PEyTQ*OlFyysR(qy5+}^<8N8pa?8aOvo zD4eT~DG%F5;{+HlJ3w{__!<0eaLz}7dyUAf_;B*eNowNzeB8Bz(xoX>4c88q={z3Q zq4Q-2$b3h@*C71F#jSp%B$4I?^QYIbT9f#>Z52UZ#o*^P+zys3zd@7i02xc)7|)-B z@Rg}DKpC8#=?^|zrj!LEJ?9Qgdw2(MM}0r+E;~Sm2^x8;;rW?V1V8uhW0dv?&_8#3 zE}CJnQj=Jfr*U}2n0F4Y9{U;m^tn^7Z3{{!<3skaw7Wt0jeC9;%rHIo{sij+!$CYR z!O~}ULm`i2>f~;zNQGCz4cdyJWGX&n0|tLP{0f5np8O8BRYY8bS~9x<=}&Q-E5E8+ z>0!mlJ!i^<EUhnS<xB=86Y(L_G59xtZ$P91YVk-{3L<QI=6-)8u8AwZ?*{)+dnMbJ zm)XDt!*QTw5<X-;OS=I?s^E8c8MvMSJ=9UfwSl<z5Mix=a|ym*o_>d!auPfSg-q?J zR0j-7lM(WCl@%PMM`bZ5usojI8rWfi#!+lr-oAz%Wd|60o=<rPh`b$v=}a8CzsgB6 zg1>_A)5$Ban(P2$MA*^_@%$r*RN@xru<eo3U{q&$6x*)dw%BP>`nePMZ#z!z22Ep* zrB8M&trtY9A^+zcz_Yz4#^M*(2w3g8wl2W;X(?=Jr-72zWCzeTh95wrTBJHXD?{D& zc~K|5!&{?mJ>gAvymPSATvKxtK<!a%bI+A*KRWf=-f|%<o!M$`x{aLJ0uixu1kC{V z@h7y%6*5$DRn-yV;)4A}xFJ{EbWFXt|Lhs!!E<MdyH4v6;d)(MR(h~sE5@&cO?7op z#xg!+B*)YrO1BQsRqvG=0RnWey^{NUqE3)Gci{2;twrJw_Ra#liR^3RS$B7LcX!+t zhpw^Mf6;Z<;?@?oQg52NqQ&Zx3hm<VUW%25l)9Ynyz?<#hD;hEAx)S(&u^wpXEGOZ z-h0ora~A*6pVB9NOIt%HP-Q_R)vt@^a}<^5g$q>VM-XkCPlp!Ire*(Nvwbhze`$nS zQ98jr?z_-07sdjYA{?FCZ+gS%0C#YO2`<syXfh0nCBl$1e$?FRfp`W4@)>1K{*iV@ zdD4kwf6`}b=uB=n6Go@ALg;iRlO;u$sirb*D3#@eQBmR?%Jlew!udHN13QaCw8ir2 zL5cvHAKnaEi@JX&TKs2!+7a$SMN8(;v6a4p(Sf5YeCROOsym~-Xw~dLC}=<@3hLVd z#(E)ZhYSoqkUukWSWj9XFp>@~oJA*70tBPiYc()#i^098vqR{}Qg6y;A<c7ZX{%PC zNHes{?TpG9!NJwAcF`LQ4>c_t-Ds-$HwH%2q(PN)4cxFkfp$cAQu3Ig?8Eng(W3RR zND#Od_n;L>_~~=@<%iJr2oI`V8%Jkygc{zaR24=EB3|%IA6tpQr}^Y0P+EZNm_3%q z?&*q7Bx+jGtuPC?88A|a;Z%CC;Byzw{gak(3j%jZIyxhP-)EyA#@i-;?L&Dpexv;f z)2TE)2+s%X)~N9ey8zb+ZqpiHcXXC{mFfle4_;OT;CQ$N=z)cACoHY`7yZ!}#w@M% zt#mbDT)K>4xK8Z8%%q)>9<(8FwBRynr~D|KHwBNO-7%8|m*iAhAY2>M&$g2gikEo{ zooda6%{}Z@1kgO_%~V=q{L$aKQB^^d-Hc2SMNTL>tr(p_YXQS^h`}2xA6lH`vBNK{ zFEgmyZ;Z;Bz`>P(0NgE|M8XJ3b1_Coi(rk<KNMoUJG3+Gs~%S{DrW%)mm&7so(SnN z*OJ=5aL!-n8Nb3>Uw3O;f-0VXbYoP`0uC-i=wKnk;!1|hA^ykDsFZzm#ptD=B}g6r zHE9M~)hC!8IjrAhjLI3n!DZkia(D0-u$v)M1o!WV+8_S7j1ef5=SA>H)&Of}k9RV+ zE1h7+aF^-ax?&zKH!LAgjNN#j0F!{$#4Igh?otHcnDzhnn-lW~WAHm7Jxu%liU_d$ z!qWc0LFP_H0FDcBe#Z2w%${^~xsMq}pa|f|(z#ejXNdqdI#bR8SIo9vX=;%hW_)$# z&ax^ZKwrSpDAPA60&on^GBu|B|1FyFn20jN02HvaI?L+^OO{G#BEIT!6{B(naBvkM zfESp$repSeLdTQ*EHDCPNOVVp2XDOTV6FfrDN7+7gJ}T_>V`#X7IuCWuzbVYt);np z2*xS`a2(G=08Op<%$W2Yol(aAEm`e~CEw;QlxyJKZ9gcH;T(g>K0v^i?PyQT6bskb zD^#wEq_m0OP>AW7;R>FS@1iV)a10Q@(@n(z3gX${+BI<&8i0a6CzO|Ok2SFcRG@?> z&YodZ&H@fDL+Jm9LMfN~a<I2H)8l)p%(rItR~ZW3moUwoWf8}idz3za<9LYC8Jqpx zqM3k=C-(4@Ma0eNjzwAqo6LD&;t&&vCIoPRxmgi_<3R0m!pH;|YOxC+0m>F?MD!!D ziH2ROSfP_h8|D*jTtIbe<1luPYaCKjW5fn!s97CLm3a}uzT$=r32^<;`dPgZ=Tuq{ zc8!@@7O^FIaJMTMm9v0@s~|3hE0Paa*prHv&9lm|&}!(oR>l0m!38sEd&DGRFKzOe zVVvyxQ(<MP&nK;DZm$+XEtxz07h$7(@ltOrx3){GBQ2X6TPuZ-DcY$&3!z-R-CEE* zF4H`>Rus^uJ;i?i38hW=23s@F*@_ut_Et<>mp}72Q*Ka!vL({7+|F#54_W>xok;Pw zcoGN(j0g=$V}>F=5Q11?G=yEMPT1^@q1CgQ8~+PYC~SD=J_n*aEdA$y2wo*_p10`) zm5$F?)VIw2D~cG_1LYAzBBCrJjYGgFcjIP!ejiaG3TFRF$Cmq`Y-aQWrsLn#lmM0~ z0&pxhG1+p<9}@o_2xGQr@@GTPXbw~I1&rJ3y|Utc^V!%ohm5z02rAgM*%msHqe*;u z!DWLmAZ*N!=(98?-JtlNK5udvgdzY(GN}7Ce2$az|1koDFWB5p?K-~^HjmJZ<pis} z|K?|CE~taMNj+9vn`1MAIT+Z=QA4RTJsABQ*=Iw%D@G1(N^qWv036R0IRX63hKCNI znL~c2Cw-)!kC{@Yi|BqdX=u6AezB@0fMFh3FayssSsu7TqAO<Zt}a}^V$=}Q%l|)N z1|8vC5DCv%*z|Tvcyz}C0gRLTa<;G^t~Wyf7%54g_^n9+pmp&7qOH)uL^L-9piTU1 zAa{a$k<X{Co4kMi&wZ@giwps83>sr}LJCIj_gNcG(b|u)C;ub_+sgF%fq(Byeq7eT zzU@uAOEKTNAq1q+G9Y3egf90vN?ahv0}%}3bM5)r)%V4lHw21pk||?{!<ZzC=-?~k zOGmUf#0|~i(H4xPAS!dsni#4sj0PBjL<beYuVConeG=g;<Bo9|%3}F2Cq{5228c7j z27h#DF*FM!Ezge-qeSC(l#B13Ldj!?(R}XLL=5e25W*2Z$9(5TCz}{7K+Cn(&mAIE z1kgO``XZl8rHLte!C2Xa(3oXphnEO(GqDp&=pZ6q=t|y1v(A4chEma&Xbf(p%Tmiu zLc#dZX~aDkKS#|P%`6`=7!l*}9IGeY*7&#!<%?sZN6UjSCMEnVl&Pt{1A=pvvp5lc z5hFUQX8q3P86^Ds5czuH?|m^@XtJe5u->pi1}kmXFe+yQ2UkKI3N11i0!{X}c;e^i zN*_A5!k12_2Eg!OK%$7uMhugPIRs#%@QWxP8+{;LDH!Ypgm6?-NopXS<o};jEDUo# z3)jQ#LyOVe_5mm@z>sbTj<t~?5!7rJ8;A`t_IZvhlYIHipL{D|7cW%WxgMYhp!u-q zT)#GD+;Fqv|LB-Xty=i`aB3JGvNNUZmQ-njNoT4RVf0MVMJUsW3=LIi)uuPgCmL*) z@1h8x`E-Q)ieC&8O<;+DIm3=H{+z^E>N`7~dQ8t^vh7As=F3?bv|?cbRhclj!)amk z&Ae3VY3DM5&u3-Q!ua`gCfk$?6@tFaxqX1Qls-UnqH*%6BNnTfwIcF3*M7a&2wHjN zQtNYQWe%R^UDx_Nx=zi8fg5!{8ghflJs^qRos@4ynSf<w!tX6S^Jv@3NYb0wERVSr zj0OpbJ%0Y;B}V0J;NXg2G-w!xG7IPaW!4tRGOp1Imc~%K$vKV2(9)BQ!7EP?Mei9| zQl@88uc>L&du9%~%_$(axrI3M-?Vrie>b=XbeNJuA9&<bo3qcrIcZ@$*SKm~pC9i( zHD)!g6AcvQLTe!V`Qo$PX62zw06+748Tgy*J)Ng&=_59J@!$O(mv8xk1hGs;sV<CR z7qc7IAyuV}AN~}hayD>qMbH8~%H!NM$hu<A$PK>iti`b`fd35bBab}VkrYWqX`xb5 zL#Q}CoJx-!rc!+wm6lgCHB6Q8`>EoCXRp;r?mLnmO8b(->92q!h@kN~ixTEjdA3@n zOz4Y*((~i~Z4^MqDOyTq!4##18I~)_pGtPFq0-V4Dm_ynlnDqwpDLk~J66+SzD80e zW`9aJjS5^zEzXJnt<7SwOr|F00!JekaY>^4;QJVrvw?$4(o&_mj3YoyF*gK?Ab=%t zjRJUwjUbf`P0k3)x1^Ifukww_vbFl=m60%fvjk9djsRLR-}|JX<1FpGV<<E~mTF6n zm@HH6sUp5MhF!v7Ntq6^pt?@eS|k8)WSKWD`D?(Df;oTO#i*PO99$Oe_`c3xlFk|d ze8{zb=HfWGM$%^gzy`A9Rke4u!Lzm}MZy)bSO6{9_4(UBN!n><LoQntM-5fwW|yhH zvW)brVsUSy0E$@vZZonh762B{Z3~;Qb>IAHw=pVb0|%Fdzo2`W<JJh^0~rC7uU|&i zyw0piw3`6n-qn}uEG|?1nNy9cQuWLc>jWSUA1^9N54o06IU6{*B&W00xA2$Kl_|A} z0Mh)Zp}x+*kV;ESY2CVYl$)DNd-v|8nwlCzW2-77U8=9`1(2zx%ANTJ&ueIC5XzF5 zmq%;YuBDQa5|X)yDtF|d6}V6VfJEk5<|;<zOyJ;pWQ4rI=hX~>3l)GaJ&>yQuQRZr zEnBuww{G3&rI%i!7himl-gx5;8aHkn$-OFf<<V*W99s%NpA*itf2qN<X3Ur&lm%sa z`Q?|XbLY+wgu!)nWhJE7hTB2_B0h=$985`;<{CclV#rnkIGqthwYp-7@#u6q`t{de z>AB~gqqp9AOE5U_+H0>-OiYYn=d<K6e~xVhP*ymfsJ>qEoRE+Za&vQ|XP<qxu}rVN z`YOHm-g`2BP#yOl;%zAa@TVdGhoW}pGucc4S!!%VfzK@8$*rmqYT4Icf4$MzzWw%F zyf3x2vXgLGj0&J4TMa{$00YD@<@00Z1fb@=#S$|1^7i(I7=<#u`R1GS=%bI4R;x9* zu58U>ewNyn0?>2c;sHkG4B+5Ggxtn#v$+7WG%SEpGWP1*w=YD{D1bqO22n*t#d!iK zkre>=k%u-Xhb$+rbMR#F-uU1Z;w-SC0M;fNEfb6#Et4pK#~**3mMvQ*BY-8g769m? zv;dCbd8VErTe?8#DAwzbOUL-j%PB4{j@;ed8;u{l^2#gZ>+5UiZ|jc2m68<zCZIkt zj(DA+3-s?o^kyZ`Nli_qu&^-d-o1NctAz8@Pd_cw5w2%9YJsg?Akt@Qq8XJlfP<?5 z0esAmh%Gz8HAnXt*bfBo_S<g@0swG11`Zr3I}%h~v<;slCjel2osL{5I6s;isw)hh z)uv4wv_uf2P%g9tt5>g<8J#L8eO{F91&}SEat3g46(E4Y4B4XvDC5~vx!0ymo5;h% zgGP-SMbXjG!Vsj~OP?KP)CFqKKX;m{m1l|;LXZ^zs5!D-b{I4^HkL+?97)rrO{2}5 zH_Mi(`tTOGQZ^QVh~{pk4{*^@Pq2#svd{_yP}RP*Wb7pxzWfmADsc!@Rsi8Ki)e33 zIPFS~kbw8ruZW_T#uXZ!2Pi9ur-r&}`N^*OdgJA-t;P&8KEqA|P<Lfi%^e(E2#vSB z1OW6okwRzIl2@JnINujxx0ztLRh1B?aRJItg6&x?x@7hc076OjXH?A{99#vsK%Vv# zfKXfJMN{4B<7CdOwzQb^xskZfb^-{H3P5a~Dz;?_omx{b%w|_?&B8sn*Ioj^uCX4B zs=0%Ms{jEEx1|8^dztWesR%FwTfQ}e8fvQKT@UV<mTyiYy*3Q4fb3$p_LHp>z&|nq z5GgB6pz33L$=Iv<=q`4d5@c7XV!ol*bQ`t++Rz6XRdWXiSHY&EK<}{td?OOEO;Y$< znFKbr%plSydsEexG^#7!L3PJ>^LaZ}Zb~M7%3KysFs_r_cZR{|B`t`@YEz2^fNQ^+ zlTM|X8ksTyHs(|xE?Y3w9#}_p$94(S99T<b8C>2}UxPA%awab^2Ay%62|$?#a12i~ zwblv%E{`Yx@V-Yrd8n6D?vhx_PmGZvmhu)yP~O6D%3CCyDSvS!-j}@|XrdQUTXBdJ zXV0bufQ{-e2%X@@a$!Ra%4)Ps`AcHBJVKcOe#U#U<yytN;1c2&U_UU*WGey8Pz2xr zblGaG1Bz$JG^V#iirXUbUV9tS@|=k+0K;Cn!1$KP>YQMDbku5UJ6Sp(fZuIWrgQot zIE$^{GNDXX2k?D^Q8@!RxDpV;+u|k|OF5pdp)Y1-inFiM$tc?(`Aiscuj$4&#p@Va z6-eLuq+$!Dbb`!I<$~ZlurRhJiJRgrW<GPB(gHY^i3~9fCc+F#en*p!ardF#Y1CzE zHg6HMA6=$t>3{6c=O)H9>1ycCj?nz>pG@7R*||(ipIMpMq;IY97c+M$t3jIwK@1rK zIkS*E3psF4XG{A6CEUrxM)7_21D}r|RCu0Q5#dg8nGU3c;a<B^oE}PLMxw!0<VP|Q za%F4~uE|!v!>F7I99$7`JLFNh82iUp`U>$v1NyY1^hw`x%>9`Ncq<A)K_(9A&L}S- zQ1H}`-{$uW6Yc4;G=DNGX9EXU1+&8#7OgwKCPU6IjvK^uLmYpEFh@Lnbl%SSVigeP zeQ*3UM1VV+53LIY_Unk20InGjugx!Gzn@V#8#uT$>^}INAIoNQ$T%3k1cdwMFe+yg zS17f9?dljx8a)(2uNtF3BhXkrC*7#b4<{-JAS(2yx}2aRCo?sVFe+yR2Ui8ge;EUJ zXu-K(?yhJriWt&EHtP%0o+9w8e3)?82X0{T@_EQ-V31k~i8&6&Po})3vD_io(#zuu z=xguPL{<CpD;bqDf`dzQIy>~TvSsSa_{$Au2q2jRGO8HMuZ38b+rlQIwXh@)K(nmL z%kv^EaCyQ}IUu2kYzm~<uY1tOg#q;XgaR>&oOqto!fVwPjLO--;gaBN$c`4wLKthx z*kLkXveYHo5$TDXVP>T*Enem=i9zaEAV}`KrUxPm4ALe+3?}~#dDDLta~;d3R89Wl zi~0$Hi4`A8C-cBI=5|KqY~XN7q8ZrbXJf_>U<h-2x1jCe##;h(sEZQka>uX(65}CD zJEA7zZ#Hi^8Z)|M?jqZ~+CPDFlm&A_Z;aj?T09FGZj8={Ac(N3)T<GFTK)C>xYa#n zCeq@VYZU=F8K%;PinZa!;4$bE$fgR4<vxR$8r7FYfR@07Q6sexi{&RF8|8Zck;oZ_ z5f|hzfH6vQjd81jj`{BB$vjf^Ba+-9PnoG29ci7A`%BCc4_E}V4a$aAE1z2lwdu65 z)%<Vl!>C$&=6Lb{Up+(2*4AEmPctfK1cyr%2q4PbjOu%0r@%-hHTU{}Q4)6n`Ez$f zc)*aGNHZD@(V(vZg!^N;!?|MQAlg5F2Gy@kV3#EtnJ0zk<+59{fNOFHOuPpP@=m4% zG$jD!`$Eiq$-iOo@BPj<eiq?3=H?MT!92*QT2INloDKgO=CxK{Id?KDX9b5#6$qdg zL*}#u-fk^vf5NoJ8niS+jSP(v0R(*69^>Xl1ptFyiA?KX$@|!Wd_RUAS8}rI1#G;2 zU$ntIg={|Hf;oSga<`B#SaM(F@SezkdA9XX3weY?%rkzlow=G(xe_>B%Dl`pm@9%X zW+!)y;SQZh^5dbxPyV}RNH_BPye+a(%DE?a53LABm`t`d7>+enD<ks_at5C<;@3l{ ziGL0-NN2h!cq}jfh@v$<|A^u;mlW6g{uKe-%aoXF1TZEDp=ik*I=aFKHR?G65c&WR zhioVHWQsJks4YOkYjL}!91DNzD-{=uYO{JQj|}}`X*nS9S&Yinz~Pc5d~o;c`O95y znc<<PZ^JEtha^iP2<Y3McJTW!J_td~#S3>yJLM-a`@GFSE0H{AXk)8`Q68L;`*&~L z6p26qS|2R=2p`(rn&&;Cv;eNjKMYw4YE!fZa({!Lzcq9Mh8}qsbrN?z`%8`A#v(wL zcP$(CzutcdLR<RxKzSn{!dTY=l`|?u0Io@Erp%T`3HJiV7C8(xu>8c59fW{!e4Op^ zyorhcT$kIKVul=uyod%hoAPv51mLptx{S{o9c^SG13zXuv+L3WE)9?Me@XG&Y384~ zuhAPV3D@wQk(XCGLS%pHnU`E!01AsQLX9p#bXhQY=Fh{Y8I!(4MtiJ86(+e#(}RSK zC?~mtTfE!{<M%x5IYpR!Tf`GuexFI^2<%A-bFXU)Kw+FcjR=OmV#HuxUq6JB#th+w zc*BLAXgSk<7G{oXR>xAssz_7I8}N5bvhnpXLImd3-hX4AkG%!3oVnhW1)wmr%Wd{F zB1~*$dVGhSR9Jq%gi$%4%kv{(&{o9VRAX;0)(43rQTF5yM&<GXQ0RKv-tI)oxM4O~ z>WtO`%NWANO+EHQ7e1)ln~cg;!9juHnOqNh3jiHhY%?rcGS}k$$5;-H^O2=<DSg7X z7t8-Y$lP>kv;Yb{7_v7oT(~VsV}@ZZ50+GmzC9MVF%dY!MH1a3%=BWX7Plb7F~J3w z>SB!mX&Kd}ApnI}8M;_tMJS9Jdyo-z0fNZjj&Y{f_mt)N1NI8=jPej3@#%}@)ABpD z?9cd1M*s@<Gp8Il@dZ(cv$^<LG<Zj%x^x7fa5GcLP?!RR5AGJpsQ!<=dw`B4Yr{BR z-?z4H+un`sWNb!j+qUf;+qP}nwmqFZ`>&iqpKNCs*1gX;zd{@L?YCWC=eJ^U$A1jv zvBJ#j09F=!kl~i`fN+6f9l&Z-Kly6EAIO;O_onIP{tw6N{8lXP_>(XPGT7FJ>B(_$ zOptE}YtMV%GT0KF3dhXX0M_4-!3MxFwE(R8$q`1s{aHUL6OJhY>}VO@0UYByfR)mg zxy+ODA{>(h+|f#|1sUjG+W}nG1CU|n;%r+0mg_QXf(-H%9M}RdUj3BQnU91Fu>p73 z0`O<O4;f+-{%;GwpH&_^AOrjW2Y@XAt3myQ^O>)JJS;chd;hioEJ<gyc&gg$JsZ^a ztcDp$Z@@8CfE_JK$D!fiKfY4Ky7Ar}{Phxjf7gt@1&*l#>}W~44_Y;6hJG#okh}2< zFAjcndH-3>A2sM!IHn4)qa|sA_M|}_Izas-PZq$`9__RzXTUMhe|NN^<(FwaJLs<( zQJyP+*3Z|`&Mlj?C)06?Eda~aRDM}KcZM3&OYqjCKOL>lx9=)n{=xCK0IU)6%l3`y z)#{m=o_ZSedzDbG*9Ha1J!ThxbpmF|FF8J+2K@Yq8r1bh7vM#{#<y#t0@BCq0<g}; za^=h738UOCw|Jrens7Zftz4=D<PtcCBRHbmv1o+$Xo5fRVMt`T<e-SuE8vt??!<VK zj>EZl80(ZTyLawT+n4Hj;GLfYy4k17*}Yo@BnNJOLnbOA3E{X8ci=``g-dWg&WVVv z{2T*57b;LVBFilZiYV8S^^cH^>PSK;``yF*He81*a3Rjaxk2IO&ctbO3Y$AIlBECR zQlz5+mSQIYrq4I;x^Eqp=>ll}L}jgCvOq_fUD$$kSh;G|nx(NxHMRx0gZ${_Vh1*1 zEtX>uCIv^79|Nbbxf7#Ex)Loh32WffA!O^iHTog`4tJvzW%iw)-e0|`!cL<mZFJwm z3GU!6GC|>KdL%4W<a_*vpYbu?+T-z3_Zr~J8}4_X7akWJSMmRFN{Xb@aRaJjIgU8J zzI;>v)Q&5A1;F5UU&QC^+@-?I+I8!7*){hnG^#>T765}kO<|nJA>>`$j^hin0R9ID zm!TY<$2)j;kGJsxGEo^ZyLbEUELSPxSt{3kVe|t&#k+YT^X9LHM3j3XD6)Kw;E1$j z)`Np0(r#vcDK5ZSI0eVTITDgCLOMoarwSpf=gw4vGWgw~e`>{O@x+lT?9|P8R@}!$ zIQW5wLsJx=TvLabTy)0uh1mgmU^TX*p!l!@Te1GDZ+_kJP)PEDu2>FsVjDJL9adu{ zmSG;IVH}2{3!36Pqz6Z)-T^1Sf2lhQ=%%(Wjq`VRcXwP1rGi&+cb5(ncP&=j{ozo1 zSXXf?rNyDRRHzq9C2md9<eR-`-klYg)N&&?-&((>tM5J_x%)e3pMCbZwOXxh0bD0a z2@9MklR=O3)IW2?i#Em%j|jqb+Vrwinc+;GyKoJZQo20&nYLtreuKuNo>CG~Vh!+J zq6iLX+l~Y9@eAWO;0Ah^`LqvD+_~rQ1-Mwb_fq(`wRlb5e`5MD@cPA>QYuyGH+TZ) z<!-sZ97m%k%z%ShKzzj!1AK$H2nV%m?-2+yfV=1#ItW?Wxp1{EuAa>!tE7XUbAHbK z-@keSXY2gMYr?|UEwpJLifJ>KK!m0W>3n?*5C9Q67IV^VBZL6|ed8nMK(9Bzl`<QR zI6N$fM_6g*{KLB;Zpr}2i}K-Ym6nxr@Vh1V7ijGpf<;m5AVOAROnqm7Oo&io(j^gZ zTFi$PikoTo;A+VV-jV@Ad6bpZs2>~A4=FoWa|;Jtp$U`cx;6NjmTiNvam!waR4(z2 zx*DJ-MCy8Snz-_qh>{ss4QPV~uGZUI*KmA%PwKDf>X~%`{hhoZ=l-6U3B4)sqlJww zm+0}+7wFinpWE+gbDwTFcsSk}8+ZfjYJk%asRs|AphH*pe^?B!JtC(shC8HuSAgrA zqp-V|&lfwzVQxFnvai2C@9rY!_H}4VOI$YUvvhhrMvtH2_OzC1)}|Xyo<0vJ=m_z( zx)?z8%IQr;HaZ3M_lN-)o_*48--o+Yn)MPlwy#9u!U>3<G7!gTW;il3g!c_7ScO!H zajcrdzdH38w=+y0fW!q8aeZqP@*mzpU1hOaVK7xeZ>)mFVnuy*=iVb;jC$l=@(hr4 z{tBF+LgJ^j8Q?oaE<~#MT?x8`4D^@*c%<q(a6FVMHQXtS#R9!ThT`WBsqOeEQunUM zxu|LQeEKl(XnlM_FK|G!F%FFg;+<uB4FPkQU&%Ba?0iiOnJ7M@50d5#L)zL%WF;p- zQ~sgOBfXA-{bjKl2U82NDk&3@$6w&Tjy^|JVg^2c_zp(11$B|xZ06bABcngl!Y2rq zuH1kVR6+crMgvq;RdI)3DMYHgLWbb*As#aT)3RMK5>6z+ld_T_OnMy*Y9+L?GN?+5 zAur5D+1ocLdGj2F_pT!I=t^W9TZOEcXk^E&LGFq5C`{af_vdz?{PJEXl0Sp7_$BJ9 z8*eHwJ@zH~?|g_Z>+isC^(`;~Of-GJieGPI<o?Hy>rALkOIK{5(Lc;%_pue-$K;gT z5G&dwHR<*G{}2rX_{&Ea42Iv*h2;<_xk8EX-XlC}08WE`^XHcM@SzNnmDK|M^Gi^t z9wH7yKy~vFLEP96{p%FergDuDx3lF4-+UiU7T-W11$c)wHRH296|2r=p(f?#6`)(_ zV2|EMuI$~u`w(JfGMS)Ksk#yk1o+EGD3!`T(JW8_k<w_i=-F>HzX6XkcvuAJJxSLC zCIi%W;yK_yLP;aPp_bq;Raatnavs7c@Y}9PgFlV(9oN<#{0v|Bp9RTy{a#Z|z?d;> z?sBfGdG!9Z@e9MF^k)z&olXaZLeZaSAi!TfLMD^7BB!VzQU<+&`!^(E0M1=w;!Z=# zvgp-NT-*$mF#6v(0Nv9IfW=&$ZLsj<8}!_IpM#zQ+9CM=oqysr>?tGTE!uiG_=T$8 z%a<8q(;puFK?D34qJaQ^v4sr~LaC4rB4sk0F=%)Mp9GSG33w6rp|l)gB-d0T`@Ir( zGD>hUy#PrMa&h)yKCV111pn-1p$vuPYREJO=qk;quS^vM;FL#|asZkKCt)=k@u@Th zGj3*9pgraB{?S6<i=+R}N4#LR)9pE3$o)NvZ$J-ZX5~PHcp=Zh&#b7)0L)0WT5X0C zG<<ZV?XIE6^T=f@HafhI9+#Slpr|CYn3;fvk+Jyq<QV*G@^SogN(_A;i-uEU(PVlY z+Ri<RE=v<JeCt)LJN+2vALXM&u7kPCQm6HR?!{H8Z^yu*SK(7#e_f6d`yPW+oj}on zZ<`9;K?*ILZMALZ0W@vh75<%id;H$<zab|#Uu^m#7~pbk23Sn90Gy$*lV(ZA08ERv zL5NF8tmjN-!IIefXgWO}&1b~30cwM;OF%QazVWm;w49ZIfQ6^gd+h~8?oY+3yE(P2 z2P$DT>R>B2Ph`w<bXs>C0X3vMV$&c~l?6ftFRa&a$=o;IeJ(647L)#P?$5!`X^^b8 zMQ{{f%qwQGnlgP6<=@gV0MoPYXeg8_)KwY9at?kDY*92P*c5+{IEFurJB&4_(s4iQ z1K!JZFq*4iPX?0(x3XktyeLJ;^Ib;p#(OAJ8^MZRw?jlHuk(*X@_y3$l2SM-O6kGD zFHqAA@MU5r0sf!FYR>$XR6*z=DFbjtV`cPKR9P&ji_SjG!#^j-a1c9{e^ctjsg&P> zQ<%6X1t)H2L#Z=DP<E*nla4;4Qe_$ksLN@$G7S%M6+F^P>VB~SLb?w_MTH!Wic<PI z8{pf-B?6o?iPe(j>xC+U<jBn}KwT7lIvxM6(E#FS24RNjwB!uN?@Gq}gck_ecu!d5 zy2${kSb4bwGa_fg$3I+B2I$de6ch>-91xekh3bzjO{z1%kBMvo>>9CJy;j6j>f!}4 zxAk&vSeyE;y~w#d2dG=%G|6{)G6$tw=}7o)e2%t({2BF>lmU7V7{{m3oR$7CW2!U2 zFNku%030A<w0YY;`1ncB09;jQMiq{YTlSzf{b|Ax4ovq!3vK@uf&tvjy1NLRvKM{< zp^~{*yoMY>hwn97twW1nJLwOzwK@a*nb3Z*TIR+sh*3;@A~!Ng&Hw^IVS|yKlZTr0 zv*G)xlJmLS48WBpzvb6FU;yS00vDcvpM)xRyoQXNu^5KRN=F(K?FBz`tU3cUAs`q) zY$Yf)?JgR%=;ZoZvWUah(`PN^Eq~b4<D7E*ar|K}WxCY>?U!Bki~*Px*Wed4L^5d* zuOSyMT?@0h3iXxIXcWqypK`W319Y;zu##OTLT_^m@XyBnk~M&E;QH>pblB7WtFQ1c zVFBzm1H{31$wjL9-|>tAqSN5tZyL=4(x~2X3cX?T9ylV7;c7^$&H#gLFBDq}tu$8R z&;M*IX#?;gi>FzWou{Tn#XmrkX>o2}1N?nT0vav4iNNSv9#{w5L%^7|@C)oNnOS=4 z&I8UI{h6oL8DOsMg&K`U^g@^)ohM}j2qu^~Wgb4&j00&xiP9}Jqu>vq96Ya7iTnyZ z9bS2c;7#|?ewEPr;0D&xLU`(D5?TcJz|okKsIRnIZA~*kCh-k>2DnYYb{!zr0RL#{ zC*|O`X_o7Y`*e=kR^xVDr=WC?0sb{527@+T#ygn~w#qEgV(s~Cgpv{3EKlVFE$HZK z1I&tnU#C8jsn}h(c->jmAAus`hxQDBPZ3)Q>Kr^k#8Eo;jx>XYMSN6l8?@mv<>amp z{=Y>W!`@3TYwRHXpsYm7n{qzrf>u$K9=Xy0Gmnu0dP`?udhn#a=?}+lO_UP9v^4<t z0sY$E#oR_JM*JiJ_dOy}{1M7Ci5J1LSb@IlF1pkJyuN5Z{}hhg$UuE`{7w-@A9#vx z8}9N^M>d6X*8r2YN@fw<IcNah=H%CB^sg=bVYnggAGXbKY=YUJUg(UbxTuwzg~#Z5 z1>6Gs`b{RR0D4BBM{^eiKlcLlUULD@3o0D!a0D_+G+33Cg<jhpz<1>>Zj(kwXH<du zOqGlQg6Ld%dAUqf?cWYMqT8n_P>ekTh%JR4Ier4o+jR391Mtq{sBzO_uCk)X>T@m$ zem*;}^TKne^(KfFKkh`PHQ`yI3M-N_(Qsihd{?D8HY=>XgTTc}k_mn$y!S|oMRk1+ zz6jNyny4bieQJOddl!rC2|9cJ3Yz<Pj{$_L(3zx5oB}y@2H*oTotGveHZ=>bQl;5~ z&6jd8@$fVBq?w@;1$Fx`o(2(EL*W0<D+hl-n51@s`B<%9Z*b(`OKn8i8sKY0hP?~r zayi84T5=jc+tKR`5Yl5PI?cB^1S0}2r8b%xhZzUcP_8n-T~Zs&NXwLA>y=!79uRtL zeSi+DZ&I3L6ZETYpu_x=@E<&n1D}!9eHc1&N}UTad>zMY9SyM3)&M^vK2&D_F_oa( zcOP;0rB@k%;f<hneWs)Nd`^QLH^F}>*Y{g+8ZQcD!m&t?sItn6^Ve^qWrqRq3m*%= z9^>KHeH{EkM!>IgUru`@IS`GVILj5IKXZs;`>PG;3qK8_v(N-*4}-w~NA>jCE1@IQ z%jgY%-_B?~ZVOt>K2h($=N9UA^G?#Je@l22p-07i@&9TPVDtWZdPQk^`s}454!+b# zGVxuzJHWPxJRHNP`GtJ|ucUp~L1;Oh`+;ij2<4_ZE^Tt~PuP`=hi^+E6-}MF*mGwy zL^Q%JiCQn>;7g5U(DgqS^8ceXUCeb=N0nbtgupI+z19Gn6Z;I9gBG>4L^mgXJLV8C zoH^YQ&iP70ckVtCp49DCuwkRuZx?a!g;1%X)M%h6FN0DpKR`blMg$UnA-=)}_%3mh zV8PjyppueObPXBA`J7jqpk3sC8rkE8r$e9_!J|E&;Nqt~4B2!ADKCm4HE{)HT*PeQ zXsTDi#goIwKCfHr!~c%{3Zjf&vXvDT_mr~o1X)q`%EF_we?~O0$NzmpqkK!65;pQ5 zU=#dSu{}XDnF67`hI_REd?|Rk4~)Qpo4J^{`v!WfzJNY7($79}8%L7g;GIkhsp{_i zbgwKza1T(!W*zaswm(aVL0(i@EefmIlxwNfoueYnVy&WLo<<>Sq*Ka&ZKx>zCeffS z{J$Si2k5V8#P3XO7ji0ob+jcyp;YlRLcQ7mOe^0I?Am<@ES1g(wcdy-ixm<Vw|aZc zXV3pmhBqU*d*Dz1Xd~<aJSL`^b?TuM^uAR(RU?x|{u{Gi^Al~}vu_a%9HqwpNTdGG z$OwFXGMyTXN&sjbc}VVvF;l&IAuJHweJKCl19*#O&tD;x$I=LaEj+cGA9lsBs!l-z z%DROOE~Tco7h%0dJnGSR)WzWL!?qudJ-Jl)t&Xmw&KFWo(2oIhCZdV^graVTVvLwR zdztWrVXubY!|Zu0gxOHi%E>K2*U-UkDOK`fl|LI!TR6A_yY%7jDaiYyOYlH51^a)u zcMjmLTu~HGZ9m)gyS8mJwryLrZQHhOyVtgnt~*U_>*f3YjD619dk*$=p-IChWV-al z(n|WtHI00W$sW)MrTQqISij_ot8bo<Q{Eqt{%U^fhDU>?AOe&D2l)8MUQnE#Q@$*M z`?o^`i+%I0cmL6ee|&r*Bvo4eFsqCGe7P?oX3*Z4+_@K2Le(ql*dc*LA7TsCkHjUH zP!Yj_BarB7a|-Gs8)@QQdXsl^Sv7N^L}8hC?*oq>^QEf)Q}{D>x*o8>8Q>~#JHFul zBuw#3D2jV4Be$jrs?dRc0-Y!x?MhBB8^CY^gaDx+Uz^P0FobXTkFf%|MfF7O_&@dc z`WtT(r9R*HtpSE#zGOnF30DNn;=T`IUKd=FE_`sj6D4;|$(iM^WBkR^D#mk2#P^|T z@<m*}=8Ow2xyJd{Tkquo(!ZU*^kAXc=>spn^2THQC!MuWsj)AGdMx7!^-)T#y&8%o zXY*B-sydDZu^=4?&3zS<t9X>olD%0+7JO7xPWvn^r>Y4Vrw0#Z1b*Xmc7E-gi6u;J zO2!vv7rx||50xnUCNdV5C5M-P8EONy)1Ux~{w*-?OA5a<?F3(DMnHsm(Hh+U)bu|M z6`sL;7{z_*#x*zP7n483ef<!M{0f;Ny&Lo0nR&Gq21jny7@Sr#Sr@4d?i6I~6%x65 z86rb3zUj6*j(z`==KTTbzsx`O#PA>w{;a9xsQd1J^tkgbxZ(tb#y+p0ggmd2Dq8ID zoU+#KJ8iSk;@d8fn|6}vlAZY_<XtFjic;yEg$A>?1__j+P}`_{k&Z@XO6iq#96Hva z<(D*a#4@ALXz|}@cb)vC)p^ppCR?CIXY}-`^{x@Q$~G=ln5TJS-3*JXoI#?Qt)~cQ zD{DDK%f#{;W~i`~8Y-=1AezJrUwL{z<o$)20n=a#On@;k1o}W1Xaeto7r_(YE^rw* z4QK%a(85qb1E>PUAQQxbU0^5Jj#85?HDvx4vpu-BxPrbA0x*vw(98>-a?T02-gft~ hEv+4g0}=rH_#8+*>4<@Isi6P>002ovPDHLkV1kewk>daW literal 0 HcmV?d00001 diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_0_head-256.png b/borestop/src/main/webapp/content/images/jhipster_family_member_0_head-256.png new file mode 100755 index 0000000000000000000000000000000000000000..8e99bfe66d5a0e4831fcdc4031c1a57ba9b9cb1a GIT binary patch literal 7037 zcmZ{pWl&ttvcS(S?oO}}+-)HwI151&+$Fd}kgyOO77f7(A!u+7ZUGWxaSsrj;O_3W zkN>@OU)>Myb#>4Dx_hRp=hW2saLy++6?r^tDr^7%@DvqfGynkfh#&wH<#BQ-)zbn1 z@PV3=mh7V&Wn~;|s+D7*{C}&ta=NL~f2VT)wKCi6O`)A;zK!~0D$i22%-N{eK_}Nr zrPN8U3TEzar1uz4H<U}!m1^*{=#7O9ef4e+cdYR={aYA*(UW&GP<YmvvsxLKX`(ot z8@l^5<rtB1+?Kgf`=!e5ZBvl#epA|Z{nxQ?@TJnI^Y)C@rkuXoqR#4~Lqyh}`huO7 z?C+&j3Xz>s;a!s9UCDXXZYjSE<6CDM^KLr7iG_6++N$RkRz_t0fCTsXr8n3mHhswH z@hKigcBkL$uix%0JY1bU+}|US$cwR`)s@xl5l#ywkw;BQ*J~4&2`!JET+Q|EH>W+q z*+BW;?C|Z~{m#zr%<SCa;_~^$<?Yed`PtcH_EBve+$6-M1Ox<BR8$__>#Hjs9-hIW zk>0+cM>jYu>a@F%o}Rv~y}RM(W92MQpU~u#jH{zv0|SGTwyfj!tUqIu$H&Ll?WxD@ z{}eoF%k)TTd^{R7yj$X9cTiF}68TUY==|7i>zB~m+nep#iP7r9%ZrQ0$fMle-u`WG z{5S6{&K_^AUtL@@e)77yx_S&=UteEdUJe$2ySg|RmsWpNNf}KsDYZwClG9!q=zMs1 zcw~uJ8vm~FIC}Yoi$YbQvRa3Shicm9B9bbv6!qD8B^6cP?(Ocq6jOrAY3seU3yVl_ zhWVRXx@2Y-N5!S^3n{FvZ}wy-%&Z@k^sO|HZ>{d1@19(##rF#Yv^nRGJ+^Ulbd=ou z*ED_j^yFk<e(&h$Q1jCdaqlt#Sg|a;`uOOG$EA?oCOfoh`jMg0zs0O$9=Ava{(2n6 zblr~*4;(+{sA`%isT)_;G`M*NS=hjA96Y@J!?pEooLv2+<#k>u=-NAZjZaLPS-VC= ze@)NG9~>Hwj!XR*@dcgRkM{A#-?(Y0XaeXo!iE_=hZkF=Hh2@rC51-!$CF1t8XFQx z8u-7@;{Sn%|HN1R1L*&ThMdRQ0_m@WB>3lgJ&Mb}mVEgKh5xm!6Nw~4=5RdvRgvl4 zJ;t%5L&#htEAob+a+wC%nTSMsBFzr@#F6q`y>;JwRFF!@-L1*ShNIPgY9Ns&kCy!p z{Fj`bBavT_HUC5=A8j3p>_WC7`;jYszH1+qURD-gTvdqL%BH^VT$P}0=mdZ#GKw-% zTArY_>9(M15nQw-25iKVI+h@4#Shuj6uC%_k<BOiebL%FE&T<1>b(N~_VJf>S^fLG zx@(cX?YHghJcWn$ZOh&rS}?xF6>r##ro(dLB`+2-iq$E<qeM(Fv;1;77@e%!S=LHI zLF3s?OTakqvdvMcy}T!Ed&tJ~x%LP4QwH8){qqC~+HG-82$dH125I!C#br-9!r_TS zt-4Q!egj0^#6`~<^3;<SO%scLV6rhBAdZ93?hKIdtd-W`$jli@f348U97Uy&&$yAL zPcJk1b+m~-WbsyphxFi#m{I<c`<Ands6y~_u7U`;=sBORvPYJp;7NDp)BXgw?6FiV zZI(g^b?(N{@Zn05_)f=ebdB^yWUiE)8+8H$RgkJ)LK%CMOlV-wviQmQrrWTO>NgJF zPTnZWsfJSznK?zZHZ4y<T1mQqN&`vo{<GHTlZCx`JO>ea$xSTH4-Z$OUXB-K?HozG zC9^ZTv2kyRhi_TMz-Ei`ba>yn+c|11bW6=CeOWCJ3PJ5!VgpBU7Kz$P7k}~S-rF$j zQ5^#`CV_Ac<<lqc{-pW+w0QdIe6{@B25*#d|HqkJi5?M+3$MR+4<XUtF?rzvFQ8YK zcTe7VL^z=caUEnXqIm?~t$LD7ZARl|O<`17bX@mTVr#r>|HhlL^j-+bhHe(-=!=5x zUG^;CYl_i!mHO_(k0Tk(0FPJ)G@;3Fs9^$Z;1y2-@z?LpO4GX0^}49Nr4>?SUV@Q@ z3ld3Ib!GstxKN>q+Ce|q>BfjlZnb>B$mOS6`)i|?GW_IzKEm|f%x5Ipv6VF<P$ig) zHzEgDkWJF=w)1cThIWYp^?bkC(ZJy_MsXKxH_H`*lzow9%w<01Joeqe=VK@C^()mj zYIb+Nbu@J`Yki&Q_n1e$2>?ftE594ceC<7{ZveL^KA>IOoGUr#XP7h@G;4XTl}Yn? zQLUhwMB0Q3*X+|>kkXiyBI**3mKvGu7RZ`nB5X>-BWNYCoNj3UbDoRe;lPm3aD&Q@ z(o!a>naoLB!Egyv6r%l^R<dOz<cw5Em#!|jR{)(wz)>ny)uEZxYqYFGNkMheZv8m8 zlZ(#nj6x>QradrGLzXPM;&jP2-|sA?BJ(1x_BkfYY~(2(swB1{_N$;;>P;_n2?c5t z-C6a_BI-rU2^2Yb9}zqEeO>iWmHTlQA@h#>OzZ$3)oc>=Ix1p}1kAaQtIJ)WwuS|r z8(SDe&DoJzY<U)s;^N3;NqB||t>}CzK<0lRi-J&*g^rAX_}!PwvH&iH+YTDiOF0!F z=WC3MAVJe-5_n!AqbY|VkeJK(JmQv%6^LVe+Ga_|Mq)jdMY~1V0PvCwU_r-6Aojv& z{ImdDd<-PS{6ol<0U#pMo379s><M_1ySVUNZ9jn|wk^pRjyw;5oM}xzUsD>RIBV9^ zbH6x_P6ncCS_%0}jWU?ymB+I7W+}HJTVW!qZm9(#Gy`3l&=kSlCnPY1oRj%$<~QwI za|d8RogXiZHmHCC#l1WitVhN&VID^z(C+u?F6|48U2<G`I(Fp_)mE{4E!u6@DWz5J zdS`13%7-GIUI>v-4Jj9jngn4qD--Xag_<$pkys60C{s}B8@+lrvy9SN9Y(K)lfdEW zxtB!#L}N@Tsr&q2dx8j__={!b38X_+-j8QuPPHsZo*(`3igxlwBYT2h?*n$uM+G=u z;eJK%blX$Zu>TsPa^eXqJ~XNO$q~trNnCb)Iqo*uNmrn_@ynUn^Z*4=|I7`uco=!U z>qbiv><?>wGTx9JV1TA9&Kw^)034BJCwEAz(Y-Ix4gefa>sT-T*u9owSHL-8(*#D2 zcdk5!9Et34fENeO<T8t0G~|J)Jnj>ER_n8LM*Of8ZGDH{j@q#=6)$<sU>pTpoL4xf zY#V2Th5;s+pJ5@LmAV=8qQMH`8B!Z1$uAmBvpOoz5wYe}%!k$@*woemHXEfaT2t9V zzVq|*Myb1w@pi#6Z|GeJcvh$1*N?W|j<8rtcd#_YJC}K-p8HIjNY|FpKAZLSX)nvN zn;}B`VHNSomMe#W{0Rxt?o>8#^Dgx0Dwt>^Xw@98Jb`fM6YJB`c14KIUCfb{I4#8` zT2uwfSd1tRgtnKdx&~E4-L1_<xT&b;uZ2lSlGFw<H%4%S#LPObYH33aQ+l!xuK#)W zio;J|p?AK-gQYj%%9^h<RV@%p@jk_CwB>OYoaAjNpu(KpnM%UMup0ZisWQLMA^7l~ zgcyE*!)>Y2^fm*xZ&NIRNYzvyFpfx51LxP|055P`$_9LbO{hswr^7Yqz-Tg6H2P2u z31&0$8Z%Hpz#URE)di~$JbhTV77yuX7TGCe0yPlle>&+5;Xa3Fw*JbCgmZ9ZDM^oO zf!9#!fP3R9StttW2$R`~vL5gSK+OtcIj=|1s`baiFD`x`&}Q!?6=1RLn=s*ff{C+w zxLl?`fx%H!j_u7(6^qoQSox+1a1=N$nT>9CG@Ib998EFC$VL-?!|Y{aHx(%<g2eG_ z!*7z$KzDTGQ~*jF*#9@$kXOx{f$aqN+;Alz1j2-tdEsm+5xH>6vx!QH*B_3!I<<j4 z&Fh~r9aN)oEoG1k(9vb3utwds1eOp;gK;Cx-hg|Rzp7zviKSP-eJX*f^tKS%r4_Om zPAm$9IJB^_aw0_v(H<<{rkeFq0zI4$<N_u?@+=3(<Y2Pffd1h8gdvlow=u~97E_Qy zt}vj75toow@4V<=OKpIG`4<@vWC&pri*l(86kyrfRbis*1o@KA3DZTr#e#rTtYok; zz;GE_J**u*Od6FZrlf0$er-!{mX*?pqpS3xDwR9}%24+V@Xi?Ol_yh3;Vd2)OAnF# z8=U9eufPl>=7)5HzrP0c4&dCkzGFiLu#|g%F1lV@?<PnZx&{s*i7^R;Aq$?{s1m#+ z0z6UfWTO;x4p=OqWIo=2N|4kNruTAL)xE_K+k=DCd#$ZIx7qJ4-lY~R7Pc$W#*yGq z?0{^%575Far@n%8Y7RPmKuy@p9M7|7i~&9DlSrO)G{o6rA8u?Z0z|(&tB^DHXB!%B zW}zEBoss4sz)XXaj9T}XpuF6anbSf2ScGgit}?!}(b{GuYG@_(bG|aYshn<NV4hXG zB%pkOa`z1&ktNGg6D-JneT0Y&aByYm_mp1ndtUE^0s_K(Op=(j<--)T!_5o-_^7H} znDh#6zWw8~a+3Q>-1P(Qtaq(V6s751^U8u=rNi_uAI113yvQDyNr=5{hreV#8Wdyk z4?(FobT1~676hp!y3v1+@|Hj66<2yxC0h>ugja_&u&2^7_p6o9=+3Yd;MST`kP?D- z(Lb!LtPCBdNIZOvFnIqZlw<H67w7oG&Bg#P($L~Y?^d0|N{W*hTLfcTZR_EDImv6q zx6AFsFk@0?682-Ph^E~XuIAeR_BM5U?J}SRM-G~*!AH1SC?`+E{IIs{P3$Jg&A&-4 z_xv4XF7qQ(bz?oDs>rH8^{vy9i$HTnTI?3~NaN7W+Yx7X1|Z3viN#q)bDKCt?$l?U zL?|^Zv^G>@ETkmXRaZ$;xgl4w;3mf2%xH3Bj(V`@IfJ2Ix~NoLQ16?5MhabT^f_a{ ztK|u*v0<<LUwN1?l2RRVY#b1<?+NKsUUcD-0o;P@mBXKok})L>R?IK(KXnAM?WG}` z6DqJ;J?{(ww>XRSf<7y9t3-Ccd)KZ8tkZ%$ef@P-wC<N{K_Y;w2T=%(NCICp(SgVT zBnR0*#*00$)GH8S`=T9NWgURRULOxf(Ki*UnaNubKr<wAq-(Fkn$WXkuLWn!t%v4L zt=B;mI1yMSUb6Vy{Zs9haBIA0M!`PsN_>;^Na%}-+(NBCD;LhR2TD_CM{GM1=tv*n zzNKD1kGmAUB-9bM@)rF#vBun*5#M2>3a!G^WIaqs?Z2TC-BogKw(xv@_BB``tfP~% zj_dY)&+^vD-tqwI=<3B%G#6px(fm3a@ze@t=ZIjX{~lp?<7lrU`h%9%K<9kJ0bx4C z`if(#vF)=KzDkIu2ax=b71pHBg7vo45S;uFV;>9W)FB`&dXETiV{8~5lF?%hdO2Gp zfiuEL)_$R;^xdz=99krGzOqp$-8=uX`nhM_6PmmkYLtOskw3=p>te#7`RH%?4Gw}t zbyRi55@ZbFN2ub~L4IoM;gn`1TEb@5fb56K6v`MWya>=^5f&$OyGqVZrO_D>8Py<Z zvjyG<lp)2?@asj4IBpbkxL3&%NC1-!p;Ub@Z2<^-W<%ib5HQgLNJ8l$LO|3?PFRc| ziLb`@1sSljZ{8fw7y)((ZA77pPTAL%ls3)GZ#lcRKI9XCRg(z_B){g<3Zo@h)yx-X zV=M08rY%Ae{ciUAj_TMUAOoo=zLy$ldGgd4u9%aWMAm@Ld4@Ykye^jgTTm~MSJs$u z=lEK%M@&@l3kh^2UwEDQoP+O-r~Neb)dqulPAUap1PjM`PoVw={5AX))|Mh&z8=_4 zk3Us_r5bRRVa_1sLdH16^sYh!+16r(xa5ps?Y`(3D*;7XAXyqu3zZsG0&ssBblYg| zdBx1juWj72{99E$w2ZMi{7%JNsgC|A_1cQ92F=FK&nG8e+ONg0urGZbOtzkyV>yT* z`_aFy!FJs9tfYk2ym-tf)txguI@+M@;%aa(k^m;~9b!UM?<-a|leam#JMR(MrPDNj zkuUOX^~-AKC+pL-zP}|^Dzv2&wt~?-7m@@GH55DJb{sOadA3<bG8M5K`!60}U1{p^ z`^n64KSB;J_uhn(3!Pl(K%dnCqFT03JnDWBukjhz?pVtGRQ$8=(MI+|JGh)F%==P6 zPIlVP&918#Gyg5C6XL|F<Xc2O%x7a>M_AvvR3GoJc2#o+F9zTE6lW?Pr-?;Tz;8AB zAF;IEUq9l;dp~Jjn5Q(TI`^I$-Bs+ti;Alq1)u8U)(;dB-s1Y1-=Pw7<4$KwPmcOb z!VwX>{$jw@e4hCp&5gSbmORcK(D~aJ2#or>Kn6c-HsT1p4+A->fZ1J=wa`TgK#WDm z*6UkHJ6ghPQ%O@b(@G?+%bo`NhAbw<D$oAW1}A#h?Iv+z8&43U@{Jp!X1M6f`~YF^ zPXft@Z9X~AOR+?AV?Z7v<sE`>k5Ome6TqaoxivHTdq<Uf_i8=aIgnM}8x?U*o$Jc; zl!TQp-=X@fY8xB%Ly9HP3XgO<y+XLht1A|&O0DJgH@!uLo$B(NyjsdpTu+t^c8GMl z&Sl=xr$6-wZ-#YALJDGEx8?upxhD!gj)l@*JZ%7rlc}LjK@$3Zp5ZY0`f;S=+Mk~O zjI6(c!LBVgEKr)ujemW(N58p46fs?JH;ClDnE|GTSrUIBA(nnk`dAzHoU587@^cm# za|eu*e_@fxst-?IJ25KLAQm?}IQz+1CgX9)@yC0_k{WzztjBR^U_xClyPnRxA$!ql za5l>yc1pAP&7g19HCC7VkXNngNY|mj#=73RCylR{la#aNu+UFZn>b52DXD4{giBlV z7G)Ns+r4psitlr{P<lFLB6+uKBKmM%5g>lKxNxW{fh@rL`Ny0&@rOo4qA{rfJ$LW) z#xTgrCGy^xTH%)Y)q{YkX8q>7n?=?aXI}Xc&iT)`b97QZ6Cs@Fxc#0n!eO6RHx}L# zUo9dR;o<dq>chsHIGBoIbF_5aCX?U>Hh8U%u`3N4?LNP<d!KPpQ;ztZf_LcO47SE! zVarz$<OnZKK)7$&I#Ai@XI}Ztc&2|uH3zgYEdf{HEG<R$KHMyt%lN!luLbpwafRBv z8k-Mg+E(0InkT=k_U#uVD>eL~Dln988h@wf-LAg>FDV9$^lgJ?TDEh!{rlpam%fo& zZo@9|{x>&#SLDsuYv)Da_sTd~pP<rmzzup{IaO^CsO&?tCWj>ycJ)fFzr??Pa5mrG zL#mof=!_b^YXF2pUCZBOG-l6#G>6*O?bP+<;L-opL3)hu?^yd|0Wpn(0KXf^)PoKH zp)xog<R#dlvXos|7IWRuYn8d#<3s{Mo}jA)7`abv9icfno6jd@j0F}q`Vpc~zWu<J zG6NlZPO{;a<<}X!Xo9Ht=q_EP@GA}1d10)d8k`hm6aKAhSn3fTtjg}gO_o2UT0!Ei z7q@hsrFf{fVQX|7^JEr)_tPdBasQwR`k0`rwD!0*+A<=&S8ngJ2th~PZGAd~9}^=s zTk;?%&~@KdJg6J0nu-G0hNPU9i2!~AHv-icztH<c6*xu9AdXk$htaZ&FEcB}6{`W6 zn2BBeYKA{T6{wnK0L*o;2K{}8(R}ej7m-Wjp(Y_W1nOV4CEsH(M`!!KZ#f|U^gX*7 zTC(^udSzxR%9p~5(4L%u@GW4SjTOkbHLyDdPd`Y}1x%fxn+k~0H#J3xLubBm0WV8` z6+04S9g_(FK3jMQ<$29}iQea!rp7G%^(nWOgbB}l7}n6CFF-1X1Rpw7Y{_5lp}jU{ zfoZO@8)L873ihve8Et!l_~hHJv%$S91?!nP61J~icmdr*TT0xMmy+wC=}rj>N<_k% z1Bt9qc+3sSKK2WFR5}upGlMujw5)KIuIeA6a1zTWc{0C(iiAF_pt#-$`~{5Df!Bn` z-^ntc0To1Ue0L-~=>9n<Sp>aa7{tbYyHl+I%In!MAxeZ;EAJH6URv~IP=vw)PJ%Vi zZ-_RML2HlLbM2#oP>J0{JVA^uv(SAHJRQ|gAi^5{I5f~+2DY7ugmR<~z-O?2Vr;$8 zGr<*;dp;c8a|N=MCk~AV)v^qjn)*y=ODdBgn%0CdP*CkHpaKTi>@#aUxz8`Vdm&j8 zc#MgnC1jkA>Wcv<32nGLH*e^fmye5P=Jvb8Pk0eJGL5r}xA(XQlF6I8^tjORH(9O3 zYD$vPX>WgD?PF*XYI<2!je4GKspmc*+)129h?L<u<S0{od(olGZhXR*ictFrY{Er< z;Z`Y@`SelC(QV|+UdV4oks?c_!p9H)=kU@8e7<Q{TpUVs{P3dHHl8r%IKd2jmLvzf z;d@OhQ@(nJJ55mb6KDfxxH_8UP-{ZM+{hcX67Ybhpl9$jHWs(X)HvZ%2-(u~Mn}~e zx^d8lG7h-BbN981njwA6>Rp|L&-$%qg(EI#Kpjo!1=1zzl(=?>Hxa&TYaG+oEUpF2 zZ;YLv&c+V3UW}y*m{V1@ez9=PteY*%_)w-tju5m)TbL2%Lw#XWVI-XIzvwz*0Gnx` zYM}3N$N0`UHr9p9^nUQ^A?z6d-2RaqN`GVDu0|Tx=GQ=WN!N+jDa}erF8}${n1Vby zmjV%3x;K~LSjJ~4*AnB8T_Fp^zRuo#k|t5ZaH~xB_UePnaKOR3?Qdk7Yuz8smKRNC z)aidN^C^L(fhr9K4CS0WKL!)q*G8RxRaOs{t2$f03|5yYe#}P#XXRFuL;fQ!?f23z zJAYnyIZCYVVvG$zsyBOF=ukzZpR28!ad1OeVr&zuuOGODM5RGly|cj4)3*AE%iwqt zT1E#}&dEfBb4Pr;-H*X7{OAXM5eqW)p|+*n4qex|hD#2cQxhi>WoBafSB9u1%DN$= zx^gC?;OPi)sk#Je3HSC*lU}K%vF&jeik>QwWVs+4L#Xc}E9%9a4Llp5)Z2}MPLa=T zS$_=|m#<SlXqDD#cUg{-kEYvV94dfp(@hqrE-|{9%<#~3GbR^st-e~Ii2f#f_4z(Y zO3F8g$?W4`ypWW(O-#+(a-9<CY&|!lwo|dcKMc!$AE^C)e|>k8&fg7XI(RVN*LX#0 jMG_Z}cyl+Lc}tcs2-}uPdLV!Ns{km<s>qZ}n+E+4U^Css literal 0 HcmV?d00001 diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_0_head-384.png b/borestop/src/main/webapp/content/images/jhipster_family_member_0_head-384.png new file mode 100755 index 0000000000000000000000000000000000000000..c7ca46022548477085d9c10966c94131e7290df6 GIT binary patch literal 10350 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 literal 0 HcmV?d00001 diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_0_head-512.png b/borestop/src/main/webapp/content/images/jhipster_family_member_0_head-512.png new file mode 100755 index 0000000000000000000000000000000000000000..7e0b8436e82d0b3536909e53a0d435669e6b77cd GIT binary patch literal 11431 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 literal 0 HcmV?d00001 diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_1.svg b/borestop/src/main/webapp/content/images/jhipster_family_member_1.svg new file mode 100755 index 00000000..e3a0f3db --- /dev/null +++ b/borestop/src/main/webapp/content/images/jhipster_family_member_1.svg @@ -0,0 +1 @@ +<svg enable-background="new 0 0 792 1135.9" viewBox="0 0 792 1135.9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><radialGradient id="a" cx="99.0069" cy="719.4542" gradientTransform="matrix(1.2124 0 0 1.2347 112.276 -102.0841)" gradientUnits="userSpaceOnUse" r="7.2456"><stop offset=".02238806" stop-color="#3a86ba"/><stop offset="1" stop-color="#3474a0"/></radialGradient><path d="m649 468.5s2.5 263.7 22.8 318c.4 67-55.7 25.6-55.7 25.6l-20.2-32.1s-23.1-68.7-23.1-82.5c.1-13.7 76.2-229 76.2-229z" fill="#b5694e"/><path d="m192.9 474.6s-2.5 263.7-22.8 318c-.4 67 55.7 25.6 55.7 25.6l20.1-32.1s23.1-68.7 23.1-82.5c0-13.7-76.1-229-76.1-229z" fill="#b5694e"/><path d="m188 496.6c5.4-35.3 9.8-48.6 58.8-54.3 18.5-2.2 86.1-7.3 104.9-18s15.8-64.3 15.8-64.3h51.2 51.2s-3 53.6 15.8 64.3 86.4 15.9 104.9 18c48.9 5.7 53.4 19 58.8 54.3 4.3 28.3 4.5 57.1 4.5 57.1h-235.3-235s.1-28.9 4.4-57.1z" fill="#b56441"/><path d="m236.5 778.7c-.3-4.9-7.3-5.1-8-.2-.6 4.5-1.2 9.1-1.8 13.7 3.9 2 7.6 3.8 11 5.4-.3-6.5-.8-12.8-1.2-18.9z" fill="url(#a)"/><path d="m241.7 794.3c0-.5-.1-1-.1-1.5-.1-1.5-.2-3-.3-4.4 0-.5-.1-1-.1-1.5-.1-1-.1-2-.2-3-1.1-16.1-2.1-31.1-2.9-44.5 0-.1 0-.1 0-.2-.1-1-.1-2-.2-3 0-.5-.1-.9-.3-1.3-.1-.4-.3-.7-.5-1-.7-1-1.9-1.5-3.1-1.5-.7 0-1.3.1-1.9.4-.7.4-1.3 1-1.7 1.8-.2.4-.3.8-.4 1.3 0 .3-.1.5-.1.8-.1.9-.2 1.8-.3 2.7-1.7 13.1-3.6 28.1-5.7 44.5-.1.8-.2 1.7-.3 2.5-.1.6-.2 1.2-.2 1.8-.1.6-.2 1.3-.2 1.9 1.3.7 2.6 1.3 3.9 2 .6-4.7 1.2-9.3 1.8-13.7.6-4.9 7.6-4.7 8 .2.4 6.1.9 12.4 1.3 18.9 1.5.7 2.9 1.3 4.2 2 0-.3 0-.5-.1-.8-.4-1.4-.5-2.9-.6-4.4z" fill="#4f4f4f"/><path d="m244.8 733.7v4.8.9h.9.7l-1.6-8.8v1.6z" fill="#4f4f4f"/><path d="m250.1 783.9h-4.6-.8v.8 4.7 1.6 4.7 1.6 3.4c8.2 3.7 13.4 5.8 13.4 5.8l-4-22.7h-2.6-1.4z" fill="#4f4f4f"/><path d="m244.8 740.4v4.7l2.2-2.3-.6-3.4h-.7z" fill="#c3c2c3"/><path d="m244.8 783.1 7.9-8.2-.7-4-7.2 7.5z" fill="#c3c2c3"/><path d="m244.8 776.8 6.9-7.2-.7-4-6.2 6.4z" fill="#c3c2c3"/><path d="m244.8 751.4 3.1-3.2-.7-4-2.4 2.5z" fill="#c3c2c3"/><path d="m244.8 757.8 4.1-4.3-.7-4-3.4 3.5z" fill="#c3c2c3"/><path d="m244.8 764.1 5-5.2-.7-4-4.3 4.5z" fill="#c3c2c3"/><path d="m250.1 783.9 3.5-3.6-.7-4-7.3 7.6z" fill="#c3c2c3"/><path d="m244.8 770.4 6-6.2-.7-4-5.3 5.5z" fill="#c3c2c3"/><path d="m254.3 783.9-.4-2.3-2.2 2.3z" fill="#c3c2c3"/><path d="m245.7 739.4h-.9v1z" fill="#4f4f4f"/><path d="m244.8 746.7 2.4-2.5-.2-1.4-2.2 2.3z" fill="#4f4f4f"/><path d="m244.8 753 3.4-3.5-.3-1.3-3.1 3.2z" fill="#4f4f4f"/><path d="m244.8 759.4 4.3-4.5-.2-1.4-4.1 4.3z" fill="#4f4f4f"/><path d="m244.8 765.7 5.3-5.5-.3-1.3-5 5.2z" fill="#4f4f4f"/><path d="m244.8 772 6.2-6.4-.2-1.4-6 6.2z" fill="#4f4f4f"/><path d="m244.8 778.4 7.2-7.5-.3-1.3-6.9 7.2z" fill="#4f4f4f"/><path d="m244.8 783.9h.8l7.3-7.6-.2-1.4-7.9 8.2z" fill="#4f4f4f"/><path d="m251.7 783.9 2.2-2.3-.3-1.3-3.5 3.6z" fill="#4f4f4f"/><path d="m178.6 561.5h4.5 1.5 4.6 1.5 4.6 1.5 4.6.7v-.8-4.8-1.6-4.7-1.6-4.7-1.6-4.8-1.6-4.7-1.6-2.2l-2.1-9.8h-3.3-1.6-4.5-1.5-4.2l-8 44.5h.1z" fill="#4f4f4f"/><path d="m202.1 541.7 2.6-2.7-.8-3.9-1.8 1.8z" fill="#c3c2c3"/><path d="m202.5 528.6-.4-1.8v2.2z" fill="#c3c2c3"/><path d="m202.1 535.3 1.5-1.5-.8-3.9-.7.7z" fill="#c3c2c3"/><path d="m202.1 560.7 5.9-6.1-.8-3.9-5.1 5.2z" fill="#c3c2c3"/><path d="m202.1 548 3.7-3.8-.8-3.9-2.9 3z" fill="#c3c2c3"/><path d="m207.4 561.5 1.7-1.8-.8-3.8-5.4 5.6z" fill="#c3c2c3"/><path d="m209.5 561.5-.1-.4-.4.4z" fill="#c3c2c3"/><path d="m202.1 554.3 4.8-4.9-.8-3.9-4 4.1z" fill="#c3c2c3"/><path d="m202.1 530.6.7-.7-.3-1.3-.4.4z" fill="#4f4f4f"/><path d="m202.1 536.9 1.8-1.8-.3-1.3-1.5 1.5z" fill="#4f4f4f"/><path d="m202.1 543.3 2.9-3-.3-1.3-2.6 2.7z" fill="#4f4f4f"/><path d="m202.1 549.6 4-4.1-.3-1.3-3.7 3.8z" fill="#4f4f4f"/><path d="m202.1 555.9 5.1-5.2-.3-1.3-4.8 4.9z" fill="#4f4f4f"/><path d="m202.1 561.5h.8l5.4-5.6-.3-1.3-5.9 6.1z" fill="#4f4f4f"/><path d="m209 561.5.4-.4-.3-1.4-1.7 1.8z" fill="#4f4f4f"/><path d="m198.1 507.6-.9-3.9-12.2 12.8-.1.5h4.2z" fill="#c3c2c3"/><path d="m196.1 498.6-9.8 10.2-1 5.8 11.7-12.2z" fill="#c3c2c3"/><path d="m191.8 478.2-.9 5.2 1.7-1.7z" fill="#c3c2c3"/><path d="m195.1 517 4.1-4.2-.9-3.9-7.7 8.1z" fill="#c3c2c3"/><path d="m195 493.4-7.3 7.6-1 5.8 9.2-9.6z" fill="#c3c2c3"/><path d="m192.8 483-2.3 2.4-1 5.8 4.2-4.3z" fill="#c3c2c3"/><path d="m193.9 488.2-4.8 5-1 5.8 6.7-6.9z" fill="#c3c2c3"/><path d="m200 517-.6-2.9-2.7 2.9z" fill="#c3c2c3"/><path d="m192.6 481.7-1.7 1.7-.4 2 2.3-2.4z" fill="#4f4f4f"/><path d="m193.7 486.9-4.2 4.3-.4 2 4.8-5z" fill="#4f4f4f"/><path d="m194.8 492.1-6.7 6.9-.4 2 7.3-7.6z" fill="#4f4f4f"/><path d="m195.9 497.2-9.2 9.6-.4 2 9.8-10.2z" fill="#4f4f4f"/><path d="m197 502.4-11.7 12.2-.3 1.9 12.2-12.8z" fill="#4f4f4f"/><path d="m190.6 517 7.7-8.1-.2-1.3-9 9.4z" fill="#4f4f4f"/><path d="m196.7 517 2.7-2.9-.2-1.3-4.1 4.2z" fill="#4f4f4f"/><path d="m166.4 650.5h4.6 1.5 4.5 1.6 4.5 1.5 4.6 1.5 4.6 1.5 4.6.7v-.8-4.8-1.6-4.7-1.6-4.8-1.5-4.8-1.6-4.7-1.6-4.8-1.6-4.7-.9h-.9-4.5-1.6-4.5-1.5-4.6-1.5-4.6-1.5-4.5-1.6-1.8l-8 44.5h3.9z" fill="#4f4f4f"/><path d="m207.4 561.5h-4.5-.8v.8 4.7 1.6 4.8 1.5 4.8 1.6 4.7 1.6 4.8 1.6 4.7 1.6 4.7 1h.9 4.6 1.5 4.6 1.5 3.7l-9.4-44.5h-.5z" fill="#c3c2c3"/><path d="m228.3 650.5-.2-1-.9 1z" fill="#c3c2c3"/><path d="m202.1 649.7 21.4-22.3-.9-3.8-20.5 21.3z" fill="#c3c2c3"/><path d="m207.4 650.5 17.2-17.9-.9-3.9-20.8 21.8z" fill="#c3c2c3"/><path d="m202.1 630.7 18.1-18.8-.9-3.9-17.2 17.9z" fill="#c3c2c3"/><path d="m202.1 643.3 20.3-21.1-.9-3.8-19.4 20.2z" fill="#c3c2c3"/><path d="m213.5 650.5 12.2-12.7-.9-3.9-15.8 16.6z" fill="#c3c2c3"/><path d="m219.6 650.5 7.2-7.5-.9-3.9-10.8 11.4z" fill="#c3c2c3"/><path d="m225.7 650.5 2.2-2.3-.9-3.9-5.9 6.2z" fill="#c3c2c3"/><path d="m202.1 637 19.2-19.9-.9-3.9-18.3 19z" fill="#c3c2c3"/><path d="m202.1 619.6v4.7l17-17.6-.2-.7h-3.7z" fill="#c3c2c3"/><path d="m209.1 606-7 7.2v4.8l11.6-12z" fill="#c3c2c3"/><path d="m203 606-.9.9v4.7l5.5-5.6z" fill="#c3c2c3"/><path d="m202.1 606v.9l.9-.9z" fill="#4f4f4f"/><path d="m207.6 606-5.5 5.6v1.6l7-7.2z" fill="#4f4f4f"/><path d="m213.7 606-11.6 12v1.6l13.1-13.6z" fill="#4f4f4f"/><path d="m202.1 625.9 17.2-17.9-.2-1.3-17 17.6z" fill="#4f4f4f"/><path d="m202.1 632.2 18.3-19-.2-1.3-18.1 18.8z" fill="#4f4f4f"/><path d="m202.1 638.6 19.4-20.2-.2-1.3-19.2 19.9z" fill="#4f4f4f"/><path d="m202.1 644.9 20.5-21.3-.2-1.4-20.3 21.1z" fill="#4f4f4f"/><path d="m202.1 650.5h.8l20.8-21.8-.2-1.3-21.4 22.3z" fill="#4f4f4f"/><path d="m209 650.5 15.8-16.6-.2-1.3-17.2 17.9z" fill="#4f4f4f"/><path d="m215.1 650.5 10.8-11.4-.2-1.3-12.2 12.7z" fill="#4f4f4f"/><path d="m221.1 650.5 5.9-6.2-.2-1.3-7.2 7.5z" fill="#4f4f4f"/><path d="m227.2 650.5.9-1-.2-1.3-2.2 2.3z" fill="#4f4f4f"/><path d="m190.7 561.5-16.9 17.6-1.1 5.9 22.6-23.5z" fill="#c3c2c3"/><path d="m184.6 561.5-9.4 9.9-1.1 5.8 15.1-15.7z" fill="#c3c2c3"/><path d="m176.9 561.5v.1l.1-.1z" fill="#c3c2c3"/><path d="m178.6 561.5-2 2.1-1.1 5.8 7.6-7.9z" fill="#c3c2c3"/><path d="m196.8 561.5-24.4 25.4-1.1 5.8 30.1-31.2z" fill="#c3c2c3"/><path d="m202.1 562.3-31.1 32.4-1 5.8 32.1-33.5z" fill="#c3c2c3"/><path d="m202.1 574.9-29.7 31.1h4.5l25.2-26.3z" fill="#c3c2c3"/><path d="m202.1 600.3-5.4 5.7h4.5l.9-1z" fill="#c3c2c3"/><path d="m202.1 587.6-17.6 18.4h4.6l13-13.6z" fill="#c3c2c3"/><path d="m202.1 573.4v-4.8l-32.5 33.9-.6 3.5h1.8z" fill="#c3c2c3"/><path d="m202.1 594-11.5 12h4.5l7-7.3z" fill="#c3c2c3"/><path d="m202.1 581.3-23.7 24.7h4.6l19.1-20z" fill="#c3c2c3"/><path d="m177 561.5-.1.1-.3 2 2-2.1z" fill="#4f4f4f"/><path d="m183.1 561.5-7.6 7.9-.3 2 9.4-9.9z" fill="#4f4f4f"/><path d="m189.2 561.5-15.1 15.7-.3 1.9 16.9-17.6z" fill="#4f4f4f"/><path d="m195.3 561.5-22.6 23.5-.3 1.9 24.4-25.4z" fill="#4f4f4f"/><path d="m202.1 561.5h-.7l-30.1 31.2-.3 2 31.1-32.4z" fill="#4f4f4f"/><path d="m202.1 567-32.1 33.5-.4 2 32.5-33.9z" fill="#4f4f4f"/><path d="m202.1 573.4-31.3 32.6h1.6l29.7-31.1z" fill="#4f4f4f"/><path d="m202.1 579.7-25.2 26.3h1.5l23.7-24.7z" fill="#4f4f4f"/><path d="m202.1 586-19.1 20h1.5l17.6-18.4z" fill="#4f4f4f"/><path d="m202.1 592.4-13 13.6h1.5l11.5-12z" fill="#4f4f4f"/><path d="m202.1 598.7-7 7.3h1.6l5.4-5.7z" fill="#4f4f4f"/><path d="m201.2 606h.9v-1z" fill="#4f4f4f"/><path d="m159.4 702.1v4.7 1.6 4.7 1.6 4.8 1.6 4.7 1.6 4.8 1.5 4.8.9h.9 4.6 1.5 4.6 1.5 4.5 1.6 4.5 1.5 4.6 1.5 4.6 1.5 4.6.7v-.8-4.7-1.6-4.7-1.6-4.8-1.6-4.7-1.6-4.8-1.5-4.8-1.6-4.7-1h-.9-4.5-1.6-4.5-1.5-4.6-1.5-4.6-1.5-4.5-1.6-4.5-1.6-4.5-.8v.8 4.8z" fill="#4f4f4f"/><path d="m225.7 650.5h-4.6-1.5-4.5-1.6-4.5-1.6-4.5-.8v.7 4.8 1.6 4.7 1.6 4.8 1.6 4.7 1.6 4.7 1.6 4.8 1.6 4.7.9h.9 4.6 1.5 4.6 1.5 4.5 1.6 4.5 1.5 4.6 1.5 4.4l-9.5-44.4h-1.1z" fill="#c3c2c3"/><path d="m237.9 736.2c.1 1 .1 2 .2 3l6.8-7.1v-1.6l-.5-2.7-6.8 7c.1.5.2.9.3 1.4z" fill="#c3c2c3"/><path d="m229.5 739.4c.1-.9.2-1.8.3-2.7l-2.6 2.7z" fill="#c3c2c3"/><path d="m202.1 700.6 5.5-5.7h-4.6l-.9 1z" fill="#c3c2c3"/><path d="m202.1 707 11.6-12.1h-4.6l-7 7.3z" fill="#c3c2c3"/><path d="m207.4 739.4 32.6-33.9-.8-3.9-36.3 37.8z" fill="#c3c2c3"/><path d="m213.5 739.4 27.6-28.7-.8-3.9-31.3 32.6z" fill="#c3c2c3"/><path d="m202.1 719.6 23.7-24.7h-4.5l-19.2 20z" fill="#c3c2c3"/><path d="m225.7 739.4 4.6-4.8c.4-.8 1-1.4 1.7-1.8l11.1-11.6-.7-4-21.3 22.2z" fill="#c3c2c3"/><path d="m202.1 713.3 17.6-18.4h-4.5l-13.1 13.6z" fill="#c3c2c3"/><path d="m202.1 726 29.8-31.1h-4.6l-25.2 26.3z" fill="#c3c2c3"/><path d="m202.1 727.6v4.7l35.7-37.2v-.2h-4.4z" fill="#c3c2c3"/><path d="m202.1 738.6 36.8-38.3-.8-3.9-36 37.5z" fill="#c3c2c3"/><path d="m237.1 733.9 7.1-7.4-.7-4-9.4 9.8c1 .1 2.2.6 3 1.6z" fill="#c3c2c3"/><path d="m243.9 739.4.9-.9v-4.8l-5.4 5.7z" fill="#c3c2c3"/><path d="m219.6 739.4 22.6-23.5-.8-3.9-26.3 27.4z" fill="#c3c2c3"/><g fill="#4f4f4f"><path d="m203 694.9h-.9v1z"/><path d="m202.1 702.2 7-7.3h-1.5l-5.5 5.7z"/><path d="m202.1 708.5 13.1-13.6h-1.5l-11.6 12.1z"/><path d="m202.1 714.9 19.2-20h-1.6l-17.6 18.4z"/><path d="m202.1 721.2 25.2-26.3h-1.5l-23.7 24.7z"/><path d="m202.1 727.6 31.3-32.7h-1.5l-29.8 31.1z"/><path d="m202.1 733.9 36-37.5-.3-1.3-35.7 37.2z"/><path d="m202.1 739.4h.8l36.3-37.8-.3-1.3-36.8 38.3z"/><path d="m209 739.4 31.3-32.6-.3-1.3-32.6 33.9z"/><path d="m215.1 739.4 26.3-27.4-.3-1.3-27.6 28.7z"/><path d="m221.1 739.4 21.4-22.2-.1-.6-.2-.7-22.6 23.5z"/><path d="m234 732.4 9.4-9.8-.2-1.3-11.2 11.5c.6-.3 1.3-.4 2-.4z"/><path d="m229.8 736.7c0-.3.1-.5.1-.8.1-.5.2-.9.4-1.3l-4.6 4.8h1.5z"/><path d="m237.6 734.9 6.8-7-.2-1.3-7.1 7.4c.2.2.4.6.5.9z"/><path d="m239.4 739.4 5.5-5.7v-1.6l-6.8 7.1v.2z"/><path d="m244.8 739.4v-.9l-.9.9z"/></g><path d="m172.5 650.5-13.1 13.6v4.7l17.6-18.3z" fill="#c3c2c3"/><path d="m178.6 650.5-19.2 19.9v4.7l23.7-24.6z" fill="#c3c2c3"/><path d="m190.7 650.5-31.3 32.6v4.7l35.9-37.3z" fill="#c3c2c3"/><path d="m184.6 650.5-25.2 26.2v4.8l29.8-31z" fill="#c3c2c3"/><path d="m196.8 650.5-37.4 38.9v4.7l42-43.6z" fill="#c3c2c3"/><path d="m195.1 694.9 7-7.2v-4.8l-11.5 12z" fill="#c3c2c3"/><path d="m183 694.9 19.1-19.9v-4.7l-23.7 24.6z" fill="#c3c2c3"/><path d="m171 650.5h-4.6l-6.6 6.8-.4 2.2v3z" fill="#c3c2c3"/><path d="m189.1 694.9 13-13.6v-4.7l-17.6 18.3z" fill="#c3c2c3"/><path d="m161 650.5-.8 4.9 4.7-4.9z" fill="#c3c2c3"/><path d="m176.9 694.9 25.2-26.2v-4.8l-29.7 31z" fill="#c3c2c3"/><path d="m164.7 694.9 37.4-38.9v-4.8l-41.9 43.7z" fill="#c3c2c3"/><path d="m170.8 694.9 31.3-32.6v-4.7l-35.8 37.3z" fill="#c3c2c3"/><path d="m201.2 694.9.9-.9v-4.7l-5.4 5.6z" fill="#c3c2c3"/><path d="m164.9 650.5-4.7 4.9-.4 1.9 6.6-6.8z" fill="#4f4f4f"/><path d="m171 650.5-11.6 12v1.6l13.1-13.6z" fill="#4f4f4f"/><path d="m177 650.5-17.6 18.3v1.6l19.2-19.9z" fill="#4f4f4f"/><path d="m183.1 650.5-23.7 24.6v1.6l25.2-26.2z" fill="#4f4f4f"/><path d="m189.2 650.5-29.8 31v1.6l31.3-32.6z" fill="#4f4f4f"/><path d="m195.3 650.5-35.9 37.3v1.6l37.4-38.9z" fill="#4f4f4f"/><path d="m202.1 651.2v-.7h-.7l-42 43.6v.8h.8z" fill="#4f4f4f"/><path d="m166.3 694.9 35.8-37.3v-1.6l-37.4 38.9z" fill="#4f4f4f"/><path d="m172.4 694.9 29.7-31v-1.6l-31.3 32.6z" fill="#4f4f4f"/><path d="m178.4 694.9 23.7-24.6v-1.6l-25.2 26.2z" fill="#4f4f4f"/><path d="m184.5 694.9 17.6-18.3v-1.6l-19.1 19.9z" fill="#4f4f4f"/><path d="m190.6 694.9 11.5-12v-1.6l-13 13.6z" fill="#4f4f4f"/><path d="m196.7 694.9 5.4-5.6v-1.6l-7 7.2z" fill="#4f4f4f"/><path d="m202.1 694.9v-.9l-.9.9z" fill="#4f4f4f"/><path d="m239.4 739.4h-1.3c.8 13.4 1.8 28.4 2.9 44.5h3.1.8v-.8-4.7-1.6-4.8-1.6-4.7-1.6-4.7-1.6-4.8-1.6-4.7-1.6-4.7-.9h-.9-4.6z" fill="#c3c2c3"/><path d="m215.2 783.9h4.6 1.5 2.5c2.1-16.4 4-31.4 5.7-44.5h-2.3-1.5-4.6-1.5-4.6-1.5-4.5-1.5-4.6-.8v.8 4.7 1.6 4.7 1.6 4.7 1.6 4.7 1.6 4.7 1.6 4.7 1.6.4c3.1 1.8 6.1 3.6 9.2 5.3h2.4 1.5z" fill="#c3c2c3"/><path d="m242.5 799.8c.8.4 1.5.7 2.3 1v-3.4z" fill="#c3c2c3"/><path d="m221.9 789.6c.4.2.7.4 1.1.6.1-.6.2-1.3.2-1.9z" fill="#c3c2c3"/><path d="m215.2 783.9-1.4 1.4c1 .6 2 1.1 3 1.6l2.9-3z" fill="#c3c2c3"/><path d="m223.7 783.9h-2.5l-3.4 3.6c1 .5 2 1.1 3 1.6l2.6-2.7c.1-.8.2-1.7.3-2.5z" fill="#c3c2c3"/><path d="m211.3 783.9c.5.3 1 .6 1.5.9l.8-.9z" fill="#c3c2c3"/><path d="m241.6 792.9 3.3-3.4v-4.7l-3.6 3.7c0 1.4.2 2.9.3 4.4z" fill="#c3c2c3"/><path d="m240.9 783.9c.1 1 .1 2 .2 3l2.9-3z" fill="#c3c2c3"/><path d="m242 798.7 2.8-3v-4.7l-3.2 3.3c.2 1.5.3 3 .4 4.4z" fill="#c3c2c3"/><path d="m213.7 783.9-.8.9c.3.2.7.4 1 .5l1.4-1.4z" fill="#4f4f4f"/><path d="m219.7 783.9-2.9 3c.3.2.7.4 1 .5l3.4-3.6h-1.5z" fill="#4f4f4f"/><path d="m223.4 786.4-2.6 2.7c.3.2.7.4 1 .5l1.3-1.4c.2-.6.3-1.2.3-1.8z" fill="#4f4f4f"/><path d="m241.1 787c0 .5.1 1 .1 1.5l3.6-3.7v-.8h-.8z" fill="#4f4f4f"/><path d="m241.7 794.3 3.2-3.3v-1.6l-3.3 3.4c0 .5 0 1 .1 1.5z" fill="#4f4f4f"/><path d="m244.8 795.8-2.8 3c0 .3 0 .5.1.8.2.1.3.2.5.2l2.3-2.4v-1.6z" fill="#4f4f4f"/><path d="m196.8 739.4-20.8 21.7c.9.7 1.8 1.3 2.6 2l22.7-23.7z" fill="#c3c2c3"/><path d="m202.1 746.6-19 19.8c.9.6 1.8 1.3 2.7 1.9l16.3-16.9z" fill="#c3c2c3"/><path d="m201.9 778.5c.1 0 .2.1.2.1v-.4z" fill="#c3c2c3"/><path d="m166.4 739.4-7 7.3v.2c.7.7 1.5 1.5 2.3 2.2l9.2-9.6h-4.5z" fill="#c3c2c3"/><path d="m202.1 740.2-22.6 23.5c.9.7 1.8 1.3 2.7 1.9l19.9-20.7z" fill="#c3c2c3"/><path d="m202.1 759.2-11.6 12.1c.9.6 1.9 1.2 2.8 1.8l8.8-9.2z" fill="#c3c2c3"/><path d="m202.1 765.6-7.9 8.2c.9.6 1.9 1.2 2.8 1.8l5-5.3v-4.7z" fill="#c3c2c3"/><path d="m202.1 771.9-4.1 4.3c1 .6 1.9 1.2 2.9 1.8l1.2-1.3z" fill="#c3c2c3"/><path d="m178.6 739.4-12.8 13.3c.8.7 1.6 1.4 2.5 2.1l14.9-15.5h-4.6z" fill="#c3c2c3"/><path d="m184.6 739.4-15.5 16.2c.8.7 1.7 1.4 2.5 2.1l17.6-18.3z" fill="#c3c2c3"/><path d="m160.3 739.4-.9 1v4.7l5.5-5.7z" fill="#c3c2c3"/><path d="m172.5 739.4-10 10.4c.8.7 1.6 1.5 2.4 2.2l12.1-12.6z" fill="#c3c2c3"/><path d="m202.1 752.9-15.3 16c.9.6 1.8 1.2 2.8 1.9l12.6-13.1v-4.8z" fill="#c3c2c3"/><path d="m190.7 739.4-18.2 19c.9.7 1.7 1.4 2.6 2l20.2-21z" fill="#c3c2c3"/><path d="m159.4 739.4v1l.9-1z" fill="#4f4f4f"/><path d="m159.4 745.1v1.6l7-7.3h-1.5z" fill="#4f4f4f"/><path d="m171 739.4-9.2 9.6c.3.3.5.5.8.8l10-10.4z" fill="#4f4f4f"/><path d="m177 739.4-12.1 12.6c.3.2.6.5.8.7l12.8-13.3z" fill="#4f4f4f"/><path d="m183.1 739.4-14.9 15.5c.3.2.6.5.8.7l15.5-16.2z" fill="#4f4f4f"/><path d="m189.2 739.4-17.6 18.3c.3.2.6.5.9.7l18.2-19z" fill="#4f4f4f"/><path d="m195.3 739.4-20.2 21c.3.2.6.5.9.7l20.8-21.7z" fill="#4f4f4f"/><path d="m202.1 739.4h-.8l-22.7 23.7c.3.2.6.4.9.7l22.6-23.5z" fill="#4f4f4f"/><path d="m202.1 745-19.9 20.7c.3.2.6.4.9.6l19-19.8z" fill="#4f4f4f"/><path d="m202.1 751.3-16.3 16.9.9.6 15.3-16v-1.5z" fill="#4f4f4f"/><path d="m202.1 757.6-12.6 13.1.9.6 11.6-12.1v-1.6z" fill="#4f4f4f"/><path d="m202.1 764-8.8 9.2c.3.2.6.4.9.6l7.9-8.2z" fill="#4f4f4f"/><path d="m202.1 770.3-5 5.3c.3.2.6.4 1 .6l4.1-4.3v-1.6z" fill="#4f4f4f"/><path d="m202.1 776.6-1.2 1.3c.3.2.6.4 1 .6l.2-.2z" fill="#4f4f4f"/><path d="m158.7 694.9h.7v-.8-4.7-1.6-4.7-1.6-4.8-1.6-4.7-1.6-4.7-1.6-3l-6.3 35.4h1z" fill="#c3c2c3"/><path d="m159.4 702.1-9.3 9.7-1 5.8 10.3-10.8z" fill="#c3c2c3"/><path d="m159.4 714.7-12.1 12.6-.7 4.1c.2.3.4.5.5.8l12.3-12.8z" fill="#c3c2c3"/><path d="m159.4 733.7-5.4 5.7h4.5l.9-.9z" fill="#c3c2c3"/><path d="m154.1 694.9-1.2 1.3-1.1 5.9 6.9-7.2z" fill="#c3c2c3"/><path d="m159.4 727.4-9 9.4c.7.9 1.4 1.7 2.1 2.6l6.9-7.2z" fill="#c3c2c3"/><path d="m159.4 695.7-7.9 8.3-1.1 5.8 9-9.3z" fill="#c3c2c3"/><path d="m159.4 708.4-10.7 11.2-1 5.8 11.7-12.3z" fill="#c3c2c3"/><path d="m159.4 721.1-11.7 12.2c.6.9 1.3 1.8 2 2.7l9.7-10.1z" fill="#c3c2c3"/><path d="m153.1 694.9-.2 1.3 1.2-1.3z" fill="#4f4f4f"/><path d="m159.4 695.7v-.8h-.7l-6.9 7.2-.3 1.9z" fill="#4f4f4f"/><path d="m159.4 700.5-9 9.3-.3 2 9.3-9.7z" fill="#4f4f4f"/><path d="m159.4 706.8-10.3 10.8-.4 2 10.7-11.2z" fill="#4f4f4f"/><path d="m159.4 713.1-11.7 12.3-.4 2 12.1-12.7z" fill="#4f4f4f"/><path d="m159.4 719.5-12.3 12.8.6.9 11.7-12.2z" fill="#4f4f4f"/><path d="m159.4 725.8-9.7 10.1c.2.3.5.6.7.9l9-9.4z" fill="#4f4f4f"/><path d="m159.4 733.7v-1.6l-6.9 7.2v.1h1.4z" fill="#4f4f4f"/><path d="m158.5 739.4h.9v-.9z" fill="#4f4f4f"/><path d="m159.4 745.1v-4.7-.9h-.9-4.5-1.4c2.1 2.5 4.4 5 6.9 7.4v-.2-1.6z" fill="#c3c2c3"/><path d="m633.1 741.4c0-.3-.1-.6-.1-.9 0-.2-.1-.3-.1-.4-.3-1.3-.9-2.2-1.7-2.7-.3-.2-.7-.3-1-.4-1.8-.3-3.9.9-4 3.8 0 .4 0 .8-.1 1.2 0 .6-.1 1.1-.1 1.7v.3c-.3 5.5-.6 11.3-.9 17.3 0 .3 0 .6-.1 1 0 .6-.1 1.1-.1 1.7-.1 1.7-.2 3.4-.3 5.1 0 .6-.1 1.1-.1 1.7-.1 1.7-.2 3.4-.3 5.1 0 .6-.1 1.1-.1 1.7-.1 1-.1 1.9-.2 2.9 4.1-2 8.4-4.2 12.7-6.6-1.2-10.8-2.3-20.8-3.3-29.9 0-.9-.1-1.7-.2-2.6z" fill="#4f4f4f"/><path d="m661.8 610.5v.8 4.8 1.6 4.7 1.6 4.8 1.5 4.8 1.6 4.7 1.6 4.8 1.6 4.7.9h.8 3.9 1.3 3.9l-5.4-44.5h-3.8z" fill="#4f4f4f"/><path d="m661.8 597.1 2.5-3.1-.5-4.1-2 2.4z" fill="#c3c2c3"/><path d="m661.8 590.7 1.9-2.2-.5-4.1-1.4 1.6z" fill="#c3c2c3"/><path d="m662.3 577.5-.5-4.1v4.7z" fill="#c3c2c3"/><path d="m661.8 603.4 3.2-3.8-.5-4.2-2.7 3.3z" fill="#c3c2c3"/><path d="m661.8 584.4 1.2-1.4-.5-4.1-.7.8z" fill="#c3c2c3"/><path d="m661.8 609.7 3.9-4.6-.5-4.1-3.4 4z" fill="#c3c2c3"/><path d="m666.3 610.5-.5-4-3.3 4z" fill="#c3c2c3"/><path d="m661.8 579.7.7-.8-.2-1.4-.5.6z" fill="#4f4f4f"/><path d="m661.8 586 1.4-1.6-.2-1.4-1.2 1.4z" fill="#4f4f4f"/><path d="m661.8 592.3 2-2.4-.1-1.4-1.9 2.2z" fill="#4f4f4f"/><path d="m661.8 598.7 2.7-3.3-.2-1.4-2.5 3.1z" fill="#4f4f4f"/><path d="m661.8 605 3.4-4-.2-1.4-3.2 3.8z" fill="#4f4f4f"/><path d="m661.8 610.5h.7l3.3-4-.1-1.4-3.9 4.6z" fill="#4f4f4f"/><path d="m672.9 699.5h-1.3-3.9-1.3-3.9-.7v.8 4.7 1.6 4.7 1.6 4.7 1.6 4.7 1.6 4.7 1.6 4.7 1.6 4.7.9h.8 3.9 1.3 3.9 1.3.7c2.8-3.4 5.2-7 7.4-10.7l-4.1-33.8h-.2-3.9z" fill="#4f4f4f"/><path d="m661.8 686 11.9-14.4-.5-4.1-11.4 13.8z" fill="#c3c2c3"/><path d="m661.8 673.4 10.6-12.8-.5-4.1-10.1 12.1z" fill="#c3c2c3"/><path d="m671.6 699.5 4.8-5.8-.5-4.1-8.2 9.9z" fill="#c3c2c3"/><path d="m661.8 660.7 4.7-5.7h-3.9l-.8 1z" fill="#c3c2c3"/><path d="m661.8 698.7 13.2-16-.5-4.1-12.7 15.4z" fill="#c3c2c3"/><path d="m676.8 699.5.3-.2-.6-4.2-3.6 4.4z" fill="#c3c2c3"/><path d="m661.8 662.3v4.7l9.9-11.9v-.1h-3.9z" fill="#c3c2c3"/><path d="m661.8 679.7 11.2-13.6-.5-4.1-10.7 13z" fill="#c3c2c3"/><path d="m666.4 699.5 9.3-11.3-.5-4.1-12.7 15.4z" fill="#c3c2c3"/><path d="m661.8 692.4 12.6-15.2-.5-4.2-12.1 14.6z" fill="#c3c2c3"/><path d="m662.6 655h-.8v1z" fill="#4f4f4f"/><path d="m661.8 662.3 6-7.3h-1.3l-4.7 5.7z" fill="#4f4f4f"/><path d="m661.8 668.6 10.1-12.1-.2-1.4-9.9 11.9z" fill="#4f4f4f"/><path d="m661.8 675 10.7-13-.1-1.4-10.6 12.8z" fill="#4f4f4f"/><path d="m661.8 681.3 11.4-13.8-.2-1.4-11.2 13.6z" fill="#4f4f4f"/><path d="m661.8 687.6 12.1-14.6-.2-1.4-11.9 14.4z" fill="#4f4f4f"/><path d="m661.8 694 12.7-15.4-.1-1.4-12.6 15.2z" fill="#4f4f4f"/><path d="m661.8 699.5h.7l12.7-15.4-.2-1.4-13.2 16z" fill="#4f4f4f"/><path d="m667.7 699.5 8.2-9.9-.2-1.4-9.3 11.3z" fill="#4f4f4f"/><path d="m672.9 699.5 3.6-4.4-.1-1.4-4.8 5.8z" fill="#4f4f4f"/><path d="m677.1 699.5v-.2l-.3.2z" fill="#4f4f4f"/><path d="m661.8 749.7 4.7-5.7h-3.9l-.8.9z" fill="#c3c2c3"/><path d="m666.3 752.1c2.6-2.6 5.1-5.3 7.4-8.1h-.7z" fill="#c3c2c3"/><path d="m661.8 756 9.9-12h-3.9l-6 7.3z" fill="#c3c2c3"/><path d="m662.6 744h-.8v.9z" fill="#4f4f4f"/><path d="m661.8 751.3 6-7.3h-1.3l-4.7 5.7z" fill="#4f4f4f"/><path d="m671.7 744-9.9 12v.3c1.5-1.4 3.1-2.8 4.5-4.2l6.7-8.1z" fill="#4f4f4f"/><path d="m645.5 521.6h1.3 3.9 1.3 3.6l-4.7-38.9-9.4 38.9h.1z" fill="#c3c2c3"/><path d="m655.8 523.4-20.8 25.1-1.6 6.7 22.9-27.7z" fill="#c3c2c3"/><path d="m656.4 528.9-23.6 28.6-1.6 6.7 25.7-31.2z" fill="#c3c2c3"/><path d="m650.6 566.1 9-11-.5-4.1-12.4 15.1z" fill="#c3c2c3"/><path d="m634.9 566.1 22.7-27.5-.5-4.2-26.1 31.7z" fill="#c3c2c3"/><path d="m655.8 566.1 4.5-5.4-.5-4.2-7.9 9.6z" fill="#c3c2c3"/><path d="m640.1 566.1 18.2-22-.5-4.2-21.6 26.2z" fill="#c3c2c3"/><path d="m660.9 566.1-.5-4.1-3.3 4.1z" fill="#c3c2c3"/><path d="m645.4 566.1 13.5-16.5-.5-4.1-17 20.6z" fill="#c3c2c3"/><path d="m641.6 521.6-.1.1-1.6 6.7 5.6-6.8z" fill="#c3c2c3"/><path d="m646.8 521.6-7.5 9-1.6 6.7 13-15.7z" fill="#c3c2c3"/><path d="m655.6 521.6h-3.6l-14.8 18-1.7 6.7 20.1-24.3z" fill="#c3c2c3"/><path d="m641.5 521.6v.1l.1-.1z" fill="#4f4f4f"/><path d="m645.5 521.6-5.6 6.8-.6 2.2 7.5-9z" fill="#4f4f4f"/><path d="m650.7 521.6-13 15.7-.5 2.3 14.8-18z" fill="#4f4f4f"/><path d="m655.6 522-20.1 24.3-.5 2.2 20.8-25.1z" fill="#4f4f4f"/><path d="m656.3 527.5-22.9 27.7-.6 2.3 23.6-28.6z" fill="#4f4f4f"/><path d="m657.1 534.4-.2-1.4-25.7 31.2-.4 1.9h.2z" fill="#4f4f4f"/><path d="m636.2 566.1 21.6-26.2-.2-1.3-22.7 27.5z" fill="#4f4f4f"/><path d="m641.4 566.1 17-20.6-.1-1.4-18.2 22z" fill="#4f4f4f"/><path d="m646.7 566.1 12.4-15.1-.2-1.4-13.5 16.5z" fill="#4f4f4f"/><path d="m651.9 566.1 7.9-9.6-.2-1.4-9 11z" fill="#4f4f4f"/><path d="m657.1 566.1 3.3-4.1-.1-1.3-4.5 5.4z" fill="#4f4f4f"/><path d="m614 655h1.3 3.9 1.3 3.9.7v-.8-4.7-1.6-4.7-1.6-4.8-1.6-4.7-1.6-4.7-1.6-4.8-1.6-4.7-1h-.8-3.9-.3l-10.8 44.5h.8z" fill="#4f4f4f"/><path d="m625.1 590.6v1.6 4.7 1.6 4.8 1.6 4.7.9h.8 3.9 1.3 3.9 1.3 3.9 1.4 3.9 1.3 3.9 1.3 3.9 1.3 4 .6v-.8-4.7-1.6-4.7-1.6-4.8-1.6-4.7-1.6-4.7-1.6-4.7l-.9-7.3h-3.8-1.3-3.9-1.3-3.9-1.3-4-1.3-3.9-1.3-3.9-.2l-5.7 23.5z" fill="#c3c2c3"/><path d="m646.7 655h3.9l11.2-13.6v-4.7z" fill="#c3c2c3"/><path d="m625.1 622.6 9.9-12.1h-3.9l-6 7.3z" fill="#c3c2c3"/><path d="m625.1 635.2 20.4-24.7h-3.9l-16.5 20z" fill="#c3c2c3"/><path d="m625.1 641.6 25.6-31.1h-3.9l-21.7 26.3z" fill="#c3c2c3"/><path d="m625.1 628.9 15.1-18.4h-3.9l-11.2 13.7z" fill="#c3c2c3"/><path d="m625.1 616.2 4.7-5.7h-3.9l-.8 1z" fill="#c3c2c3"/><path d="m625.1 654.2 36.1-43.7h-4l-32.1 39z" fill="#c3c2c3"/><path d="m625.8 655h3.9l32.1-38.9v-4.8z" fill="#c3c2c3"/><path d="m651.9 655h3.9l6-7.2v-4.8z" fill="#c3c2c3"/><path d="m641.4 655h4l16.4-19.9v-4.8z" fill="#c3c2c3"/><path d="m625.1 647.9 30.8-37.4h-3.9l-26.9 32.7z" fill="#c3c2c3"/><path d="m631 655h3.9l26.9-32.6v-4.7z" fill="#c3c2c3"/><path d="m636.2 655h3.9l21.7-26.2v-4.8z" fill="#c3c2c3"/><path d="m657.1 655h3.9l.8-.9v-4.7z" fill="#c3c2c3"/><path d="m625.9 610.5h-.8v1z" fill="#4f4f4f"/><path d="m625.1 617.8 6-7.3h-1.3l-4.7 5.7z" fill="#4f4f4f"/><path d="m625.1 624.2 11.2-13.7h-1.3l-9.9 12.1z" fill="#4f4f4f"/><path d="m625.1 630.5 16.5-20h-1.4l-15.1 18.4z" fill="#4f4f4f"/><path d="m625.1 636.8 21.7-26.3h-1.3l-20.4 24.7z" fill="#4f4f4f"/><path d="m625.1 643.2 26.9-32.7h-1.3l-25.6 31.1z" fill="#4f4f4f"/><path d="m625.1 649.5 32.1-39h-1.3l-30.8 37.4z" fill="#4f4f4f"/><path d="m625.1 655h.7l36-43.7v-.8h-.6l-36.1 43.7z" fill="#4f4f4f"/><path d="m629.7 655h1.3l30.8-37.3v-1.6z" fill="#4f4f4f"/><path d="m634.9 655h1.3l25.6-31v-1.6z" fill="#4f4f4f"/><path d="m640.1 655h1.3l20.4-24.7v-1.5z" fill="#4f4f4f"/><path d="m645.4 655h1.3l15.1-18.3v-1.6z" fill="#4f4f4f"/><path d="m650.6 655h1.3l9.9-12v-1.6z" fill="#4f4f4f"/><path d="m655.8 655h1.3l4.7-5.6v-1.6z" fill="#4f4f4f"/><path d="m661 655h.8v-.9z" fill="#4f4f4f"/><path d="m624.3 610.5.8-.9v-4.7l-4.7 5.6z" fill="#c3c2c3"/><path d="m625.1 598.5-3 3.7-1.6 6.7 4.6-5.6z" fill="#c3c2c3"/><path d="m625.1 589.6-.3 1.4.3-.4z" fill="#c3c2c3"/><path d="m625.1 592.2-.9 1.1-1.6 6.7 2.5-3.1z" fill="#c3c2c3"/><path d="m625.1 590.6-.3.4-.6 2.3.9-1.1z" fill="#4f4f4f"/><path d="m625.1 596.9-2.5 3.1-.5 2.2 3-3.7z" fill="#4f4f4f"/><path d="m625.1 604.9v-1.6l-4.6 5.6-.4 1.6h.3z" fill="#4f4f4f"/><path d="m625.1 610.5v-.9l-.8.9z" fill="#4f4f4f"/><path d="m588.4 744h.8 3.9 1.3 3.9 1.3 3.9 1.4 3.9 1.3 3.9 1.3 3.9 1.3 3.9.7v-.8-4.7-1.6-4.8-1.6-4.7-1.6-4.7-1.6-4.8-1.6-4.7-1.6-4.7-1h-.8-3.9-1.3-3.9-1.3-3.9-1.3-4-1.3-3.9-.9l-10.2 42.4v1.2z" fill="#4f4f4f"/><path d="m661 655h-3.9-1.3-3.9-1.3-3.9-1.3-4-1.3-3.9-1.3-3.9-1.3-3.9-.7v.8 4.8 1.6 4.7 1.6 4.7 1.6 4.8 1.6 4.7 1.6 4.7 1.6 4.8.9h.8 3.9 1.3 3.9 1.3 3.9 1.4 3.9 1.3 3.9 1.3 3.9 1.3 4 .6v-.8-4.7-1.6-4.8-1.6-4.7-1.6-4.7-1.6-4.8-1.6-4.7-1.6-4.7-1z" fill="#c3c2c3"/><path d="m657.2 699.5-32.1 38.9v4.7l1-1.2c0-.4 0-.8.1-1.2.1-2.8 2.2-4.1 4-3.8l31-37.5h-4z" fill="#c3c2c3"/><path d="m657.1 744h3.9l.8-.9v-4.8z" fill="#c3c2c3"/><path d="m652 699.5-26.9 32.6v4.8l30.8-37.4z" fill="#c3c2c3"/><path d="m631.1 699.5-6 7.3v4.7l9.9-12z" fill="#c3c2c3"/><path d="m625.9 699.5-.8 1v4.7l4.7-5.7z" fill="#c3c2c3"/><path d="m646.7 744h3.9l11.2-13.6v-4.7z" fill="#c3c2c3"/><path d="m641.4 744h4l16.4-19.9v-4.8z" fill="#c3c2c3"/><path d="m651.9 744h3.9l6-7.3v-4.7z" fill="#c3c2c3"/><path d="m641.6 699.5-16.5 20v4.7l20.4-24.7z" fill="#c3c2c3"/><path d="m636.2 744h3.9l21.7-26.3v-4.7z" fill="#c3c2c3"/><path d="m636.3 699.5-11.2 13.6v4.8l15.1-18.4z" fill="#c3c2c3"/><path d="m626 744c0-.1 0-.2 0-.3l-.3.3z" fill="#c3c2c3"/><path d="m646.8 699.5-21.7 26.3v4.7l25.6-31z" fill="#c3c2c3"/><path d="m633.1 741.4c.1.8.2 1.7.3 2.6h1.5l26.9-32.6v-4.7z" fill="#c3c2c3"/><path d="m631.2 737.4c.8.5 1.5 1.4 1.7 2.7l28.9-35v-4.7z" fill="#c3c2c3"/><path d="m625.1 699.5v1l.8-1z" fill="#4f4f4f"/><path d="m629.8 699.5-4.7 5.7v1.6l6-7.3z" fill="#4f4f4f"/><path d="m635 699.5-9.9 12v1.6l11.2-13.6z" fill="#4f4f4f"/><path d="m640.2 699.5-15.1 18.4v1.6l16.5-20z" fill="#4f4f4f"/><path d="m645.5 699.5-20.4 24.7v1.6l21.7-26.3z" fill="#4f4f4f"/><path d="m650.7 699.5-25.6 31v1.6l26.9-32.6z" fill="#4f4f4f"/><path d="m655.9 699.5-30.8 37.4v1.6l32.1-39z" fill="#4f4f4f"/><path d="m625.1 744h.7l.3-.3c0-.6.1-1.1.1-1.7l-1 1.2v.8z" fill="#4f4f4f"/><path d="m661.2 699.5-31 37.5c.3.1.7.2 1 .4l30.6-37.1v-.8z" fill="#4f4f4f"/><path d="m632.9 740.1c0 .1.1.3.1.4 0 .3.1.6.1.9l28.7-34.8v-1.6z" fill="#4f4f4f"/><path d="m634.9 744h1.3l25.6-31v-1.6z" fill="#4f4f4f"/><path d="m640.1 744h1.3l20.4-24.7v-1.6z" fill="#4f4f4f"/><path d="m645.4 744h1.3l15.1-18.3v-1.6z" fill="#4f4f4f"/><path d="m650.6 744h1.3l9.9-12v-1.6z" fill="#4f4f4f"/><path d="m655.8 744h1.3l4.7-5.7v-1.6z" fill="#4f4f4f"/><path d="m661 744h.8v-.9z" fill="#4f4f4f"/><path d="m625.1 662.2-24.7 29.9-1.6 6.7 26.3-31.9z" fill="#c3c2c3"/><path d="m625.1 674.8-20.4 24.7h4l16.4-19.9z" fill="#c3c2c3"/><path d="m620.5 655-15.8 19.2-1.6 6.7 21.3-25.9z" fill="#c3c2c3"/><path d="m625.1 687.5-9.9 12h3.9l6-7.3z" fill="#c3c2c3"/><path d="m625.1 693.8-4.7 5.7h3.9l.8-.9z" fill="#c3c2c3"/><path d="m625.1 655.8-22.5 27.3-1.6 6.7 24.1-29.2z" fill="#c3c2c3"/><path d="m625.1 681.2-15.1 18.3h3.9l11.2-13.6z" fill="#c3c2c3"/><path d="m615.3 655-8.4 10.3-1.6 6.6 13.9-16.9z" fill="#c3c2c3"/><path d="m610.1 655-1.1 1.3-1.6 6.7 6.6-8z" fill="#c3c2c3"/><path d="m625.1 668.5-25.6 31h3.9l21.7-26.3z" fill="#c3c2c3"/><path d="m609.3 655-.3 1.3 1.1-1.3z" fill="#4f4f4f"/><path d="m614 655-6.6 8-.5 2.3 8.4-10.3z" fill="#4f4f4f"/><path d="m619.2 655-13.9 16.9-.6 2.3 15.8-19.2z" fill="#4f4f4f"/><path d="m625.1 655h-.7l-21.3 25.9-.5 2.2 22.5-27.3z" fill="#4f4f4f"/><path d="m625.1 660.6-24.1 29.2-.6 2.3 24.7-29.9z" fill="#4f4f4f"/><path d="m625.1 668.5v-1.6l-26.3 31.9-.2.7h.9z" fill="#4f4f4f"/><path d="m625.1 673.2-21.7 26.3h1.3l20.4-24.7z" fill="#4f4f4f"/><path d="m625.1 679.6-16.4 19.9h1.3l15.1-18.3z" fill="#4f4f4f"/><path d="m625.1 685.9-11.2 13.6h1.3l9.9-12z" fill="#4f4f4f"/><path d="m625.1 692.2-6 7.3h1.3l4.7-5.7z" fill="#4f4f4f"/><path d="m624.3 699.5h.8v-.9z" fill="#4f4f4f"/><path d="m603.4 788.5h-3.9-1.3-3.9-1.3-3.9-.7v.8 4.6l2-.4s5.9-1.6 14.9-5h-.5z" fill="#4f4f4f"/><path d="m625.1 744v.8 4.7 1.6 4.7 1.6 3.8c.3-6 .6-11.8.9-17.3h-.3-.6z" fill="#c3c2c3"/><path d="m661.8 751.3v-1.6-4.7-1h-.8-3.9-1.3-3.9-1.3-3.9-1.3-3.9-1.3-3.9-1.3-1.5c1 9.1 2.1 19.1 3.3 29.9 8.6-4.9 17.3-10.7 25.1-17.6v-.3-4.7z" fill="#c3c2c3"/><path d="m604.9 744-16.5 19.9v4.8l20.4-24.7z" fill="#c3c2c3"/><path d="m599.6 744-11.2 13.6v4.8l15.1-18.4z" fill="#c3c2c3"/><path d="m620.5 744-32.1 39v4.7l36-43.7z" fill="#c3c2c3"/><path d="m610.1 744-21.7 26.3v4.7l25.6-31z" fill="#c3c2c3"/><path d="m615.3 744-26.9 32.6v4.8l30.8-37.4z" fill="#c3c2c3"/><path d="m599.5 788.5h3.9l21.6-26.2c0-.3 0-.6.1-1v-3.8z" fill="#c3c2c3"/><path d="m625.1 751.1-30.8 37.4h3.9l26.9-32.6z" fill="#c3c2c3"/><path d="m620.4 782.2c1.2-.5 2.4-1.1 3.6-1.7.1-1 .1-1.9.2-2.9z" fill="#c3c2c3"/><path d="m625.1 744.8-36 43.7h3.9l32.1-39z" fill="#c3c2c3"/><path d="m624.6 770.8-12.3 15c1.9-.8 4-1.7 6.1-2.6l6-7.3c0-1.7.1-3.4.2-5.1z" fill="#c3c2c3"/><path d="m625 764-20.2 24.5h.5c1.6-.6 3.2-1.2 5-1.9l14.4-17.5c.1-1.7.2-3.4.3-5.1z" fill="#c3c2c3"/><path d="m594.4 744-6 7.3v4.7l9.9-12z" fill="#c3c2c3"/><path d="m589.2 744-.8.9v4.8l4.7-5.7z" fill="#c3c2c3"/><path d="m588.4 744v.9l.8-.9z" fill="#4f4f4f"/><path d="m593.1 744-4.7 5.7v1.6l6-7.3z" fill="#4f4f4f"/><path d="m598.3 744-9.9 12v1.6l11.2-13.6z" fill="#4f4f4f"/><path d="m603.5 744-15.1 18.4v1.5l16.5-19.9z" fill="#4f4f4f"/><path d="m608.8 744-20.4 24.7v1.6l21.7-26.3z" fill="#4f4f4f"/><path d="m614 744-25.6 31v1.6l26.9-32.6z" fill="#4f4f4f"/><path d="m619.2 744-30.8 37.4v1.6l32.1-39z" fill="#4f4f4f"/><path d="m625.1 744h-.7l-36 43.7v.8h.7l36-43.7z" fill="#4f4f4f"/><path d="m625.1 749.5-32.1 39h1.3l30.8-37.4z" fill="#4f4f4f"/><path d="m625.1 755.9-26.9 32.6h1.3l25.6-31z" fill="#4f4f4f"/><path d="m604.7 788.5 20.3-24.5c0-.6.1-1.1.1-1.7l-21.6 26.2z" fill="#4f4f4f"/><path d="m624.7 769.1-14.4 17.5c.6-.3 1.3-.5 2-.8l12.3-15c0-.6 0-1.2.1-1.7z" fill="#4f4f4f"/><path d="m624.3 775.9-6 7.3c.7-.3 1.4-.6 2.1-.9l3.8-4.6c0-.7.1-1.3.1-1.8z" fill="#4f4f4f"/><path d="m588.4 741.9-.4 1.6.4-.4z" fill="#c3c2c3"/><path d="m588.4 743.1-.4.4-.1.5h.5z" fill="#4f4f4f"/><path d="m578.6 788.5h3.9 1.3 3.9.7v-.8-4.7-1.6-4.8-1.6-4.7-1.6-4.8-1.5-4.8-1.6-4.7-1.6-4.8-.9h-.5l-10.7 44.5h.1z" fill="#c3c2c3"/><path d="m583.8 794.9 4.6-1v-4.6z" fill="#c3c2c3"/><path d="m578.6 788.5-2 2.4-1.4 5.8.7-.2 6.6-8z" fill="#c3c2c3"/><path d="m577.2 788.5-.1.2.2-.2z" fill="#c3c2c3"/><path d="m583.8 788.5-6.3 7.7 4.7-1 5.5-6.7z" fill="#c3c2c3"/><path d="m577.3 788.5-.2.2-.5 2.2 2-2.4z" fill="#4f4f4f"/><path d="m582.5 788.5-6.6 8 1.6-.3 6.3-7.7z" fill="#4f4f4f"/><path d="m588.4 788.5h-.7l-5.5 6.7 1.6-.3 4.6-5.6z" fill="#4f4f4f"/><path d="m336.3 426.5c-2.9.8-6.2 1.6-9.8 2.3 25.1 11.3 61.6 18.3 100.8 18.3 36.9 0 71.4-6.2 96.3-16.4-7.9-1.2-15.1-2.6-20.7-4.2s-19.6 12.5-83.1 12.5c-63.4 0-83.5-12.5-83.5-12.5z" fill="none"/><path d="m509 990.8h-16.2c5.3 0 10.7.1 16.2 0z" fill="#808080"/><path d="m427.3 447.1c-39.2 0-75.7-7-100.8-18.3-1.8.4-3.7.7-5.7 1.1.3.1.6.3.9.4s.6.3.8.4c.8.4 1.7.8 2.6 1.2.3.1.6.3.9.4.9.4 1.8.8 2.6 1.1.3.1.6.3.9.4.9.4 1.8.7 2.7 1.1.3.1.6.2.9.4.9.3 1.8.7 2.8 1 .1 0 .1 0 .2.1 1.8.7 3.7 1.3 5.6 1.9.7.2 1.3.4 2 .6.3.1.6.2 1 .3 1 .3 1.9.6 2.9.9.3.1.7.2 1 .3 1 .3 2 .6 2.9.8.3.1.7.2 1 .3 1 .3 2 .5 3 .8.3.1.7.2 1 .2 1 .2 2 .5 3 .7.3.1.7.2 1 .2 1 .2 2 .5 3.1.7.3.1.7.1 1 .2 1 .2 2.1.4 3.1.6.4.1.7.1 1.1.2 1.1.2 2.1.4 3.2.6.4.1.7.1 1.1.2 1.1.2 2.1.4 3.2.5.2 0 .4.1.5.1 11.1 1.8 22.9 3 35.2 3.6h1c.4 0 .8 0 1.2.1 1.2 0 2.4.1 3.6.1h1.2c1.2 0 2.5.1 3.7.1h1.2 3.3.5 1.3 3.8 1.3c1.3 0 2.6-.1 3.8-.1h1.3c1.3 0 2.6-.1 3.9-.2.4 0 .9 0 1.3-.1.9 0 1.9-.1 2.8-.2 12.3-.7 24.2-2.1 35.2-4.1.1 0 .2 0 .3-.1.5-.1 1-.2 1.5-.3 1.6-.3 3.1-.6 4.7-.9.5-.1 1.1-.2 1.6-.3 1.6-.3 3.2-.7 4.8-1.1.6-.1 1.1-.3 1.7-.4 1.7-.4 3.3-.8 5-1.3.6-.2 1.1-.3 1.7-.5 1.8-.5 3.5-1 5.2-1.5l1.8-.6c1.9-.6 3.7-1.2 5.5-1.8.5-.2.9-.3 1.4-.5.3-.1.6-.2.8-.3 1.9-.7 3.8-1.4 5.7-2.2.7-.3 1.4-.6 2.1-.9 1.2-.5 2.4-1.1 3.6-1.6-2.2-.3-4.3-.6-6.4-1-24.7 10.5-59.2 16.7-96.1 16.7z" fill="#808080"/><path d="m587.4 760.6h-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-.6-35.2-.7-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-.6-35.2-.8-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-.7-35.2-.7-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-.6-35.2-.7-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-.6-23.2 2.5 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7.7 35.2.7 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8.6 35.2.8 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7.6 35.3.7 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.7.7 35.2.7 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8.6 35.2.8 3.7.3-4.8z" fill="#808080"/><path d="m588.1 442.1v3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.8h.7 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.6v-.6-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-1.3c-8.2-2.9-18.6-5-31.9-6.5-.9-.1-2.1-.2-3.3-.4v2.9 1.3z" fill="#808080"/><path d="m632.8 472.4 11.7-12c-.5-.8-1-1.6-1.5-2.3l-14 14.3z" fill="#e8e7e8"/><path d="m637.8 472.4 8.5-8.7c-.4-.9-.8-1.7-1.3-2.6l-11 11.2h3.8z" fill="#e8e7e8"/><path d="m623.4 461.5 11.1-11.4c-.8-.5-1.5-1-2.4-1.4l-8.7 8.9z" fill="#e8e7e8"/><path d="m623.4 456.3 7.9-8.1c-.8-.4-1.7-.9-2.5-1.3l-5.4 5.5z" fill="#e8e7e8"/><path d="m624.3 445.1c-.3-.1-.6-.2-.9-.3v1.3z" fill="#e8e7e8"/><path d="m642.8 472.4 4.9-5c-.3-1-.7-1.9-1-2.8l-7.6 7.8z" fill="#e8e7e8"/><path d="m647.8 472.4.9-1c-.2-1-.5-2.1-.8-3l-3.9 4z" fill="#e8e7e8"/><path d="m623.4 466.6 14-14.4c-.7-.6-1.4-1.1-2.2-1.6l-11.9 12.1v3.9z" fill="#e8e7e8"/><path d="m623.4 451.2 4.5-4.6c-.9-.4-1.8-.8-2.7-1.1l-1.8 1.9z" fill="#e8e7e8"/><path d="m627.7 472.4 14.7-15c-.5-.7-1.1-1.4-1.8-2l-16.6 17z" fill="#e8e7e8"/><path d="m623.4 471.7 16.7-17.1c-.6-.6-1.3-1.2-2-1.8l-14.7 15.1z" fill="#e8e7e8"/><path d="m623.4 447.4 1.8-1.9c-.3-.1-.6-.2-.9-.4l-.9 1z" fill="#808080"/><path d="m623.4 452.5 5.4-5.5c-.3-.1-.6-.3-.9-.4l-4.5 4.6z" fill="#808080"/><path d="m623.4 457.6 8.7-8.9c-.3-.2-.5-.3-.8-.4l-7.9 8.1z" fill="#808080"/><path d="m623.4 462.8 11.9-12.1c-.3-.2-.5-.3-.8-.5l-11.1 11.4z" fill="#808080"/><path d="m623.4 467.9 14.7-15.1c-.2-.2-.5-.4-.7-.6l-14 14.4z" fill="#808080"/><path d="m623.4 472.4h.6l16.7-17.1c-.2-.2-.4-.4-.6-.7l-16.7 17.1z" fill="#808080"/><path d="m629 472.4 14-14.3c-.2-.2-.4-.5-.5-.7l-14.7 15z" fill="#808080"/><path d="m634 472.4 11-11.2c-.2-.3-.3-.5-.5-.8l-11.7 12z" fill="#808080"/><path d="m639 472.4 7.6-7.8c-.1-.3-.3-.6-.4-.9l-8.5 8.7z" fill="#808080"/><path d="m644 472.4 3.9-4c-.1-.3-.2-.7-.3-1l-4.9 5z" fill="#808080"/><path d="m648.9 472.4c-.1-.3-.1-.6-.2-1l-.9 1z" fill="#808080"/><path d="m618.9 508.4h-1.3-3.8-1.2-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-.7v.7 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.8 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7.7v-.6-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-.8z" fill="#808080"/><path d="m644 472.4h-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.7-.6v.6 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.8h.7 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3c1.8-7.9 2.9-13.4 3-15.9.2-7.7-.1-14.4-1.2-20.2h-1.1-4.2z" fill="#e8e7e8"/><path d="m623.4 513 4.5-4.6h-3.8l-.7.8z" fill="#e8e7e8"/><path d="m623.4 543.8 20.3-20.8c.4-1.8.9-3.5 1.3-5.1l-21.6 22.1z" fill="#e8e7e8"/><path d="m623.4 538.7 22-22.5c.4-1.8.8-3.5 1.2-5.1l-23.2 23.8z" fill="#e8e7e8"/><path d="m623.4 529.7v3.8l23.6-24.2c.1-.3.1-.6.2-1h-3z" fill="#e8e7e8"/><path d="m627.7 544.4 14.2-14.5c.4-1.8.9-3.5 1.3-5.2l-19.2 19.7z" fill="#e8e7e8"/><path d="m637.8 544.4.7-.7c.4-1.8.9-3.5 1.3-5.2l-5.7 5.9z" fill="#e8e7e8"/><path d="m623.4 523.3 14.5-14.9h-3.8l-10.7 11z" fill="#e8e7e8"/><path d="m623.4 528.4 19.5-20h-3.8l-15.7 16.2z" fill="#e8e7e8"/><path d="m632.8 544.4 7.4-7.6c.4-1.8.9-3.5 1.3-5.2l-12.5 12.8z" fill="#e8e7e8"/><path d="m623.4 518.1 9.5-9.7h-3.8l-5.7 5.9z" fill="#e8e7e8"/><path d="m624.1 508.4h-.7v.8z" fill="#808080"/><path d="m623.4 514.3 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m623.4 519.4 10.7-11h-1.2l-9.5 9.7z" fill="#808080"/><path d="m623.4 524.6 15.7-16.2h-1.2l-14.5 14.9z" fill="#808080"/><path d="m623.4 529.7 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m623.4 534.8 23.2-23.8c.1-.6.3-1.1.4-1.7l-23.6 24.2z" fill="#808080"/><path d="m623.4 539.9 21.6-22.1c.1-.6.3-1.2.4-1.7l-22 22.5z" fill="#808080"/><path d="m623.4 544.4h.6l19.2-19.7c.1-.6.3-1.2.4-1.7l-20.3 20.8v.6z" fill="#808080"/><path d="m629 544.4 12.5-12.8c.1-.6.3-1.2.4-1.7l-14.2 14.5z" fill="#808080"/><path d="m634 544.4 5.7-5.9c.1-.6.3-1.2.4-1.7l-7.4 7.6z" fill="#808080"/><path d="m638.3 544.4c.1-.2.1-.5.2-.7l-.7.7z" fill="#808080"/><path d="m588.1 497.5 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m588.1 502.6 29.6-30.2h-3.7l-25.9 26.4z" fill="#e8e7e8"/><path d="m588.1 477 4.5-4.6h-3.7l-.8.7z" fill="#e8e7e8"/><path d="m588.1 482.1 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m588.1 492.4 19.6-20h-3.8l-15.8 16.1z" fill="#e8e7e8"/><path d="m588.1 487.2 14.6-14.8h-3.8l-10.8 11z" fill="#e8e7e8"/><path d="m612.6 508.4 10.8-11v-3.9l-14.6 14.9z" fill="#e8e7e8"/><path d="m617.6 508.4 5.8-5.9v-3.8l-9.6 9.7z" fill="#e8e7e8"/><path d="m607.6 508.4 15.8-16.1v-3.9l-19.6 20z" fill="#e8e7e8"/><path d="m592.5 508.4 30.9-31.5v-3.9l-34.6 35.4z" fill="#e8e7e8"/><path d="m588.1 507.8 34.6-35.4h-3.7l-30.9 31.5z" fill="#e8e7e8"/><path d="m602.6 508.4 20.8-21.3v-3.8l-24.6 25.1z" fill="#e8e7e8"/><path d="m597.5 508.4 25.9-26.4v-3.8l-29.6 30.2z" fill="#e8e7e8"/><path d="m622.6 508.4.8-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m588.9 472.4h-.8v.7z" fill="#808080"/><path d="m588.1 478.3 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m588.1 483.4 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m588.1 488.5 15.8-16.1h-1.2l-14.6 14.8z" fill="#808080"/><path d="m588.1 493.7 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m588.1 498.8 25.9-26.4h-1.3l-24.6 25.1z" fill="#808080"/><path d="m588.1 503.9 30.9-31.5h-1.3l-29.6 30.2z" fill="#808080"/><path d="m588.1 508.4h.7l34.6-35.4v-.6h-.7l-34.6 35.4z" fill="#808080"/><path d="m593.8 508.4 29.6-30.2v-1.3l-30.9 31.5z" fill="#808080"/><path d="m598.8 508.4 24.6-25.1v-1.3l-25.9 26.4z" fill="#808080"/><path d="m603.8 508.4 19.6-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m608.8 508.4 14.6-14.9v-1.2l-15.8 16.1z" fill="#808080"/><path d="m613.8 508.4 9.6-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m618.9 508.4 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m623.4 508.4v-.8l-.8.8z" fill="#808080"/><path d="m623.4 600.5v-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.6v.6 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.8h.7 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 1.3c1-4.3 2-8.5 3.1-12.6v-2.1z" fill="#808080"/><path d="m634 544.4h-1.3-3.7-1.3-3.7-.6v.6 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.8h.7 3.8 1.3c3.2-13 6.3-25.1 9.1-36h-.5-3.8z" fill="#e8e7e8"/><path d="m623.4 585.1 4.5-4.6h-3.8l-.7.7z" fill="#e8e7e8"/><path d="m623.4 603.9c.2-.9.5-1.9.7-2.8l-.7.7z" fill="#e8e7e8"/><path d="m623.4 586.4v3.8l4.5-4.6c.4-1.7.9-3.4 1.3-5.1z" fill="#e8e7e8"/><path d="m623.4 595.3 2.8-2.9c.4-1.7.9-3.4 1.3-5.1l-4.1 4.2z" fill="#e8e7e8"/><path d="m623.4 600.5 1.1-1.1c.4-1.7.8-3.4 1.3-5.1l-2.4 2.4z" fill="#e8e7e8"/><path d="m624.1 580.5h-.7v.7z" fill="#808080"/><path d="m623.4 586.4 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m623.4 591.5 4.1-4.2c.1-.6.3-1.2.4-1.7l-4.5 4.6z" fill="#808080"/><path d="m623.4 596.6 2.4-2.4c.1-.6.3-1.2.4-1.7l-2.8 2.9z" fill="#808080"/><path d="m623.4 601.7.7-.7c.1-.6.3-1.1.4-1.7l-1.1 1.1z" fill="#808080"/><path d="m602.6 580.5 20.8-21.3v-3.9l-24.6 25.2z" fill="#e8e7e8"/><path d="m607.6 580.5 15.8-16.2v-3.8l-19.6 20z" fill="#e8e7e8"/><path d="m612.6 580.5 10.8-11.1v-3.8l-14.6 14.9z" fill="#e8e7e8"/><path d="m588.1 569.6 24.6-25.2h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m588.1 574.7 29.6-30.3h-3.7l-25.9 26.4z" fill="#e8e7e8"/><path d="m622.6 580.5.8-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m588.1 564.4 19.6-20h-3.8l-15.8 16.2z" fill="#e8e7e8"/><path d="m588.1 579.8 34.6-35.4h-3.7l-30.9 31.6z" fill="#e8e7e8"/><path d="m588.1 559.3 14.6-14.9h-3.8l-10.8 11.1z" fill="#e8e7e8"/><path d="m617.6 580.5 5.8-5.9v-3.9l-9.6 9.8z" fill="#e8e7e8"/><path d="m597.5 580.5 25.9-26.4v-3.9l-29.6 30.3z" fill="#e8e7e8"/><path d="m588.1 554.2 9.5-9.8h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m592.5 580.5 30.9-31.6v-3.8l-34.6 35.4z" fill="#e8e7e8"/><path d="m588.1 549 4.5-4.6h-3.7l-.8.8z" fill="#e8e7e8"/><path d="m588.9 544.4h-.8v.8z" fill="#808080"/><path d="m588.1 550.3 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m588.1 555.5 10.8-11.1h-1.3l-9.5 9.8z" fill="#808080"/><path d="m588.1 560.6 15.8-16.2h-1.2l-14.6 14.9z" fill="#808080"/><path d="m588.1 565.7 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m588.1 570.8 25.9-26.4h-1.3l-24.6 25.2z" fill="#808080"/><path d="m588.1 576 30.9-31.6h-1.3l-29.6 30.3z" fill="#808080"/><path d="m588.1 579.8v.7h.7l34.6-35.4v-.7h-.7z" fill="#808080"/><path d="m593.8 580.5 29.6-30.3v-1.3l-30.9 31.6z" fill="#808080"/><path d="m598.8 580.5 24.6-25.2v-1.2l-25.9 26.4z" fill="#808080"/><path d="m603.8 580.5 19.6-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m608.8 580.5 14.6-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m613.8 580.5 9.6-9.8v-1.3l-10.8 11.1z" fill="#808080"/><path d="m618.9 580.5 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m623.4 580.5v-.8l-.8.8z" fill="#808080"/><path d="m607.6 652.5h-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.6v.6 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.8h.7 3.8 1.3 3.8 1.3 3.8 1.3.4c2.4-11.9 4.9-24 7.6-36h-3.1-1.2z" fill="#808080"/><path d="m612 652.5c.3-1.4.6-2.8.9-4.2l-4.1 4.2z" fill="#e8e7e8"/><path d="m607.6 652.5 5.7-5.8c.4-1.7.8-3.3 1.1-5l-10.6 10.8z" fill="#e8e7e8"/><path d="m588.1 621.1 4.5-4.6h-3.7l-.8.8z" fill="#e8e7e8"/><path d="m592.5 652.5 25.4-26c.4-1.7.8-3.4 1.2-5.1l-30.3 31h3.7z" fill="#e8e7e8"/><path d="m588.1 646.7 29.6-30.2h-3.7l-25.9 26.4z" fill="#e8e7e8"/><path d="m588.1 641.6 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m588.1 648v3.8l31.4-32.1c.3-1.1.5-2.2.8-3.3h-1.3z" fill="#e8e7e8"/><path d="m588.1 626.2 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m597.5 652.5 18.8-19.2c.4-1.7.8-3.4 1.2-5l-23.7 24.3h3.7z" fill="#e8e7e8"/><path d="m588.1 631.4 14.6-14.9h-3.8l-10.8 11z" fill="#e8e7e8"/><path d="m588.1 636.5 19.6-20h-3.8l-15.8 16.1z" fill="#e8e7e8"/><path d="m602.6 652.5 12.2-12.5c.4-1.7.8-3.4 1.2-5l-17.2 17.5z" fill="#e8e7e8"/><path d="m588.9 616.5h-.8v.8z" fill="#808080"/><path d="m588.1 622.4 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m588.1 627.5 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m588.1 632.6 15.8-16.1h-1.2l-14.6 14.9z" fill="#808080"/><path d="m588.1 637.8 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m588.1 642.9 25.9-26.4h-1.3l-24.6 25.1z" fill="#808080"/><path d="m588.1 648 30.9-31.5h-1.3l-29.6 30.2z" fill="#808080"/><path d="m588.1 652.5h.6l30.3-31c.1-.6.3-1.1.4-1.7l-31.4 32.1v.6z" fill="#808080"/><path d="m593.8 652.5 23.7-24.3c.1-.6.3-1.1.4-1.7l-25.4 26z" fill="#808080"/><path d="m598.8 652.5 17.2-17.5c.1-.6.3-1.1.4-1.7l-18.8 19.2z" fill="#808080"/><path d="m603.8 652.5 10.6-10.8c.1-.6.3-1.1.4-1.7l-12.2 12.5z" fill="#808080"/><path d="m608.8 652.5 4.1-4.2c.1-.6.2-1.1.4-1.7l-5.7 5.8h1.2z" fill="#808080"/><path d="m593.8 724.6h-1.3-3.8-.6v.6 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.8h4.7c.3-3 .7-6 1.1-9.1 1.1-8.6 2.4-17.7 3.9-27h-.3-3.7z" fill="#808080"/><path d="m588.1 693.2 4.5-4.6h-3.7l-.8.7z" fill="#e8e7e8"/><path d="m588.1 713.7 14.2-14.5c.3-1.6.6-3.2.9-4.8l-15.1 15.4z" fill="#e8e7e8"/><path d="m588.1 718.8 13-13.3c.3-1.6.6-3.2.9-4.7l-13.9 14.2z" fill="#e8e7e8"/><path d="m588.1 704.7v3.8l15.4-15.7c.3-1.4.6-2.8.8-4.2h-.4z" fill="#e8e7e8"/><path d="m588.1 698.3 9.5-9.7h-3.7l-5.8 5.8z" fill="#e8e7e8"/><path d="m588.1 723.9 11.8-12.1c.3-1.6.6-3.1.8-4.7l-12.7 13v3.8z" fill="#e8e7e8"/><path d="m588.1 703.4 14.6-14.8h-3.8l-10.8 11z" fill="#e8e7e8"/><path d="m592.5 724.6 6.4-6.5c.3-1.6.5-3.1.8-4.7l-10.9 11.2z" fill="#e8e7e8"/><path d="m597.5 724.6.3-.3c.3-1.5.5-3.1.8-4.6l-4.9 5h3.8z" fill="#e8e7e8"/><path d="m588.9 688.6h-.8v.7z" fill="#808080"/><path d="m588.1 694.4 5.8-5.8h-1.3l-4.5 4.6z" fill="#808080"/><path d="m588.1 699.6 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m588.1 704.7 15.8-16.1h-1.2l-14.6 14.8z" fill="#808080"/><path d="m588.1 709.8 15.1-15.4c.1-.5.2-1.1.3-1.6l-15.4 15.7z" fill="#808080"/><path d="m588.1 715 13.9-14.2c.1-.5.2-1.1.3-1.6l-14.2 14.5z" fill="#808080"/><path d="m588.1 720.1 12.7-13c.1-.5.2-1.1.3-1.6l-13 13.3z" fill="#808080"/><path d="m588.1 724.6h.6l10.9-11.2c.1-.5.2-1.1.3-1.6l-11.8 12.1z" fill="#808080"/><path d="m593.8 724.6 4.9-5c.1-.5.2-1 .3-1.6l-6.4 6.5h1.2z" fill="#808080"/><path d="m597.8 724.6c0-.1 0-.2.1-.3l-.3.3z" fill="#808080"/><path d="m588.1 796.6v.6 3.8 1.3 3.8 1.3 3.8 1.3 2.7c.4-6.1.8-12.4 1.3-18.8h-.7-.6z" fill="#808080"/><path d="m588.1 770.3 4.1-4.2c.2-1.4.3-2.9.5-4.3l-4.6 4.7z" fill="#e8e7e8"/><path d="m588.1 780.6 2.9-3c.1-1.4.3-2.8.4-4.3l-3.4 3.4v3.9z" fill="#e8e7e8"/><path d="m588.1 790.9 1.9-2c.1-1.4.2-2.8.4-4.2l-2.3 2.3z" fill="#e8e7e8"/><path d="m588.1 785.7 2.4-2.5c.1-1.4.3-2.8.4-4.2l-2.8 2.9z" fill="#e8e7e8"/><path d="m588.1 796 1.5-1.5c.1-1.4.2-2.8.3-4.2l-1.8 1.8z" fill="#e8e7e8"/><path d="m589.4 796.6c0-.2 0-.5.1-.7l-.7.7z" fill="#e8e7e8"/><path d="m588.1 775.5 3.5-3.6c.1-1.4.3-2.9.4-4.3l-4 4v3.9z" fill="#e8e7e8"/><path d="m588.1 765.2 4.5-4.6h-3.7l-.8.8z" fill="#e8e7e8"/><path d="m588.9 760.6h-.8v.8z" fill="#808080"/><path d="m588.1 765.2v1.3l4.6-4.7c0-.4.1-.8.1-1.2h-.2z" fill="#808080"/><path d="m588.1 771.6 4-4c.1-.5.1-1 .2-1.5l-4.1 4.2v1.3z" fill="#808080"/><path d="m588.1 776.8 3.4-3.4c0-.5.1-1 .1-1.4l-3.5 3.6z" fill="#808080"/><path d="m588.1 781.9 2.8-2.9c0-.5.1-1 .1-1.4l-2.9 3z" fill="#808080"/><path d="m588.1 787 2.3-2.3c0-.5.1-.9.1-1.4l-2.4 2.5z" fill="#808080"/><path d="m588.1 792.2 1.8-1.8c0-.5.1-.9.1-1.4l-1.9 2z" fill="#808080"/><path d="m588.1 796.6h.6l.7-.7c0-.5.1-.9.1-1.4l-1.5 1.5v.6z" fill="#808080"/><path d="m517.7 440.8v1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.8h.7 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.6v-.6-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.5c-.3.1-.6.2-.8.3v.3 3.8z" fill="#808080"/><path d="m552.9 436.3h.7 3.8 1.3 3.8 1.3 3.8 1.3 2.9c-5.7-.5-12.1-1.2-18.7-1.9v1.1.8z" fill="#e8e7e8"/><path d="m577.4 472.4 10.7-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m552.9 451.2 14.5-14.9h-3.7l-10.8 11.1z" fill="#e8e7e8"/><path d="m552.9 446.1 9.5-9.8h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m562.3 472.4 25.8-26.4v-3.9l-29.5 30.3z" fill="#e8e7e8"/><path d="m587.4 472.4.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m582.4 472.4 5.7-5.9v-3.9l-9.5 9.8z" fill="#e8e7e8"/><path d="m552.9 440.9 4.5-4.6h-3.7l-.8.8z" fill="#e8e7e8"/><path d="m572.3 472.4 15.8-16.2v-3.8l-19.5 20z" fill="#e8e7e8"/><path d="m567.3 472.4 20.8-21.3v-3.8l-24.5 25.1z" fill="#e8e7e8"/><path d="m552.9 471.7 33.3-34c-1.1-.1-2.2-.2-3.4-.3l-29.8 30.5v3.8z" fill="#e8e7e8"/><path d="m552.9 466.6 28.7-29.3c-1.1-.1-2.2-.2-3.4-.3l-25.2 25.8v3.8z" fill="#e8e7e8"/><path d="m552.9 452.5v3.8l19.5-19.9c-.3 0-.5-.1-.8-.1h-2.9z" fill="#e8e7e8"/><path d="m557.3 472.4 30.8-31.5v-2.9c-.3 0-.5-.1-.8-.1l-33.8 34.5z" fill="#e8e7e8"/><path d="m552.9 461.5 24.1-24.6c-1.1-.1-2.3-.2-3.4-.3l-20.6 21.1v3.8z" fill="#e8e7e8"/><path d="m553.7 436.3h-.8v.8z" fill="#808080"/><path d="m552.9 442.2 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m552.9 447.4 10.8-11.1h-1.3l-9.5 9.8z" fill="#808080"/><path d="m552.9 452.5 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m552.9 457.6 20.6-21.1c-.4 0-.8-.1-1.2-.1l-19.5 19.9v1.3z" fill="#808080"/><path d="m552.9 462.8 25.2-25.8c-.4 0-.8-.1-1.2-.1l-24.1 24.6v1.3z" fill="#808080"/><path d="m552.9 467.9 29.8-30.5c-.4 0-.8-.1-1.2-.1l-28.7 29.3v1.3z" fill="#808080"/><path d="m552.9 472.4h.6l33.8-34.5c-.4 0-.8-.1-1.2-.1l-33.3 34v.6z" fill="#808080"/><path d="m588.1 442.1v-1.3l-30.8 31.6h1.3z" fill="#808080"/><path d="m563.6 472.4 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m568.6 472.4 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m573.6 472.4 14.5-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m578.6 472.4 9.5-9.8v-1.2l-10.7 11z" fill="#808080"/><path d="m583.6 472.4 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m588.1 472.4v-.8l-.7.8z" fill="#808080"/><path d="m552.2 436.3.7-.8v-1.1c-.8-.1-1.6-.2-2.4-.3l-2.1 2.1h3.8z" fill="#e8e7e8"/><path d="m542.1 436.3 2.7-2.8c-1.1-.1-2.2-.3-3.4-.4l-3.1 3.2z" fill="#e8e7e8"/><path d="m532.1 436.3 3.8-3.9c-1.1-.1-2.2-.3-3.3-.4l-4.2 4.3z" fill="#e8e7e8"/><path d="m547.2 436.3 2.2-2.2c-1.1-.1-2.3-.3-3.4-.4l-2.6 2.6z" fill="#e8e7e8"/><path d="m537.1 436.3 3.2-3.3c-1.1-.1-2.2-.3-3.3-.4l-3.6 3.7z" fill="#e8e7e8"/><path d="m524.2 434.2c-1.8.7-3.7 1.5-5.7 2.2h3.5z" fill="#e8e7e8"/><path d="m523.3 436.3h3.8l4.4-4.5c-.5-.1-1-.1-1.5-.2-1.2.5-2.4 1.1-3.6 1.6z" fill="#e8e7e8"/><path d="m523.3 436.3 3-3.1c-.7.3-1.4.6-2.1.9l-2.1 2.2z" fill="#808080"/><path d="m528.4 436.3 4.2-4.3c-.4-.1-.7-.1-1.1-.2l-4.4 4.5z" fill="#808080"/><path d="m533.4 436.3 3.6-3.7c-.4 0-.7-.1-1.1-.1l-3.8 3.9h1.3z" fill="#808080"/><path d="m538.4 436.3 3.1-3.2c-.4 0-.8-.1-1.1-.1l-3.2 3.3z" fill="#808080"/><path d="m543.4 436.3 2.6-2.6c-.4 0-.8-.1-1.1-.1l-2.7 2.8h1.2z" fill="#808080"/><path d="m548.4 436.3 2.1-2.1c-.4 0-.8-.1-1.1-.1l-2.2 2.2z" fill="#808080"/><path d="m552.9 435.6-.7.7h.7z" fill="#808080"/><path d="m517.7 512.9v1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.7 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8.6v-.6-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-.6v.7z" fill="#808080"/><path d="m552.9 476.9v1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8.8h.8 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8.6v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-.6v.6z" fill="#e8e7e8"/><path d="m552.9 533.5 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m552.9 538.7 29.6-30.3h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m552.9 528.4 19.6-20h-3.8l-15.8 16.2z" fill="#e8e7e8"/><path d="m552.9 543.8 34.6-35.4h-3.8l-30.8 31.5z" fill="#e8e7e8"/><path d="m552.9 518.1 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m562.3 544.4 25.8-26.4v-3.8l-29.5 30.2z" fill="#e8e7e8"/><path d="m567.3 544.4 20.8-21.2v-3.9l-24.5 25.1z" fill="#e8e7e8"/><path d="m552.9 523.3 14.5-14.9h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m587.4 544.4.7-.7v-3.9l-4.5 4.6z" fill="#e8e7e8"/><path d="m582.4 544.4 5.7-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m572.3 544.4 15.8-16.1v-3.9l-19.5 20z" fill="#e8e7e8"/><path d="m557.3 544.4 30.8-31.5v-3.8l-34.6 35.3z" fill="#e8e7e8"/><path d="m552.9 513 4.5-4.6h-3.7l-.8.8z" fill="#e8e7e8"/><path d="m577.4 544.4 10.7-11v-3.8l-14.5 14.8z" fill="#e8e7e8"/><path d="m553.7 508.4h-.8v.8z" fill="#808080"/><path d="m552.9 514.3 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m552.9 519.4 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m552.9 524.6 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m552.9 529.7 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m552.9 534.8 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m552.9 539.9 30.8-31.5h-1.2l-29.6 30.3z" fill="#808080"/><path d="m552.9 544.4h.6l34.6-35.3v-.7h-.6l-34.6 35.4z" fill="#808080"/><path d="m558.6 544.4 29.5-30.2v-1.3l-30.8 31.5z" fill="#808080"/><path d="m563.6 544.4 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m568.6 544.4 19.5-20v-1.2l-20.8 21.2z" fill="#808080"/><path d="m573.6 544.4 14.5-14.8v-1.3l-15.8 16.1z" fill="#808080"/><path d="m578.6 544.4 9.5-9.7v-1.3l-10.7 11z" fill="#808080"/><path d="m583.6 544.4 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m588.1 544.4v-.7l-.7.7z" fill="#808080"/><path d="m537.1 508.4 15.8-16.1v-3.9l-19.5 20z" fill="#e8e7e8"/><path d="m552.2 508.4.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m542.1 508.4 10.8-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m527.1 508.4 25.8-26.4v-3.8l-29.6 30.2z" fill="#e8e7e8"/><path d="m547.2 508.4 5.7-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m517.7 477 4.5-4.6h-3.8l-.7.7z" fill="#e8e7e8"/><path d="m517.7 482.1 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m517.7 487.2 14.5-14.8h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m552.9 476.9v-3.9l-34.6 35.4h3.8z" fill="#e8e7e8"/><path d="m517.7 492.4 19.5-20h-3.7l-15.8 16.1z" fill="#e8e7e8"/><path d="m517.7 502.6 29.6-30.2h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m517.7 507.8 34.6-35.4h-3.8l-30.8 31.5z" fill="#e8e7e8"/><path d="m532.1 508.4 20.8-21.3v-3.8l-24.5 25.1z" fill="#e8e7e8"/><path d="m517.7 497.5 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m518.4 472.4h-.7v.7z" fill="#808080"/><path d="m517.7 478.3 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m517.7 483.4 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m517.7 488.5 15.8-16.1h-1.3l-14.5 14.8z" fill="#808080"/><path d="m517.7 493.7 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m517.7 498.8 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m517.7 503.9 30.8-31.5h-1.2l-29.6 30.2z" fill="#808080"/><path d="m517.7 507.8v.6h.6l34.6-35.4v-.6h-.6z" fill="#808080"/><path d="m523.3 508.4 29.6-30.2v-1.3l-30.8 31.5z" fill="#808080"/><path d="m528.4 508.4 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m533.4 508.4 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m538.4 508.4 14.5-14.9v-1.2l-15.8 16.1z" fill="#808080"/><path d="m543.4 508.4 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m548.4 508.4 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m552.9 508.4v-.8l-.7.8z" fill="#808080"/><path d="m548.4 580.5h-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-.6v.6 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8.8h.7 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8.6v-.6-3.9-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7z" fill="#808080"/><path d="m588.1 576v-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-.8h-.7-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-.6v.7 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8.8h.8 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8.6v-.7z" fill="#e8e7e8"/><path d="m577.4 616.5 10.7-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m552.9 610.7 29.6-30.2h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m587.4 616.5.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m562.3 616.5 25.8-26.4v-3.9l-29.5 30.3z" fill="#e8e7e8"/><path d="m552.9 605.6 24.6-25.1h-3.8l-20.8 21.2z" fill="#e8e7e8"/><path d="m582.4 616.5 5.7-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m567.3 616.5 20.8-21.3v-3.8l-24.5 25.1z" fill="#e8e7e8"/><path d="m552.9 585.1 4.5-4.6h-3.7l-.8.7z" fill="#e8e7e8"/><path d="m572.3 616.5 15.8-16.2v-3.8l-19.5 20z" fill="#e8e7e8"/><path d="m552.9 595.3 14.5-14.8h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m552.9 600.5 19.6-20h-3.8l-15.8 16.1z" fill="#e8e7e8"/><path d="m557.3 616.5 30.8-31.5v-3.9l-34.6 35.4z" fill="#e8e7e8"/><path d="m552.9 590.2 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m552.9 615.9 34.6-35.4h-3.8l-30.8 31.5z" fill="#e8e7e8"/><path d="m553.7 580.5h-.8v.7z" fill="#808080"/><path d="m552.9 586.4 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m552.9 591.5 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m552.9 596.6 15.8-16.1h-1.3l-14.5 14.8z" fill="#808080"/><path d="m552.9 601.7 20.8-21.2h-1.2l-19.6 20z" fill="#808080"/><path d="m552.9 606.9 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m552.9 612 30.8-31.5h-1.2l-29.6 30.2z" fill="#808080"/><path d="m552.9 615.9v.6h.6l34.6-35.4v-.6h-.6z" fill="#808080"/><path d="m558.6 616.5 29.5-30.3v-1.2l-30.8 31.5z" fill="#808080"/><path d="m563.6 616.5 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m568.6 616.5 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m573.6 616.5 14.5-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m578.6 616.5 9.5-9.7v-1.3l-10.7 11z" fill="#808080"/><path d="m583.6 616.5 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m588.1 616.5v-.8l-.7.8z" fill="#808080"/><path d="m517.7 554.2 9.5-9.8h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m517.7 559.3 14.5-14.9h-3.7l-10.8 11.1z" fill="#e8e7e8"/><path d="m547.2 580.5 5.7-5.9v-3.9l-9.5 9.8z" fill="#e8e7e8"/><path d="m517.7 564.4 19.5-20h-3.7l-15.8 16.2z" fill="#e8e7e8"/><path d="m527.1 580.5 25.8-26.4v-3.9l-29.6 30.3z" fill="#e8e7e8"/><path d="m537.1 580.5 15.8-16.2v-3.8l-19.5 20z" fill="#e8e7e8"/><path d="m532.1 580.5 20.8-21.3v-3.9l-24.5 25.2z" fill="#e8e7e8"/><path d="m542.1 580.5 10.8-11.1v-3.8l-14.5 14.9z" fill="#e8e7e8"/><path d="m517.7 579.8 34.6-35.4h-3.8l-30.8 31.6z" fill="#e8e7e8"/><path d="m517.7 569.6 24.6-25.2h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m517.7 574.7 29.6-30.3h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m552.2 580.5.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m517.7 549 4.5-4.6h-3.8l-.7.8z" fill="#e8e7e8"/><path d="m522.1 580.5 30.8-31.6v-3.8l-34.6 35.4z" fill="#e8e7e8"/><path d="m518.4 544.4h-.7v.8z" fill="#808080"/><path d="m517.7 550.3 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m517.7 555.5 10.8-11.1h-1.3l-9.5 9.8z" fill="#808080"/><path d="m517.7 560.6 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m517.7 565.7 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m517.7 570.8 25.8-26.4h-1.2l-24.6 25.2z" fill="#808080"/><path d="m517.7 576 30.8-31.6h-1.2l-29.6 30.3z" fill="#808080"/><path d="m517.7 579.8v.7h.6l34.6-35.4v-.7h-.6z" fill="#808080"/><path d="m523.3 580.5 29.6-30.3v-1.3l-30.8 31.6z" fill="#808080"/><path d="m528.4 580.5 24.5-25.2v-1.2l-25.8 26.4z" fill="#808080"/><path d="m533.4 580.5 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m538.4 580.5 14.5-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m543.4 580.5 9.5-9.8v-1.3l-10.8 11.1z" fill="#808080"/><path d="m548.4 580.5 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m552.9 580.5v-.8l-.7.8z" fill="#808080"/><path d="m548.4 652.5h-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-.6v.7 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8.8h.7 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8.6v-.7-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-.8h-.7z" fill="#808080"/><path d="m583.6 616.5h-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-.6v.6 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.8 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8.6v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-.8h-.7z" fill="#e8e7e8"/><path d="m552.9 672.5 19.6-20h-3.8l-15.8 16.2z" fill="#e8e7e8"/><path d="m552.9 677.6 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m552.9 687.9 34.6-35.4h-3.8l-30.8 31.6z" fill="#e8e7e8"/><path d="m557.3 688.6 30.8-31.6v-3.8l-34.6 35.4z" fill="#e8e7e8"/><path d="m587.4 688.6.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m552.9 682.8 29.6-30.3h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m552.9 657.1 4.5-4.6h-3.7l-.8.8z" fill="#e8e7e8"/><path d="m552.9 667.4 14.5-14.9h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m572.3 688.6 15.8-16.2v-3.8l-19.5 20z" fill="#e8e7e8"/><path d="m552.9 662.3 9.5-9.8h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m567.3 688.6 20.8-21.3v-3.9l-24.5 25.2z" fill="#e8e7e8"/><path d="m562.3 688.6 25.8-26.5v-3.8l-29.5 30.3z" fill="#e8e7e8"/><path d="m577.4 688.6 10.7-11.1v-3.8l-14.5 14.9z" fill="#e8e7e8"/><path d="m582.4 688.6 5.7-5.9v-3.9l-9.5 9.8z" fill="#e8e7e8"/><path d="m553.7 652.5h-.8v.8z" fill="#808080"/><path d="m552.9 658.4 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m552.9 663.5 10.8-11h-1.3l-9.5 9.8z" fill="#808080"/><path d="m552.9 668.7 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m552.9 673.8 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m552.9 678.9 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m552.9 684.1 30.8-31.6h-1.2l-29.6 30.3z" fill="#808080"/><path d="m552.9 687.9v.7h.6l34.6-35.4v-.7h-.6z" fill="#808080"/><path d="m558.6 688.6 29.5-30.3v-1.3l-30.8 31.6z" fill="#808080"/><path d="m563.6 688.6 24.5-25.2v-1.3l-25.8 26.5z" fill="#808080"/><path d="m568.6 688.6 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m573.6 688.6 14.5-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m578.6 688.6 9.5-9.8v-1.3l-10.7 11.1z" fill="#808080"/><path d="m583.6 688.6 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m588.1 688.6v-.8l-.7.8z" fill="#808080"/><path d="m517.7 636.5 19.5-20h-3.7l-15.8 16.1z" fill="#e8e7e8"/><path d="m517.7 651.9 34.6-35.4h-3.8l-30.8 31.5z" fill="#e8e7e8"/><path d="m552.2 652.5.7-.7v-3.9l-4.5 4.6z" fill="#e8e7e8"/><path d="m517.7 641.6 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m517.7 621.1 4.5-4.6h-3.8l-.7.8z" fill="#e8e7e8"/><path d="m517.7 626.2 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m517.7 631.4 14.5-14.9h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m517.7 646.7 29.6-30.2h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m527.1 652.5 25.8-26.4v-3.8l-29.6 30.2z" fill="#e8e7e8"/><path d="m522.1 652.5 30.8-31.5v-3.9l-34.6 35.4z" fill="#e8e7e8"/><path d="m547.2 652.5 5.7-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m542.1 652.5 10.8-11v-3.8l-14.5 14.8z" fill="#e8e7e8"/><path d="m532.1 652.5 20.8-21.3v-3.8l-24.5 25.1z" fill="#e8e7e8"/><path d="m537.1 652.5 15.8-16.1v-3.9l-19.5 20z" fill="#e8e7e8"/><path d="m518.4 616.5h-.7v.8z" fill="#808080"/><path d="m517.7 622.4 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m517.7 627.5 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m517.7 632.6 15.8-16.1h-1.3l-14.5 14.9z" fill="#808080"/><path d="m517.7 637.8 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m517.7 642.9 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m517.7 648 30.8-31.5h-1.2l-29.6 30.2z" fill="#808080"/><path d="m517.7 651.9v.6h.6l34.6-35.4v-.6h-.6z" fill="#808080"/><path d="m523.3 652.5 29.6-30.2v-1.3l-30.8 31.5z" fill="#808080"/><path d="m528.4 652.5 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m533.4 652.5 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m538.4 652.5 14.5-14.8v-1.3l-15.8 16.1z" fill="#808080"/><path d="m543.4 652.5 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m548.4 652.5 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m552.9 652.5v-.7l-.7.7z" fill="#808080"/><path d="m552.9 756.1v-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-.6v.6 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h35.2v-.6z" fill="#808080"/><path d="m583.6 688.6h-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-.6v.6 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8.8h.8 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8.6v-.7-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.2-3.9-.7h-.7z" fill="#e8e7e8"/><path d="m567.3 760.6 20.8-21.3v-3.8l-24.5 25.1z" fill="#e8e7e8"/><path d="m552.9 739.4 14.5-14.8h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m552.9 749.7 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m552.9 744.6 19.6-20h-3.8l-15.8 16.1z" fill="#e8e7e8"/><path d="m557.3 760.6 30.8-31.5v-3.9l-34.6 35.4z" fill="#e8e7e8"/><path d="m562.3 760.6 25.8-26.4v-3.8l-29.5 30.2z" fill="#e8e7e8"/><path d="m552.9 754.8 29.6-30.2h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m572.3 760.6 15.8-16.1v-3.9l-19.5 20z" fill="#e8e7e8"/><path d="m552.9 760 34.6-35.4h-3.8l-30.8 31.5z" fill="#e8e7e8"/><path d="m587.4 760.6.7-.7v-3.9l-4.5 4.6z" fill="#e8e7e8"/><path d="m552.9 729.2 4.5-4.6h-3.7l-.8.7z" fill="#e8e7e8"/><path d="m582.4 760.6 5.7-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m552.9 734.3 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m577.4 760.6 10.7-11v-3.8l-14.5 14.8z" fill="#e8e7e8"/><path d="m553.7 724.6h-.8v.7z" fill="#808080"/><path d="m552.9 730.5 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m552.9 735.6 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m552.9 740.7 15.8-16.1h-1.3l-14.5 14.8z" fill="#808080"/><path d="m552.9 745.9 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m552.9 751 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m552.9 756.1 30.8-31.5h-1.2l-29.6 30.2z" fill="#808080"/><path d="m552.9 760v.6h.6l34.6-35.4v-.6h-.6z" fill="#808080"/><path d="m558.6 760.6 29.5-30.2v-1.3l-30.8 31.5z" fill="#808080"/><path d="m563.6 760.6 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m568.6 760.6 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m573.6 760.6 14.5-14.8v-1.3l-15.8 16.1z" fill="#808080"/><path d="m578.6 760.6 9.5-9.7v-1.3l-10.7 11z" fill="#808080"/><path d="m583.6 760.6 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m588.1 760.6v-.7l-.7.7z" fill="#808080"/><path d="m517.7 693.2 4.5-4.6h-3.8l-.7.7z" fill="#e8e7e8"/><path d="m542.1 724.6 10.8-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m537.1 724.6 15.8-16.2v-3.8l-19.5 20z" fill="#e8e7e8"/><path d="m517.7 703.4 14.5-14.8h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m517.7 708.5 19.5-19.9h-3.7l-15.8 16.1z" fill="#e8e7e8"/><path d="m517.7 713.7 24.6-25.1h-3.8l-20.8 21.2z" fill="#e8e7e8"/><path d="m517.7 718.8 29.6-30.2h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m547.2 724.6 5.7-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m552.2 724.6.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m517.7 698.3 9.5-9.7h-3.7l-5.8 5.8z" fill="#e8e7e8"/><path d="m522.1 724.6 30.8-31.6v-3.8l-34.6 35.4z" fill="#e8e7e8"/><path d="m517.7 723.9 34.6-35.3h-3.8l-30.8 31.5z" fill="#e8e7e8"/><path d="m532.1 724.6 20.8-21.3v-3.8l-24.5 25.1z" fill="#e8e7e8"/><path d="m527.1 724.6 25.8-26.4v-3.9l-29.6 30.3z" fill="#e8e7e8"/><path d="m518.4 688.6h-.7v.7z" fill="#808080"/><path d="m517.7 694.4 5.8-5.8h-1.3l-4.5 4.6z" fill="#808080"/><path d="m517.7 699.6 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m517.7 704.7 15.8-16.1h-1.3l-14.5 14.8z" fill="#808080"/><path d="m517.7 709.8 20.8-21.2h-1.3l-19.5 19.9z" fill="#808080"/><path d="m517.7 715 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m517.7 720.1 30.8-31.5h-1.2l-29.6 30.2z" fill="#808080"/><path d="m517.7 723.9v.7h.6l34.6-35.4v-.6h-.6z" fill="#808080"/><path d="m523.3 724.6 29.6-30.3v-1.3l-30.8 31.6z" fill="#808080"/><path d="m528.4 724.6 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m533.4 724.6 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m538.4 724.6 14.5-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m543.4 724.6 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m548.4 724.6 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m552.9 724.6v-.8l-.7.8z" fill="#808080"/><path d="m552.9 828.2v-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-.8h-.7-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-.6v.7 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8.8h.7 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8.6v-.7z" fill="#808080"/><path d="m552.9 765.1v1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9.7h.8 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8.6v-.6-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-35.2v.7z" fill="#e8e7e8"/><path d="m552.9 801.2 4.5-4.6h-3.7l-.8.8z" fill="#e8e7e8"/><path d="m552.9 816.6 19.6-20h-3.8l-15.8 16.2z" fill="#e8e7e8"/><path d="m552.9 821.8 24.6-25.2h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m552.9 832 34.6-35.4h-3.8l-30.8 31.6z" fill="#e8e7e8"/><path d="m552.9 826.9 29.6-30.3h-3.8l-25.8 26.5z" fill="#e8e7e8"/><path d="m557.3 832.7 30.8-31.6v-3.8l-34.6 35.4z" fill="#e8e7e8"/><path d="m568.6 832.7h3.8l15.7-16.1c0-.4 0-.8.1-1.2v-2.7z" fill="#e8e7e8"/><path d="m552.9 811.5 14.5-14.9h-3.7l-10.8 11.1z" fill="#e8e7e8"/><path d="m582.4 832.7 5.1-5.2c.1-1.3.1-2.7.2-4.1l-9.1 9.3z" fill="#e8e7e8"/><path d="m587.2 832.7c.1-1.3.1-2.6.2-3.9l-3.8 3.9z" fill="#e8e7e8"/><path d="m552.9 806.4 9.5-9.8h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m577.4 832.7 10.4-10.6c.1-1.3.2-2.7.2-4.1l-14.4 14.7z" fill="#e8e7e8"/><path d="m562.3 832.7 25.8-26.4v-3.9l-29.5 30.3z" fill="#e8e7e8"/><path d="m567.3 832.7 20.8-21.3v-3.8l-24.5 25.1z" fill="#e8e7e8"/><path d="m553.7 796.6h-.8v.8z" fill="#808080"/><path d="m552.9 802.5 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m552.9 807.7 10.8-11.1h-1.3l-9.5 9.8z" fill="#808080"/><path d="m552.9 812.8 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m552.9 817.9 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m552.9 823.1 25.8-26.5h-1.2l-24.6 25.2z" fill="#808080"/><path d="m552.9 828.2 30.8-31.6h-1.2l-29.6 30.3z" fill="#808080"/><path d="m552.9 832v.7h.6l34.6-35.4v-.7h-.6z" fill="#808080"/><path d="m558.6 832.7 29.5-30.3v-1.3l-30.8 31.6z" fill="#808080"/><path d="m563.6 832.7 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m568.6 832.7 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m573.6 832.7 14.4-14.7c0-.5.1-.9.1-1.4l-15.7 16.1z" fill="#808080"/><path d="m578.6 832.7 9.1-9.3c0-.5 0-.9.1-1.4l-10.4 10.6h1.2z" fill="#808080"/><path d="m583.6 832.7 3.8-3.9c0-.5 0-.9.1-1.4l-5.1 5.2h1.2z" fill="#808080"/><path d="m542.1 796.6 10.8-11v-3.8l-14.5 14.8z" fill="#e8e7e8"/><path d="m517.7 780.6 19.5-20h-3.7l-15.8 16.2z" fill="#e8e7e8"/><path d="m547.2 796.6 5.7-5.8v-3.9l-9.5 9.7z" fill="#e8e7e8"/><path d="m552.2 796.6.7-.7v-3.9l-4.5 4.6z" fill="#e8e7e8"/><path d="m517.7 785.7 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m517.7 796 34.6-35.4h-3.8l-30.8 31.6z" fill="#e8e7e8"/><path d="m517.7 790.9 29.6-30.3h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m537.1 796.6 15.8-16.1v-3.8l-19.5 19.9z" fill="#e8e7e8"/><path d="m517.7 775.5 14.5-14.9h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m517.7 765.2 4.5-4.6h-3.8l-.7.8z" fill="#e8e7e8"/><path d="m552.9 765.1v-3.8l-34.6 35.3h3.8z" fill="#e8e7e8"/><path d="m527.1 796.6 25.8-26.4v-3.8l-29.6 30.2z" fill="#e8e7e8"/><path d="m532.1 796.6 20.8-21.2v-3.9l-24.5 25.1z" fill="#e8e7e8"/><path d="m517.7 770.3 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m518.4 760.6h-.7v.8z" fill="#808080"/><path d="m517.7 766.5 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m517.7 771.6 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m517.7 776.8 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m517.7 781.9 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m517.7 787 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m517.7 792.2 30.8-31.6h-1.2l-29.6 30.3z" fill="#808080"/><path d="m517.7 796.6h.6l34.6-35.3v-.7h-.6l-34.6 35.4z" fill="#808080"/><path d="m523.3 796.6 29.6-30.2v-1.3l-30.8 31.5z" fill="#808080"/><path d="m528.4 796.6 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m533.4 796.6 19.5-19.9v-1.3l-20.8 21.2z" fill="#808080"/><path d="m538.4 796.6 14.5-14.8v-1.3l-15.8 16.1z" fill="#808080"/><path d="m543.4 796.6 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m548.4 796.6 4.5-4.6v-1.2l-5.7 5.8z" fill="#808080"/><path d="m552.9 796.6v-.7l-.7.7z" fill="#808080"/><path d="m548.4 868.7h-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-.6v.7 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.7 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8.6v-.6-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-.7z" fill="#808080"/><path d="m582.4 832.7h-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.6v.6 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.8h.7 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 2.3c.2-11.3.6-23.3 1.2-36h-3.6-1.3z" fill="#e8e7e8"/><path d="m557.3 904.7 28.6-29.3c0-1.3 0-2.6.1-3.9l-32.5 33.2z" fill="#e8e7e8"/><path d="m552.9 900.2v3.8l33.1-33.9c0-.5 0-1 0-1.5h-2.3z" fill="#e8e7e8"/><path d="m552.9 888.7 19.6-20h-3.8l-15.8 16.2z" fill="#e8e7e8"/><path d="m562.3 904.7 23.5-24.1c0-1.3 0-2.6.1-3.9l-27.4 28z" fill="#e8e7e8"/><path d="m552.9 883.6 14.5-14.9h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m552.9 873.3 4.5-4.6h-3.7l-.8.8z" fill="#e8e7e8"/><path d="m552.9 878.4 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m585.5 904.7c0-.7 0-1.3 0-2l-1.9 2z" fill="#e8e7e8"/><path d="m552.9 893.8 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m577.4 904.7 8.3-8.5c0-1.3 0-2.6 0-3.9l-12.1 12.4z" fill="#e8e7e8"/><path d="m582.4 904.7 3.2-3.3c0-1.3 0-2.6 0-3.9l-7 7.2z" fill="#e8e7e8"/><path d="m552.9 899 29.6-30.3h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m567.3 904.7 18.4-18.9c0-1.3 0-2.6.1-3.9l-22.3 22.8z" fill="#e8e7e8"/><path d="m572.3 904.7 13.4-13.7c0-1.3 0-2.6.1-3.9l-17.2 17.6z" fill="#e8e7e8"/><path d="m553.7 868.7h-.8v.8z" fill="#808080"/><path d="m552.9 874.6 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m552.9 879.7 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m552.9 884.9 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m552.9 890 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m552.9 895.1 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m552.9 900.2 30.8-31.5h-1.2l-29.6 30.3z" fill="#808080"/><path d="m552.9 904.7h.6l32.5-33.2c0-.4 0-.9 0-1.3l-33.1 33.9z" fill="#808080"/><path d="m558.6 904.7 27.4-28c0-.4 0-.9 0-1.3l-28.6 29.3z" fill="#808080"/><path d="m563.6 904.7 22.3-22.8c0-.4 0-.9 0-1.3l-23.5 24.1z" fill="#808080"/><path d="m568.6 904.7 17.2-17.6c0-.4 0-.9 0-1.3l-18.4 18.9z" fill="#808080"/><path d="m573.6 904.7 12.1-12.4c0-.4 0-.9 0-1.3l-13.4 13.7z" fill="#808080"/><path d="m578.6 904.7 7-7.2c0-.4 0-.9 0-1.3l-8.3 8.5z" fill="#808080"/><path d="m583.6 904.7 1.9-2c0-.4 0-.9 0-1.3l-3.2 3.3z" fill="#808080"/><path d="m517.7 862.9 29.6-30.2h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m527.1 868.7 25.8-26.4v-3.8l-29.6 30.2z" fill="#e8e7e8"/><path d="m542.1 868.7 10.8-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m547.2 868.7 5.7-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m532.1 868.7 20.8-21.3v-3.8l-24.5 25.1z" fill="#e8e7e8"/><path d="m517.7 857.8 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m517.7 868.1 34.6-35.4h-3.8l-30.8 31.5z" fill="#e8e7e8"/><path d="m552.2 868.7.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m517.7 842.4 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m517.7 837.3 4.5-4.6h-3.8l-.7.7z" fill="#e8e7e8"/><path d="m517.7 847.5 14.5-14.8h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m537.1 868.7 15.8-16.1v-3.9l-19.5 20z" fill="#e8e7e8"/><path d="m517.7 852.7 19.5-20h-3.7l-15.8 16.1z" fill="#e8e7e8"/><path d="m522.1 868.7 30.8-31.5v-3.9l-34.6 35.4z" fill="#e8e7e8"/><path d="m518.4 832.7h-.7v.7z" fill="#808080"/><path d="m517.7 838.6 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m517.7 843.7 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m517.7 848.8 15.8-16.1h-1.3l-14.5 14.8z" fill="#808080"/><path d="m517.7 854 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m517.7 859.1 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m517.7 864.2 30.8-31.5h-1.2l-29.6 30.2z" fill="#808080"/><path d="m517.7 868.1v.6h.6l34.6-35.4v-.6h-.6z" fill="#808080"/><path d="m523.3 868.7 29.6-30.2v-1.3l-30.8 31.5z" fill="#808080"/><path d="m528.4 868.7 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m533.4 868.7 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m538.4 868.7 14.5-14.9v-1.2l-15.8 16.1z" fill="#808080"/><path d="m543.4 868.7 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m548.4 868.7 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m552.9 868.7v-.8l-.7.8z" fill="#808080"/><path d="m548.4 940.8h-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-.6v.6 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8.8h.7 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8.6v-.7-3.8-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7z" fill="#808080"/><path d="m582.4 904.7h-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.6v.6 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.8h.7 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3.8c.6-10.2.8-22.2 1-36h-1.9-1.3z" fill="#e8e7e8"/><path d="m552.9 972.3v3.8l31.4-32.1c.1-1.1.2-2.2.2-3.3h-.8z" fill="#e8e7e8"/><path d="m562.3 976.8 20.8-21.3c.2-1.4.4-2.9.6-4.4l-25.1 25.7z" fill="#e8e7e8"/><path d="m572.3 976.8 7.5-7.7c.7-1.7 1.2-3.6 1.8-5.6l-13 13.3z" fill="#e8e7e8"/><path d="m557.3 976.8 26.5-27.1c.1-1.4.3-2.8.4-4.2l-30.7 31.4h3.8z" fill="#e8e7e8"/><path d="m567.3 976.8 14.7-15c.3-1.5.6-3.1.9-4.8l-19.3 19.7h3.7z" fill="#e8e7e8"/><path d="m574.8 976.8.9-.9c1.1-1.2 2.2-2.7 3-4.4l-5.2 5.3z" fill="#e8e7e8"/><path d="m552.9 971 29.6-30.2h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m552.9 945.4 4.5-4.6h-3.7l-.8.7z" fill="#e8e7e8"/><path d="m552.9 955.6 14.5-14.8h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m552.9 950.5 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m552.9 965.9 24.6-25.1h-3.8l-20.8 21.2z" fill="#e8e7e8"/><path d="m552.9 960.8 19.6-20h-3.8l-15.8 16.1z" fill="#e8e7e8"/><path d="m553.7 940.8h-.8v.7z" fill="#808080"/><path d="m552.9 946.7 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m552.9 951.8 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m552.9 956.9 15.8-16.1h-1.3l-14.5 14.8z" fill="#808080"/><path d="m552.9 962 20.8-21.2h-1.2l-19.6 20z" fill="#808080"/><path d="m552.9 967.2 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m552.9 972.3 30.8-31.5h-1.2l-29.6 30.2z" fill="#808080"/><path d="m552.9 976.8h.6l30.7-31.4c0-.5.1-.9.1-1.4l-31.4 32.1z" fill="#808080"/><path d="m558.6 976.8 25.1-25.7c.1-.5.1-1 .2-1.4l-26.5 27.1z" fill="#808080"/><path d="m563.6 976.8 19.3-19.7c.1-.5.2-1 .2-1.5l-20.8 21.3h1.3z" fill="#808080"/><path d="m568.6 976.8 13-13.3c.1-.5.3-1.1.4-1.7l-14.7 15z" fill="#808080"/><path d="m573.6 976.8 5.2-5.3c.4-.7.7-1.5 1.1-2.4l-7.5 7.7z" fill="#808080"/><path d="m517.7 920.9v3.8l19.5-20h-3.7z" fill="#e8e7e8"/><path d="m517.7 915.8v3.8l14.5-14.9h-3.7z" fill="#e8e7e8"/><path d="m517.7 926v3.9l24.6-25.2h-3.8z" fill="#e8e7e8"/><path d="m517.7 931.1v3.9l29.6-30.3h-3.8z" fill="#e8e7e8"/><path d="m517.7 905.5v3.8l4.5-4.6h-3.8z" fill="#e8e7e8"/><path d="m517.7 936.3v3.8l34.6-35.4h-3.8z" fill="#e8e7e8"/><path d="m517.7 910.6v3.9l9.5-9.8h-3.7z" fill="#e8e7e8"/><path d="m527.1 940.8 25.8-26.5v-3.8l-29.6 30.3z" fill="#e8e7e8"/><path d="m532.1 940.8 20.8-21.3v-3.9l-24.5 25.2z" fill="#e8e7e8"/><path d="m537.1 940.8 15.8-16.2v-3.8l-19.5 20z" fill="#e8e7e8"/><path d="m552.2 940.8.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m542.1 940.8 10.8-11.1v-3.8l-14.5 14.9z" fill="#e8e7e8"/><path d="m547.2 940.8 5.7-5.9v-3.9l-9.5 9.8z" fill="#e8e7e8"/><path d="m522.1 940.8 30.8-31.6v-3.8l-34.6 35.4z" fill="#e8e7e8"/><path d="m517.7 905.5.7-.8h-.7z" fill="#808080"/><path d="m517.7 909.3v1.3l5.8-5.9h-1.3z" fill="#808080"/><path d="m517.7 914.5v1.3l10.8-11.1h-1.3z" fill="#808080"/><path d="m517.7 919.6v1.3l15.8-16.2h-1.3z" fill="#808080"/><path d="m517.7 924.7v1.3l20.8-21.3h-1.3z" fill="#808080"/><path d="m517.7 929.9v1.2l25.8-26.4h-1.2z" fill="#808080"/><path d="m517.7 935v1.3l30.8-31.6h-1.2z" fill="#808080"/><path d="m517.7 940.1v.7h.6l34.6-35.4v-.7h-.6z" fill="#808080"/><path d="m523.3 940.8 29.6-30.3v-1.3l-30.8 31.6z" fill="#808080"/><path d="m528.4 940.8 24.5-25.2v-1.3l-25.8 26.5z" fill="#808080"/><path d="m533.4 940.8 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m538.4 940.8 14.5-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m543.4 940.8 9.5-9.8v-1.3l-10.8 11.1z" fill="#808080"/><path d="m548.4 940.8 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m552.9 940.8v-.8l-.7.8z" fill="#808080"/><path d="m572.3 976.8h-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.6v.6 3.8 1.3 3.8c9.4-2.1 17.2-5.2 21.9-9.6h-1.2-1z" fill="#e8e7e8"/><path d="m523.5 976.8-5.8 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m548.3 987.3c1.6-.3 3.1-.6 4.7-1v-3.8z" fill="#e8e7e8"/><path d="m543.5 976.8-12.5 12.8c1.4-.1 2.8-.3 4.2-.4l12.2-12.4z" fill="#e8e7e8"/><path d="m552.9 977.4-10.6 10.9c1.5-.2 3-.5 4.5-.7l6.2-6.3v-3.9z" fill="#e8e7e8"/><path d="m548.5 976.8-12 12.3c1.4-.2 2.9-.3 4.3-.5l11.5-11.7h-3.8z" fill="#e8e7e8"/><path d="m538.5 976.8-13 13.3c1.4-.1 2.7-.2 4.1-.3l12.7-13z" fill="#e8e7e8"/><path d="m518.4 976.8-.7.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m528.5 976.8-10.8 11v2.7c.4 0 .8 0 1.2-.1l13.3-13.6z" fill="#e8e7e8"/><path d="m533.5 976.8-13.3 13.6c1.3-.1 2.7-.1 4-.2l13.1-13.4z" fill="#e8e7e8"/><path d="m517.7 976.8v.8l.7-.8z" fill="#808080"/><path d="m522.2 976.8-4.5 4.6v1.3l5.8-5.9z" fill="#808080"/><path d="m517.7 986.5v1.3l10.8-11h-1.3z" fill="#808080"/><path d="m532.2 976.8-13.3 13.6c.4 0 .9 0 1.3-.1l13.3-13.6h-1.3z" fill="#808080"/><path d="m537.2 976.8-13.1 13.4c.4 0 .9-.1 1.3-.1l13-13.3z" fill="#808080"/><path d="m542.3 976.8-12.7 13c.5 0 .9-.1 1.4-.1l12.6-12.8h-1.3z" fill="#808080"/><path d="m547.3 976.8-12.2 12.4c.5-.1.9-.1 1.4-.2l12-12.3h-1.2z" fill="#808080"/><path d="m552.9 976.8h-.6l-11.5 11.7c.5-.1 1-.1 1.5-.2l10.6-10.9z" fill="#808080"/><path d="m552.9 981.3-6.2 6.3 1.5-.3 4.7-4.8z" fill="#808080"/><path d="m447.3 452.4v3.8 1.3 3.8 1.3 3.8 1.3 3.8.8h.7 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.6v-.6-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-.3c-11.1 2-22.9 3.4-35.2 4.1v1.2 1.2z" fill="#808080"/><path d="m506.9 472.4 10.8-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m501.9 472.4 15.8-16.2v-3.8l-19.5 20z" fill="#e8e7e8"/><path d="m496.9 472.4 20.8-21.3v-3.8l-24.6 25.1z" fill="#e8e7e8"/><path d="m517.7 440.8v-3.8l-34.6 35.4h3.8z" fill="#e8e7e8"/><path d="m511.9 472.4 5.8-5.9v-3.9l-9.5 9.8z" fill="#e8e7e8"/><path d="m491.9 472.4 25.8-26.4v-3.9l-29.6 30.3z" fill="#e8e7e8"/><path d="m482.5 466.6 26.4-27.1c-1.7.5-3.5 1-5.2 1.5l-21.2 21.7z" fill="#e8e7e8"/><path d="m482.5 456.3 12.9-13.2c-1.6.4-3.2.7-4.8 1.1l-8.1 8.3z" fill="#e8e7e8"/><path d="m482.5 451.2 6.5-6.7c-1.5.3-3.1.6-4.7.9l-1.9 1.9v3.9z" fill="#e8e7e8"/><path d="m482.8 445.8c-.1 0-.2 0-.3.1v.3z" fill="#e8e7e8"/><path d="m517 472.4.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m482.5 461.5 19.5-20c-1.6.4-3.3.9-5 1.3l-14.5 14.9z" fill="#e8e7e8"/><path d="m482.5 471.7 33.8-34.6c-1.8.6-3.7 1.2-5.5 1.8l-28.3 28.9z" fill="#e8e7e8"/><path d="m482.5 447.4 1.9-1.9c-.5.1-1 .2-1.5.3l-.3.3v1.3z" fill="#808080"/><path d="m482.5 452.5 8.1-8.3c-.5.1-1 .2-1.6.3l-6.5 6.7z" fill="#808080"/><path d="m482.5 457.6 14.5-14.9c-.6.1-1.1.3-1.7.4l-12.9 13.2v1.3z" fill="#808080"/><path d="m482.5 462.8 21.2-21.7c-.6.2-1.1.3-1.7.5l-19.5 20z" fill="#808080"/><path d="m482.5 467.9 28.3-28.9c-.6.2-1.2.4-1.8.6l-26.4 27.1v1.2z" fill="#808080"/><path d="m482.5 472.4h.6l34.6-35.4v-.3c-.5.2-.9.3-1.4.5l-33.8 34.6z" fill="#808080"/><path d="m488.1 472.4 29.6-30.3v-1.3l-30.8 31.6z" fill="#808080"/><path d="m493.1 472.4 24.6-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m498.2 472.4 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m503.2 472.4 14.5-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m508.2 472.4 9.5-9.8v-1.2l-10.8 11z" fill="#808080"/><path d="m513.2 472.4 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m517.7 472.4v-.8l-.7.8z" fill="#808080"/><path d="m447.3 512.9v1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.7 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.7.7v-.6-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-.8-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.3-3.7-.6v.7z" fill="#808080"/><path d="m482.5 476.9v1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8.8h.7 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8.6v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-.6v.6z" fill="#e8e7e8"/><path d="m482.5 543.8 34.6-35.4h-3.8l-30.8 31.5z" fill="#e8e7e8"/><path d="m501.9 544.4 15.8-16.1v-3.9l-19.5 20z" fill="#e8e7e8"/><path d="m511.9 544.4 5.8-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m517.7 512.9v-3.8l-34.6 35.3h3.8z" fill="#e8e7e8"/><path d="m496.9 544.4 20.8-21.2v-3.9l-24.6 25.1z" fill="#e8e7e8"/><path d="m482.5 538.7 29.6-30.3h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m482.5 518.1 9.5-9.7h-3.8l-5.7 5.9z" fill="#e8e7e8"/><path d="m506.9 544.4 10.8-11v-3.8l-14.5 14.8z" fill="#e8e7e8"/><path d="m482.5 523.3 14.5-14.9h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m491.9 544.4 25.8-26.4v-3.8l-29.6 30.2z" fill="#e8e7e8"/><path d="m482.5 528.4 19.5-20h-3.7l-15.8 16.2z" fill="#e8e7e8"/><path d="m482.5 533.5 24.5-25.1h-3.7l-20.8 21.3z" fill="#e8e7e8"/><path d="m482.5 513 4.5-4.6h-3.8l-.7.8z" fill="#e8e7e8"/><path d="m517 544.4.7-.7v-3.9l-4.5 4.6z" fill="#e8e7e8"/><path d="m483.2 508.4h-.7v.8z" fill="#808080"/><path d="m482.5 514.3 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m482.5 519.4 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m482.5 524.6 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m482.5 529.7 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m482.5 534.8 25.8-26.4h-1.3l-24.5 25.1z" fill="#808080"/><path d="m482.5 539.9 30.8-31.5h-1.2l-29.6 30.3z" fill="#808080"/><path d="m482.5 543.8v.6h.6l34.6-35.3v-.7h-.6z" fill="#808080"/><path d="m488.1 544.4 29.6-30.2v-1.3l-30.8 31.5z" fill="#808080"/><path d="m493.1 544.4 24.6-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m498.2 544.4 19.5-20v-1.2l-20.8 21.2z" fill="#808080"/><path d="m503.2 544.4 14.5-14.8v-1.3l-15.8 16.1z" fill="#808080"/><path d="m508.2 544.4 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m513.2 544.4 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m517.7 544.4v-.7l-.7.7z" fill="#808080"/><path d="m471.7 508.4 10.8-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m447.3 507.8 34.5-35.4h-3.7l-30.8 31.5z" fill="#e8e7e8"/><path d="m466.7 508.4 15.8-16.1v-3.9l-19.6 20z" fill="#e8e7e8"/><path d="m476.7 508.4 5.8-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m447.3 482.1 9.5-9.7h-3.8l-5.7 5.9z" fill="#e8e7e8"/><path d="m461.7 508.4 20.8-21.3v-3.8l-24.6 25.1z" fill="#e8e7e8"/><path d="m447.3 492.4 19.5-20h-3.7l-15.8 16.1z" fill="#e8e7e8"/><path d="m447.3 477 4.5-4.6h-3.8l-.7.7z" fill="#e8e7e8"/><path d="m447.3 487.2 14.5-14.8h-3.8l-10.7 11z" fill="#e8e7e8"/><path d="m447.3 497.5 24.5-25.1h-3.7l-20.8 21.3z" fill="#e8e7e8"/><path d="m447.3 502.6 29.5-30.2h-3.7l-25.8 26.4z" fill="#e8e7e8"/><path d="m456.7 508.4 25.8-26.4v-3.8l-29.6 30.2z" fill="#e8e7e8"/><path d="m481.7 508.4.8-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m482.5 476.9v-3.9l-34.6 35.4h3.7z" fill="#e8e7e8"/><path d="m448 472.4h-.7v.7z" fill="#808080"/><path d="m447.3 478.3 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m447.3 483.4 10.7-11h-1.2l-9.5 9.7z" fill="#808080"/><path d="m447.3 488.5 15.8-16.1h-1.3l-14.5 14.8z" fill="#808080"/><path d="m447.3 493.7 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m447.3 498.8 25.8-26.4h-1.3l-24.5 25.1z" fill="#808080"/><path d="m447.3 503.9 30.8-31.5h-1.3l-29.5 30.2z" fill="#808080"/><path d="m447.3 508.4h.6l34.6-35.4v-.6h-.7l-34.5 35.4z" fill="#808080"/><path d="m452.9 508.4 29.6-30.2v-1.3l-30.9 31.5z" fill="#808080"/><path d="m457.9 508.4 24.6-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m462.9 508.4 19.6-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m468 508.4 14.5-14.9v-1.2l-15.8 16.1z" fill="#808080"/><path d="m473 508.4 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m478 508.4 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m482.5 508.4v-.8l-.8.8z" fill="#808080"/><path d="m447.3 585v1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8.8h.7 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.7.7v-.6-3.9-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.8-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.3-3.7-.6v.6z" fill="#808080"/><path d="m482.5 548.9v1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8.8h.7 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8.6v-.7-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-.8h-.7-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-.6v.7z" fill="#e8e7e8"/><path d="m501.9 616.5 15.8-16.2v-3.8l-19.5 20z" fill="#e8e7e8"/><path d="m482.5 600.5 19.5-20h-3.7l-15.8 16.1z" fill="#e8e7e8"/><path d="m511.9 616.5 5.8-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m482.5 590.2 9.5-9.7h-3.8l-5.7 5.9z" fill="#e8e7e8"/><path d="m482.5 605.6 24.5-25.1h-3.7l-20.8 21.2z" fill="#e8e7e8"/><path d="m482.5 595.3 14.5-14.8h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m506.9 616.5 10.8-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m482.5 615.9 34.6-35.4h-3.8l-30.8 31.5z" fill="#e8e7e8"/><path d="m482.5 585.1 4.5-4.6h-3.8l-.7.7z" fill="#e8e7e8"/><path d="m517 616.5.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m496.9 616.5 20.8-21.3v-3.8l-24.6 25.1z" fill="#e8e7e8"/><path d="m486.9 616.5 30.8-31.5v-3.9l-34.6 35.4z" fill="#e8e7e8"/><path d="m491.9 616.5 25.8-26.4v-3.9l-29.6 30.3z" fill="#e8e7e8"/><path d="m482.5 610.7 29.6-30.2h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m483.2 580.5h-.7v.7z" fill="#808080"/><path d="m482.5 586.4 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m482.5 591.5 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m482.5 596.6 15.8-16.1h-1.3l-14.5 14.8z" fill="#808080"/><path d="m482.5 601.7 20.8-21.2h-1.3l-19.5 20z" fill="#808080"/><path d="m482.5 606.9 25.8-26.4h-1.3l-24.5 25.1z" fill="#808080"/><path d="m482.5 612 30.8-31.5h-1.2l-29.6 30.2z" fill="#808080"/><path d="m482.5 615.9v.6h.6l34.6-35.4v-.6h-.6z" fill="#808080"/><path d="m488.1 616.5 29.6-30.3v-1.2l-30.8 31.5z" fill="#808080"/><path d="m493.1 616.5 24.6-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m498.2 616.5 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m503.2 616.5 14.5-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m508.2 616.5 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m513.2 616.5 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m517.7 616.5v-.8l-.7.8z" fill="#808080"/><path d="m482.5 548.9v-3.8l-34.6 35.4h3.7z" fill="#e8e7e8"/><path d="m447.3 579.8 34.5-35.4h-3.7l-30.8 31.6z" fill="#e8e7e8"/><path d="m456.7 580.5 25.8-26.4v-3.9l-29.6 30.3z" fill="#e8e7e8"/><path d="m447.3 559.3 14.5-14.9h-3.8l-10.7 11.1z" fill="#e8e7e8"/><path d="m466.7 580.5 15.8-16.2v-3.8l-19.6 20z" fill="#e8e7e8"/><path d="m447.3 574.7 29.5-30.3h-3.7l-25.8 26.4z" fill="#e8e7e8"/><path d="m447.3 569.6 24.5-25.2h-3.7l-20.8 21.3z" fill="#e8e7e8"/><path d="m447.3 549 4.5-4.6h-3.8l-.7.8z" fill="#e8e7e8"/><path d="m481.7 580.5.8-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m471.7 580.5 10.8-11.1v-3.8l-14.5 14.9z" fill="#e8e7e8"/><path d="m461.7 580.5 20.8-21.3v-3.9l-24.6 25.2z" fill="#e8e7e8"/><path d="m447.3 564.4 19.5-20h-3.7l-15.8 16.2z" fill="#e8e7e8"/><path d="m447.3 554.2 9.5-9.8h-3.8l-5.7 5.9z" fill="#e8e7e8"/><path d="m476.7 580.5 5.8-5.9v-3.9l-9.5 9.8z" fill="#e8e7e8"/><path d="m448 544.4h-.7v.8z" fill="#808080"/><path d="m447.3 550.3 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m447.3 555.5 10.7-11.1h-1.2l-9.5 9.8z" fill="#808080"/><path d="m447.3 560.6 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m447.3 565.7 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m447.3 570.8 25.8-26.4h-1.3l-24.5 25.2z" fill="#808080"/><path d="m447.3 576 30.8-31.6h-1.3l-29.5 30.3z" fill="#808080"/><path d="m447.3 579.8v.7h.6l34.6-35.4v-.7h-.7z" fill="#808080"/><path d="m452.9 580.5 29.6-30.3v-1.3l-30.9 31.6z" fill="#808080"/><path d="m457.9 580.5 24.6-25.2v-1.2l-25.8 26.4z" fill="#808080"/><path d="m462.9 580.5 19.6-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m468 580.5 14.5-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m473 580.5 9.5-9.8v-1.3l-10.8 11.1z" fill="#808080"/><path d="m478 580.5 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m482.5 580.5v-.8l-.8.8z" fill="#808080"/><path d="m482.5 684.1v-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-.8h-.8-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.3-3.7-.6v.7 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8.8h.7 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.7.7v-.7z" fill="#808080"/><path d="m513.2 616.5h-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-.6v.6 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.7 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8.6v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-.8h-.7z" fill="#e8e7e8"/><path d="m511.9 688.6 5.8-5.9v-3.9l-9.5 9.8z" fill="#e8e7e8"/><path d="m482.5 657.1 4.5-4.6h-3.8l-.7.8z" fill="#e8e7e8"/><path d="m482.5 662.3 9.5-9.8h-3.8l-5.7 5.9z" fill="#e8e7e8"/><path d="m517 688.6.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m506.9 688.6 10.8-11.1v-3.8l-14.5 14.9z" fill="#e8e7e8"/><path d="m482.5 682.8 29.6-30.3h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m482.5 687.9 34.6-35.4h-3.8l-30.8 31.6z" fill="#e8e7e8"/><path d="m501.9 688.6 15.8-16.2v-3.8l-19.5 20z" fill="#e8e7e8"/><path d="m482.5 672.5 19.5-20h-3.7l-15.8 16.2z" fill="#e8e7e8"/><path d="m482.5 667.4 14.5-14.9h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m482.5 677.6 24.5-25.1h-3.7l-20.8 21.3z" fill="#e8e7e8"/><path d="m486.9 688.6 30.8-31.6v-3.8l-34.6 35.4z" fill="#e8e7e8"/><path d="m491.9 688.6 25.8-26.5v-3.8l-29.6 30.3z" fill="#e8e7e8"/><path d="m496.9 688.6 20.8-21.3v-3.9l-24.6 25.2z" fill="#e8e7e8"/><path d="m483.2 652.5h-.7v.8z" fill="#808080"/><path d="m482.5 658.4 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m482.5 663.5 10.8-11h-1.3l-9.5 9.8z" fill="#808080"/><path d="m482.5 668.7 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m482.5 673.8 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m482.5 678.9 25.8-26.4h-1.3l-24.5 25.1z" fill="#808080"/><path d="m482.5 684.1 30.8-31.6h-1.2l-29.6 30.3z" fill="#808080"/><path d="m482.5 687.9v.7h.6l34.6-35.4v-.7h-.6z" fill="#808080"/><path d="m488.1 688.6 29.6-30.3v-1.3l-30.8 31.6z" fill="#808080"/><path d="m493.1 688.6 24.6-25.2v-1.3l-25.8 26.5z" fill="#808080"/><path d="m498.2 688.6 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m503.2 688.6 14.5-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m508.2 688.6 9.5-9.8v-1.3l-10.8 11.1z" fill="#808080"/><path d="m513.2 688.6 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m517.7 688.6v-.8l-.7.8z" fill="#808080"/><path d="m451.6 652.5 30.9-31.5v-3.9l-34.6 35.4z" fill="#e8e7e8"/><path d="m447.3 651.9 34.5-35.4h-3.7l-30.8 31.5z" fill="#e8e7e8"/><path d="m466.7 652.5 15.8-16.1v-3.9l-19.6 20z" fill="#e8e7e8"/><path d="m471.7 652.5 10.8-11v-3.8l-14.5 14.8z" fill="#e8e7e8"/><path d="m481.7 652.5.8-.7v-3.9l-4.5 4.6z" fill="#e8e7e8"/><path d="m476.7 652.5 5.8-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m456.7 652.5 25.8-26.4v-3.8l-29.6 30.2z" fill="#e8e7e8"/><path d="m461.7 652.5 20.8-21.3v-3.8l-24.6 25.1z" fill="#e8e7e8"/><path d="m447.3 646.7 29.5-30.2h-3.7l-25.8 26.4z" fill="#e8e7e8"/><path d="m447.3 641.6 24.5-25.1h-3.7l-20.8 21.3z" fill="#e8e7e8"/><path d="m447.3 631.4 14.5-14.9h-3.8l-10.7 11z" fill="#e8e7e8"/><path d="m447.3 621.1 4.5-4.6h-3.8l-.7.8z" fill="#e8e7e8"/><path d="m447.3 626.2 9.5-9.7h-3.8l-5.7 5.9z" fill="#e8e7e8"/><path d="m447.3 636.5 19.5-20h-3.7l-15.8 16.1z" fill="#e8e7e8"/><path d="m448 616.5h-.7v.8z" fill="#808080"/><path d="m447.3 622.4 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m447.3 627.5 10.7-11h-1.2l-9.5 9.7z" fill="#808080"/><path d="m447.3 632.6 15.8-16.1h-1.3l-14.5 14.9z" fill="#808080"/><path d="m447.3 637.8 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m447.3 642.9 25.8-26.4h-1.3l-24.5 25.1z" fill="#808080"/><path d="m447.3 648 30.8-31.5h-1.3l-29.5 30.2z" fill="#808080"/><path d="m447.3 651.9v.6h.6l34.6-35.4v-.6h-.7z" fill="#808080"/><path d="m452.9 652.5 29.6-30.2v-1.3l-30.9 31.5z" fill="#808080"/><path d="m457.9 652.5 24.6-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m462.9 652.5 19.6-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m468 652.5 14.5-14.8v-1.3l-15.8 16.1z" fill="#808080"/><path d="m473 652.5 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m478 652.5 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m482.5 652.5v-.7l-.8.7z" fill="#808080"/><path d="m482.5 756.1v-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.8-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.3-3.7-.6v.6 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h35.2v-.6z" fill="#808080"/><path d="m517.7 720.1v-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.2-3.9-.7h-.7-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-.6v.6 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8.8h.7 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8.6v-.7z" fill="#e8e7e8"/><path d="m517.7 740.6-19.5 20h3.7l15.8-16.1z" fill="#e8e7e8"/><path d="m517.7 730.4-29.6 30.2h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m517.7 735.5-24.6 25.1h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m517.7 725.2-34.6 35.4h3.8l30.8-31.5z" fill="#e8e7e8"/><path d="m493.3 724.6-10.8 11v3.8l14.5-14.8z" fill="#e8e7e8"/><path d="m488.2 724.6-5.7 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m483.2 724.6-.7.7v3.9l4.5-4.6z" fill="#e8e7e8"/><path d="m482.5 756.1v3.9l34.6-35.4h-3.8z" fill="#e8e7e8"/><path d="m503.3 724.6-20.8 21.3v3.8l24.5-25.1z" fill="#e8e7e8"/><path d="m508.3 724.6-25.8 26.4v3.8l29.6-30.2z" fill="#e8e7e8"/><path d="m498.3 724.6-15.8 16.1v3.9l19.5-20z" fill="#e8e7e8"/><path d="m517.7 750.9-9.5 9.7h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m517.7 756-4.5 4.6h3.8l.7-.7z" fill="#e8e7e8"/><path d="m517.7 745.8-14.5 14.8h3.7l10.8-11z" fill="#e8e7e8"/><path d="m482.5 724.6v.7l.7-.7z" fill="#808080"/><path d="m487 724.6-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m492 724.6-9.5 9.7v1.3l10.8-11z" fill="#808080"/><path d="m497 724.6-14.5 14.8v1.3l15.8-16.1z" fill="#808080"/><path d="m502 724.6-19.5 20v1.3l20.8-21.3z" fill="#808080"/><path d="m507 724.6-24.5 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m512.1 724.6-29.6 30.2v1.3l30.8-31.5z" fill="#808080"/><path d="m517.7 724.6h-.6l-34.6 35.4v.6h.6l34.6-35.4z" fill="#808080"/><path d="m517.7 729.1-30.8 31.5h1.2l29.6-30.2z" fill="#808080"/><path d="m517.7 734.2-25.8 26.4h1.2l24.6-25.1z" fill="#808080"/><path d="m517.7 739.3-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m517.7 744.5-15.8 16.1h1.3l14.5-14.8z" fill="#808080"/><path d="m517.7 749.6-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m517.7 754.7-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m517 760.6h.7v-.7z" fill="#808080"/><path d="m482.5 689.2-34.6 35.4h3.7l30.9-31.6z" fill="#e8e7e8"/><path d="m473.1 688.6-25.8 26.4v3.8l29.5-30.2z" fill="#e8e7e8"/><path d="m447.3 720.1v3.8l34.5-35.3h-3.7z" fill="#e8e7e8"/><path d="m482.5 704.6-19.6 20h3.8l15.8-16.2z" fill="#e8e7e8"/><path d="m453 688.6-5.7 5.8v3.9l9.5-9.7z" fill="#e8e7e8"/><path d="m482.5 720-4.5 4.6h3.7l.8-.8z" fill="#e8e7e8"/><path d="m448 688.6-.7.7v3.9l4.5-4.6z" fill="#e8e7e8"/><path d="m482.5 699.5-24.6 25.1h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m482.5 714.9-9.5 9.7h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m463.1 688.6-15.8 16.1v3.8l19.5-19.9z" fill="#e8e7e8"/><path d="m468.1 688.6-20.8 21.2v3.9l24.5-25.1z" fill="#e8e7e8"/><path d="m458 688.6-10.7 11v3.8l14.5-14.8z" fill="#e8e7e8"/><path d="m482.5 709.7-14.5 14.9h3.7l10.8-11z" fill="#e8e7e8"/><path d="m482.5 694.3-29.6 30.3h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m447.3 688.6v.7l.7-.7z" fill="#808080"/><path d="m451.8 688.6-4.5 4.6v1.2l5.7-5.8z" fill="#808080"/><path d="m456.8 688.6-9.5 9.7v1.3l10.7-11z" fill="#808080"/><path d="m461.8 688.6-14.5 14.8v1.3l15.8-16.1z" fill="#808080"/><path d="m466.8 688.6-19.5 19.9v1.3l20.8-21.2z" fill="#808080"/><path d="m471.8 688.6-24.5 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m476.8 688.6-29.5 30.2v1.3l30.8-31.5z" fill="#808080"/><path d="m482.5 688.6h-.7l-34.5 35.3v.7h.6l34.6-35.4z" fill="#808080"/><path d="m482.5 693-30.9 31.6h1.3l29.6-30.3z" fill="#808080"/><path d="m482.5 698.2-25.8 26.4h1.2l24.6-25.1z" fill="#808080"/><path d="m482.5 703.3-20.8 21.3h1.2l19.6-20z" fill="#808080"/><path d="m482.5 708.4-15.8 16.2h1.3l14.5-14.9z" fill="#808080"/><path d="m482.5 713.6-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m482.5 718.7-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m481.7 724.6h.8v-.8z" fill="#808080"/><path d="m447.3 801.1v1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8.8h.7 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.7.7v-.7-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-.8h-.8-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.3-3.7-.6v.7z" fill="#808080"/><path d="m482.5 765.1v1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9.7h.7 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8.6v-.6-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-35.2v.7z" fill="#e8e7e8"/><path d="m482.5 826.9 29.6-30.3h-3.8l-25.8 26.5z" fill="#e8e7e8"/><path d="m482.5 832 34.6-35.4h-3.8l-30.8 31.6z" fill="#e8e7e8"/><path d="m486.9 832.7 30.8-31.6v-3.8l-34.6 35.4z" fill="#e8e7e8"/><path d="m482.5 821.8 24.5-25.2h-3.7l-20.8 21.3z" fill="#e8e7e8"/><path d="m496.9 832.7 20.8-21.3v-3.8l-24.6 25.1z" fill="#e8e7e8"/><path d="m482.5 806.4 9.5-9.8h-3.8l-5.7 5.9z" fill="#e8e7e8"/><path d="m482.5 811.5 14.5-14.9h-3.7l-10.8 11.1z" fill="#e8e7e8"/><path d="m482.5 816.6 19.5-20h-3.7l-15.8 16.2z" fill="#e8e7e8"/><path d="m491.9 832.7 25.8-26.4v-3.9l-29.6 30.3z" fill="#e8e7e8"/><path d="m511.9 832.7 5.8-5.9v-3.9l-9.5 9.8z" fill="#e8e7e8"/><path d="m517 832.7.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m482.5 801.2 4.5-4.6h-3.8l-.7.8z" fill="#e8e7e8"/><path d="m506.9 832.7 10.8-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m501.9 832.7 15.8-16.2v-3.8l-19.5 20z" fill="#e8e7e8"/><path d="m483.2 796.6h-.7v.8z" fill="#808080"/><path d="m482.5 802.5 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m482.5 807.7 10.8-11.1h-1.3l-9.5 9.8z" fill="#808080"/><path d="m482.5 812.8 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m482.5 817.9 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m482.5 823.1 25.8-26.5h-1.3l-24.5 25.2z" fill="#808080"/><path d="m482.5 828.2 30.8-31.6h-1.2l-29.6 30.3z" fill="#808080"/><path d="m482.5 832.7h.6l34.6-35.4v-.7h-.6l-34.6 35.4z" fill="#808080"/><path d="m488.1 832.7 29.6-30.3v-1.3l-30.8 31.6z" fill="#808080"/><path d="m493.1 832.7 24.6-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m498.2 832.7 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m503.2 832.7 14.5-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m508.2 832.7 9.5-9.8v-1.2l-10.8 11z" fill="#808080"/><path d="m513.2 832.7 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m517.7 832.7v-.8l-.7.8z" fill="#808080"/><path d="m476.7 796.6 5.8-5.8v-3.9l-9.5 9.7z" fill="#e8e7e8"/><path d="m481.7 796.6.8-.7v-3.9l-4.5 4.6z" fill="#e8e7e8"/><path d="m471.7 796.6 10.8-11v-3.8l-14.5 14.8z" fill="#e8e7e8"/><path d="m447.3 780.6 19.5-20h-3.7l-15.8 16.2z" fill="#e8e7e8"/><path d="m447.3 785.7 24.5-25.1h-3.7l-20.8 21.3z" fill="#e8e7e8"/><path d="m447.3 790.9 29.5-30.3h-3.7l-25.8 26.4z" fill="#e8e7e8"/><path d="m447.3 765.2 4.5-4.6h-3.8l-.7.8z" fill="#e8e7e8"/><path d="m447.3 775.5 14.5-14.9h-3.8l-10.7 11z" fill="#e8e7e8"/><path d="m447.3 796 34.5-35.4h-3.7l-30.8 31.6z" fill="#e8e7e8"/><path d="m461.7 796.6 20.8-21.2v-3.9l-24.6 25.1z" fill="#e8e7e8"/><path d="m456.7 796.6 25.8-26.4v-3.8l-29.6 30.2z" fill="#e8e7e8"/><path d="m466.7 796.6 15.8-16.1v-3.8l-19.6 19.9z" fill="#e8e7e8"/><path d="m482.5 765.1v-3.8l-34.6 35.3h3.7z" fill="#e8e7e8"/><path d="m447.3 770.3 9.5-9.7h-3.8l-5.7 5.9z" fill="#e8e7e8"/><path d="m448 760.6h-.7v.8z" fill="#808080"/><path d="m447.3 766.5 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m447.3 771.6 10.7-11h-1.2l-9.5 9.7z" fill="#808080"/><path d="m447.3 776.8 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m447.3 781.9 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m447.3 787 25.8-26.4h-1.3l-24.5 25.1z" fill="#808080"/><path d="m447.3 792.2 30.8-31.6h-1.3l-29.5 30.3z" fill="#808080"/><path d="m447.3 796.6h.6l34.6-35.3v-.7h-.7l-34.5 35.4z" fill="#808080"/><path d="m452.9 796.6 29.6-30.2v-1.3l-30.9 31.5z" fill="#808080"/><path d="m457.9 796.6 24.6-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m462.9 796.6 19.6-19.9v-1.3l-20.8 21.2z" fill="#808080"/><path d="m468 796.6 14.5-14.8v-1.3l-15.8 16.1z" fill="#808080"/><path d="m473 796.6 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m478 796.6 4.5-4.6v-1.2l-5.8 5.8z" fill="#808080"/><path d="m482.5 796.6v-.7l-.8.7z" fill="#808080"/><path d="m478 868.7h-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.3-3.7-.6v.7 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.7 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.7.7v-.6-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-.8z" fill="#808080"/><path d="m513.2 832.7h-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-.6v.6 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8.8h.7 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8.6v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7z" fill="#e8e7e8"/><path d="m511.9 904.7 5.8-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m486.9 904.7 30.8-31.5v-3.8l-34.6 35.3z" fill="#e8e7e8"/><path d="m517 904.7.7-.7v-3.9l-4.5 4.6z" fill="#e8e7e8"/><path d="m491.9 904.7 25.8-26.4v-3.8l-29.6 30.2z" fill="#e8e7e8"/><path d="m506.9 904.7 10.8-11v-3.8l-14.5 14.8z" fill="#e8e7e8"/><path d="m496.9 904.7 20.8-21.2v-3.9l-24.6 25.1z" fill="#e8e7e8"/><path d="m501.9 904.7 15.8-16.1v-3.9l-19.5 20z" fill="#e8e7e8"/><path d="m482.5 878.4 9.5-9.7h-3.8l-5.7 5.9z" fill="#e8e7e8"/><path d="m482.5 883.6 14.5-14.9h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m482.5 904.1 34.6-35.4h-3.8l-30.8 31.5z" fill="#e8e7e8"/><path d="m482.5 873.3 4.5-4.6h-3.8l-.7.8z" fill="#e8e7e8"/><path d="m482.5 899 29.6-30.3h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m482.5 893.8 24.5-25.1h-3.7l-20.8 21.3z" fill="#e8e7e8"/><path d="m482.5 888.7 19.5-20h-3.7l-15.8 16.2z" fill="#e8e7e8"/><path d="m483.2 868.7h-.7v.8z" fill="#808080"/><path d="m482.5 874.6 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m482.5 879.7 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m482.5 884.9 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m482.5 890 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m482.5 895.1 25.8-26.4h-1.3l-24.5 25.1z" fill="#808080"/><path d="m482.5 900.2 30.8-31.5h-1.2l-29.6 30.3z" fill="#808080"/><path d="m482.5 904.1v.6h.6l34.6-35.3v-.7h-.6z" fill="#808080"/><path d="m488.1 904.7 29.6-30.2v-1.3l-30.8 31.5z" fill="#808080"/><path d="m493.1 904.7 24.6-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m498.2 904.7 19.5-20v-1.2l-20.8 21.2z" fill="#808080"/><path d="m503.2 904.7 14.5-14.8v-1.3l-15.8 16.1z" fill="#808080"/><path d="m508.2 904.7 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m513.2 904.7 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m517.7 904.7v-.7l-.7.7z" fill="#808080"/><path d="m447.3 837.3 4.5-4.6h-3.8l-.7.7z" fill="#e8e7e8"/><path d="m447.3 842.4 9.5-9.7h-3.8l-5.7 5.9z" fill="#e8e7e8"/><path d="m451.6 868.7 30.9-31.5v-3.9l-34.6 35.4z" fill="#e8e7e8"/><path d="m476.7 868.7 5.8-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m466.7 868.7 15.8-16.1v-3.9l-19.6 20z" fill="#e8e7e8"/><path d="m471.7 868.7 10.8-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m447.3 847.5 14.5-14.8h-3.8l-10.7 11z" fill="#e8e7e8"/><path d="m456.7 868.7 25.8-26.4v-3.8l-29.6 30.2z" fill="#e8e7e8"/><path d="m447.3 868.1 34.5-35.4h-3.7l-30.8 31.5z" fill="#e8e7e8"/><path d="m447.3 852.7 19.5-20h-3.7l-15.8 16.1z" fill="#e8e7e8"/><path d="m447.3 857.8 24.5-25.1h-3.7l-20.8 21.3z" fill="#e8e7e8"/><path d="m447.3 862.9 29.5-30.2h-3.7l-25.8 26.4z" fill="#e8e7e8"/><path d="m481.7 868.7.8-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m461.7 868.7 20.8-21.3v-3.8l-24.6 25.1z" fill="#e8e7e8"/><path d="m448 832.7h-.7v.7z" fill="#808080"/><path d="m447.3 838.6 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m447.3 843.7 10.7-11h-1.2l-9.5 9.7z" fill="#808080"/><path d="m447.3 848.8 15.8-16.1h-1.3l-14.5 14.8z" fill="#808080"/><path d="m447.3 854 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m447.3 859.1 25.8-26.4h-1.3l-24.5 25.1z" fill="#808080"/><path d="m447.3 864.2 30.8-31.5h-1.3l-29.5 30.2z" fill="#808080"/><path d="m447.3 868.7h.6l34.6-35.4v-.6h-.7l-34.5 35.4z" fill="#808080"/><path d="m452.9 868.7 29.6-30.2v-1.3l-30.9 31.5z" fill="#808080"/><path d="m457.9 868.7 24.6-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m462.9 868.7 19.6-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m468 868.7 14.5-14.9v-1.2l-15.8 16.1z" fill="#808080"/><path d="m473 868.7 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m478 868.7 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m482.5 868.7v-.8l-.8.8z" fill="#808080"/><path d="m482.5 972.3v-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.8-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.3-3.7-.6v.6 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8.8h.7 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.7.7v-.7z" fill="#808080"/><path d="m513.2 904.7h-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-.6v.7 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8.8h.7 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8.6v-.7-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-.8h-.7z" fill="#e8e7e8"/><path d="m517.7 961.9-14.5 14.9h3.7l10.8-11z" fill="#e8e7e8"/><path d="m517.7 956.8-19.5 20h3.7l15.8-16.2z" fill="#e8e7e8"/><path d="m517.7 946.5-29.6 30.3h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m517.7 967.1-9.5 9.7h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m503.3 940.8-20.8 21.2v3.9l24.5-25.1z" fill="#e8e7e8"/><path d="m517.7 951.7-24.6 25.1h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m517.7 941.4-34.6 35.4h3.8l30.8-31.6z" fill="#e8e7e8"/><path d="m493.3 940.8-10.8 11v3.8l14.5-14.8z" fill="#e8e7e8"/><path d="m488.2 940.8-5.7 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m483.2 940.8-.7.7v3.9l4.5-4.6z" fill="#e8e7e8"/><path d="m508.3 940.8-25.8 26.4v3.8l29.6-30.2z" fill="#e8e7e8"/><path d="m517.7 972.2-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m498.3 940.8-15.8 16.1v3.9l19.5-20z" fill="#e8e7e8"/><path d="m482.5 972.3v3.8l34.6-35.3h-3.8z" fill="#e8e7e8"/><path d="m482.5 940.8v.7l.7-.7z" fill="#808080"/><path d="m487 940.8-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m492 940.8-9.5 9.7v1.3l10.8-11z" fill="#808080"/><path d="m497 940.8-14.5 14.8v1.3l15.8-16.1z" fill="#808080"/><path d="m502 940.8-19.5 20v1.2l20.8-21.2z" fill="#808080"/><path d="m507 940.8-24.5 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m512.1 940.8-29.6 30.2v1.3l30.8-31.5z" fill="#808080"/><path d="m517.7 940.8h-.6l-34.6 35.3v.7h.6l34.6-35.4z" fill="#808080"/><path d="m517.7 945.2-30.8 31.6h1.2l29.6-30.3z" fill="#808080"/><path d="m517.7 950.4-25.8 26.4h1.2l24.6-25.1z" fill="#808080"/><path d="m517.7 955.5-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m517.7 960.6-15.8 16.2h1.3l14.5-14.9z" fill="#808080"/><path d="m517.7 965.8-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m517.7 970.9-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m517 976.8h.7v-.8z" fill="#808080"/><path d="m482.5 915.6-24.6 25.2h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m482.5 905.4-34.6 35.4h3.7l30.9-31.6z" fill="#e8e7e8"/><path d="m482.5 920.8-19.6 20h3.8l15.8-16.2z" fill="#e8e7e8"/><path d="m482.5 910.5-29.6 30.3h3.8l25.8-26.5z" fill="#e8e7e8"/><path d="m482.5 925.9-14.5 14.9h3.7l10.8-11.1z" fill="#e8e7e8"/><path d="m482.5 931-9.5 9.8h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m482.5 936.2-4.5 4.6h3.7l.8-.8z" fill="#e8e7e8"/><path d="m447.3 936.3v3.8l34.5-35.4h-3.7z" fill="#e8e7e8"/><path d="m451.8 904.7h-3.8l-.7.8v3.8z" fill="#e8e7e8"/><path d="m476.8 904.7h-3.7l-25.8 26.4v3.9z" fill="#e8e7e8"/><path d="m461.8 904.7h-3.8l-10.7 11.1v3.8z" fill="#e8e7e8"/><path d="m471.8 904.7h-3.7l-20.8 21.3v3.9z" fill="#e8e7e8"/><path d="m456.8 904.7h-3.8l-5.7 5.9v3.9z" fill="#e8e7e8"/><path d="m466.8 904.7h-3.7l-15.8 16.2v3.8z" fill="#e8e7e8"/><path d="m448 904.7h-.7v.8z" fill="#808080"/><path d="m453 904.7h-1.2l-4.5 4.6v1.3z" fill="#808080"/><path d="m458 904.7h-1.2l-9.5 9.8v1.3z" fill="#808080"/><path d="m463.1 904.7h-1.3l-14.5 14.9v1.3z" fill="#808080"/><path d="m468.1 904.7h-1.3l-19.5 20v1.3z" fill="#808080"/><path d="m473.1 904.7h-1.3l-24.5 25.2v1.2z" fill="#808080"/><path d="m478.1 904.7h-1.3l-29.5 30.3v1.3z" fill="#808080"/><path d="m482.5 904.7h-.7l-34.5 35.4v.7h.6l34.6-35.4z" fill="#808080"/><path d="m482.5 909.2-30.9 31.6h1.3l29.6-30.3z" fill="#808080"/><path d="m482.5 914.3-25.8 26.5h1.2l24.6-25.2z" fill="#808080"/><path d="m482.5 919.5-20.8 21.3h1.2l19.6-20z" fill="#808080"/><path d="m482.5 924.6-15.8 16.2h1.3l14.5-14.9z" fill="#808080"/><path d="m482.5 929.7-10.8 11.1h1.3l9.5-9.8z" fill="#808080"/><path d="m482.5 934.9-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m481.7 940.8h.8v-.8z" fill="#808080"/><path d="m517.7 986.5v-3.8-1.3-3.8-.8h-.7-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.6v.6 3.8 1.3 3.8 1.3 2.8c3.3.1 6.8.2 10.3.3h16.7c2.9-.1 5.8-.1 8.7-.3v-2.7z" fill="#e8e7e8"/><path d="m453 976.8-5.7 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m448 976.8-.7.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m482.5 977.4-12.2 12.5c1.2.1 2.3.1 3.6.2l8.6-8.8z" fill="#e8e7e8"/><path d="m479.9 990.4c.9 0 1.7.1 2.6.1v-2.8z" fill="#e8e7e8"/><path d="m482.5 982.6-7.4 7.6c1.2.1 2.4.1 3.6.2l3.8-3.9z" fill="#e8e7e8"/><path d="m473.1 976.8-12.2 12.5c1.1.1 2.3.2 3.5.2l12.5-12.7z" fill="#e8e7e8"/><path d="m478.1 976.8-12.5 12.8c1.1.1 2.3.1 3.5.2l12.8-13z" fill="#e8e7e8"/><path d="m463.1 976.8-11.5 11.7c.9.1 2.1.2 3.5.3l11.8-12z" fill="#e8e7e8"/><path d="m458 976.8-10.8 11v.4h1.7s.5.1 1.5.1l11.4-11.6h-3.8z" fill="#e8e7e8"/><path d="m468.1 976.8-11.9 12.1c1.1.1 2.2.2 3.5.3l12.1-12.4z" fill="#e8e7e8"/><path d="m447.3 976.8v.8l.7-.8z" fill="#808080"/><path d="m451.8 976.8-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m447.3 986.5v1.3l10.7-11h-1.2z" fill="#808080"/><path d="m461.8 976.8-11.4 11.6c.3 0 .7.1 1.2.1l11.5-11.7z" fill="#808080"/><path d="m466.8 976.8-11.8 12c.4 0 .8.1 1.2.1l11.9-12.1z" fill="#808080"/><path d="m471.8 976.8-12.1 12.4c.4 0 .8.1 1.2.1l12.2-12.5z" fill="#808080"/><path d="m476.8 976.8-12.5 12.7c.4 0 .8.1 1.2.1l12.5-12.8z" fill="#808080"/><path d="m482.5 976.8h-.6l-12.8 13c.4 0 .8 0 1.2.1l12.2-12.5z" fill="#808080"/><path d="m482.5 981.3-8.6 8.8c.4 0 .8 0 1.2.1l7.4-7.6z" fill="#808080"/><path d="m482.5 986.4-3.8 3.9c.4 0 .8 0 1.2.1l2.6-2.7z" fill="#808080"/><path d="m376.8 451.1v1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.8h.7 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.6v-.6-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-1c-12.3-.6-24.1-1.8-35.2-3.6v.6 3.8z" fill="#808080"/><path d="m426.5 472.4 20.8-21.3v-1.2c-.9.1-1.9.1-2.8.2l-21.8 22.3z" fill="#e8e7e8"/><path d="m412 461.5 10.7-11c-1.2 0-2.5 0-3.7-.1l-7 7.2z" fill="#e8e7e8"/><path d="m421.4 472.4 21.7-22.2c-1.3.1-2.6.1-3.9.2l-21.6 22.1h3.8z" fill="#e8e7e8"/><path d="m412 456.3 5.8-5.9c-1.2 0-2.4-.1-3.6-.1l-2.2 2.2z" fill="#e8e7e8"/><path d="m436.5 472.4 10.8-11v-3.9l-14.6 14.9z" fill="#e8e7e8"/><path d="m446.5 472.4.8-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m431.5 472.4 15.8-16.2v-3.8l-19.6 20z" fill="#e8e7e8"/><path d="m441.5 472.4 5.8-5.9v-3.9l-9.5 9.8z" fill="#e8e7e8"/><path d="m416.4 472.4 21.5-22c-1.3 0-2.6.1-3.8.1l-21.4 21.9z" fill="#e8e7e8"/><path d="m412 466.6 15.7-16.1c-.2 0-.3 0-.5 0-1.1 0-2.2 0-3.3 0l-12 12.2v3.9z" fill="#e8e7e8"/><path d="m412 471.7 20.8-21.2c-1.3 0-2.5 0-3.8 0l-17 17.4z" fill="#e8e7e8"/><path d="m413 450.2c-.3 0-.6 0-1 0v1z" fill="#e8e7e8"/><path d="m412 452.5 2.2-2.2c-.4 0-.8 0-1.2-.1l-1 1z" fill="#808080"/><path d="m412 457.6 7-7.2c-.4 0-.8 0-1.2 0l-5.8 5.9z" fill="#808080"/><path d="m412 462.8 12-12.2c-.4 0-.8 0-1.2 0l-10.7 11v1.2z" fill="#808080"/><path d="m412 467.9 17-17.4c-.4 0-.8 0-1.3 0l-15.7 16.1z" fill="#808080"/><path d="m412 472.4h.6l21.4-21.9c-.4 0-.9 0-1.3 0l-20.7 21.2z" fill="#808080"/><path d="m417.7 472.4 21.6-22.1c-.4 0-.9 0-1.3 0l-21.5 22h1.2z" fill="#808080"/><path d="m422.7 472.4 21.8-22.3c-.4 0-.9 0-1.3.1l-21.7 22.2z" fill="#808080"/><path d="m447.3 452.4v-1.3l-20.8 21.3h1.2z" fill="#808080"/><path d="m432.7 472.4 14.6-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m437.8 472.4 9.5-9.8v-1.2l-10.8 11z" fill="#808080"/><path d="m442.8 472.4 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m447.3 472.4v-.8l-.8.8z" fill="#808080"/><path d="m376.8 512.9v1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.8 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7.6v-.6-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.2-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-.7v.7z" fill="#808080"/><path d="m412 476.9v1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8.8h.8 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7.7v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.8-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-.7v.6z" fill="#e8e7e8"/><path d="m412 538.7 29.6-30.3h-3.7l-25.9 26.4z" fill="#e8e7e8"/><path d="m446.5 544.4.8-.7v-3.9l-4.5 4.6z" fill="#e8e7e8"/><path d="m421.4 544.4 25.9-26.4v-3.8l-29.6 30.2z" fill="#e8e7e8"/><path d="m412 523.3 14.6-14.9h-3.8l-10.8 11z" fill="#e8e7e8"/><path d="m441.5 544.4 5.8-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m412 543.8 34.6-35.4h-3.7l-30.9 31.5z" fill="#e8e7e8"/><path d="m426.5 544.4 20.8-21.2v-3.9l-24.6 25.1z" fill="#e8e7e8"/><path d="m447.3 512.9v-3.8l-34.6 35.3h3.7z" fill="#e8e7e8"/><path d="m436.5 544.4 10.8-11v-3.8l-14.6 14.8z" fill="#e8e7e8"/><path d="m412 528.4 19.6-20h-3.8l-15.8 16.2z" fill="#e8e7e8"/><path d="m412 533.5 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m412 518.1 9.6-9.7h-3.8l-5.8 5.9z" fill="#e8e7e8"/><path d="m412 513 4.5-4.6h-3.7l-.8.8z" fill="#e8e7e8"/><path d="m431.5 544.4 15.8-16.1v-3.9l-19.6 20z" fill="#e8e7e8"/><path d="m412.8 508.4h-.8v.8z" fill="#808080"/><path d="m412 514.3 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m412 519.4 10.8-11h-1.2l-9.6 9.7z" fill="#808080"/><path d="m412 524.6 15.8-16.2h-1.2l-14.6 14.9z" fill="#808080"/><path d="m412 529.7 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m412 534.8 25.9-26.4h-1.3l-24.6 25.1z" fill="#808080"/><path d="m412 539.9 30.9-31.5h-1.3l-29.6 30.3z" fill="#808080"/><path d="m412 544.4h.7l34.6-35.3v-.7h-.7l-34.6 35.4z" fill="#808080"/><path d="m417.7 544.4 29.6-30.2v-1.3l-30.9 31.5z" fill="#808080"/><path d="m422.7 544.4 24.6-25.1v-1.3l-25.9 26.4z" fill="#808080"/><path d="m427.7 544.4 19.6-20v-1.2l-20.8 21.2z" fill="#808080"/><path d="m432.7 544.4 14.6-14.8v-1.3l-15.8 16.1z" fill="#808080"/><path d="m437.8 544.4 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m442.8 544.4 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m447.3 544.4v-.7l-.8.7z" fill="#808080"/><path d="m376.8 482.1 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m386.2 508.4 25.8-26.4v-3.8l-29.5 30.2z" fill="#e8e7e8"/><path d="m401.3 508.4 10.7-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m411.3 508.4.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m391.2 508.4 20.8-21.3v-3.8l-24.5 25.1z" fill="#e8e7e8"/><path d="m406.3 508.4 5.7-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m376.8 507.8 34.6-35.4h-3.7l-30.9 31.5z" fill="#e8e7e8"/><path d="m376.8 492.4 19.6-20h-3.8l-15.8 16.1z" fill="#e8e7e8"/><path d="m376.8 497.5 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m376.8 502.6 29.6-30.2h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m396.3 508.4 15.7-16.1v-3.9l-19.5 20z" fill="#e8e7e8"/><path d="m376.8 487.2 14.6-14.8h-3.8l-10.8 11z" fill="#e8e7e8"/><path d="m412 476.9v-3.9l-34.5 35.4h3.7z" fill="#e8e7e8"/><path d="m376.8 477 4.5-4.6h-3.7l-.8.7z" fill="#e8e7e8"/><path d="m377.6 472.4h-.8v.7z" fill="#808080"/><path d="m376.8 478.3 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m376.8 483.4 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m376.8 488.5 15.8-16.1h-1.2l-14.6 14.8z" fill="#808080"/><path d="m376.8 493.7 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m376.8 498.8 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m376.8 503.9 30.9-31.5h-1.3l-29.6 30.2z" fill="#808080"/><path d="m376.8 508.4h.7l34.5-35.4v-.6h-.6l-34.6 35.4z" fill="#808080"/><path d="m382.5 508.4 29.5-30.2v-1.3l-30.8 31.5z" fill="#808080"/><path d="m387.5 508.4 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m392.5 508.4 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m397.5 508.4 14.5-14.9v-1.2l-15.7 16.1z" fill="#808080"/><path d="m402.5 508.4 9.5-9.7v-1.3l-10.7 11z" fill="#808080"/><path d="m407.5 508.4 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m412 508.4v-.8l-.7.8z" fill="#808080"/><path d="m381.3 616.5h1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7.6v-.6-3.9-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7-3.8-1.2-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-.7v.6 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8.8h.8z" fill="#808080"/><path d="m412 548.9v1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8.8h.8 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7.7v-.7-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-.8h-.8-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-.7v.7z" fill="#e8e7e8"/><path d="m421.4 616.5 25.9-26.4v-3.9l-29.6 30.3z" fill="#e8e7e8"/><path d="m412 595.3 14.6-14.8h-3.8l-10.8 11z" fill="#e8e7e8"/><path d="m447.3 585v-3.9l-34.6 35.4h3.7z" fill="#e8e7e8"/><path d="m412 610.7 29.6-30.2h-3.7l-25.9 26.4z" fill="#e8e7e8"/><path d="m412 590.2 9.6-9.7h-3.8l-5.8 5.9z" fill="#e8e7e8"/><path d="m426.5 616.5 20.8-21.3v-3.8l-24.6 25.1z" fill="#e8e7e8"/><path d="m431.5 616.5 15.8-16.2v-3.8l-19.6 20z" fill="#e8e7e8"/><path d="m412 605.6 24.6-25.1h-3.8l-20.8 21.2z" fill="#e8e7e8"/><path d="m412 600.5 19.6-20h-3.8l-15.8 16.1z" fill="#e8e7e8"/><path d="m412 585.1 4.5-4.6h-3.7l-.8.7z" fill="#e8e7e8"/><path d="m441.5 616.5 5.8-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m446.5 616.5.8-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m412 615.9 34.6-35.4h-3.7l-30.9 31.5z" fill="#e8e7e8"/><path d="m436.5 616.5 10.8-11v-3.9l-14.6 14.9z" fill="#e8e7e8"/><path d="m412.8 580.5h-.8v.7z" fill="#808080"/><path d="m412 586.4 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m412 591.5 10.8-11h-1.2l-9.6 9.7z" fill="#808080"/><path d="m412 596.6 15.8-16.1h-1.2l-14.6 14.8z" fill="#808080"/><path d="m412 601.7 20.8-21.2h-1.2l-19.6 20z" fill="#808080"/><path d="m412 606.9 25.9-26.4h-1.3l-24.6 25.1z" fill="#808080"/><path d="m412 612 30.9-31.5h-1.3l-29.6 30.2z" fill="#808080"/><path d="m412 615.9v.6h.7l34.6-35.4v-.6h-.7z" fill="#808080"/><path d="m417.7 616.5 29.6-30.3v-1.2l-30.9 31.5z" fill="#808080"/><path d="m422.7 616.5 24.6-25.1v-1.3l-25.9 26.4z" fill="#808080"/><path d="m427.7 616.5 19.6-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m432.7 616.5 14.6-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m437.8 616.5 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m442.8 616.5 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m447.3 616.5v-.8l-.8.8z" fill="#808080"/><path d="m376.8 569.6 24.6-25.2h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m412 548.9v-3.8l-34.5 35.4h3.7z" fill="#e8e7e8"/><path d="m376.8 574.7 29.6-30.3h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m376.8 579.8 34.6-35.4h-3.7l-30.9 31.6z" fill="#e8e7e8"/><path d="m411.3 580.5.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m386.2 580.5 25.8-26.4v-3.9l-29.5 30.3z" fill="#e8e7e8"/><path d="m376.8 549 4.5-4.6h-3.7l-.8.8z" fill="#e8e7e8"/><path d="m376.8 559.3 14.6-14.9h-3.8l-10.8 11.1z" fill="#e8e7e8"/><path d="m391.2 580.5 20.8-21.3v-3.9l-24.5 25.2z" fill="#e8e7e8"/><path d="m396.3 580.5 15.7-16.2v-3.8l-19.5 20z" fill="#e8e7e8"/><path d="m376.8 564.4 19.6-20h-3.8l-15.8 16.2z" fill="#e8e7e8"/><path d="m406.3 580.5 5.7-5.9v-3.9l-9.5 9.8z" fill="#e8e7e8"/><path d="m376.8 554.2 9.5-9.8h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m401.3 580.5 10.7-11.1v-3.8l-14.5 14.9z" fill="#e8e7e8"/><path d="m377.6 544.4h-.8v.8z" fill="#808080"/><path d="m376.8 550.3 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m376.8 555.5 10.8-11.1h-1.3l-9.5 9.8z" fill="#808080"/><path d="m376.8 560.6 15.8-16.2h-1.2l-14.6 14.9z" fill="#808080"/><path d="m376.8 565.7 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m376.8 570.8 25.8-26.4h-1.2l-24.6 25.2z" fill="#808080"/><path d="m376.8 576 30.9-31.6h-1.3l-29.6 30.3z" fill="#808080"/><path d="m376.8 580.5h.7l34.5-35.4v-.7h-.6l-34.6 35.4z" fill="#808080"/><path d="m382.5 580.5 29.5-30.3v-1.3l-30.8 31.6z" fill="#808080"/><path d="m387.5 580.5 24.5-25.2v-1.2l-25.8 26.4z" fill="#808080"/><path d="m392.5 580.5 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m397.5 580.5 14.5-14.9v-1.3l-15.7 16.2z" fill="#808080"/><path d="m402.5 580.5 9.5-9.8v-1.3l-10.7 11.1z" fill="#808080"/><path d="m407.5 580.5 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m412 580.5v-.8l-.7.8z" fill="#808080"/><path d="m412 684.1v-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-.8h-.7-3.8-1.2-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-.7v.7 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8.8h.8 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7.6v-.7z" fill="#808080"/><path d="m447.3 648v-1.3-3.8-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-.8h-.8-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-.7v.6 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.8 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7.7v-.6z" fill="#e8e7e8"/><path d="m447.3 678.8-9.5 9.8h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m422.8 652.5-10.8 11v3.9l14.6-14.9z" fill="#e8e7e8"/><path d="m412.8 652.5-.8.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m417.8 652.5-5.8 5.9v3.9l9.6-9.8z" fill="#e8e7e8"/><path d="m432.8 652.5-20.8 21.3v3.8l24.6-25.1z" fill="#e8e7e8"/><path d="m447.3 668.6-19.6 20h3.8l15.8-16.2z" fill="#e8e7e8"/><path d="m447.3 684-4.5 4.6h3.7l.8-.8z" fill="#e8e7e8"/><path d="m412 684.1v3.8l34.6-35.4h-3.7z" fill="#e8e7e8"/><path d="m447.3 673.7-14.6 14.9h3.8l10.8-11.1z" fill="#e8e7e8"/><path d="m427.8 652.5-15.8 16.2v3.8l19.6-20z" fill="#e8e7e8"/><path d="m447.3 653.2-34.6 35.4h3.7l30.9-31.6z" fill="#e8e7e8"/><path d="m447.3 663.4-24.6 25.2h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m437.9 652.5-25.9 26.4v3.9l29.6-30.3z" fill="#e8e7e8"/><path d="m447.3 658.3-29.6 30.3h3.7l25.9-26.5z" fill="#e8e7e8"/><path d="m412 652.5v.8l.8-.8z" fill="#808080"/><path d="m416.5 652.5-4.5 4.6v1.3l5.8-5.9z" fill="#808080"/><path d="m421.6 652.5-9.6 9.8v1.2l10.8-11z" fill="#808080"/><path d="m426.6 652.5-14.6 14.9v1.3l15.8-16.2z" fill="#808080"/><path d="m431.6 652.5-19.6 20v1.3l20.8-21.3z" fill="#808080"/><path d="m436.6 652.5-24.6 25.1v1.3l25.9-26.4z" fill="#808080"/><path d="m441.6 652.5-29.6 30.3v1.3l30.9-31.6z" fill="#808080"/><path d="m447.3 652.5h-.7l-34.6 35.4v.7h.7l34.6-35.4z" fill="#808080"/><path d="m447.3 657-30.9 31.6h1.3l29.6-30.3z" fill="#808080"/><path d="m447.3 662.1-25.9 26.5h1.3l24.6-25.2z" fill="#808080"/><path d="m447.3 667.3-20.8 21.3h1.2l19.6-20z" fill="#808080"/><path d="m447.3 672.4-15.8 16.2h1.2l14.6-14.9z" fill="#808080"/><path d="m447.3 677.5-10.8 11.1h1.3l9.5-9.8z" fill="#808080"/><path d="m447.3 682.7-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m446.5 688.6h.8v-.8z" fill="#808080"/><path d="m412 642.8-9.5 9.7h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m397.6 616.5-20.8 21.3v3.8l24.6-25.1z" fill="#e8e7e8"/><path d="m377.6 616.5-.8.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m412 617.1-34.5 35.4h3.7l30.8-31.5z" fill="#e8e7e8"/><path d="m402.6 616.5-25.8 26.4v3.8l29.6-30.2z" fill="#e8e7e8"/><path d="m412 632.5-19.5 20h3.8l15.7-16.1z" fill="#e8e7e8"/><path d="m412 627.4-24.5 25.1h3.7l20.8-21.3z" fill="#e8e7e8"/><path d="m382.6 616.5-5.8 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m412 637.7-14.5 14.8h3.8l10.7-11z" fill="#e8e7e8"/><path d="m407.7 616.5-30.9 31.5v3.9l34.6-35.4z" fill="#e8e7e8"/><path d="m412 622.3-29.5 30.2h3.7l25.8-26.4z" fill="#e8e7e8"/><path d="m387.6 616.5-10.8 11v3.9l14.6-14.9z" fill="#e8e7e8"/><path d="m412 647.9-4.5 4.6h3.8l.7-.7z" fill="#e8e7e8"/><path d="m392.6 616.5-15.8 16.1v3.9l19.6-20z" fill="#e8e7e8"/><path d="m376.8 616.5v.8l.8-.8z" fill="#808080"/><path d="m381.3 616.5-4.5 4.6v1.3l5.8-5.9z" fill="#808080"/><path d="m386.3 616.5-9.5 9.7v1.3l10.8-11z" fill="#808080"/><path d="m391.4 616.5-14.6 14.9v1.2l15.8-16.1z" fill="#808080"/><path d="m396.4 616.5-19.6 20v1.3l20.8-21.3z" fill="#808080"/><path d="m401.4 616.5-24.6 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m406.4 616.5-29.6 30.2v1.3l30.9-31.5z" fill="#808080"/><path d="m412 616.5h-.6l-34.6 35.4v.6h.7l34.5-35.4z" fill="#808080"/><path d="m412 621-30.8 31.5h1.3l29.5-30.2z" fill="#808080"/><path d="m412 626.1-25.8 26.4h1.3l24.5-25.1z" fill="#808080"/><path d="m412 631.2-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m412 636.4-15.7 16.1h1.2l14.5-14.8z" fill="#808080"/><path d="m412 641.5-10.7 11h1.2l9.5-9.7z" fill="#808080"/><path d="m412 646.6-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m411.3 652.5h.7v-.7z" fill="#808080"/><path d="m412 756.1v-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7-3.8-1.2-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-.7v.6 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h35.2v-.6z" fill="#808080"/><path d="m447.3 720.1v-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.2-3.9-.7h-.8-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-.7v.6 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8.8h.8 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7.7v-.7z" fill="#e8e7e8"/><path d="m417.8 724.6-5.8 5.9v3.8l9.6-9.7z" fill="#e8e7e8"/><path d="m447.3 725.2-34.6 35.4h3.7l30.9-31.5z" fill="#e8e7e8"/><path d="m412.8 724.6-.8.7v3.9l4.5-4.6z" fill="#e8e7e8"/><path d="m422.8 724.6-10.8 11v3.8l14.6-14.8z" fill="#e8e7e8"/><path d="m412 756.1v3.9l34.6-35.4h-3.7z" fill="#e8e7e8"/><path d="m447.3 745.8-14.6 14.8h3.8l10.8-11z" fill="#e8e7e8"/><path d="m447.3 750.9-9.5 9.7h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m427.8 724.6-15.8 16.1v3.9l19.6-20z" fill="#e8e7e8"/><path d="m432.8 724.6-20.8 21.3v3.8l24.6-25.1z" fill="#e8e7e8"/><path d="m437.9 724.6-25.9 26.4v3.8l29.6-30.2z" fill="#e8e7e8"/><path d="m447.3 740.6-19.6 20h3.8l15.8-16.1z" fill="#e8e7e8"/><path d="m447.3 735.5-24.6 25.1h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m447.3 756-4.5 4.6h3.7l.8-.7z" fill="#e8e7e8"/><path d="m447.3 730.4-29.6 30.2h3.7l25.9-26.4z" fill="#e8e7e8"/><path d="m412 724.6v.7l.8-.7z" fill="#808080"/><path d="m416.5 724.6-4.5 4.6v1.3l5.8-5.9z" fill="#808080"/><path d="m421.6 724.6-9.6 9.7v1.3l10.8-11z" fill="#808080"/><path d="m426.6 724.6-14.6 14.8v1.3l15.8-16.1z" fill="#808080"/><path d="m431.6 724.6-19.6 20v1.3l20.8-21.3z" fill="#808080"/><path d="m436.6 724.6-24.6 25.1v1.3l25.9-26.4z" fill="#808080"/><path d="m441.6 724.6-29.6 30.2v1.3l30.9-31.5z" fill="#808080"/><path d="m447.3 724.6h-.7l-34.6 35.4v.6h.7l34.6-35.4z" fill="#808080"/><path d="m447.3 729.1-30.9 31.5h1.3l29.6-30.2z" fill="#808080"/><path d="m447.3 734.2-25.9 26.4h1.3l24.6-25.1z" fill="#808080"/><path d="m447.3 739.3-20.8 21.3h1.2l19.6-20z" fill="#808080"/><path d="m447.3 744.5-15.8 16.1h1.2l14.6-14.8z" fill="#808080"/><path d="m447.3 749.6-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m447.3 754.7-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m446.5 760.6h.8v-.7z" fill="#808080"/><path d="m412 714.9-9.5 9.7h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m412 709.7-14.5 14.9h3.8l10.7-11z" fill="#e8e7e8"/><path d="m412 704.6-19.5 20h3.8l15.7-16.2z" fill="#e8e7e8"/><path d="m412 694.3-29.5 30.3h3.7l25.8-26.4z" fill="#e8e7e8"/><path d="m377.6 688.6-.8.7v3.9l4.5-4.6z" fill="#e8e7e8"/><path d="m412 689.2-34.5 35.4h3.7l30.8-31.6z" fill="#e8e7e8"/><path d="m397.6 688.6-20.8 21.2v3.9l24.6-25.1z" fill="#e8e7e8"/><path d="m402.6 688.6-25.8 26.4v3.8l29.6-30.2z" fill="#e8e7e8"/><path d="m376.8 720.1v3.8l34.6-35.3h-3.7z" fill="#e8e7e8"/><path d="m382.6 688.6-5.8 5.8v3.9l9.5-9.7z" fill="#e8e7e8"/><path d="m412 720-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m387.6 688.6-10.8 11v3.8l14.6-14.8z" fill="#e8e7e8"/><path d="m412 699.5-24.5 25.1h3.7l20.8-21.3z" fill="#e8e7e8"/><path d="m392.6 688.6-15.8 16.1v3.8l19.6-19.9z" fill="#e8e7e8"/><path d="m376.8 688.6v.7l.8-.7z" fill="#808080"/><path d="m381.3 688.6-4.5 4.6v1.2l5.8-5.8z" fill="#808080"/><path d="m386.3 688.6-9.5 9.7v1.3l10.8-11z" fill="#808080"/><path d="m391.4 688.6-14.6 14.8v1.3l15.8-16.1z" fill="#808080"/><path d="m396.4 688.6-19.6 19.9v1.3l20.8-21.2z" fill="#808080"/><path d="m401.4 688.6-24.6 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m406.4 688.6-29.6 30.2v1.3l30.9-31.5z" fill="#808080"/><path d="m412 688.6h-.6l-34.6 35.3v.7h.7l34.5-35.4z" fill="#808080"/><path d="m412 693-30.8 31.6h1.3l29.5-30.3z" fill="#808080"/><path d="m412 698.2-25.8 26.4h1.3l24.5-25.1z" fill="#808080"/><path d="m412 703.3-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m412 708.4-15.7 16.2h1.2l14.5-14.9z" fill="#808080"/><path d="m412 713.6-10.7 11h1.2l9.5-9.7z" fill="#808080"/><path d="m412 718.7-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m411.3 724.6h.7v-.8z" fill="#808080"/><path d="m376.8 801.1v1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8.8h.8 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7.6v-.7-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-.8h-.7-3.8-1.2-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-.7v.7z" fill="#808080"/><path d="m412 765.1v1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9.7h.8 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7.7v-.6-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-35.3v.7z" fill="#e8e7e8"/><path d="m412 806.4 9.6-9.8h-3.8l-5.8 5.9z" fill="#e8e7e8"/><path d="m412 811.5 14.6-14.9h-3.8l-10.8 11.1z" fill="#e8e7e8"/><path d="m446.5 832.7.8-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m431.5 832.7 15.8-16.2v-3.8l-19.6 20z" fill="#e8e7e8"/><path d="m441.5 832.7 5.8-5.9v-3.9l-9.5 9.8z" fill="#e8e7e8"/><path d="m412 801.2 4.5-4.6h-3.7l-.8.8z" fill="#e8e7e8"/><path d="m436.5 832.7 10.8-11v-3.9l-14.6 14.9z" fill="#e8e7e8"/><path d="m412 821.8 24.6-25.2h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m412 832 34.6-35.4h-3.7l-30.9 31.6z" fill="#e8e7e8"/><path d="m421.4 832.7 25.9-26.4v-3.9l-29.6 30.3z" fill="#e8e7e8"/><path d="m447.3 801.1v-3.8l-34.6 35.4h3.7z" fill="#e8e7e8"/><path d="m426.5 832.7 20.8-21.3v-3.8l-24.6 25.1z" fill="#e8e7e8"/><path d="m412 826.9 29.6-30.3h-3.7l-25.9 26.5z" fill="#e8e7e8"/><path d="m412 816.6 19.6-20h-3.8l-15.8 16.2z" fill="#e8e7e8"/><path d="m412.8 796.6h-.8v.8z" fill="#808080"/><path d="m412 802.5 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m412 807.7 10.8-11.1h-1.2l-9.6 9.8z" fill="#808080"/><path d="m412 812.8 15.8-16.2h-1.2l-14.6 14.9z" fill="#808080"/><path d="m412 817.9 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m412 823.1 25.9-26.5h-1.3l-24.6 25.2z" fill="#808080"/><path d="m412 828.2 30.9-31.6h-1.3l-29.6 30.3z" fill="#808080"/><path d="m412 832.7h.7l34.6-35.4v-.7h-.7l-34.6 35.4z" fill="#808080"/><path d="m417.7 832.7 29.6-30.3v-1.3l-30.9 31.6z" fill="#808080"/><path d="m422.7 832.7 24.6-25.1v-1.3l-25.9 26.4z" fill="#808080"/><path d="m427.7 832.7 19.6-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m432.7 832.7 14.6-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m437.8 832.7 9.5-9.8v-1.2l-10.8 11z" fill="#808080"/><path d="m442.8 832.7 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m447.3 832.7v-.8l-.8.8z" fill="#808080"/><path d="m376.8 790.9 29.6-30.3h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m386.2 796.6 25.8-26.4v-3.8l-29.5 30.2z" fill="#e8e7e8"/><path d="m412 765.1v-3.8l-34.5 35.3h3.7z" fill="#e8e7e8"/><path d="m376.8 765.2 4.5-4.6h-3.7l-.8.8z" fill="#e8e7e8"/><path d="m376.8 780.6 19.6-20h-3.8l-15.8 16.2z" fill="#e8e7e8"/><path d="m376.8 796 34.6-35.4h-3.7l-30.9 31.6z" fill="#e8e7e8"/><path d="m376.8 785.7 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m406.3 796.6 5.7-5.8v-3.9l-9.5 9.7z" fill="#e8e7e8"/><path d="m396.3 796.6 15.7-16.1v-3.8l-19.5 19.9z" fill="#e8e7e8"/><path d="m411.3 796.6.7-.7v-3.9l-4.5 4.6z" fill="#e8e7e8"/><path d="m401.3 796.6 10.7-11v-3.8l-14.5 14.8z" fill="#e8e7e8"/><path d="m376.8 770.3 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m391.2 796.6 20.8-21.2v-3.9l-24.5 25.1z" fill="#e8e7e8"/><path d="m376.8 775.5 14.6-14.9h-3.8l-10.8 11z" fill="#e8e7e8"/><path d="m377.6 760.6h-.8v.8z" fill="#808080"/><path d="m376.8 766.5 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m376.8 771.6 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m376.8 776.8 15.8-16.2h-1.2l-14.6 14.9z" fill="#808080"/><path d="m376.8 781.9 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m376.8 787 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m376.8 792.2 30.9-31.6h-1.3l-29.6 30.3z" fill="#808080"/><path d="m376.8 796.6h.7l34.5-35.3v-.7h-.6l-34.6 35.4z" fill="#808080"/><path d="m382.5 796.6 29.5-30.2v-1.3l-30.8 31.5z" fill="#808080"/><path d="m387.5 796.6 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m392.5 796.6 19.5-19.9v-1.3l-20.8 21.2z" fill="#808080"/><path d="m397.5 796.6 14.5-14.8v-1.3l-15.7 16.1z" fill="#808080"/><path d="m402.5 796.6 9.5-9.7v-1.3l-10.7 11z" fill="#808080"/><path d="m407.5 796.6 4.5-4.6v-1.2l-5.7 5.8z" fill="#808080"/><path d="m412 796.6v-.7l-.7.7z" fill="#808080"/><path d="m381.3 904.7h1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7.6v-.6-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.2-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-.7v.7 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.8z" fill="#808080"/><path d="m412 837.2v1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8.8h.8 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7.7v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.8-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-.7v.6z" fill="#e8e7e8"/><path d="m447.3 884.7-19.6 20h3.8l15.8-16.1z" fill="#e8e7e8"/><path d="m447.3 900.1-4.5 4.6h3.7l.8-.7z" fill="#e8e7e8"/><path d="m412.8 868.7-.8.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m447.3 889.9-14.6 14.8h3.8l10.8-11z" fill="#e8e7e8"/><path d="m447.3 895-9.5 9.7h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m427.8 868.7-15.8 16.2v3.8l19.6-20z" fill="#e8e7e8"/><path d="m442.9 868.7-30.9 31.5v3.9l34.6-35.4z" fill="#e8e7e8"/><path d="m422.8 868.7-10.8 11v3.9l14.6-14.9z" fill="#e8e7e8"/><path d="m432.8 868.7-20.8 21.3v3.8l24.6-25.1z" fill="#e8e7e8"/><path d="m417.8 868.7-5.8 5.9v3.8l9.6-9.7z" fill="#e8e7e8"/><path d="m437.9 868.7-25.9 26.4v3.9l29.6-30.3z" fill="#e8e7e8"/><path d="m447.3 869.4-34.6 35.3h3.7l30.9-31.5z" fill="#e8e7e8"/><path d="m447.3 874.5-29.6 30.2h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m447.3 879.6-24.6 25.1h3.8l20.8-21.2z" fill="#e8e7e8"/><path d="m412 868.7v.8l.8-.8z" fill="#808080"/><path d="m416.5 868.7-4.5 4.6v1.3l5.8-5.9z" fill="#808080"/><path d="m421.6 868.7-9.6 9.7v1.3l10.8-11z" fill="#808080"/><path d="m426.6 868.7-14.6 14.9v1.3l15.8-16.2z" fill="#808080"/><path d="m431.6 868.7-19.6 20v1.3l20.8-21.3z" fill="#808080"/><path d="m436.6 868.7-24.6 25.1v1.3l25.9-26.4z" fill="#808080"/><path d="m441.6 868.7-29.6 30.3v1.2l30.9-31.5z" fill="#808080"/><path d="m447.3 868.7h-.7l-34.6 35.4v.6h.7l34.6-35.3z" fill="#808080"/><path d="m447.3 873.2-30.9 31.5h1.3l29.6-30.2z" fill="#808080"/><path d="m447.3 878.3-25.8 26.4h1.2l24.6-25.1z" fill="#808080"/><path d="m447.3 883.5-20.8 21.2h1.2l19.6-20z" fill="#808080"/><path d="m447.3 888.6-15.8 16.1h1.2l14.6-14.8z" fill="#808080"/><path d="m447.3 893.7-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m447.3 898.8-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m446.5 904.7h.8v-.7z" fill="#808080"/><path d="m412 853.8-14.5 14.9h3.8l10.7-11z" fill="#e8e7e8"/><path d="m412 838.5-29.5 30.2h3.7l25.8-26.4z" fill="#e8e7e8"/><path d="m376.8 868.1 34.6-35.4h-3.7l-30.9 31.5z" fill="#e8e7e8"/><path d="m412 864.1-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m412 848.7-19.5 20h3.8l15.7-16.1z" fill="#e8e7e8"/><path d="m412 843.6-24.5 25.1h3.7l20.8-21.3z" fill="#e8e7e8"/><path d="m376.8 847.5 14.6-14.8h-3.8l-10.8 11z" fill="#e8e7e8"/><path d="m376.8 837.3 4.5-4.6h-3.7l-.8.7z" fill="#e8e7e8"/><path d="m376.8 842.4 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m412 859-9.5 9.7h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m376.8 852.7 19.6-20h-3.8l-15.8 16.1z" fill="#e8e7e8"/><path d="m376.8 857.8 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m376.8 862.9 29.6-30.2h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m412 833.3-34.5 35.4h3.7l30.8-31.5z" fill="#e8e7e8"/><path d="m377.6 832.7h-.8v.7z" fill="#808080"/><path d="m376.8 838.6 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m376.8 843.7 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m376.8 848.8 15.8-16.1h-1.2l-14.6 14.8z" fill="#808080"/><path d="m376.8 854 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m376.8 859.1 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m376.8 864.2 30.9-31.5h-1.3l-29.6 30.2z" fill="#808080"/><path d="m376.8 868.7h.7l34.5-35.4v-.6h-.6l-34.6 35.4z" fill="#808080"/><path d="m412 837.2-30.8 31.5h1.3l29.5-30.2z" fill="#808080"/><path d="m412 842.3-25.8 26.4h1.3l24.5-25.1z" fill="#808080"/><path d="m412 847.4-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m412 852.6-15.7 16.1h1.2l14.5-14.9z" fill="#808080"/><path d="m412 857.7-10.7 11h1.2l9.5-9.7z" fill="#808080"/><path d="m412 862.8-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m411.3 868.7h.7v-.8z" fill="#808080"/><path d="m412 972.3v-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7-3.8-1.2-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-.7v.6 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8.8h.8 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7.6v-.7z" fill="#808080"/><path d="m447.3 936.3v-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-.8h-.8-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.2-3.8-1.3-3.7-.7v.7 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8.8h.8 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7.7v-.7z" fill="#e8e7e8"/><path d="m447.3 946.5-29.6 30.3h3.7l25.9-26.4z" fill="#e8e7e8"/><path d="m447.3 941.4-34.6 35.4h3.7l30.9-31.6z" fill="#e8e7e8"/><path d="m447.3 967.1-9.5 9.7h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m447.3 972.2-4.5 4.6h3.7l.8-.8z" fill="#e8e7e8"/><path d="m447.3 951.7-24.6 25.1h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m447.3 961.9-14.6 14.9h3.8l10.8-11z" fill="#e8e7e8"/><path d="m447.3 956.8-19.6 20h3.8l15.8-16.2z" fill="#e8e7e8"/><path d="m427.8 940.8-15.8 16.1v3.9l19.6-20z" fill="#e8e7e8"/><path d="m437.9 940.8-25.9 26.4v3.8l29.6-30.2z" fill="#e8e7e8"/><path d="m422.8 940.8-10.8 11v3.8l14.6-14.8z" fill="#e8e7e8"/><path d="m432.8 940.8-20.8 21.2v3.9l24.6-25.1z" fill="#e8e7e8"/><path d="m412 972.3v3.8l34.6-35.3h-3.7z" fill="#e8e7e8"/><path d="m417.8 940.8-5.8 5.9v3.8l9.6-9.7z" fill="#e8e7e8"/><path d="m412.8 940.8-.8.7v3.9l4.5-4.6z" fill="#e8e7e8"/><path d="m412 940.8v.7l.8-.7z" fill="#808080"/><path d="m416.5 940.8-4.5 4.6v1.3l5.8-5.9z" fill="#808080"/><path d="m421.6 940.8-9.6 9.7v1.3l10.8-11z" fill="#808080"/><path d="m426.6 940.8-14.6 14.8v1.3l15.8-16.1z" fill="#808080"/><path d="m431.6 940.8-19.6 20v1.2l20.8-21.2z" fill="#808080"/><path d="m436.6 940.8-24.6 25.1v1.3l25.9-26.4z" fill="#808080"/><path d="m441.6 940.8-29.6 30.2v1.3l30.9-31.5z" fill="#808080"/><path d="m447.3 940.8h-.7l-34.6 35.3v.7h.7l34.6-35.4z" fill="#808080"/><path d="m447.3 945.2-30.9 31.6h1.3l29.6-30.3z" fill="#808080"/><path d="m447.3 950.4-25.9 26.4h1.3l24.6-25.1z" fill="#808080"/><path d="m447.3 955.5-20.8 21.3h1.2l19.6-20z" fill="#808080"/><path d="m447.3 960.6-15.8 16.2h1.2l14.6-14.9z" fill="#808080"/><path d="m447.3 965.8-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m447.3 970.9-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m446.5 976.8h.8v-.8z" fill="#808080"/><path d="m412 936.2-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m412 931-9.5 9.8h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m412 910.5-29.5 30.3h3.7l25.8-26.5z" fill="#e8e7e8"/><path d="m412 925.9-14.5 14.9h3.8l10.7-11.1z" fill="#e8e7e8"/><path d="m412 920.8-19.5 20h3.8l15.7-16.2z" fill="#e8e7e8"/><path d="m412 915.6-24.5 25.2h3.7l20.8-21.3z" fill="#e8e7e8"/><path d="m412 905.4-34.5 35.4h3.7l30.8-31.6z" fill="#e8e7e8"/><path d="m381.3 904.7h-3.7l-.8.8v3.8z" fill="#e8e7e8"/><path d="m411.4 904.7h-3.7l-30.9 31.6v3.8z" fill="#e8e7e8"/><path d="m396.4 904.7h-3.8l-15.8 16.2v3.8z" fill="#e8e7e8"/><path d="m401.4 904.7h-3.8l-20.8 21.3v3.9z" fill="#e8e7e8"/><path d="m406.4 904.7h-3.8l-25.8 26.4v3.9z" fill="#e8e7e8"/><path d="m391.4 904.7h-3.8l-10.8 11.1v3.8z" fill="#e8e7e8"/><path d="m386.3 904.7h-3.7l-5.8 5.9v3.9z" fill="#e8e7e8"/><path d="m377.6 904.7h-.8v.8z" fill="#808080"/><path d="m382.6 904.7h-1.3l-4.5 4.6v1.3z" fill="#808080"/><path d="m387.6 904.7h-1.3l-9.5 9.8v1.3z" fill="#808080"/><path d="m392.6 904.7h-1.2l-14.6 14.9v1.3z" fill="#808080"/><path d="m397.6 904.7h-1.2l-19.6 20v1.3z" fill="#808080"/><path d="m402.6 904.7h-1.2l-24.6 25.2v1.2z" fill="#808080"/><path d="m407.7 904.7h-1.3l-29.6 30.3v1.3z" fill="#808080"/><path d="m412 904.7h-.6l-34.6 35.4v.7h.7l34.5-35.4z" fill="#808080"/><path d="m412 909.2-30.8 31.6h1.3l29.5-30.3z" fill="#808080"/><path d="m412 914.3-25.8 26.5h1.3l24.5-25.2z" fill="#808080"/><path d="m412 919.5-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m412 924.6-15.7 16.2h1.2l14.5-14.9z" fill="#808080"/><path d="m412 929.7-10.7 11.1h1.2l9.5-9.8z" fill="#808080"/><path d="m412 934.9-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m411.3 940.8h.7v-.8z" fill="#808080"/><path d="m447.3 986.5v-3.8-1.3-3.8-.8h-.7-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.2v.6 3.8 1.3 3.8.4c17.5.9 30.7 1.3 35.2 1.5v-.4-1.3z" fill="#e8e7e8"/><path d="m377.6 976.8-.8.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m412 977.4-8.7 8.9c1.2.1 2.4.1 3.6.2l5.1-5.2z" fill="#e8e7e8"/><path d="m397.6 976.8-8.4 8.6c1.2.1 2.4.2 3.5.2l8.7-8.9h-3.8z" fill="#e8e7e8"/><path d="m412 982.6-3.9 4c1.2.1 2.4.1 3.6.2l.3-.3z" fill="#e8e7e8"/><path d="m402.6 976.8-8.7 8.9c1.2.1 2.4.1 3.5.2l8.9-9.2h-3.7z" fill="#e8e7e8"/><path d="m407.7 976.8-9 9.2c1.2.1 2.4.1 3.5.2l9.2-9.4z" fill="#e8e7e8"/><path d="m392.6 976.8-8.1 8.3c1.2.1 2.4.2 3.5.2l8.4-8.5z" fill="#e8e7e8"/><path d="m387.6 976.8-7.8 8c1.2.1 2.3.2 3.5.2l8-8.2z" fill="#e8e7e8"/><path d="m382.6 976.8-5.8 5.9v1.9c.6 0 1.2.1 1.8.1l7.7-7.9z" fill="#e8e7e8"/><path d="m376.8 976.8v.8l.8-.8z" fill="#808080"/><path d="m376.8 981.4v1.3l5.8-5.9h-1.3z" fill="#808080"/><path d="m386.3 976.8-7.7 7.9c.4 0 .8.1 1.2.1l7.8-8z" fill="#808080"/><path d="m391.4 976.8-8 8.2c.4 0 .8.1 1.2.1l8.1-8.3z" fill="#808080"/><path d="m396.4 976.8-8.4 8.5c.4 0 .8.1 1.2.1l8.4-8.6z" fill="#808080"/><path d="m401.4 976.8-8.7 8.9c.4 0 .8.1 1.2.1l8.7-8.9h-1.2z" fill="#808080"/><path d="m406.4 976.8-8.9 9.2c.4 0 .8 0 1.2.1l9-9.2h-1.3z" fill="#808080"/><path d="m412 976.8h-.6l-9.2 9.4c.4 0 .8 0 1.2.1l8.7-8.9v-.6z" fill="#808080"/><path d="m412 981.3-5.1 5.2c.4 0 .8 0 1.2.1l3.9-4z" fill="#808080"/><path d="m411.7 986.7h.3v-.4z" fill="#808080"/><path d="m332.1 436.3h-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.5-1.3-3.7-.6v.6 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.8h.7 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.6v-.6-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-2.7c-1.9-.6-3.7-1.3-5.6-1.9h-.2z" fill="#808080"/><path d="m371.1 472.4 5.7-5.9v-3.9l-9.5 9.8z" fill="#e8e7e8"/><path d="m341.6 466.6 22-22.5c-1-.2-2.1-.5-3.1-.7l-18.9 19.3z" fill="#e8e7e8"/><path d="m341.6 471.7 26.1-26.7c-1.1-.2-2.1-.4-3.1-.6l-23 23.5z" fill="#e8e7e8"/><path d="m341.6 461.5 17.8-18.3c-1-.2-2-.5-3-.7l-14.8 15.1z" fill="#e8e7e8"/><path d="m376.1 472.4.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m346 472.4 26-26.6c-1.1-.2-2.1-.4-3.2-.6l-26.6 27.2z" fill="#e8e7e8"/><path d="m351 472.4 25.3-25.9c-1.1-.2-2.2-.4-3.2-.5l-25.8 26.4z" fill="#e8e7e8"/><path d="m341.6 456.3 13.8-14.1c-1-.3-2-.5-3-.8l-10.8 11z" fill="#e8e7e8"/><path d="m361 472.4 15.8-16.2v-3.8l-19.5 20z" fill="#e8e7e8"/><path d="m366.1 472.4 10.7-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m376.8 451.1v-3.8l-24.5 25.1h3.7z" fill="#e8e7e8"/><path d="m341.6 446.1 5.9-6c-1-.3-1.9-.6-2.9-.9l-3 3z" fill="#e8e7e8"/><path d="m341.6 451.2 9.8-10c-1-.3-2-.5-2.9-.8l-6.9 7z" fill="#e8e7e8"/><path d="m343.6 438.9c-.7-.2-1.3-.4-2-.6v2.7z" fill="#e8e7e8"/><path d="m341.6 442.2 3-3c-.3-.1-.6-.2-1-.3l-2 2z" fill="#808080"/><path d="m341.6 447.4 6.9-7c-.3-.1-.7-.2-1-.3l-5.9 6z" fill="#808080"/><path d="m341.6 452.5 10.8-11c-.3-.1-.7-.2-1-.3l-9.8 10z" fill="#808080"/><path d="m341.6 457.6 14.8-15.1c-.3-.1-.7-.2-1-.2l-13.8 14.1z" fill="#808080"/><path d="m341.6 462.8 18.9-19.3c-.3-.1-.7-.2-1-.2l-17.8 18.3v1.2z" fill="#808080"/><path d="m341.6 467.9 23-23.5c-.3-.1-.7-.1-1-.2l-22 22.5z" fill="#808080"/><path d="m341.6 472.4h.6l26.6-27.2c-.4-.1-.7-.1-1.1-.2l-26.1 26.7z" fill="#808080"/><path d="m347.3 472.4 25.8-26.4c-.4-.1-.7-.1-1.1-.2l-26 26.6z" fill="#808080"/><path d="m352.3 472.4 24.6-25.1v-.6c-.2 0-.4-.1-.5-.1l-25.4 25.8z" fill="#808080"/><path d="m357.3 472.4 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m362.3 472.4 14.5-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m367.3 472.4 9.5-9.8v-1.2l-10.7 11z" fill="#808080"/><path d="m372.3 472.4 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m376.8 472.4v-.8l-.7.8z" fill="#808080"/><path d="m310.5 431.5c-1.4.2-2.7.4-4.1.6v3.6z" fill="#e8e7e8"/><path d="m335.9 436.3c-.9-.4-1.8-.7-2.7-1.1l-1.1 1.1z" fill="#e8e7e8"/><path d="m330.8 436.3 1.4-1.4c-.9-.4-1.8-.7-2.7-1.1l-2.5 2.5z" fill="#e8e7e8"/><path d="m320.8 436.3 4.3-4.4c-.9-.4-1.7-.8-2.6-1.2l-5.5 5.6z" fill="#e8e7e8"/><path d="m315.8 436.3 5.9-6c-.3-.1-.6-.3-.9-.4-1 .2-2 .3-3 .5l-5.8 6h3.8z" fill="#e8e7e8"/><path d="m310.8 436.3 5.6-5.7c-1.5.2-2.9.5-4.4.7l-4.9 5.1h3.7z" fill="#e8e7e8"/><path d="m325.8 436.3 2.8-2.9c-.9-.4-1.8-.7-2.6-1.1l-3.9 4z" fill="#e8e7e8"/><path d="m306.4 436.3h.6l4.9-5.1c-.5.1-1 .1-1.5.2l-4.1 4.2v.7z" fill="#808080"/><path d="m312 436.3 5.8-6c-.5.1-1 .2-1.5.2l-5.6 5.7h1.3z" fill="#808080"/><path d="m317.1 436.3 5.5-5.6c-.3-.1-.6-.3-.8-.4l-5.9 6z" fill="#808080"/><path d="m322.1 436.3 3.9-4c-.3-.1-.6-.3-.9-.4l-4.3 4.4z" fill="#808080"/><path d="m327.1 436.3 2.5-2.5c-.3-.1-.6-.3-.9-.4l-2.8 2.9z" fill="#808080"/><path d="m332.1 436.3 1.1-1.1c-.3-.1-.6-.2-.9-.4l-1.4 1.4h1.2z" fill="#808080"/><path d="m336.1 436.3c-.1 0-.1 0-.2-.1l-.1.1z" fill="#808080"/><path d="m306.4 512.9v1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.7 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8.6v-.6-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-.6v.7z" fill="#808080"/><path d="m341.6 476.9v1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8.8h.8 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8.6v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-.6v.6z" fill="#e8e7e8"/><path d="m366.1 544.4 10.7-11v-3.8l-14.5 14.8z" fill="#e8e7e8"/><path d="m361 544.4 15.8-16.1v-3.9l-19.5 20z" fill="#e8e7e8"/><path d="m341.6 518.1 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m341.6 533.5 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m376.8 512.9v-3.8l-34.6 35.3h3.8z" fill="#e8e7e8"/><path d="m341.6 538.7 29.6-30.3h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m341.6 528.4 19.6-20h-3.8l-15.8 16.2z" fill="#e8e7e8"/><path d="m341.6 513 4.5-4.6h-3.7l-.8.8z" fill="#e8e7e8"/><path d="m341.6 523.3 14.5-14.9h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m371.1 544.4 5.7-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m356 544.4 20.8-21.2v-3.9l-24.5 25.1z" fill="#e8e7e8"/><path d="m351 544.4 25.8-26.4v-3.8l-29.5 30.2z" fill="#e8e7e8"/><path d="m376.1 544.4.7-.7v-3.9l-4.5 4.6z" fill="#e8e7e8"/><path d="m341.6 543.8 34.6-35.4h-3.8l-30.8 31.5z" fill="#e8e7e8"/><path d="m342.4 508.4h-.8v.8z" fill="#808080"/><path d="m341.6 514.3 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m341.6 519.4 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m341.6 524.6 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m341.6 529.7 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m341.6 534.8 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m341.6 539.9 30.8-31.5h-1.2l-29.6 30.3z" fill="#808080"/><path d="m341.6 544.4h.6l34.6-35.3v-.7h-.6l-34.6 35.4z" fill="#808080"/><path d="m347.3 544.4 29.5-30.2v-1.3l-30.8 31.5z" fill="#808080"/><path d="m352.3 544.4 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m357.3 544.4 19.5-20v-1.2l-20.8 21.2z" fill="#808080"/><path d="m362.3 544.4 14.5-14.8v-1.3l-15.8 16.1z" fill="#808080"/><path d="m367.3 544.4 9.5-9.7v-1.3l-10.7 11z" fill="#808080"/><path d="m372.3 544.4 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m376.8 544.4v-.7l-.7.7z" fill="#808080"/><path d="m306.4 492.4 19.5-20h-3.7l-15.8 16.1z" fill="#e8e7e8"/><path d="m306.4 507.8 34.6-35.4h-3.8l-30.8 31.5z" fill="#e8e7e8"/><path d="m306.4 502.6 29.6-30.2h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m306.4 497.5 24.5-25.1h-3.7l-20.8 21.3z" fill="#e8e7e8"/><path d="m306.4 482.1 9.5-9.7h-3.8l-5.7 5.9z" fill="#e8e7e8"/><path d="m306.4 487.2 14.5-14.8h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m320.8 508.4 20.8-21.3v-3.8l-24.5 25.1z" fill="#e8e7e8"/><path d="m315.8 508.4 25.8-26.4v-3.8l-29.6 30.2z" fill="#e8e7e8"/><path d="m330.8 508.4 10.8-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m335.9 508.4 5.7-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m340.9 508.4.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m325.8 508.4 15.8-16.1v-3.9l-19.5 20z" fill="#e8e7e8"/><path d="m306.4 477 4.5-4.6h-3.8l-.7.7z" fill="#e8e7e8"/><path d="m341.6 476.9v-3.9l-34.6 35.4h3.8z" fill="#e8e7e8"/><path d="m307.1 472.4h-.7v.7z" fill="#808080"/><path d="m306.4 478.3 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m306.4 483.4 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m306.4 488.5 15.8-16.1h-1.3l-14.5 14.8z" fill="#808080"/><path d="m306.4 493.7 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m306.4 498.8 25.8-26.4h-1.3l-24.5 25.1z" fill="#808080"/><path d="m306.4 503.9 30.8-31.5h-1.2l-29.6 30.2z" fill="#808080"/><path d="m306.4 508.4h.6l34.6-35.4v-.6h-.6l-34.6 35.4z" fill="#808080"/><path d="m312 508.4 29.6-30.2v-1.3l-30.8 31.5z" fill="#808080"/><path d="m317.1 508.4 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m322.1 508.4 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m327.1 508.4 14.5-14.9v-1.2l-15.8 16.1z" fill="#808080"/><path d="m332.1 508.4 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m337.1 508.4 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m341.6 508.4v-.8l-.7.8z" fill="#808080"/><path d="m310.9 616.5h1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8.6v-.6-3.9-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-.6v.6 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8.8h.7z" fill="#808080"/><path d="m346.1 580.5h1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8.6v-.7-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-.8h-.7-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-.6v.7 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8.8h.8z" fill="#e8e7e8"/><path d="m376.8 611.9-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m376.8 581.1-34.6 35.4h3.8l30.8-31.5z" fill="#e8e7e8"/><path d="m352.4 580.5-10.8 11v3.8l14.5-14.8z" fill="#e8e7e8"/><path d="m347.4 580.5-5.8 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m342.4 580.5-.8.7v3.9l4.5-4.6z" fill="#e8e7e8"/><path d="m372.4 580.5-30.8 31.5v3.9l34.6-35.4z" fill="#e8e7e8"/><path d="m367.4 580.5-25.8 26.4v3.8l29.6-30.2z" fill="#e8e7e8"/><path d="m357.4 580.5-15.8 16.1v3.9l19.6-20z" fill="#e8e7e8"/><path d="m376.8 586.2-29.5 30.3h3.7l25.8-26.4z" fill="#e8e7e8"/><path d="m376.8 601.6-14.5 14.9h3.8l10.7-11z" fill="#e8e7e8"/><path d="m376.8 596.5-19.5 20h3.7l15.8-16.2z" fill="#e8e7e8"/><path d="m376.8 606.8-9.5 9.7h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m362.4 580.5-20.8 21.2v3.9l24.6-25.1z" fill="#e8e7e8"/><path d="m376.8 591.4-24.5 25.1h3.7l20.8-21.3z" fill="#e8e7e8"/><path d="m341.6 580.5v.7l.8-.7z" fill="#808080"/><path d="m346.1 580.5-4.5 4.6v1.3l5.8-5.9z" fill="#808080"/><path d="m351.1 580.5-9.5 9.7v1.3l10.8-11z" fill="#808080"/><path d="m356.1 580.5-14.5 14.8v1.3l15.8-16.1z" fill="#808080"/><path d="m361.2 580.5-19.6 20v1.2l20.8-21.2z" fill="#808080"/><path d="m366.2 580.5-24.6 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m371.2 580.5-29.6 30.2v1.3l30.8-31.5z" fill="#808080"/><path d="m376.8 581.1v-.6h-.6l-34.6 35.4v.6h.6z" fill="#808080"/><path d="m376.8 585-30.8 31.5h1.3l29.5-30.3z" fill="#808080"/><path d="m376.8 590.1-25.8 26.4h1.3l24.5-25.1z" fill="#808080"/><path d="m376.8 595.2-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m376.8 600.3-15.8 16.2h1.3l14.5-14.9z" fill="#808080"/><path d="m376.8 605.5-10.7 11h1.2l9.5-9.7z" fill="#808080"/><path d="m376.8 610.6-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m376.1 616.5h.7v-.8z" fill="#808080"/><path d="m341.6 570.7-9.5 9.8h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m307.1 544.4-.7.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m322.2 544.4-15.8 16.2v3.8l19.5-20z" fill="#e8e7e8"/><path d="m312.1 544.4-5.7 5.9v3.9l9.5-9.8z" fill="#e8e7e8"/><path d="m317.2 544.4-10.8 11.1v3.8l14.5-14.9z" fill="#e8e7e8"/><path d="m341.6 575.9-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m341.6 550.2-29.6 30.3h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m327.2 544.4-20.8 21.3v3.9l24.5-25.2z" fill="#e8e7e8"/><path d="m341.6 545.1-34.6 35.4h3.8l30.8-31.6z" fill="#e8e7e8"/><path d="m341.6 555.3-24.5 25.2h3.7l20.8-21.3z" fill="#e8e7e8"/><path d="m341.6 560.5-19.5 20h3.7l15.8-16.2z" fill="#e8e7e8"/><path d="m332.2 544.4-25.8 26.4v3.9l29.6-30.3z" fill="#e8e7e8"/><path d="m341.6 565.6-14.5 14.9h3.7l10.8-11.1z" fill="#e8e7e8"/><path d="m337.2 544.4-30.8 31.6v3.8l34.6-35.4z" fill="#e8e7e8"/><path d="m306.4 544.4v.8l.7-.8z" fill="#808080"/><path d="m310.9 544.4-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m315.9 544.4-9.5 9.8v1.3l10.8-11.1z" fill="#808080"/><path d="m320.9 544.4-14.5 14.9v1.3l15.8-16.2z" fill="#808080"/><path d="m325.9 544.4-19.5 20v1.3l20.8-21.3z" fill="#808080"/><path d="m330.9 544.4-24.5 25.2v1.2l25.8-26.4z" fill="#808080"/><path d="m336 544.4-29.6 30.3v1.3l30.8-31.6z" fill="#808080"/><path d="m341.6 544.4h-.6l-34.6 35.4v.7h.6l34.6-35.4z" fill="#808080"/><path d="m341.6 548.9-30.8 31.6h1.2l29.6-30.3z" fill="#808080"/><path d="m341.6 554.1-25.8 26.4h1.3l24.5-25.2z" fill="#808080"/><path d="m341.6 559.2-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m341.6 564.3-15.8 16.2h1.3l14.5-14.9z" fill="#808080"/><path d="m341.6 569.4-10.8 11.1h1.3l9.5-9.8z" fill="#808080"/><path d="m341.6 574.6-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m340.9 580.5h.7v-.8z" fill="#808080"/><path d="m310.9 688.6h1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8.6v-.7-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-.8h-.7-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-.6v.7 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8.8h.7z" fill="#808080"/><path d="m346.1 652.5h1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8.6v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-.6v.6 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.8z" fill="#e8e7e8"/><path d="m352.4 652.5-10.8 11v3.9l14.5-14.9z" fill="#e8e7e8"/><path d="m347.4 652.5-5.8 5.9v3.9l9.5-9.8z" fill="#e8e7e8"/><path d="m342.4 652.5-.8.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m357.4 652.5-15.8 16.2v3.8l19.6-20z" fill="#e8e7e8"/><path d="m376.8 678.8-9.5 9.8h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m376.8 653.2-34.6 35.4h3.8l30.8-31.6z" fill="#e8e7e8"/><path d="m376.8 684-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m376.8 658.3-29.5 30.3h3.7l25.8-26.5z" fill="#e8e7e8"/><path d="m376.8 668.6-19.5 20h3.7l15.8-16.2z" fill="#e8e7e8"/><path d="m372.4 652.5-30.8 31.6v3.8l34.6-35.4z" fill="#e8e7e8"/><path d="m367.4 652.5-25.8 26.4v3.9l29.6-30.3z" fill="#e8e7e8"/><path d="m362.4 652.5-20.8 21.3v3.8l24.6-25.1z" fill="#e8e7e8"/><path d="m376.8 663.4-24.5 25.2h3.7l20.8-21.3z" fill="#e8e7e8"/><path d="m376.8 673.7-14.5 14.9h3.8l10.7-11.1z" fill="#e8e7e8"/><path d="m341.6 652.5v.8l.8-.8z" fill="#808080"/><path d="m346.1 652.5-4.5 4.6v1.3l5.8-5.9z" fill="#808080"/><path d="m351.1 652.5-9.5 9.8v1.2l10.8-11z" fill="#808080"/><path d="m356.1 652.5-14.5 14.9v1.3l15.8-16.2z" fill="#808080"/><path d="m361.2 652.5-19.6 20v1.3l20.8-21.3z" fill="#808080"/><path d="m366.2 652.5-24.6 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m371.2 652.5-29.6 30.3v1.3l30.8-31.6z" fill="#808080"/><path d="m376.8 652.5h-.6l-34.6 35.4v.7h.6l34.6-35.4z" fill="#808080"/><path d="m376.8 657-30.8 31.6h1.3l29.5-30.3z" fill="#808080"/><path d="m376.8 662.1-25.8 26.5h1.3l24.5-25.2z" fill="#808080"/><path d="m376.8 667.3-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m376.8 672.4-15.8 16.2h1.3l14.5-14.9z" fill="#808080"/><path d="m376.8 677.5-10.7 11.1h1.2l9.5-9.8z" fill="#808080"/><path d="m376.8 682.7-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m376.1 688.6h.7v-.8z" fill="#808080"/><path d="m341.6 632.5-19.5 20h3.7l15.8-16.1z" fill="#e8e7e8"/><path d="m341.6 617.1-34.6 35.4h3.8l30.8-31.5z" fill="#e8e7e8"/><path d="m307.1 616.5-.7.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m341.6 622.3-29.6 30.2h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m312.1 616.5-5.7 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m341.6 647.9-4.5 4.6h3.8l.7-.7z" fill="#e8e7e8"/><path d="m341.6 642.8-9.5 9.7h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m341.6 627.4-24.5 25.1h3.7l20.8-21.3z" fill="#e8e7e8"/><path d="m341.6 637.7-14.5 14.8h3.7l10.8-11z" fill="#e8e7e8"/><path d="m317.2 616.5-10.8 11v3.9l14.5-14.9z" fill="#e8e7e8"/><path d="m332.2 616.5-25.8 26.4v3.8l29.6-30.2z" fill="#e8e7e8"/><path d="m337.2 616.5-30.8 31.5v3.9l34.6-35.4z" fill="#e8e7e8"/><path d="m322.2 616.5-15.8 16.1v3.9l19.5-20z" fill="#e8e7e8"/><path d="m327.2 616.5-20.8 21.3v3.8l24.5-25.1z" fill="#e8e7e8"/><path d="m306.4 616.5v.8l.7-.8z" fill="#808080"/><path d="m310.9 616.5-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m315.9 616.5-9.5 9.7v1.3l10.8-11z" fill="#808080"/><path d="m320.9 616.5-14.5 14.9v1.2l15.8-16.1z" fill="#808080"/><path d="m325.9 616.5-19.5 20v1.3l20.8-21.3z" fill="#808080"/><path d="m330.9 616.5-24.5 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m336 616.5-29.6 30.2v1.3l30.8-31.5z" fill="#808080"/><path d="m341.6 617.1v-.6h-.6l-34.6 35.4v.6h.6z" fill="#808080"/><path d="m341.6 621-30.8 31.5h1.2l29.6-30.2z" fill="#808080"/><path d="m341.6 626.1-25.8 26.4h1.3l24.5-25.1z" fill="#808080"/><path d="m341.6 631.2-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m341.6 636.4-15.8 16.1h1.3l14.5-14.8z" fill="#808080"/><path d="m341.6 641.5-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m341.6 646.6-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m340.9 652.5h.7v-.7z" fill="#808080"/><path d="m341.6 756.1v-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-.6v.6 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h35.2v-.6z" fill="#808080"/><path d="m376.8 720.1v-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.2-3.9-.7h-.7-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-.6v.6 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8.8h.8 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8.6v-.7z" fill="#e8e7e8"/><path d="m376.8 745.8-14.5 14.8h3.8l10.7-11z" fill="#e8e7e8"/><path d="m367.4 724.6-25.8 26.4v3.8l29.6-30.2z" fill="#e8e7e8"/><path d="m362.4 724.6-20.8 21.3v3.8l24.6-25.1z" fill="#e8e7e8"/><path d="m342.4 724.6-.8.7v3.9l4.5-4.6z" fill="#e8e7e8"/><path d="m352.4 724.6-10.8 11v3.8l14.5-14.8z" fill="#e8e7e8"/><path d="m357.4 724.6-15.8 16.1v3.9l19.6-20z" fill="#e8e7e8"/><path d="m376.8 735.5-24.5 25.1h3.7l20.8-21.3z" fill="#e8e7e8"/><path d="m376.8 740.6-19.5 20h3.7l15.8-16.1z" fill="#e8e7e8"/><path d="m347.4 724.6-5.8 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m341.6 756.1v3.9l34.6-35.4h-3.8z" fill="#e8e7e8"/><path d="m376.8 750.9-9.5 9.7h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m376.8 725.2-34.6 35.4h3.8l30.8-31.5z" fill="#e8e7e8"/><path d="m376.8 730.4-29.5 30.2h3.7l25.8-26.4z" fill="#e8e7e8"/><path d="m376.8 756-4.5 4.6h3.8l.7-.7z" fill="#e8e7e8"/><path d="m341.6 724.6v.7l.8-.7z" fill="#808080"/><path d="m346.1 724.6-4.5 4.6v1.3l5.8-5.9z" fill="#808080"/><path d="m351.1 724.6-9.5 9.7v1.3l10.8-11z" fill="#808080"/><path d="m356.1 724.6-14.5 14.8v1.3l15.8-16.1z" fill="#808080"/><path d="m361.2 724.6-19.6 20v1.3l20.8-21.3z" fill="#808080"/><path d="m366.2 724.6-24.6 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m371.2 724.6-29.6 30.2v1.3l30.8-31.5z" fill="#808080"/><path d="m376.8 724.6h-.6l-34.6 35.4v.6h.6l34.6-35.4z" fill="#808080"/><path d="m376.8 729.1-30.8 31.5h1.3l29.5-30.2z" fill="#808080"/><path d="m376.8 734.2-25.8 26.4h1.3l24.5-25.1z" fill="#808080"/><path d="m376.8 739.3-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m376.8 744.5-15.8 16.1h1.3l14.5-14.8z" fill="#808080"/><path d="m376.8 749.6-10.7 11h1.2l9.5-9.7z" fill="#808080"/><path d="m376.8 754.7-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m376.1 760.6h.7v-.7z" fill="#808080"/><path d="m307.1 688.6-.7.7v3.9l4.5-4.6z" fill="#e8e7e8"/><path d="m312.1 688.6-5.7 5.8v3.9l9.5-9.7z" fill="#e8e7e8"/><path d="m322.2 688.6-15.8 16.1v3.8l19.5-19.9z" fill="#e8e7e8"/><path d="m317.2 688.6-10.8 11v3.8l14.5-14.8z" fill="#e8e7e8"/><path d="m341.6 699.5-24.5 25.1h3.7l20.8-21.3z" fill="#e8e7e8"/><path d="m341.6 694.3-29.6 30.3h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m327.2 688.6-20.8 21.2v3.9l24.5-25.1z" fill="#e8e7e8"/><path d="m341.6 709.7-14.5 14.9h3.7l10.8-11z" fill="#e8e7e8"/><path d="m332.2 688.6-25.8 26.4v3.8l29.6-30.2z" fill="#e8e7e8"/><path d="m337.2 688.6-30.8 31.5v3.8l34.6-35.3z" fill="#e8e7e8"/><path d="m341.6 720-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m341.6 704.6-19.5 20h3.7l15.8-16.2z" fill="#e8e7e8"/><path d="m341.6 689.2-34.6 35.4h3.8l30.8-31.6z" fill="#e8e7e8"/><path d="m341.6 714.9-9.5 9.7h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m306.4 688.6v.7l.7-.7z" fill="#808080"/><path d="m310.9 688.6-4.5 4.6v1.2l5.7-5.8z" fill="#808080"/><path d="m315.9 688.6-9.5 9.7v1.3l10.8-11z" fill="#808080"/><path d="m320.9 688.6-14.5 14.8v1.3l15.8-16.1z" fill="#808080"/><path d="m325.9 688.6-19.5 19.9v1.3l20.8-21.2z" fill="#808080"/><path d="m330.9 688.6-24.5 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m336 688.6-29.6 30.2v1.3l30.8-31.5z" fill="#808080"/><path d="m341.6 688.6h-.6l-34.6 35.3v.7h.6l34.6-35.4z" fill="#808080"/><path d="m341.6 693-30.8 31.6h1.2l29.6-30.3z" fill="#808080"/><path d="m341.6 698.2-25.8 26.4h1.3l24.5-25.1z" fill="#808080"/><path d="m341.6 703.3-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m341.6 708.4-15.8 16.2h1.3l14.5-14.9z" fill="#808080"/><path d="m341.6 713.6-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m341.6 718.7-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m340.9 724.6h.7v-.8z" fill="#808080"/><path d="m306.4 801.1v1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8.8h.7 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8.6v-.7-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-.8h-.7-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-.6v.7z" fill="#808080"/><path d="m341.6 765.1v1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9.7h.8 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8.6v-.6-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-35.2v.7z" fill="#e8e7e8"/><path d="m341.6 816.6 19.6-20h-3.8l-15.8 16.2z" fill="#e8e7e8"/><path d="m341.6 806.4 9.5-9.8h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m356 832.7 20.8-21.3v-3.8l-24.5 25.1z" fill="#e8e7e8"/><path d="m341.6 811.5 14.5-14.9h-3.7l-10.8 11.1z" fill="#e8e7e8"/><path d="m371.1 832.7 5.7-5.9v-3.9l-9.5 9.8z" fill="#e8e7e8"/><path d="m366.1 832.7 10.7-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m341.6 832 34.6-35.4h-3.8l-30.8 31.6z" fill="#e8e7e8"/><path d="m361 832.7 15.8-16.2v-3.8l-19.5 20z" fill="#e8e7e8"/><path d="m351 832.7 25.8-26.4v-3.9l-29.5 30.3z" fill="#e8e7e8"/><path d="m341.6 801.2 4.5-4.6h-3.7l-.8.8z" fill="#e8e7e8"/><path d="m376.8 801.1v-3.8l-34.6 35.4h3.8z" fill="#e8e7e8"/><path d="m376.1 832.7.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m341.6 821.8 24.6-25.2h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m341.6 826.9 29.6-30.3h-3.8l-25.8 26.5z" fill="#e8e7e8"/><path d="m342.4 796.6h-.8v.8z" fill="#808080"/><path d="m341.6 802.5 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m341.6 807.7 10.8-11.1h-1.3l-9.5 9.8z" fill="#808080"/><path d="m341.6 812.8 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m341.6 817.9 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m341.6 823.1 25.8-26.5h-1.2l-24.6 25.2z" fill="#808080"/><path d="m341.6 828.2 30.8-31.6h-1.2l-29.6 30.3z" fill="#808080"/><path d="m341.6 832.7h.6l34.6-35.4v-.7h-.6l-34.6 35.4z" fill="#808080"/><path d="m347.3 832.7 29.5-30.3v-1.3l-30.8 31.6z" fill="#808080"/><path d="m352.3 832.7 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m357.3 832.7 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m362.3 832.7 14.5-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m367.3 832.7 9.5-9.8v-1.2l-10.7 11z" fill="#808080"/><path d="m372.3 832.7 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m376.8 832.7v-.8l-.7.8z" fill="#808080"/><path d="m306.4 780.6 19.5-20h-3.7l-15.8 16.2z" fill="#e8e7e8"/><path d="m306.4 765.2 4.5-4.6h-3.8l-.7.8z" fill="#e8e7e8"/><path d="m306.4 770.3 9.5-9.7h-3.8l-5.7 5.9z" fill="#e8e7e8"/><path d="m315.8 796.6 25.8-26.4v-3.8l-29.6 30.2z" fill="#e8e7e8"/><path d="m306.4 775.5 14.5-14.9h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m306.4 796 34.6-35.4h-3.8l-30.8 31.6z" fill="#e8e7e8"/><path d="m306.4 785.7 24.5-25.1h-3.7l-20.8 21.3z" fill="#e8e7e8"/><path d="m320.8 796.6 20.8-21.2v-3.9l-24.5 25.1z" fill="#e8e7e8"/><path d="m325.8 796.6 15.8-16.1v-3.8l-19.5 19.9z" fill="#e8e7e8"/><path d="m306.4 790.9 29.6-30.3h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m341.6 765.1v-3.8l-34.6 35.3h3.8z" fill="#e8e7e8"/><path d="m340.9 796.6.7-.7v-3.9l-4.5 4.6z" fill="#e8e7e8"/><path d="m335.9 796.6 5.7-5.8v-3.9l-9.5 9.7z" fill="#e8e7e8"/><path d="m330.8 796.6 10.8-11v-3.8l-14.5 14.8z" fill="#e8e7e8"/><path d="m307.1 760.6h-.7v.8z" fill="#808080"/><path d="m306.4 766.5 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m306.4 771.6 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m306.4 776.8 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m306.4 781.9 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m306.4 787 25.8-26.4h-1.3l-24.5 25.1z" fill="#808080"/><path d="m306.4 792.2 30.8-31.6h-1.2l-29.6 30.3z" fill="#808080"/><path d="m306.4 796.6h.6l34.6-35.3v-.7h-.6l-34.6 35.4z" fill="#808080"/><path d="m312 796.6 29.6-30.2v-1.3l-30.8 31.5z" fill="#808080"/><path d="m317.1 796.6 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m322.1 796.6 19.5-19.9v-1.3l-20.8 21.2z" fill="#808080"/><path d="m327.1 796.6 14.5-14.8v-1.3l-15.8 16.1z" fill="#808080"/><path d="m332.1 796.6 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m337.1 796.6 4.5-4.6v-1.2l-5.7 5.8z" fill="#808080"/><path d="m341.6 796.6v-.7l-.7.7z" fill="#808080"/><path d="m341.6 900.2v-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-.6v.7 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.7 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8.6v-.6z" fill="#808080"/><path d="m341.6 837.2v1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8.8h.8 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8.6v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-.6v.6z" fill="#e8e7e8"/><path d="m376.8 889.9-14.5 14.8h3.8l10.7-11z" fill="#e8e7e8"/><path d="m376.8 895-9.5 9.7h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m376.8 884.7-19.5 20h3.7l15.8-16.1z" fill="#e8e7e8"/><path d="m376.8 879.6-24.5 25.1h3.7l20.8-21.2z" fill="#e8e7e8"/><path d="m342.4 868.7-.8.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m376.8 900.1-4.5 4.6h3.8l.7-.7z" fill="#e8e7e8"/><path d="m367.4 868.7-25.8 26.4v3.9l29.6-30.3z" fill="#e8e7e8"/><path d="m341.6 900.2v3.9l34.6-35.4h-3.8z" fill="#e8e7e8"/><path d="m362.4 868.7-20.8 21.3v3.8l24.6-25.1z" fill="#e8e7e8"/><path d="m347.4 868.7-5.8 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m352.4 868.7-10.8 11v3.9l14.5-14.9z" fill="#e8e7e8"/><path d="m376.8 869.4-34.6 35.3h3.8l30.8-31.5z" fill="#e8e7e8"/><path d="m357.4 868.7-15.8 16.2v3.8l19.6-20z" fill="#e8e7e8"/><path d="m376.8 874.5-29.5 30.2h3.7l25.8-26.4z" fill="#e8e7e8"/><path d="m341.6 868.7v.8l.8-.8z" fill="#808080"/><path d="m346.1 868.7-4.5 4.6v1.3l5.8-5.9z" fill="#808080"/><path d="m351.1 868.7-9.5 9.7v1.3l10.8-11z" fill="#808080"/><path d="m356.1 868.7-14.5 14.9v1.3l15.8-16.2z" fill="#808080"/><path d="m361.2 868.7-19.6 20v1.3l20.8-21.3z" fill="#808080"/><path d="m366.2 868.7-24.6 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m371.2 868.7-29.6 30.3v1.2l30.8-31.5z" fill="#808080"/><path d="m376.8 868.7h-.6l-34.6 35.4v.6h.6l34.6-35.3z" fill="#808080"/><path d="m376.8 873.2-30.8 31.5h1.3l29.5-30.2z" fill="#808080"/><path d="m376.8 878.3-25.8 26.4h1.3l24.5-25.1z" fill="#808080"/><path d="m376.8 883.5-20.8 21.2h1.3l19.5-20z" fill="#808080"/><path d="m376.8 888.6-15.8 16.1h1.3l14.5-14.8z" fill="#808080"/><path d="m376.8 893.7-10.7 11h1.2l9.5-9.7z" fill="#808080"/><path d="m376.8 898.8-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m376.1 904.7h.7v-.7z" fill="#808080"/><path d="m341.6 843.6-24.5 25.1h3.7l20.8-21.3z" fill="#e8e7e8"/><path d="m341.6 838.5-29.6 30.2h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m327.2 832.7-20.8 21.3v3.8l24.5-25.1z" fill="#e8e7e8"/><path d="m332.2 832.7-25.8 26.4v3.8l29.6-30.2z" fill="#e8e7e8"/><path d="m322.2 832.7-15.8 16.1v3.9l19.5-20z" fill="#e8e7e8"/><path d="m341.6 833.3-34.6 35.4h3.8l30.8-31.5z" fill="#e8e7e8"/><path d="m337.2 832.7-30.8 31.5v3.9l34.6-35.4z" fill="#e8e7e8"/><path d="m341.6 864.1-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m317.2 832.7-10.8 11v3.8l14.5-14.8z" fill="#e8e7e8"/><path d="m341.6 848.7-19.5 20h3.7l15.8-16.1z" fill="#e8e7e8"/><path d="m341.6 853.8-14.5 14.9h3.7l10.8-11z" fill="#e8e7e8"/><path d="m312.1 832.7-5.7 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m341.6 859-9.5 9.7h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m307.1 832.7-.7.7v3.9l4.5-4.6z" fill="#e8e7e8"/><path d="m306.4 832.7v.7l.7-.7z" fill="#808080"/><path d="m310.9 832.7-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m315.9 832.7-9.5 9.7v1.3l10.8-11z" fill="#808080"/><path d="m320.9 832.7-14.5 14.8v1.3l15.8-16.1z" fill="#808080"/><path d="m325.9 832.7-19.5 20v1.3l20.8-21.3z" fill="#808080"/><path d="m330.9 832.7-24.5 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m336 832.7-29.6 30.2v1.3l30.8-31.5z" fill="#808080"/><path d="m341.6 833.3v-.6h-.6l-34.6 35.4v.6h.6z" fill="#808080"/><path d="m341.6 837.2-30.8 31.5h1.2l29.6-30.2z" fill="#808080"/><path d="m341.6 842.3-25.8 26.4h1.3l24.5-25.1z" fill="#808080"/><path d="m341.6 847.4-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m341.6 852.6-15.8 16.1h1.3l14.5-14.9z" fill="#808080"/><path d="m341.6 857.7-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m341.6 862.8-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m340.9 868.7h.7v-.8z" fill="#808080"/><path d="m310.9 976.8h1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.6v-.6-3.8-1.4-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.7-.6v.6 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.7c.2 0 .3.1.5.1h.2 3.8z" fill="#808080"/><path d="m346.1 940.8h1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8.6v-.7-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-.8h-.7-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-.6v.7 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8.8h.8z" fill="#e8e7e8"/><path d="m376.8 961.9-14.5 14.9h3.8l10.7-11z" fill="#e8e7e8"/><path d="m376.8 956.8-19.5 20h3.7l15.8-16.2z" fill="#e8e7e8"/><path d="m367.4 940.8-25.8 26.4v3.8l29.6-30.2z" fill="#e8e7e8"/><path d="m352.4 940.8-10.8 11v3.8l14.5-14.8z" fill="#e8e7e8"/><path d="m357.4 940.8-15.8 16.1v3.9l19.6-20z" fill="#e8e7e8"/><path d="m342.4 940.8-.8.7v3.9l4.5-4.6z" fill="#e8e7e8"/><path d="m376.8 951.7-24.5 25.1h3.7l20.8-21.3z" fill="#e8e7e8"/><path d="m362.4 940.8-20.8 21.2v3.9l24.6-25.1z" fill="#e8e7e8"/><path d="m376.8 946.5-29.5 30.3h3.7l25.8-26.4z" fill="#e8e7e8"/><path d="m372.4 940.8-30.8 31.5v3.8l34.6-35.3z" fill="#e8e7e8"/><path d="m376.8 941.4-34.6 35.4h3.8l30.8-31.6z" fill="#e8e7e8"/><path d="m347.4 940.8-5.8 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m376.8 972.2-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m376.8 967.1-9.5 9.7h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m341.6 940.8v.7l.8-.7z" fill="#808080"/><path d="m346.1 940.8-4.5 4.6v1.3l5.8-5.9z" fill="#808080"/><path d="m351.1 940.8-9.5 9.7v1.3l10.8-11z" fill="#808080"/><path d="m356.1 940.8-14.5 14.8v1.3l15.8-16.1z" fill="#808080"/><path d="m361.2 940.8-19.6 20v1.2l20.8-21.2z" fill="#808080"/><path d="m366.2 940.8-24.6 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m371.2 940.8-29.6 30.2v1.3l30.8-31.5z" fill="#808080"/><path d="m376.8 940.8h-.6l-34.6 35.3v.7h.6l34.6-35.4z" fill="#808080"/><path d="m376.8 945.2-30.8 31.6h1.3l29.5-30.3z" fill="#808080"/><path d="m376.8 950.4-25.8 26.4h1.3l24.5-25.1z" fill="#808080"/><path d="m376.8 955.5-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m376.8 960.6-15.8 16.2h1.3l14.5-14.9z" fill="#808080"/><path d="m376.8 965.8-10.7 11h1.2l9.5-9.7z" fill="#808080"/><path d="m376.8 970.9-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m376.1 976.8h.7v-.8z" fill="#808080"/><path d="m341.6 915.6-24.5 25.2h3.7l20.8-21.3z" fill="#e8e7e8"/><path d="m341.6 925.9-14.5 14.9h3.7l10.8-11.1z" fill="#e8e7e8"/><path d="m341.6 920.8-19.5 20h3.7l15.8-16.2z" fill="#e8e7e8"/><path d="m341.6 931-9.5 9.8h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m341.6 936.2-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m341.6 905.4-34.6 35.4h3.8l30.8-31.6z" fill="#e8e7e8"/><path d="m341.6 910.5-29.6 30.3h3.8l25.8-26.5z" fill="#e8e7e8"/><path d="m336 904.7h-3.8l-25.8 26.4v3.9z" fill="#e8e7e8"/><path d="m306.4 936.3v3.8l34.6-35.4h-3.8z" fill="#e8e7e8"/><path d="m325.9 904.7h-3.7l-15.8 16.2v3.8z" fill="#e8e7e8"/><path d="m320.9 904.7h-3.7l-10.8 11.1v3.8z" fill="#e8e7e8"/><path d="m310.9 904.7h-3.8l-.7.8v3.8z" fill="#e8e7e8"/><path d="m330.9 904.7h-3.7l-20.8 21.3v3.9z" fill="#e8e7e8"/><path d="m315.9 904.7h-3.8l-5.7 5.9v3.9z" fill="#e8e7e8"/><path d="m307.1 904.7h-.7v.8z" fill="#808080"/><path d="m312.1 904.7h-1.2l-4.5 4.6v1.3z" fill="#808080"/><path d="m317.2 904.7h-1.3l-9.5 9.8v1.3z" fill="#808080"/><path d="m322.2 904.7h-1.3l-14.5 14.9v1.3z" fill="#808080"/><path d="m327.2 904.7h-1.3l-19.5 20v1.3z" fill="#808080"/><path d="m332.2 904.7h-1.3l-24.5 25.2v1.2z" fill="#808080"/><path d="m337.2 904.7h-1.2l-29.6 30.3v1.3z" fill="#808080"/><path d="m341.6 904.7h-.6l-34.6 35.4v.7h.6l34.6-35.4z" fill="#808080"/><path d="m341.6 909.2-30.8 31.6h1.2l29.6-30.3z" fill="#808080"/><path d="m341.6 914.3-25.8 26.5h1.3l24.5-25.2z" fill="#808080"/><path d="m341.6 919.5-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m341.6 924.6-15.8 16.2h1.3l14.5-14.9z" fill="#808080"/><path d="m341.6 929.7-10.8 11.1h1.3l9.5-9.8z" fill="#808080"/><path d="m341.6 934.9-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m340.9 940.8h.7v-.8z" fill="#808080"/><path d="m376.8 981.4v-3.8-.8h-.7-3.8-1.3-3.8-1.3-3.8-1.1-3.8-1.2-3.8-1.2-3.8-1.2-3.8-.6v.6 3.8.1c11.7 1.2 23.7 2.3 35.2 3.1v-1.9z" fill="#e8e7e8"/><path d="m312.1 976.8-.7.7c1.1.2 2.2.3 3.3.5l1.2-1.2z" fill="#e8e7e8"/><path d="m317.2 976.8-1.4 1.4c1.1.2 2.2.3 3.3.5l1.8-1.9z" fill="#e8e7e8"/><path d="m327.2 976.8-2.6 2.6c1.1.1 2.2.3 3.3.4l3-3z" fill="#e8e7e8"/><path d="m322.2 976.8-2 2c1.1.2 2.2.3 3.3.4l2.4-2.5h-3.7z" fill="#e8e7e8"/><path d="m337.2 976.8-3.6 3.7c1.1.1 2.2.3 3.4.4l4-4.1z" fill="#e8e7e8"/><path d="m332.2 976.8-3.1 3.2c1.1.1 2.2.3 3.4.4l3.5-3.6z" fill="#e8e7e8"/><path d="m307.1 976.8c1 .2 2.1.4 3.2.6l.5-.6z" fill="#e8e7e8"/><path d="m341.6 977.4-3.5 3.6c1.1.1 2.3.2 3.4.4l.1-.1z" fill="#e8e7e8"/><path d="m306.9 976.8h.2z" fill="#808080"/><path d="m310.9 976.8-.5.6c.4.1.7.1 1.1.2l.7-.7h-1.3z" fill="#808080"/><path d="m315.9 976.8-1.2 1.2c.4.1.7.1 1.1.2l1.4-1.4z" fill="#808080"/><path d="m320.9 976.8-1.8 1.9c.4.1.7.1 1.1.2l2-2h-1.3z" fill="#808080"/><path d="m325.9 976.8-2.4 2.5c.4 0 .7.1 1.1.1l2.6-2.6z" fill="#808080"/><path d="m330.9 976.8-3 3c.4 0 .7.1 1.1.1l3.1-3.2h-1.2z" fill="#808080"/><path d="m336 976.8-3.5 3.6c.4 0 .8.1 1.1.1l3.6-3.7z" fill="#808080"/><path d="m341.6 976.8h-.6l-4 4.1c.4 0 .8.1 1.1.1l3.5-3.6z" fill="#808080"/><path d="m341.5 981.4h.1v-.1z" fill="#808080"/><path d="m236 442.1v3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.8h.7 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.6v-.6-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.8h-.7-2.8c-8.6.8-15.7 1.4-19.9 1.9-4.3.5-8.2 1-11.8 1.7v.9 1.2z" fill="#808080"/><path d="m271.9 436.3h3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.6v-.6-3.6c-11.8 1.6-24.4 2.9-35.2 3.9v.3z" fill="#e8e7e8"/><path d="m295.6 472.4 10.8-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m280.6 472.4 25.8-26.4v-3.9l-29.6 30.3z" fill="#e8e7e8"/><path d="m287 436.3-15.8 16.2v3.8l19.5-20z" fill="#e8e7e8"/><path d="m292 436.3-20.8 21.3v3.9l24.5-25.2z" fill="#e8e7e8"/><path d="m275.6 472.4 30.8-31.6v-3.8l-34.6 35.4z" fill="#e8e7e8"/><path d="m297 436.3-25.8 26.5v3.8l29.5-30.3z" fill="#e8e7e8"/><path d="m285.6 472.4 20.8-21.3v-3.8l-24.6 25.1z" fill="#e8e7e8"/><path d="m281.9 436.3-10.7 11.1v3.8l14.5-14.9z" fill="#e8e7e8"/><path d="m290.6 472.4 15.8-16.2v-3.8l-19.5 20z" fill="#e8e7e8"/><path d="m302 436.3-30.8 31.6v3.8l34.6-35.4z" fill="#e8e7e8"/><path d="m271.9 436.3-.7.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m300.6 472.4 5.8-5.9v-3.9l-9.5 9.8z" fill="#e8e7e8"/><path d="m305.7 472.4.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m276.9 436.3-5.7 5.9v3.9l9.5-9.8z" fill="#e8e7e8"/><path d="m271.2 436.3v.8l.7-.8z" fill="#808080"/><path d="m275.7 436.3-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m280.7 436.3-9.5 9.8v1.3l10.7-11.1z" fill="#808080"/><path d="m285.7 436.3-14.5 14.9v1.3l15.8-16.2z" fill="#808080"/><path d="m290.7 436.3-19.5 20v1.3l20.8-21.3z" fill="#808080"/><path d="m295.7 436.3-24.5 25.2v1.3l25.8-26.5z" fill="#808080"/><path d="m300.7 436.3-29.5 30.3v1.3l30.8-31.6z" fill="#808080"/><path d="m306.4 437v-.7h-.6l-34.6 35.4v.7h.6z" fill="#808080"/><path d="m276.8 472.4 29.6-30.3v-1.3l-30.8 31.6z" fill="#808080"/><path d="m281.8 472.4 24.6-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m286.9 472.4 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m291.9 472.4 14.5-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m296.9 472.4 9.5-9.8v-1.2l-10.8 11z" fill="#808080"/><path d="m301.9 472.4 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m306.4 472.4v-.8l-.7.8z" fill="#808080"/><path d="m270.7 436.1c-1 .1-2.1.2-3.1.3h2.8z" fill="#e8e7e8"/><path d="m271.2 436.3v-.3c-.2 0-.3 0-.5 0l-.3.3z" fill="#808080"/><path d="m240.5 544.4h1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7.7v-.6-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-.8-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.2-3.8-1.3-3.7-.6v.7 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.7z" fill="#808080"/><path d="m271.2 476.9v1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8.8h.7 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8.6v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-.6v.6z" fill="#e8e7e8"/><path d="m281.9 508.4-10.7 11v3.9l14.5-14.9z" fill="#e8e7e8"/><path d="m287 508.4-15.8 16.2v3.8l19.5-20z" fill="#e8e7e8"/><path d="m292 508.4-20.8 21.3v3.8l24.5-25.1z" fill="#e8e7e8"/><path d="m276.9 508.4-5.7 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m297 508.4-25.8 26.4v3.9l29.5-30.3z" fill="#e8e7e8"/><path d="m271.9 508.4-.7.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m306.4 539.8-4.5 4.6h3.8l.7-.7z" fill="#e8e7e8"/><path d="m306.4 514.2-29.6 30.2h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m306.4 519.3-24.6 25.1h3.8l20.8-21.2z" fill="#e8e7e8"/><path d="m306.4 524.4-19.5 20h3.7l15.8-16.1z" fill="#e8e7e8"/><path d="m306.4 529.6-14.5 14.8h3.7l10.8-11z" fill="#e8e7e8"/><path d="m306.4 534.7-9.5 9.7h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m302 508.4-30.8 31.5v3.9l34.6-35.4z" fill="#e8e7e8"/><path d="m306.4 509.1-34.6 35.3h3.8l30.8-31.5z" fill="#e8e7e8"/><path d="m271.2 508.4v.8l.7-.8z" fill="#808080"/><path d="m275.7 508.4-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m280.7 508.4-9.5 9.7v1.3l10.7-11z" fill="#808080"/><path d="m285.7 508.4-14.5 14.9v1.3l15.8-16.2z" fill="#808080"/><path d="m290.7 508.4-19.5 20v1.3l20.8-21.3z" fill="#808080"/><path d="m295.7 508.4-24.5 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m300.7 508.4-29.5 30.3v1.2l30.8-31.5z" fill="#808080"/><path d="m306.4 509.1v-.7h-.6l-34.6 35.4v.6h.6z" fill="#808080"/><path d="m306.4 512.9-30.8 31.5h1.2l29.6-30.2z" fill="#808080"/><path d="m306.4 518-25.8 26.4h1.2l24.6-25.1z" fill="#808080"/><path d="m306.4 523.2-20.8 21.2h1.3l19.5-20z" fill="#808080"/><path d="m306.4 528.3-15.8 16.1h1.3l14.5-14.8z" fill="#808080"/><path d="m306.4 533.4-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m306.4 538.5-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m305.7 544.4h.7v-.7z" fill="#808080"/><path d="m236 477 4.5-4.6h-3.8l-.7.7z" fill="#e8e7e8"/><path d="m271.2 488.4-19.6 20h3.8l15.8-16.1z" fill="#e8e7e8"/><path d="m271.2 493.5-14.6 14.9h3.8l10.8-11z" fill="#e8e7e8"/><path d="m271.2 483.3-24.6 25.1h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m271.2 498.7-9.5 9.7h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m271.2 503.8-4.5 4.6h3.7l.8-.8z" fill="#e8e7e8"/><path d="m236 502.6 29.5-30.2h-3.7l-25.8 26.4z" fill="#e8e7e8"/><path d="m236 507.8 34.5-35.4h-3.7l-30.8 31.5z" fill="#e8e7e8"/><path d="m271.2 478.2-29.6 30.2h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m271.2 473-34.6 35.4h3.7l30.9-31.5z" fill="#e8e7e8"/><path d="m236 497.5 24.5-25.1h-3.7l-20.8 21.3z" fill="#e8e7e8"/><path d="m236 482.1 9.5-9.7h-3.8l-5.7 5.9z" fill="#e8e7e8"/><path d="m236 492.4 19.5-20h-3.8l-15.7 16.1z" fill="#e8e7e8"/><path d="m236 487.2 14.5-14.8h-3.8l-10.7 11z" fill="#e8e7e8"/><path d="m236.7 472.4h-.7v.7z" fill="#808080"/><path d="m236 478.3 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m236 483.4 10.7-11h-1.2l-9.5 9.7z" fill="#808080"/><path d="m236 488.5 15.7-16.1h-1.2l-14.5 14.8z" fill="#808080"/><path d="m236 493.7 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m236 498.8 25.8-26.4h-1.3l-24.5 25.1z" fill="#808080"/><path d="m236 503.9 30.8-31.5h-1.3l-29.5 30.2z" fill="#808080"/><path d="m236 508.4h.6l34.6-35.4v-.6h-.7l-34.5 35.4z" fill="#808080"/><path d="m271.2 476.9-30.9 31.5h1.3l29.6-30.2z" fill="#808080"/><path d="m271.2 482-25.8 26.4h1.2l24.6-25.1z" fill="#808080"/><path d="m271.2 487.1-20.8 21.3h1.2l19.6-20z" fill="#808080"/><path d="m271.2 492.3-15.8 16.1h1.2l14.6-14.9z" fill="#808080"/><path d="m271.2 497.4-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m271.2 502.5-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m270.4 508.4h.8v-.8z" fill="#808080"/><path d="m240.5 616.5h1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7.7v-.6-3.9-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.8-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.2-3.8-1.3-3.7-.6v.6 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8.8h.7z" fill="#808080"/><path d="m275.7 580.5h1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8.6v-.7-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-.8h-.7-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-.6v.7 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8.8h.7z" fill="#e8e7e8"/><path d="m297 580.5-25.8 26.4v3.8l29.5-30.2z" fill="#e8e7e8"/><path d="m306.4 581.1-34.6 35.4h3.8l30.8-31.5z" fill="#e8e7e8"/><path d="m281.9 580.5-10.7 11v3.8l14.5-14.8z" fill="#e8e7e8"/><path d="m302 580.5-30.8 31.5v3.9l34.6-35.4z" fill="#e8e7e8"/><path d="m287 580.5-15.8 16.1v3.9l19.5-20z" fill="#e8e7e8"/><path d="m271.9 580.5-.7.7v3.9l4.5-4.6z" fill="#e8e7e8"/><path d="m276.9 580.5-5.7 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m306.4 586.2-29.6 30.3h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m306.4 611.9-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m306.4 606.8-9.5 9.7h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m306.4 601.6-14.5 14.9h3.7l10.8-11z" fill="#e8e7e8"/><path d="m306.4 591.4-24.6 25.1h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m306.4 596.5-19.5 20h3.7l15.8-16.2z" fill="#e8e7e8"/><path d="m292 580.5-20.8 21.2v3.9l24.5-25.1z" fill="#e8e7e8"/><path d="m271.2 580.5v.7l.7-.7z" fill="#808080"/><path d="m275.7 580.5-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m280.7 580.5-9.5 9.7v1.3l10.7-11z" fill="#808080"/><path d="m285.7 580.5-14.5 14.8v1.3l15.8-16.1z" fill="#808080"/><path d="m290.7 580.5-19.5 20v1.2l20.8-21.2z" fill="#808080"/><path d="m295.7 580.5-24.5 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m300.7 580.5-29.5 30.2v1.3l30.8-31.5z" fill="#808080"/><path d="m306.4 580.5h-.6l-34.6 35.4v.6h.6l34.6-35.4z" fill="#808080"/><path d="m306.4 585-30.8 31.5h1.2l29.6-30.3z" fill="#808080"/><path d="m306.4 590.1-25.8 26.4h1.2l24.6-25.1z" fill="#808080"/><path d="m306.4 595.2-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m306.4 600.3-15.8 16.2h1.3l14.5-14.9z" fill="#808080"/><path d="m306.4 605.5-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m306.4 610.6-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m305.7 616.5h.7v-.8z" fill="#808080"/><path d="m251.7 544.4-15.7 16.2v3.8l19.5-20z" fill="#e8e7e8"/><path d="m246.7 544.4-10.7 11.1v3.8l14.5-14.9z" fill="#e8e7e8"/><path d="m241.7 544.4-5.7 5.9v3.9l9.5-9.8z" fill="#e8e7e8"/><path d="m256.8 544.4-20.8 21.3v3.9l24.5-25.2z" fill="#e8e7e8"/><path d="m266.8 544.4-30.8 31.6v3.8l34.5-35.4z" fill="#e8e7e8"/><path d="m261.8 544.4-25.8 26.4v3.9l29.5-30.3z" fill="#e8e7e8"/><path d="m271.2 545.1-34.6 35.4h3.7l30.9-31.6z" fill="#e8e7e8"/><path d="m271.2 575.9-4.5 4.6h3.7l.8-.8z" fill="#e8e7e8"/><path d="m271.2 570.7-9.5 9.8h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m271.2 550.2-29.6 30.3h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m271.2 565.6-14.6 14.9h3.8l10.8-11.1z" fill="#e8e7e8"/><path d="m271.2 560.5-19.6 20h3.8l15.8-16.2z" fill="#e8e7e8"/><path d="m271.2 555.3-24.6 25.2h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m236.7 544.4-.7.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m236 544.4v.8l.7-.8z" fill="#808080"/><path d="m240.5 544.4-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m245.5 544.4-9.5 9.8v1.3l10.7-11.1z" fill="#808080"/><path d="m250.5 544.4-14.5 14.9v1.3l15.7-16.2z" fill="#808080"/><path d="m255.5 544.4-19.5 20v1.3l20.8-21.3z" fill="#808080"/><path d="m260.5 544.4-24.5 25.2v1.2l25.8-26.4z" fill="#808080"/><path d="m265.5 544.4-29.5 30.3v1.3l30.8-31.6z" fill="#808080"/><path d="m271.2 545.1v-.7h-.7l-34.5 35.4v.7h.6z" fill="#808080"/><path d="m271.2 548.9-30.9 31.6h1.3l29.6-30.3z" fill="#808080"/><path d="m271.2 554.1-25.8 26.4h1.2l24.6-25.2z" fill="#808080"/><path d="m271.2 559.2-20.8 21.3h1.2l19.6-20z" fill="#808080"/><path d="m271.2 564.3-15.8 16.2h1.2l14.6-14.9z" fill="#808080"/><path d="m271.2 569.4-10.8 11.1h1.3l9.5-9.8z" fill="#808080"/><path d="m271.2 574.6-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m270.4 580.5h.8v-.8z" fill="#808080"/><path d="m241.7 688.6h3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.6v-.6-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.5v.6 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 1c.7 2.9 1.3 5.9 1.9 8.8h2.6 1.2z" fill="#808080"/><path d="m275.7 652.5h1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8.6v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-.6v.6 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.7z" fill="#e8e7e8"/><path d="m276.9 652.5-5.7 5.9v3.9l9.5-9.8z" fill="#e8e7e8"/><path d="m306.4 673.7-14.5 14.9h3.7l10.8-11.1z" fill="#e8e7e8"/><path d="m302 652.5-30.8 31.6v3.8l34.6-35.4z" fill="#e8e7e8"/><path d="m306.4 684-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m306.4 658.3-29.6 30.3h3.8l25.8-26.5z" fill="#e8e7e8"/><path d="m292 652.5-20.8 21.3v3.8l24.5-25.1z" fill="#e8e7e8"/><path d="m297 652.5-25.8 26.4v3.9l29.5-30.3z" fill="#e8e7e8"/><path d="m281.9 652.5-10.7 11v3.9l14.5-14.9z" fill="#e8e7e8"/><path d="m271.9 652.5-.7.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m306.4 678.8-9.5 9.8h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m287 652.5-15.8 16.2v3.8l19.5-20z" fill="#e8e7e8"/><path d="m306.4 653.2-34.6 35.4h3.8l30.8-31.6z" fill="#e8e7e8"/><path d="m306.4 668.6-19.5 20h3.7l15.8-16.2z" fill="#e8e7e8"/><path d="m306.4 663.4-24.6 25.2h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m271.2 652.5v.8l.7-.8z" fill="#808080"/><path d="m275.7 652.5-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m280.7 652.5-9.5 9.8v1.2l10.7-11z" fill="#808080"/><path d="m285.7 652.5-14.5 14.9v1.3l15.8-16.2z" fill="#808080"/><path d="m290.7 652.5-19.5 20v1.3l20.8-21.3z" fill="#808080"/><path d="m295.7 652.5-24.5 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m300.7 652.5-29.5 30.3v1.3l30.8-31.6z" fill="#808080"/><path d="m306.4 653.2v-.7h-.6l-34.6 35.4v.7h.6z" fill="#808080"/><path d="m306.4 657-30.8 31.6h1.2l29.6-30.3z" fill="#808080"/><path d="m306.4 662.1-25.8 26.5h1.2l24.6-25.2z" fill="#808080"/><path d="m306.4 667.3-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m306.4 672.4-15.8 16.2h1.3l14.5-14.9z" fill="#808080"/><path d="m306.4 677.5-10.8 11.1h1.3l9.5-9.8z" fill="#808080"/><path d="m306.4 682.7-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m305.7 688.6h.7v-.8z" fill="#808080"/><path d="m271.2 642.8-9.5 9.7h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m261.8 616.5-25.8 26.4v3.8l29.5-30.2z" fill="#e8e7e8"/><path d="m266.8 616.5-30.8 31.5v3.9l34.5-35.4z" fill="#e8e7e8"/><path d="m271.2 637.7-14.6 14.8h3.8l10.8-11z" fill="#e8e7e8"/><path d="m236.7 616.5-.7.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m271.2 647.9-4.5 4.6h3.7l.8-.7z" fill="#e8e7e8"/><path d="m241.7 616.5-5.7 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m271.2 632.5-19.6 20h3.8l15.8-16.1z" fill="#e8e7e8"/><path d="m251.7 616.5-15.7 16.1v3.9l19.5-20z" fill="#e8e7e8"/><path d="m271.2 622.3-29.6 30.2h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m246.7 616.5-10.7 11v3.9l14.5-14.9z" fill="#e8e7e8"/><path d="m271.2 627.4-24.6 25.1h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m256.8 616.5-20.8 21.3v3.8l24.5-25.1z" fill="#e8e7e8"/><path d="m271.2 617.1-34.6 35.4h3.7l30.9-31.5z" fill="#e8e7e8"/><path d="m236 616.5v.8l.7-.8z" fill="#808080"/><path d="m240.5 616.5-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m245.5 616.5-9.5 9.7v1.3l10.7-11z" fill="#808080"/><path d="m250.5 616.5-14.5 14.9v1.2l15.7-16.1z" fill="#808080"/><path d="m255.5 616.5-19.5 20v1.3l20.8-21.3z" fill="#808080"/><path d="m260.5 616.5-24.5 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m265.5 616.5-29.5 30.2v1.3l30.8-31.5z" fill="#808080"/><path d="m271.2 616.5h-.7l-34.5 35.4v.6h.6l34.6-35.4z" fill="#808080"/><path d="m271.2 621-30.9 31.5h1.3l29.6-30.2z" fill="#808080"/><path d="m271.2 626.1-25.8 26.4h1.2l24.6-25.1z" fill="#808080"/><path d="m271.2 631.2-20.8 21.3h1.2l19.6-20z" fill="#808080"/><path d="m271.2 636.4-15.8 16.1h1.2l14.6-14.8z" fill="#808080"/><path d="m271.2 641.5-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m271.2 646.6-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m270.4 652.5h.8v-.7z" fill="#808080"/><path d="m271.2 760v-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-1.3c1.6 12 2.9 24.1 3.9 36h23.2v-.7z" fill="#808080"/><path d="m275.7 724.6h1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8.6v-.7-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.2-3.9-.7h-.7-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-.6v.6 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8.8h.7z" fill="#e8e7e8"/><path d="m287 724.6-15.8 16.1v3.9l19.5-20z" fill="#e8e7e8"/><path d="m292 724.6-20.8 21.3v3.8l24.5-25.1z" fill="#e8e7e8"/><path d="m306.4 725.2-34.6 35.4h3.8l30.8-31.5z" fill="#e8e7e8"/><path d="m306.4 735.5-24.6 25.1h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m276.9 724.6-5.7 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m306.4 730.4-29.6 30.2h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m297 724.6-25.8 26.4v3.8l29.5-30.2z" fill="#e8e7e8"/><path d="m306.4 745.8-14.5 14.8h3.7l10.8-11z" fill="#e8e7e8"/><path d="m302 724.6-30.8 31.5v3.9l34.6-35.4z" fill="#e8e7e8"/><path d="m306.4 756-4.5 4.6h3.8l.7-.7z" fill="#e8e7e8"/><path d="m271.9 724.6-.7.7v3.9l4.5-4.6z" fill="#e8e7e8"/><path d="m281.9 724.6-10.7 11v3.8l14.5-14.8z" fill="#e8e7e8"/><path d="m306.4 740.6-19.5 20h3.7l15.8-16.1z" fill="#e8e7e8"/><path d="m306.4 750.9-9.5 9.7h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m271.2 724.6v.7l.7-.7z" fill="#808080"/><path d="m275.7 724.6-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m280.7 724.6-9.5 9.7v1.3l10.7-11z" fill="#808080"/><path d="m285.7 724.6-14.5 14.8v1.3l15.8-16.1z" fill="#808080"/><path d="m290.7 724.6-19.5 20v1.3l20.8-21.3z" fill="#808080"/><path d="m295.7 724.6-24.5 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m300.7 724.6-29.5 30.2v1.3l30.8-31.5z" fill="#808080"/><path d="m306.4 724.6h-.6l-34.6 35.4v.6h.6l34.6-35.4z" fill="#808080"/><path d="m306.4 729.1-30.8 31.5h1.2l29.6-30.2z" fill="#808080"/><path d="m306.4 734.2-25.8 26.4h1.2l24.6-25.1z" fill="#808080"/><path d="m306.4 739.3-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m306.4 744.5-15.8 16.1h1.3l14.5-14.8z" fill="#808080"/><path d="m306.4 749.6-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m306.4 754.7-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m305.7 760.6h.7v-.7z" fill="#808080"/><path d="m251.7 688.6-11.5 11.8c.2 1.1.4 2.2.6 3.2l14.7-15z" fill="#e8e7e8"/><path d="m271.2 704.6-19.6 20h3.8l15.8-16.2z" fill="#e8e7e8"/><path d="m271.2 699.5-24.6 25.1h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m271.2 709.7-14.6 14.9h3.8l10.8-11z" fill="#e8e7e8"/><path d="m271.2 714.9-9.5 9.7h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m271.2 698.2v-3.8l-27.4 28c.1.7.2 1.5.3 2.2h1.3z" fill="#e8e7e8"/><path d="m271.2 720-4.5 4.6h3.7l.8-.8z" fill="#e8e7e8"/><path d="m237.9 688.6c.2.7.3 1.4.5 2.2l2.1-2.2z" fill="#e8e7e8"/><path d="m241.7 688.6-3.2 3.2c.2 1.1.4 2.1.6 3.2l6.3-6.4z" fill="#e8e7e8"/><path d="m261.8 688.6-20 20.5c.2 1.1.4 2.2.5 3.3l23.2-23.8z" fill="#e8e7e8"/><path d="m266.8 688.6-24.3 24.9c0 .2.1.4.1.6.1.9.3 1.8.4 2.8l27.6-28.2h-3.8z" fill="#e8e7e8"/><path d="m256.8 688.6-15.8 16.1c.2 1.1.4 2.2.6 3.3l18.9-19.4z" fill="#e8e7e8"/><path d="m246.7 688.6-7.3 7.5c.2 1.1.4 2.1.6 3.2l10.5-10.7z" fill="#e8e7e8"/><path d="m271.2 689.2-28 28.7c.2 1.1.3 2.2.5 3.4l27.6-28.2v-3.9z" fill="#e8e7e8"/><path d="m240.5 688.6-2.1 2.2c.1.4.1.7.2 1.1l3.2-3.2h-1.3z" fill="#808080"/><path d="m245.5 688.6-6.3 6.4c.1.4.1.7.2 1.1l7.3-7.5z" fill="#808080"/><path d="m250.5 688.6-10.5 10.7c.1.4.1.7.2 1.1l11.5-11.8z" fill="#808080"/><path d="m255.5 688.6-14.7 15c.1.4.1.7.2 1.1l15.7-16.1z" fill="#808080"/><path d="m260.5 688.6-18.9 19.4c.1.4.1.7.2 1.1l20-20.5z" fill="#808080"/><path d="m265.5 688.6-23.2 23.8c.1.4.1.7.2 1.1l24.3-24.9z" fill="#808080"/><path d="m271.2 688.6h-.6l-27.6 28.2c.1.4.1.7.2 1.1l28-28.7z" fill="#808080"/><path d="m271.2 693-27.6 28.2c.1.4.1.8.2 1.1l27.4-28z" fill="#808080"/><path d="m271.2 698.2-25.8 26.4h1.2l24.6-25.1z" fill="#808080"/><path d="m271.2 703.3-20.8 21.3h1.2l19.6-20z" fill="#808080"/><path d="m271.2 708.4-15.8 16.2h1.2l14.6-14.9z" fill="#808080"/><path d="m271.2 713.6-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m271.2 718.7-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m270.4 724.6h.8v-.8z" fill="#808080"/><path d="m255.5 832.7h1.3 3.8 1.3 3.8 1.3 3.8.6v-.7-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3c.6 12.3 1 24.4 1.3 36h3.9z" fill="#808080"/><path d="m271.2 765.1v1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9.7h.7 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8.6v-.6-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-35.2v.7z" fill="#e8e7e8"/><path d="m306.4 822.9-9.5 9.8h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m276.9 796.6-5.7 5.9v3.9l9.5-9.8z" fill="#e8e7e8"/><path d="m292 796.6-20.8 21.3v3.9l24.5-25.2z" fill="#e8e7e8"/><path d="m306.4 828.1-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m281.9 796.6-10.7 11.1v3.8l14.5-14.9z" fill="#e8e7e8"/><path d="m287 796.6-15.8 16.2v3.8l19.5-20z" fill="#e8e7e8"/><path d="m306.4 797.3-34.6 35.4h3.8l30.8-31.6z" fill="#e8e7e8"/><path d="m271.9 796.6-.7.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m306.4 812.7-19.5 20h3.7l15.8-16.2z" fill="#e8e7e8"/><path d="m306.4 807.6-24.6 25.1h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m297 796.6-25.8 26.5v3.8l29.5-30.3z" fill="#e8e7e8"/><path d="m302 796.6-30.8 31.6v3.8l34.6-35.4z" fill="#e8e7e8"/><path d="m306.4 817.8-14.5 14.9h3.7l10.8-11z" fill="#e8e7e8"/><path d="m306.4 802.4-29.6 30.3h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m271.2 796.6v.8l.7-.8z" fill="#808080"/><path d="m275.7 796.6-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m280.7 796.6-9.5 9.8v1.3l10.7-11.1z" fill="#808080"/><path d="m285.7 796.6-14.5 14.9v1.3l15.8-16.2z" fill="#808080"/><path d="m290.7 796.6-19.5 20v1.3l20.8-21.3z" fill="#808080"/><path d="m295.7 796.6-24.5 25.2v1.3l25.8-26.5z" fill="#808080"/><path d="m300.7 796.6-29.5 30.3v1.3l30.8-31.6z" fill="#808080"/><path d="m306.4 797.3v-.7h-.6l-34.6 35.4v.7h.6z" fill="#808080"/><path d="m306.4 801.1-30.8 31.6h1.2l29.6-30.3z" fill="#808080"/><path d="m306.4 806.3-25.8 26.4h1.2l24.6-25.1z" fill="#808080"/><path d="m306.4 811.4-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m306.4 816.5-15.8 16.2h1.3l14.5-14.9z" fill="#808080"/><path d="m306.4 821.7-10.8 11h1.3l9.5-9.8z" fill="#808080"/><path d="m306.4 826.8-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m305.7 832.7h.7v-.8z" fill="#808080"/><path d="m256.8 760.6-8.1 8.3c.1 1.2.2 2.4.3 3.6l11.6-11.9z" fill="#e8e7e8"/><path d="m266.8 760.6-17.5 17.9c.1 1.2.2 2.4.2 3.6l21-21.5z" fill="#e8e7e8"/><path d="m271.2 776.7-19.6 19.9h3.8l15.8-16.1z" fill="#e8e7e8"/><path d="m251.7 760.6-3.5 3.5c.1 1.2.2 2.4.3 3.6l6.9-7.1z" fill="#e8e7e8"/><path d="m248 760.6c.1.8.1 1.6.2 2.3l2.3-2.3z" fill="#e8e7e8"/><path d="m271.2 766.4-21.2 21.7c.1 1.2.1 2.4.2 3.6l21-21.5z" fill="#e8e7e8"/><path d="m271.2 771.5-21 21.5c.1 1.2.1 2.4.2 3.7l20.8-21.3z" fill="#e8e7e8"/><path d="m271.2 761.3-21.5 22c.1 1.2.1 2.4.2 3.6l21.3-21.8z" fill="#e8e7e8"/><path d="m271.2 781.8-14.6 14.8h3.8l10.8-11z" fill="#e8e7e8"/><path d="m271.2 792-4.5 4.6h3.7l.8-.7z" fill="#e8e7e8"/><path d="m271.2 786.9-9.5 9.7h3.7l5.8-5.8z" fill="#e8e7e8"/><path d="m261.8 760.6-12.8 13.1c.1 1.2.2 2.4.2 3.6l16.3-16.6h-3.7z" fill="#e8e7e8"/><path d="m250.5 760.6-2.3 2.3c0 .4.1.8.1 1.2l3.5-3.5z" fill="#808080"/><path d="m255.5 760.6-6.9 7.1c0 .4.1.8.1 1.2l8.1-8.3z" fill="#808080"/><path d="m260.5 760.6-11.6 11.9c0 .4.1.8.1 1.2l12.8-13.1z" fill="#808080"/><path d="m265.5 760.6-16.3 16.6c0 .4.1.8.1 1.2l17.5-17.9h-1.3z" fill="#808080"/><path d="m271.2 760.6h-.6l-21 21.5c0 .4 0 .8.1 1.2l21.5-22z" fill="#808080"/><path d="m271.2 765.1-21.3 21.8c0 .4 0 .8.1 1.2l21.2-21.7z" fill="#808080"/><path d="m271.2 770.2-21 21.5c0 .4 0 .8.1 1.2l21-21.5v-1.2z" fill="#808080"/><path d="m271.2 776.7v-1.3l-20.8 21.2h1.2z" fill="#808080"/><path d="m271.2 780.5-15.8 16.1h1.2l14.6-14.8z" fill="#808080"/><path d="m271.2 785.6-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m271.2 790.8-5.8 5.8h1.3l4.5-4.6z" fill="#808080"/><path d="m270.4 796.6h.8v-.7z" fill="#808080"/><path d="m256.8 904.7h3.8 1.3 3.8 1.3 3.8.6v-.6-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.3-3.8-1.3-3.8-1.3-2.9c.3 12.9.5 25.1 1 36h2 1.3z" fill="#808080"/><path d="m275.7 868.7h1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8.6v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-.6v.6 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8.8h.7z" fill="#e8e7e8"/><path d="m306.4 874.5-29.6 30.2h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m306.4 884.7-19.5 20h3.7l15.8-16.1z" fill="#e8e7e8"/><path d="m302 868.7-30.8 31.5v3.9l34.6-35.4z" fill="#e8e7e8"/><path d="m306.4 900.1-4.5 4.6h3.8l.7-.7z" fill="#e8e7e8"/><path d="m297 868.7-25.8 26.4v3.9l29.5-30.3z" fill="#e8e7e8"/><path d="m271.9 868.7-.7.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m306.4 879.6-24.6 25.1h3.8l20.8-21.2z" fill="#e8e7e8"/><path d="m306.4 895-9.5 9.7h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m306.4 889.9-14.5 14.8h3.7l10.8-11z" fill="#e8e7e8"/><path d="m306.4 869.4-34.6 35.3h3.8l30.8-31.5z" fill="#e8e7e8"/><path d="m276.9 868.7-5.7 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m281.9 868.7-10.7 11v3.9l14.5-14.9z" fill="#e8e7e8"/><path d="m287 868.7-15.8 16.2v3.8l19.5-20z" fill="#e8e7e8"/><path d="m292 868.7-20.8 21.3v3.8l24.5-25.1z" fill="#e8e7e8"/><path d="m271.2 868.7v.8l.7-.8z" fill="#808080"/><path d="m275.7 868.7-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m280.7 868.7-9.5 9.7v1.3l10.7-11z" fill="#808080"/><path d="m285.7 868.7-14.5 14.9v1.3l15.8-16.2z" fill="#808080"/><path d="m290.7 868.7-19.5 20v1.3l20.8-21.3z" fill="#808080"/><path d="m295.7 868.7-24.5 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m300.7 868.7-29.5 30.3v1.2l30.8-31.5z" fill="#808080"/><path d="m306.4 869.4v-.7h-.6l-34.6 35.4v.6h.6z" fill="#808080"/><path d="m306.4 873.2-30.8 31.5h1.2l29.6-30.2z" fill="#808080"/><path d="m306.4 878.3-25.8 26.4h1.2l24.6-25.1z" fill="#808080"/><path d="m306.4 883.5-20.8 21.2h1.3l19.5-20z" fill="#808080"/><path d="m306.4 888.6-15.8 16.1h1.3l14.5-14.8z" fill="#808080"/><path d="m306.4 893.7-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m306.4 898.8-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m305.7 904.7h.7v-.7z" fill="#808080"/><path d="m271.2 852.6v-3.8l-18.7 19.1v.9h2.9z" fill="#e8e7e8"/><path d="m251.7 832.7c0 1.3.1 2.5.1 3.8l3.7-3.8z" fill="#e8e7e8"/><path d="m271.2 843.6-18.8 19.2c0 1.3.1 2.5.1 3.8l18.7-19.1z" fill="#e8e7e8"/><path d="m271.2 864.1-4.5 4.6h3.7l.8-.8z" fill="#e8e7e8"/><path d="m271.2 859-9.5 9.7h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m261.8 832.7-9.8 10c0 1.3.1 2.5.1 3.8l13.5-13.8z" fill="#e8e7e8"/><path d="m266.8 832.7-14.7 15c0 1.3.1 2.5.1 3.8l18.4-18.8z" fill="#e8e7e8"/><path d="m271.2 853.8-14.6 14.9h3.8l10.8-11z" fill="#e8e7e8"/><path d="m271.2 838.5-18.9 19.3c0 1.3.1 2.5.1 3.8l18.8-19.2z" fill="#e8e7e8"/><path d="m256.8 832.7-4.9 5c0 1.3.1 2.5.1 3.7l8.6-8.8h-3.8z" fill="#e8e7e8"/><path d="m271.2 833.3-19 19.4c0 1.3.1 2.5.1 3.8l18.9-19.3z" fill="#e8e7e8"/><path d="m255.5 832.7-3.7 3.8v1.3l4.9-5h-1.2z" fill="#808080"/><path d="m260.5 832.7-8.6 8.8v1.3l9.8-10h-1.2z" fill="#808080"/><path d="m265.5 832.7-13.5 13.8v1.3l14.7-15h-1.2z" fill="#808080"/><path d="m271.2 832.7h-.6l-18.4 18.8v1.3l19-19.4z" fill="#808080"/><path d="m271.2 837.2-18.9 19.3v1.3l18.9-19.3z" fill="#808080"/><path d="m271.2 842.3-18.8 19.2v1.3l18.8-19.2z" fill="#808080"/><path d="m271.2 847.4-18.7 19.1v1.3l18.7-19.1z" fill="#808080"/><path d="m271.2 852.6-15.8 16.1h1.2l14.6-14.9z" fill="#808080"/><path d="m271.2 857.7-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m271.2 862.8-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m270.4 868.7h.8v-.8z" fill="#808080"/><path d="m271.2 965.9v-3.9-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.3-3.8-1.3-3.8-.2c1.6 10.2 3.9 17.7 7.3 21.8 1.5 1.8 4 3.4 7.3 5v-.4-1.3z" fill="#808080"/><path d="m306.4 936.3v-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-.8h-.7-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-.6v.7 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8.8h.7 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8.6v-.7z" fill="#e8e7e8"/><path d="m306.4 961.9-12.2 12.5c1 .2 2.1.4 3.1.6l9.1-9.3z" fill="#e8e7e8"/><path d="m302 940.8-27.5 28.2c.9.3 1.8.7 2.8 1l28.5-29.2z" fill="#e8e7e8"/><path d="m271.9 940.8-.7.7v3.9l4.5-4.6z" fill="#e8e7e8"/><path d="m306.4 946.5-24.3 24.9c1 .3 1.9.5 3 .8l21.4-21.9v-3.8z" fill="#e8e7e8"/><path d="m306.4 951.7-20.4 20.8c1 .3 2 .5 3 .7l17.3-17.7v-3.8z" fill="#e8e7e8"/><path d="m306.4 967.1-8 8.2c1 .2 2.1.4 3.2.6l4.8-4.9z" fill="#e8e7e8"/><path d="m306.4 956.8-16.3 16.7c1 .2 2 .5 3.1.7l13.2-13.5z" fill="#e8e7e8"/><path d="m306.4 941.4-28.2 28.8c.9.3 1.9.6 2.9.9l25.3-25.9z" fill="#e8e7e8"/><path d="m297 940.8-25.8 26.4v.4c.8.4 1.6.7 2.4 1l27.2-27.8z" fill="#e8e7e8"/><path d="m281.9 940.8-10.7 11v3.8l14.5-14.8z" fill="#e8e7e8"/><path d="m292 940.8-20.8 21.2v3.9l24.5-25.1z" fill="#e8e7e8"/><path d="m276.9 940.8-5.7 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m287 940.8-15.8 16.1v3.9l19.5-20z" fill="#e8e7e8"/><path d="m306.4 972.2-3.8 3.9c1.1.2 2.1.4 3.2.6l.6-.6z" fill="#e8e7e8"/><path d="m271.2 940.8v.7l.7-.7z" fill="#808080"/><path d="m275.7 940.8-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m280.7 940.8-9.5 9.7v1.3l10.7-11z" fill="#808080"/><path d="m285.7 940.8-14.5 14.8v1.3l15.8-16.1z" fill="#808080"/><path d="m290.7 940.8-19.5 20v1.2l20.8-21.2z" fill="#808080"/><path d="m271.2 965.9v1.3l25.8-26.4h-1.3z" fill="#808080"/><path d="m300.7 940.8-27.2 27.8c.3.1.6.2.9.4l27.5-28.2z" fill="#808080"/><path d="m306.4 940.8h-.6l-28.5 29.2c.3.1.6.2.9.3l28.2-28.8z" fill="#808080"/><path d="m306.4 945.2-25.3 25.9c.3.1.6.2 1 .3l24.3-24.9z" fill="#808080"/><path d="m306.4 950.4-21.4 21.8c.3.1.7.2 1 .3l20.4-20.8z" fill="#808080"/><path d="m306.4 955.5-17.3 17.7c.3.1.7.2 1 .2l16.3-16.7z" fill="#808080"/><path d="m306.4 960.6-13.2 13.5c.3.1.7.1 1 .2l12.2-12.5z" fill="#808080"/><path d="m306.4 965.8-9.1 9.3c.4.1.7.1 1.1.2l8-8.2z" fill="#808080"/><path d="m306.4 970.9-4.8 4.9c.4.1.7.1 1.1.2l3.8-3.9v-1.2z" fill="#808080"/><path d="m305.8 976.6c.2 0 .4.1.6.1v-.7z" fill="#808080"/><path d="m271.2 931-9.5 9.8h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m271.2 936.2-4.5 4.6h3.7l.8-.8z" fill="#e8e7e8"/><path d="m271.2 925.9-14.6 14.9h3.8l10.8-11.1z" fill="#e8e7e8"/><path d="m271.2 910.5-16.3 16.7c.1 1.2.2 2.4.3 3.5l16-16.3z" fill="#e8e7e8"/><path d="m271.2 920.8-15.3 15.6c.1 1.2.3 2.3.5 3.4l14.8-15.2z" fill="#e8e7e8"/><path d="m271.2 915.6-15.8 16.2c.1 1.2.3 2.3.4 3.4l15.4-15.8z" fill="#e8e7e8"/><path d="m271.2 905.4-16.7 17.1c.1 1.2.2 2.4.3 3.6l16.4-16.8z" fill="#e8e7e8"/><path d="m270.5 904.7h-3.8l-12.6 12.9c.1 1.2.2 2.4.2 3.6z" fill="#e8e7e8"/><path d="m255.5 904.7h-2c0 .6.1 1.3.1 1.9z" fill="#e8e7e8"/><path d="m265.5 904.7h-3.8l-7.9 8.1c.1 1.2.1 2.4.2 3.6z" fill="#e8e7e8"/><path d="m260.5 904.7h-3.8l-3.1 3.2c.1 1.2.1 2.5.2 3.7z" fill="#e8e7e8"/><path d="m256.8 904.7h-1.3l-1.9 1.9c0 .4 0 .8.1 1.2z" fill="#808080"/><path d="m261.8 904.7h-1.3l-6.7 6.8c0 .4 0 .8.1 1.2z" fill="#808080"/><path d="m266.8 904.7h-1.3l-11.4 11.7c0 .4 0 .8.1 1.2z" fill="#808080"/><path d="m271.2 904.7h-.6l-16.1 16.5c0 .4.1.8.1 1.2l16.7-17.1v-.6z" fill="#808080"/><path d="m271.2 909.2-16.4 16.8c0 .4.1.8.1 1.2l16.3-16.7z" fill="#808080"/><path d="m271.2 914.3-16 16.3c0 .4.1.8.1 1.2l15.8-16.2v-1.3z" fill="#808080"/><path d="m271.2 919.5-15.4 15.8c0 .4.1.8.1 1.1l15.3-15.6z" fill="#808080"/><path d="m271.2 925.9v-1.3l-14.8 15.2c0 .3.1.7.1 1h.2z" fill="#808080"/><path d="m271.2 929.7-10.8 11.1h1.3l9.5-9.8z" fill="#808080"/><path d="m271.2 934.9-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m270.4 940.8h.8v-.8z" fill="#808080"/><path d="m196.4 472.4h3.8.6v-.6-3.8-1.3-3.8-1.3-3.8-1.3-.5c-3.7 4.5-6.1 9.9-7.9 16.6h2.2 1.3z" fill="#808080"/><path d="m200.7 466.6 23.6-24.2c-1.9.5-3.7 1.1-5.4 1.6l-18.3 18.7v3.9z" fill="#e8e7e8"/><path d="m225.2 472.4 10.8-11v-3.9l-14.6 14.9z" fill="#e8e7e8"/><path d="m200.7 471.7 30.2-30.8c-1.7.3-3.3.7-4.8 1.1l-25.3 25.9v3.8z" fill="#e8e7e8"/><path d="m200.7 461.5 16.3-16.7c-2.5 1-4.8 2-6.9 3.2l-9.4 9.6z" fill="#e8e7e8"/><path d="m205.1 472.4 30.8-31.5v-.9c-1.2.2-2.4.4-3.5.6l-31.1 31.8z" fill="#e8e7e8"/><path d="m235.2 472.4.8-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m220.2 472.4 15.8-16.2v-3.8l-19.6 20z" fill="#e8e7e8"/><path d="m210.1 472.4 25.9-26.4v-3.9l-29.6 30.3z" fill="#e8e7e8"/><path d="m230.2 472.4 5.8-5.9v-3.9l-9.6 9.8z" fill="#e8e7e8"/><path d="m215.2 472.4 20.8-21.3v-3.8l-24.6 25.1z" fill="#e8e7e8"/><path d="m206.8 450.1c-2.3 1.7-4.3 3.6-6.1 5.6v.5z" fill="#e8e7e8"/><path d="m200.7 457.6 9.4-9.6c-1.2.7-2.3 1.4-3.4 2.2l-6.1 6.2v1.2z" fill="#808080"/><path d="m200.7 462.8 18.3-18.7c-.7.2-1.3.5-2 .7l-16.3 16.7z" fill="#808080"/><path d="m200.7 467.9 25.3-25.9c-.6.1-1.1.3-1.7.4l-23.6 24.2z" fill="#808080"/><path d="m200.7 472.4h.6l31.1-31.8c-.5.1-1.1.2-1.6.3l-30.2 30.8v.7z" fill="#808080"/><path d="m236 442.1v-1.3l-30.9 31.6h1.3z" fill="#808080"/><path d="m211.4 472.4 24.6-25.1v-1.3l-25.9 26.4z" fill="#808080"/><path d="m216.4 472.4 19.6-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m221.4 472.4 14.6-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m226.4 472.4 9.6-9.8v-1.2l-10.8 11z" fill="#808080"/><path d="m231.5 472.4 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m236 472.4v-.8l-.8.8z" fill="#808080"/><path d="m200.7 544.4v-.6-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.5-3.8-.8h-.7-3.8-1.2-3.8-1.2-.2c1.5 9.6 4.5 21.9 8.4 36h1.9z" fill="#808080"/><path d="m205.2 508.4h1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7.7v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.8-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-.7v.6 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8.8h.8z" fill="#e8e7e8"/><path d="m201.5 508.4-.8.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m226.6 508.4-25.9 26.4v3.9l29.6-30.3z" fill="#e8e7e8"/><path d="m231.6 508.4-30.9 31.5v3.9l34.6-35.4z" fill="#e8e7e8"/><path d="m216.5 508.4-15.8 16.2v3.8l19.6-20z" fill="#e8e7e8"/><path d="m236 514.2-29.6 30.2h3.7l25.9-26.4z" fill="#e8e7e8"/><path d="m221.5 508.4-20.8 21.3v3.8l24.6-25.1z" fill="#e8e7e8"/><path d="m236 509.1-34.6 35.3h3.7l30.9-31.5z" fill="#e8e7e8"/><path d="m206.5 508.4-5.8 5.9v3.8l9.6-9.7z" fill="#e8e7e8"/><path d="m236 534.7-9.6 9.7h3.8l5.8-5.9z" fill="#e8e7e8"/><path d="m211.5 508.4-10.8 11v3.9l14.6-14.9z" fill="#e8e7e8"/><path d="m236 539.8-4.5 4.6h3.7l.8-.7z" fill="#e8e7e8"/><path d="m236 529.6-14.6 14.8h3.8l10.8-11z" fill="#e8e7e8"/><path d="m236 524.4-19.6 20h3.8l15.8-16.1z" fill="#e8e7e8"/><path d="m236 519.3-24.6 25.1h3.8l20.8-21.2z" fill="#e8e7e8"/><path d="m200.7 508.4v.8l.8-.8z" fill="#808080"/><path d="m205.2 508.4-4.5 4.6v1.3l5.8-5.9z" fill="#808080"/><path d="m210.3 508.4-9.6 9.7v1.3l10.8-11z" fill="#808080"/><path d="m215.3 508.4-14.6 14.9v1.3l15.8-16.2z" fill="#808080"/><path d="m220.3 508.4-19.6 20v1.3l20.8-21.3z" fill="#808080"/><path d="m225.3 508.4-24.6 25.1v1.3l25.9-26.4z" fill="#808080"/><path d="m230.3 508.4-29.6 30.3v1.2l30.9-31.5z" fill="#808080"/><path d="m236 508.4h-.7l-34.6 35.4v.6h.7l34.6-35.3z" fill="#808080"/><path d="m236 512.9-30.9 31.5h1.3l29.6-30.2z" fill="#808080"/><path d="m236 518-25.9 26.4h1.3l24.6-25.1z" fill="#808080"/><path d="m236 523.2-20.8 21.2h1.2l19.6-20z" fill="#808080"/><path d="m236 528.3-15.8 16.1h1.2l14.6-14.8z" fill="#808080"/><path d="m236 533.4-10.8 11h1.2l9.6-9.7z" fill="#808080"/><path d="m236 538.5-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m235.2 544.4h.8v-.7z" fill="#808080"/><path d="m192.9 472.4c-.3 1-.5 2-.8 3.1l3-3.1z" fill="#e8e7e8"/><path d="m196.4 472.4-4.6 4.7c-.3 1.6-.7 3.2-1 4.8l9.4-9.6h-3.8z" fill="#e8e7e8"/><path d="m200.7 473-10.3 10.5c-.3 1.5-.5 3-.8 4.6l11-11.3v-3.8z" fill="#e8e7e8"/><path d="m200.7 503.8-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m200.7 498.7-9.5 9.7h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m200.7 483.3-12 12.3c0 1.2 0 2.4.1 3.8l11.9-12.2z" fill="#e8e7e8"/><path d="m200.7 478.2-11.3 11.6c-.1.9-.3 1.9-.4 2.8-.1.5-.1 1.1-.2 1.6l11.9-12.2z" fill="#e8e7e8"/><path d="m200.7 488.4-11.9 12.1c.1 1.1.2 2.3.3 3.5l11.5-11.8v-3.8z" fill="#e8e7e8"/><path d="m200.7 497.4v-3.8l-11.4 11.7c.1 1 .3 2.1.5 3.2h.2z" fill="#e8e7e8"/><path d="m195.1 472.4-3 3.1c-.1.6-.3 1.1-.4 1.7l4.6-4.7h-1.2z" fill="#808080"/><path d="m200.7 472.4h-.6l-9.4 9.6c-.1.5-.2 1-.3 1.6l10.3-10.5z" fill="#808080"/><path d="m200.7 476.9-11 11.3c-.1.5-.2 1-.2 1.5l11.3-11.6v-1.2z" fill="#808080"/><path d="m200.7 482-11.9 12.2c0 .4-.1.9-.1 1.4l12-12.3z" fill="#808080"/><path d="m200.7 487.1-11.9 12.2c0 .4 0 .8.1 1.2l11.9-12.1v-1.3z" fill="#808080"/><path d="m200.7 492.3-11.5 11.8c0 .4.1.8.1 1.1l11.4-11.7z" fill="#808080"/><path d="m200.7 497.4-10.7 11h1.2l9.5-9.7z" fill="#808080"/><path d="m200.7 502.5-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m200 508.4h.7v-.8z" fill="#808080"/><path d="m211.5 580.5h3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.6v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.5-3.8-.8h-.7-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.6v.6 3.8 1.3 3.2c2.4 8.5 5.1 17.6 7.9 27.1h1.6 1.4z" fill="#e8e7e8"/><path d="m236 581.1-20.8 21.3c.3 1 .6 2 .9 3l19.9-20.4z" fill="#e8e7e8"/><path d="m208.7 580.5c.1.4.2.8.4 1.3l1.2-1.3z" fill="#e8e7e8"/><path d="m211.5 580.5-2.2 2.2c.3 1 .6 2 .9 2.9l5.1-5.2h-3.8z" fill="#e8e7e8"/><path d="m236 601.6-14.6 14.9h3.8l10.8-11z" fill="#e8e7e8"/><path d="m216.5 580.5-6 6.2c.3 1 .6 2 .9 2.9l8.9-9.1z" fill="#e8e7e8"/><path d="m236 611.9-4.5 4.6h3.7l.8-.8z" fill="#e8e7e8"/><path d="m236 606.8-9.6 9.7h3.8l5.8-5.9z" fill="#e8e7e8"/><path d="m236 591.4-18.5 18.9c.3 1 .6 2 .9 3l17.6-18z" fill="#e8e7e8"/><path d="m236 586.2-19.6 20.1c.3 1 .6 2 .9 3l18.8-19.2v-3.9z" fill="#e8e7e8"/><path d="m236 600.3v-3.8l-17.3 17.7c.2.8.4 1.5.7 2.3h.9z" fill="#e8e7e8"/><path d="m226.6 580.5-13.7 14c.3 1 .6 2 .9 2.9l16.6-17h-3.8z" fill="#e8e7e8"/><path d="m221.5 580.5-9.9 10.1c.3 1 .6 2 .9 2.9l12.8-13.1h-3.8z" fill="#e8e7e8"/><path d="m231.6 580.5-17.6 18 .9 3 20.5-20.9h-3.8z" fill="#e8e7e8"/><path d="m210.3 580.5-1.2 1.3c.1.3.2.7.3 1l2.2-2.2h-1.3z" fill="#808080"/><path d="m215.3 580.5-5.1 5.2c.1.3.2.7.3 1l6-6.2z" fill="#808080"/><path d="m220.3 580.5-8.9 9.1c.1.3.2.7.3 1l9.9-10.1z" fill="#808080"/><path d="m225.3 580.5-12.8 13.1c.1.3.2.7.3 1l13.7-14h-1.2z" fill="#808080"/><path d="m230.3 580.5-16.6 17c.1.3.2.7.3 1l17.6-18z" fill="#808080"/><path d="m236 580.5h-.6l-20.5 20.9c.1.3.2.7.3 1l20.8-21.3z" fill="#808080"/><path d="m236 585-20 20.3c.1.3.2.7.3 1l19.6-20.1v-1.2z" fill="#808080"/><path d="m236 590.1-18.8 19.2c.1.3.2.7.3 1l18.5-18.9z" fill="#808080"/><path d="m236 595.2-17.6 18c.1.3.2.7.3 1l17.3-17.7z" fill="#808080"/><path d="m236 600.3-15.8 16.2h1.2l14.6-14.9z" fill="#808080"/><path d="m236 605.5-10.8 11h1.2l9.6-9.7z" fill="#808080"/><path d="m236 610.6-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m235.2 616.5h.8v-.8z" fill="#808080"/><path d="m200.7 545.1-1.8 1.9c.3 1 .6 2 .8 3l1-1z" fill="#e8e7e8"/><path d="m200 550.9c.2.8.5 1.6.7 2.5v-3.2z" fill="#e8e7e8"/><path d="m198.2 544.4c.1.5.3 1 .4 1.5l1.5-1.5z" fill="#e8e7e8"/><path d="m200.7 544.4h-.6l-1.5 1.5c.1.3.2.7.3 1l1.8-1.9z" fill="#808080"/><path d="m200.7 548.9-1 1c.1.3.2.7.3 1l.7-.7z" fill="#808080"/><path d="m231.6 652.5h3.8.6v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.3-3.8-1.3-3.8-1.3-.9c3.4 11.9 6.8 24 10 36h1 1.5z" fill="#e8e7e8"/><path d="m231.6 652.5-1.8 1.9c.3 1 .5 2 .8 3l4.8-4.9z" fill="#e8e7e8"/><path d="m236 663.4-3.1 3.2c.3 1 .5 2.1.7 3.1l2.4-2.4z" fill="#e8e7e8"/><path d="m229.3 652.5c.1.3.1.6.2.8l.8-.8z" fill="#e8e7e8"/><path d="m236 658.3-4.1 4.2c.3 1 .5 2 .8 3.1l3.4-3.4v-3.9z" fill="#e8e7e8"/><path d="m236 653.2-5.2 5.3c.3 1 .5 2 .8 3l4.4-4.5z" fill="#e8e7e8"/><path d="m235.8 679c.1.3.1.5.2.8v-1z" fill="#e8e7e8"/><path d="m236 668.6-2.1 2.2c.2 1 .5 2.1.7 3.1l1.4-1.4z" fill="#e8e7e8"/><path d="m236 673.7-1.1 1.2c.2 1 .5 2.1.7 3.1l.4-.4z" fill="#e8e7e8"/><path d="m230.3 652.5-.8.8c.1.3.2.7.3 1l1.8-1.9h-1.3z" fill="#808080"/><path d="m236 652.5h-.6l-4.8 4.9c.1.3.2.7.3 1l5.2-5.3v-.6z" fill="#808080"/><path d="m236 657-4.4 4.5c.1.3.2.7.3 1l4.1-4.2z" fill="#808080"/><path d="m236 662.1-3.4 3.4c.1.3.2.7.3 1l3.1-3.2z" fill="#808080"/><path d="m236 667.3-2.4 2.4c.1.3.2.7.2 1l2.1-2.2v-1.2z" fill="#808080"/><path d="m236 672.4-1.4 1.4c.1.3.2.7.2 1l1.1-1.2v-1.2z" fill="#808080"/><path d="m236 677.5-.4.4c.1.3.2.7.2 1l.2-.2z" fill="#808080"/><path d="m303.3 226.2h2.3c-1-7.8-1.9-15.5-2.9-22.8-4.9-37.9-10.3-148.4 115.9-148.4 114.3 0 120.8 110.5 115.9 148.3-1 7.3-1.9 15-2.9 22.8h2.3c20.1-14.9 21.8 23.9 13.4 37.2-6.9 11-7.1 12.2-11.3 24.2-3.1 8.9-8.2 10.1-12.5 9.1-.5 5.3-1 9.9-1.3 13.5-1.8 20.4-50.9 61.2-62 74-10.4 12-27.8 7.3-33.3 7-5.6-.3-8.3-.4-8.3-.4s-2.7.1-8.3.4-22.9 4.9-33.3-7c-11.1-12.8-60.1-53.6-62-74-.3-3.7-.8-8.3-1.3-13.5-4.3 1-9.4-.2-12.5-9.1-4.2-12.1-4.3-13.3-11.3-24.2-8.3-13.2-6.7-52 13.4-37.1z" fill="#b56441"/><path d="m321.1 287.5s2.3 6 2.3 6c16.8 51.4 66 65.6 92.2 66.4 1 0 1.5-22.8 1.5-22.8-1.5 0 6.4-.3 6.8 0 0 0 .6 22.6 1.1 22.6 24.5-1.1 73-12.5 88.9-61.1 0 0 2.2-11.1 2.2-11.1.4-1.5 11.9-47.9 13-43.6-.4 3.4-.8 6.8-1.3 10.2 0 0-2.5 29.6-4.3 42.7-.5 5.3-.9 9.9-1.3 13.5-2.5 20.2-8 26.7-12.8 34.2 0 0 0 .1-.1.1-15.8 19.6-36.1 41.7-43.7 50.4-10.4 12-33.1 12.7-38.7 12.4-5.2-.2-7.9-.4-8.2-.4h-.1c-.4 0-3 .2-8.2.4-5.6.3-28.3-.4-38.7-12.4-7.7-8.8-27.9-30.9-43.7-50.4 0 0 0-.1-.1-.1-4.9-7.5-10.4-14-12.8-34.2-.4-3.6-.8-8.3-1.3-13.5-1.9-13.1-4.3-42.7-4.3-42.7-.4-3.4-.8-6.8-1.3-10.2 1-4.4 12.6 42.1 12.9 43.6z" fill="#582d11"/><path d="m422.1 298c10.9-.1 49 14 46.4 17.9-8.2 10.1-30.4-10.9-46.9-10.1-27 1.4-38.7 20.2-46.9 10.1-2.6-3.9 34.3-17.8 47.4-17.9z" fill="#582d11"/><path d="m533.7 209.3c-4.6 2.5-13.2-25.6-37.2-44.9-6.7-5.4-26.4-21.5-78-21.5v-92.5s51.9-3.6 86.9 33.7c35.2 37.3 44.1 116.9 28.3 125.2z" fill="#b56441"/><path d="m303.5 209.3c4.7 2.5 13.2-25.6 37.2-44.9 6.7-5.4 26.4-21.5 78-21.5v-92.5s-51.9-3.6-86.9 33.7c-35.1 37.3-44 116.9-28.3 125.2z" fill="#b56441"/><path d="m481.8 392.2-63 31.3 5.4 67.5 90.7-59.1z" fill="#e0e0e0"/><path d="m355.2 392.8 63.6 30.7-4.9 67.5-94.8-57z" fill="#e0e0e0"/><path d="m533.6 994.8-40.1-.1 73.2-559.5c6.2.6 27.9 3 31.9 4.3 3.9 1.3-65 555.3-65 555.3z" fill="#4189c6"/><path d="m318.7 980.6 43 4.6-67.6-552.1c-6.2.6-30.1 3.4-35.2 3.9z" fill="#4189c6"/><path d="m407.9 693.6c0 3.2 2.6 5.7 5.7 5.7 3.2 0 5.7-2.6 5.7-5.7s-2.6-5.7-5.7-5.7c-3.1-.1-5.7 2.5-5.7 5.7z" fill="#4189c6"/><path d="m407.9 601.1c0 3.2 2.6 5.7 5.7 5.7 3.2 0 5.7-2.6 5.7-5.7 0-3.2-2.6-5.7-5.7-5.7-3.1-.1-5.7 2.5-5.7 5.7z" fill="#4189c6"/><path d="m405.2 508.5c0 3.2 2.6 5.7 5.7 5.7 3.2 0 5.7-2.6 5.7-5.7 0-3.2-2.6-5.7-5.7-5.7s-5.7 2.6-5.7 5.7z" fill="#4189c6"/><path d="m413.7 786.1c0 3.2 2.6 5.7 5.7 5.7 3.2 0 5.7-2.6 5.7-5.7 0-3.2-2.6-5.7-5.7-5.7s-5.7 2.5-5.7 5.7z" fill="#4189c6"/><path d="m417.4 878.6c0 3.2 2.6 5.7 5.7 5.7 3.2 0 5.7-2.6 5.7-5.7 0-3.2-2.6-5.7-5.7-5.7s-5.7 2.6-5.7 5.7z" fill="#4189c6"/><path d="m365.2 203c12.8 0 23.2 10.4 23.2 23.2s-10.4 23.2-23.2 23.2-23.2-10.4-23.2-23.2 10.4-23.2 23.2-23.2z" fill="#fff"/><path d="m374.5 226c0 5.4-4.4 9.9-9.9 9.9-4 0-7.5-2.4-9-5.9.6.4 1.3.6 2 .6 2.3 0 4.1-1.8 4.1-4.1s-1.8-4.1-4.1-4.1c-.9 0-1.8.3-2.4.8 1.2-4 5-7 9.4-7 5.5-.1 9.9 4.4 9.9 9.8z" fill="#3f2609"/><path d="m470.2 203c12.8 0 23.2 10.4 23.2 23.2s-10.4 23.2-23.2 23.2-23.2-10.4-23.2-23.2 10.4-23.2 23.2-23.2z" fill="#fff"/><path d="m479.5 226c0 5.4-4.4 9.9-9.9 9.9-4 0-7.5-2.4-9-5.9.6.4 1.3.6 2 .6 2.3 0 4.1-1.8 4.1-4.1s-1.8-4.1-4.1-4.1c-.9 0-1.8.3-2.4.8 1.2-4 5-7 9.4-7 5.5-.1 9.9 4.4 9.9 9.8z" fill="#3f2609"/><path d="m433.9 443s-88.1-49.1-95.1-17.5-15.1 55.7 8.2 59.7c23.3 4.1 86.9-42.2 86.9-42.2z" fill="#3373aa"/><path d="m418.6 435.7c24.8-13.4 73.9-36.4 79.9-13 8.2 31.5 17.1 55.3-6 60.2-16.2 3.5-53.2-17.3-73.8-29.9-.2-15.3.2-2.2-.1-17.3z" fill="#4189c6"/><path d="m367.1 164.6c-24.7.5-39 8.6-39 16.9 0 8.4 13.2 6 23 2.1s22.9-3.6 28.3.4 17.2 5.2 17.7-3.3-21.5-16.3-30-16.1z" fill="#582d11"/><path d="m467.9 164.4c24.7.5 39.1 8.5 39.1 16.9 0 8.3-13.2 6-23 2.1-9.9-3.9-22.9-3.6-28.4.4s-17.2 5.1-17.7-3.3c-.5-8.5 21.6-16.3 30-16.1z" fill="#582d11"/><path d="m388 323s8.4 14.5 31.7 14 31.2-14 31.2-14-15.2-4.9-27.5-4.9c-5.3 0-10.7 2.9-17.7 4.1s-17.7.8-17.7.8z" fill="#c18c7e"/><path d="m366.4 996-47 6.4c-.6.1-1.2-.4-1.3-1l-9-66.2c-.1-.6.4-1.2 1-1.3l47-6.4c.6-.1 1.2.4 1.3 1l9 66.2c.1.6-.4 1.2-1 1.3z" fill="#474b56"/><path d="m536.9 1006.1-47.1-6c-.6-.1-1.1-.6-1-1.3l8.4-66.3c.1-.6.6-1.1 1.3-1l47.1 6c.6.1 1.1.6 1 1.3l-8.4 66.3c-.1.6-.7 1-1.3 1z" fill="#474b56"/><path d="m241.3 769.1c-8.2 5.4-16.6 10.4-25.2 14.9-2.1 1.1-5 3.4-7.5 2-1.4-.8-2.8-4.6-3.6-6-2.5-4.4-4.7-8.9-6.7-13.6-.7-1.8-3.6-1-2.9.8 2.3 5.4 4.8 10.7 7.8 15.8 1.6 2.8 3.2 7.1 7.1 6.8 2-.1 4-1.5 5.6-2.4 3.1-1.6 6.2-3.3 9.2-5 6-3.4 11.9-7 17.7-10.8 1.6-.9.1-3.5-1.5-2.5z" fill="#3a3032"/><path d="m529.4 158.2c-.2-.1-.4-.2-.6-.3-51.9-25-108.1-49.9-163.6-34.2-35.2 10-65.9 21.4-76.3 23-11.3 1.8-23.8-10.9-17.8-17.3 22.9-24 55.4-29.7 62.5-30.1 23-1.4 39.3-1.7 62.2-1.4 43.9.5 87.4-3.2 130.8-10 8-1.3 12.2-10 23.8 1.7 16.4 16.5 13.6 54-2.6 77.3-3.1 4.8-11.8-4.1-18.4-8.7z" fill="#474b56"/><path d="m556.4 102.9c-51.3 10.2-107.5 6.7-159.7 6.8-47.7 0-71.5 7.9-112.2 37.3-9.4 6.8-19.2 11.1-8.3-13.4 16.8-37.7 65.3-74.1 132.5-85.3 49.3-8.2 100.3 5.2 138.7 38.8 7 6 7.6 13.2 9 15.8z" fill="#474b56"/><path d="m340.5 131.4c-12.4 3.6-11.9 11.5-62.3 22.3-22.4 4.8-19.1-20.2-19-20.6 3.9-16.6 37.5-30 59.9-25.4 5.6 1.2 75.4-23.5 143.1 8.6 28.7 13.6 39.8 12.1 82.3 48.9.9.7-.1 2.1-1.1 1.5-12.9-8.7-31.9-20-47-22.3 0 0 0 0-.1 0-36.8-9.2-50.8-24.8-92.3-22.7-50.7 2.6-64.3 8.3-63.5 9.7z" fill="#474b56"/><path d="m259.7 140.9s-10-18.5 36.9-37.8c57.3-23.6 109-.6 169.6 21.1 11.6 4.2 30.9 15.5 32.6 20.8.5 1.6-75-18.5-147.3-28.3-59.3-8.1-79.8-.1-91.8 24.2z" fill="#3d4251"/><path d="m133.7 771.9 10.7-50.9s32.1-9.9 72.6-5.6c40.5 4.2 56.3 24.5 56.3 24.5l-27.3 69-90.8-13.1c-14.4-2-23.9-12.6-21.5-23.9z" fill="#e0e0e0"/><path d="m171.2 781.3c26.6-56.3 75.4-163.5 85.6-211.3 1.7-7.9 5.1-15.3 10.4-21.3 13.1-15.3 24.5-10.5 32.9-1.2 11 12.3 14.6 29.5 10.1 45.4l-37.8 133.7s-35.9 100.9-45 121.5c-7.5 16.8-21 7.4-39.7-5.4-19.7-13.7-26.7-39.7-16.5-61.4z" fill="#b5694e"/><path d="m273.8 601.5c-12.3-11.8-48.4-109.2-33.7-123.2s36.1-36 47.8-39.8c11.8-3.8 20-7.6 28.2-3.8s30.3 17.3 32.6 29.1c2.3 11.9-28.1 33.4-32.5 44.3-4.4 10.8 3.8 43.4 1.5 52.2s-3.8 44.4-22.9 46.8c-19.1 2.3-8.8 6.3-21-5.6z" fill="#b56441"/><path d="m221.5 772c-1.2 1.4-2.3 2.5-3.2 3.3s-1.8 1.4-2.5 1.8c-.8.4-1.5.6-2.1.6-.7 0-1.4-.2-2.1-.5s-1.2-.7-1.5-1.2-.5-1.1-.5-1.7c-.1-.6-.1-1.3 0-2.1s.1-1.6.1-2.4c0 0 0-.3 0-.8s0-1.2 0-2.1c0-.8 0-1.8 0-2.8s0-2 .1-3c0-1 .1-1.9.1-2.8s.1-1.6.1-2.1c0-.3.1-.6.2-.9s.3-.6.6-.7c.2-.2.5-.3.8-.3.3-.1.6-.1.9 0 .3 0 .6.1.8.1.2.1.4.1.6.2s.2.1.3.1c.5.2.8.5.9.9s.2.8.1 1.3l-1.7 16.9 9.7-10.2c.2-.2.4-.3.7-.5s.6-.4 1-.5.8-.2 1.2-.2.8 0 1.2.2.7.5.8 1 .1 1-.2 1.6c-.2.5-.6 1.1-1.1 1.6-.5.6-1 1.1-1.6 1.7s-1.2 1.2-1.9 1.8c-.7.5-1.3 1.1-1.8 1.7z" fill="#333"/><path d="m238.4 760c-1.7-.7-3.2-1.8-4.7-3.2s-2.7-3-3.7-4.9c-1-1.8-1.8-3.9-2.3-6-.5-2.2-.6-4.4-.3-6.7-1.3.7-2.6 1.3-4 1.8-1.3.5-2.6.9-3.9 1.1s-2.5.4-3.7.3c-1.2 0-2.2-.3-3.2-.7-1.3-.5-2.4-1.2-3.4-2s-1.9-1.6-2.6-2.5c-.8-.9-1.4-1.9-1.9-2.9s-.8-2-1.1-3c-.2-1-.3-2-.2-2.9.1-1 .3-1.9.7-2.7.5-1.1 1.2-2.1 2.3-2.8 1-.8 2.3-1.3 3.9-1.6s3.5-.2 5.6.2c2.2.4 4.6 1.2 7.4 2.4 2 .9 3.9 1.8 5.6 2.7s3.4 1.9 4.9 2.9c.8-.5 1.6-1.1 2.4-1.7l2.4-1.8c.2-.1.4-.3.6-.4.2-.2.5-.4.7-.5.3-.2.5-.3.7-.4s.4-.1.5-.1c.1.1.2.2.3.3.1.2.1.3.2.5 0 .2.1.4.1.5v.4c0 .3 0 .6-.2.9-.3.7-.8 1.4-1.5 2.3-.7.8-1.5 1.7-2.4 2.6 2 1.5 3.8 3.1 5.4 4.7s2.9 3.2 4 4.7c1.1 1.6 2 3.1 2.7 4.6s1.2 2.9 1.4 4.3c.3 1.4.4 2.6.3 3.8s-.3 2.2-.7 3.2-1 1.8-1.8 2.4c-.8.7-1.7 1.1-2.7 1.4-1.1.3-2.2.3-3.5.2-1.3-.3-2.7-.7-4.3-1.4zm3.3-4.2c1.3.5 2.3.7 3.2.5s1.5-.7 1.8-1.5c.4-.8.4-1.9.1-3.2s-.9-2.9-2-4.5c-1-1.7-2.5-3.5-4.4-5.5s-4.3-3.9-7.2-6l-.7.5c-.3 1.4-.4 2.8-.3 4.2s.4 2.8.8 4.1.9 2.6 1.6 3.9c.7 1.2 1.4 2.3 2.2 3.4.8 1 1.6 1.9 2.4 2.6.9.6 1.7 1.2 2.5 1.5zm-28.2-19.4c1 .4 2.1.6 3.2.6 1.2 0 2.4-.2 3.7-.5 1.3-.4 2.6-.9 4-1.5 1.4-.7 2.8-1.4 4.3-2.3-1.6-1-3.4-1.9-5.2-2.9s-3.8-1.9-6-2.8c-1.5-.6-2.7-1.1-3.8-1.3-1.1-.3-2-.4-2.8-.3-.8 0-1.4.2-1.8.5-.5.3-.8.7-1 1.2s-.3 1-.3 1.5c0 .6.1 1.2.3 1.8s.5 1.2.8 1.9c.3.6.7 1.2 1.2 1.7l1.5 1.5c.7.3 1.3.7 1.9.9z" fill="#333"/><path d="m245.5 693.2c1.3 1.1 2.6 2.1 3.8 2.9s2.3 1.5 3.2 1.9c.8.4 1.6.5 2.2.3.6-.1 1.1-.6 1.5-1.4.1-.3.2-.7.2-1.2s-.1-1.1-.2-1.8-.4-1.6-.7-2.5-.7-2-1.2-3.2h.6 1.2c.6 0 1.3.1 2.3.1.6 1.3 1 2.7 1.4 3.9.3 1.3.6 2.4.7 3.5s.1 2.1 0 3-.3 1.7-.6 2.4c-.3.8-.8 1.4-1.4 2-.6.5-1.3.9-2 1.2-.8.2-1.6.3-2.5.3-.9-.1-1.9-.3-2.9-.8-.4-.2-.8-.4-1.3-.7s-1.1-.7-1.7-1.1-1.3-.9-2-1.5-1.5-1.2-2.3-1.8c-.5 1.7-1.1 3.4-1.6 5s-1 3.2-1.6 4.7c.9.8 1.7 1.6 2.6 2.4.8.8 1.6 1.5 2.4 2.2.7.7 1.4 1.3 2 1.9l1.5 1.5c1 1.2 1.7 2.2 2 3s.3 1.4.1 1.9c-.1.3-.3.6-.5.8s-.5.4-.8.6c-.3.1-.6.2-.9.2s-.6 0-1-.2c-.2-.1-.4-.2-.5-.3-1.7-1.3-3.2-2.7-4.7-4.1s-2.9-2.7-4.3-4.1c-.3.7-.6 1.3-1 1.9s-.8 1.1-1.3 1.5-1.1.7-1.7.9-1.4.3-2.2.3c-.2 0-.5-.1-.6-.1-.2 0-.4-.1-.5-.2-.5-.2-.7-.5-.6-.9.1-.2.3-.4.7-.6s.9-.4 1.7-.6c.2-.6.5-1.2.7-1.8s.5-1.2.8-1.9l.8-1.8c-1-.9-1.9-1.9-2.8-2.7-.9-.9-1.8-1.7-2.6-2.5-.6-.5-1.1-.9-1.7-1.4-.6-.4-1.2-.7-1.8-1-.5-.2-.9-.4-1.4-.5-.4-.1-.9-.1-1.2 0-.4.1-.7.2-1 .5-.3.2-.5.6-.7 1s-.3.8-.4 1.4c-.1.5-.1 1.2-.1 1.9s.1 1.5.2 2.4.4 1.9.7 3c.1.4.2.7.2 1s-.1.5-.1.7c0 .1-.2.1-.6 0-.3-.1-.8-.2-1.2-.5-.6-.3-1.2-.7-1.6-1.3s-.8-1.2-1.1-1.9-.5-1.5-.6-2.3-.2-1.7-.1-2.5c0-.8.1-1.6.3-2.4s.4-1.4.6-2c.4-.9.9-1.6 1.4-2.3.6-.7 1.3-1.2 2-1.6.8-.4 1.7-.6 2.6-.5 1 0 2.1.3 3.2.8.6.2 1.2.6 1.9 1.1s1.5 1 2.4 1.7c.9.6 1.8 1.3 2.7 2.1s1.9 1.6 2.9 2.4c.5-1.3 1-2.8 1.6-4.4s1.2-3.3 1.8-4.9c-1.8-1.5-3.6-3.2-5.5-4.9s-3.7-3.5-5.4-5.2c-.6-.6-1-1.2-1.2-1.9-.2-.6-.2-1.3.1-1.9.1-.3.3-.5.4-.7.2-.2.4-.4.6-.5s.5-.2.8-.2.6.1.9.2.6.3 1 .5.7.5 1.1.8c.6.6 1.3 1.3 2.1 2 .7.7 1.5 1.4 2.3 2.1s1.6 1.5 2.4 2.2 1.6 1.5 2.5 2.2c.3-.8.5-1.5.8-2.1.2-.6.4-1.1.5-1.4 0-.1.1-.3.1-.4s.1-.2.1-.3c.2-.4.3-.7.5-.8s.4-.3.5-.4c.2-.1.4-.1.6-.1s.4.1.7.2.5.3.6.4c.1.2.2.4.2.6v.6c0 .2-.1.4-.1.6-.1.4-.2.6-.2.8s-.1.3-.1.3v.1.1c0 .1-.1.2-.1.4-.1.2-.2.5-.3.9-.1.5-.3.9-.4 1.4-.5.6-.7 1-.8 1.4z" fill="#333"/><path d="m265.3 671.2c-.1.8-.1 1.7-.2 2.6 0 .9-.1 1.7-.1 2.6 0 .8-.1 1.6-.2 2.3s-.3 1.4-.5 1.9c-.3.6-.6 1-1 1.2s-.8.2-1.2.1c-.4-.2-.7-.4-1-.6-.3-.3-.5-.5-.7-.8s-.3-.6-.4-.8c-.1-.3-.1-.5-.2-.7l.9-14.7-9.7 11.6c-.3.4-.7.7-1 .8-.3.2-.8.1-1.2-.1 0 0-.1 0-.2-.1s-.3-.2-.5-.3-.4-.3-.6-.5-.4-.4-.5-.7c-.1-.2-.2-.5-.3-.8 0-.3 0-.6.2-.9.1-.3.3-.5.5-.8.3-.4.7-.8 1.2-1.4.5-.5 1.1-1.1 1.7-1.7l1.8-1.8c.6-.6 1.2-1.2 1.7-1.7s.9-.9 1.3-1.2c.3-.3.5-.5.5-.5.6-.6 1.2-1.1 1.7-1.7s1-1 1.5-1.4 1-.7 1.6-.8c.5-.1 1.2-.1 1.8.2.7.3 1.4.7 1.8 1.2.5.5.8 1.1 1.1 1.9.2.8.4 1.8.4 3.1 0 1.2-.1 2.7-.2 4.5z" fill="#333"/><path d="m705.2 772.5-16.2-49.3s-33-6.3-72.8 2.4-53.3 30.5-53.3 30.5l34.9 65.7 88.8-23c14-3.7 22.2-15.3 18.6-26.3z" fill="#e0e0e0"/><path d="m670.7 775.2c-26.6-56.3-75.4-163.5-85.6-211.3-1.7-7.9-5.1-15.3-10.4-21.3-13.1-15.3-24.5-10.5-32.9-1.2-11 12.3-14.6 29.5-10.1 45.4l37.8 133.7s35.9 100.9 45 121.5c7.5 16.8 21 7.4 39.7-5.4 19.6-13.7 26.7-39.7 16.5-61.4z" fill="#b5694e"/><path d="m568.1 595.4c12.3-11.8 48.4-109.2 33.7-123.2-14.7-14.1-36.1-36-47.8-39.8-11.8-3.8-20-7.6-28.2-3.8s-30.3 17.3-32.6 29.1c-2.3 11.9 28.1 33.4 32.5 44.3s-3.8 43.4-1.5 52.2 3.8 44.4 22.9 46.8c19 2.3 8.7 6.3 21-5.6z" fill="#b56441"/></svg> \ No newline at end of file diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_1_head-192.png b/borestop/src/main/webapp/content/images/jhipster_family_member_1_head-192.png new file mode 100755 index 0000000000000000000000000000000000000000..ac5f2a00ac809809f7e48628d79e04849ebad98b GIT binary patch literal 7046 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 S!t<8`Kvhvo0VZc1_WuB}nB+SE literal 0 HcmV?d00001 diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_1_head-256.png b/borestop/src/main/webapp/content/images/jhipster_family_member_1_head-256.png new file mode 100755 index 0000000000000000000000000000000000000000..443822e8ea1f8db01adc11f33e8685fb14b997dc GIT binary patch literal 9505 zcmZ{KWl$Wz((Ufz5(oqh1W3>j91<KBCqS^^5ZpZpZo9Z!@Zhe2#eG@a-Q8V-1>eX0 zzPj(%dtE)%r%%=C>K`*xQ!^8)tSIvW`!zNI0C@3PR#FuJ06s$?02Ado*pz9h0RW&! zWd${<=hR6>+SoZ*K}_tkl$?^ZjD+l01to21Idy3{4QY9eXCNc5A@e`@8AyIsm-?*s zOiIeCgQeAk#Z`F0DoS6})a8^6l$7nh%E(G72W!cs=}VOuh*TJfRGUiFn2ObziXqH| znk^)&%p{-FXRkFCE7upUF%>VjQmD6(Y_*ntCi8XqGc`Y@eB}z4|KKOh=pssE%SU1M zk?gzR8&7fCU&`zToJ5soQo8JfTC4=>AMl?gN{qNLbLna`iE0BuxR+sXl*?#F=zMK{ zdw@-|lV*e6m$A~+vz?89*Z+`6<i*A1!Q%Aaqr=Uf#tKc2&8gAF+1b&)p4suy)6=u{ zrNzFs7IhJNX*NO;dd#e-AXY-aP*;0PMM=)D@Pt4J)X~bx!f0=Ey`?m7erj@MVZN=p zqC6vcb9J@8tVoajl`b2h4jZ91E5ZNzbDwR&E?O)EhzOq=t1r(zKdaW))@P@twzszz z$46F{mR6r_Wo2W1V|8_{zXP$*-!a|Uvbwaqd2l@3T(h;gxw*c+y}7Z_-?_Q5xiZq% zKe^P@KT`mon4DYL-rD||Gbk3)&EwmdSU0w{v8f(hB@L+%aw#%P?oy2I6%OiRw8`iG zSsYZ-mz<ciFh8G?oH9K%)zRMW7V=vz6fPgxBN5s&I5NJscTnkWRF{=J(BGfw<DBkn zE)&)z5!x*k+>U_5J3BhPynV*UCIY=Z(rvZ-YW@WK`b0s!yuBg5zJ5>$#Lho~H+<|% zP(!$fQ|eFC$nfyNfx+^kf{@^#SSRapb6G!MUnmsn1c@~C$t<!`s;jIh$<COXn1Hv! zH#fI3Gc#Ko>R=VHw6wH3Sh<^r$Kl~I3<lfU+$#PZ@8sm1lAK(apI=*))78>gm=JZa ze;6GVRaRQMyR(}b9X>fcxWBjGSzn!-9M@G<n(-@A*FL1Mu&_EWBhVK*J~kenRWs4k znd_ik?4WI9ZIhE2>tJu+*V`A*mR|6@0FX|qieCZPM6a3o<n@B{n&vi-{vn4Femu{Z z|Fwtzf{&psBgFemNaXc@ng2w&=aGf9Uj8q4|6lO`kMhgaj@Ji0Pl-t6J)O^|W}+43 zS?P6c|9=$8$j?aA|CiM7tnGN4!8EopZukLtywD`RkNn@xA_esP3R<4UPygdc<ko-W zPso9ptHG!7sa+(p{tk&;-+v}|{wn|9($9hoq+RI9%*D`3NuCf506;VKSyD{R4Y)KD z=u7_=7cj=*7nijNDcr3;p-!I#5C(G2)loB&s#=-6A<U`O4`#Y?Kf*0PiCNGMmaPCg zNq@j2?Y{nMd523qdYBKIU3u&M`@*PAb&uZLp8&%jCuU`wm!I0mZt?y8C#LJb%nFu? z;j|SasUu9aZ~;U9ahhrW->e#ULDu0EEE2D+5z<<n>%|1Moezpi#|@Zqi|=Yb-pXzz z>ih&1)S?}{<w}l&O$D2Cyd^27fFPWb3!`E>P4V*Js0#G&u3S1KLBg_a+p7}}Q@H+C zmUpzfdin{e5B}!dwQcc({vvHq#-Vm)w#<ZA)44|I&F*eKr=oL4d<A;9K?>?jWJfXE zi-gM~9AsAi8imMWG3<lCUn|=uO;-J+F?8o(!M|xZf;2#UwEjI+K$p+K2r|w#*T2D| zmQNUjL6`=z%a{9JvV%in$jHMd#o*@VgJUqhCz4cO@iNZ68tljrknOnKS|h>a`#IUb z^%T<TO!~Vv{uI6CpI>1KGY(*c9~La3fmzL}4;{uh;_VTLCKHeN_?K8sM)DL-`^5m8 zZ-(Q;q8S?ASK|Urp5pdHjw6?Q_8!AOZT~XESh(b)eUtZv%R67bZ1rZu5y$#;2juX( zs{p);Lxqp{)jAB}6pTfVt=-&2;(v@IGY<o{dglASKi7A3<Vky(A|e)-6Wq)ca%ea{ zNs8E7#>i9Z)C=B~4|spd!`IgY5{XUoB67Lk#4cO7i$;e3TXtnC_I4+-AIPrpR(5?_ z={hZX%YV+KHfX03+&-<l`{vC3qKz;x<Z1c-GR_O?&QCDP09RBH#bk8gz6aX{jb3l~ z>lb!kPC80*+<t>zWAq*N1YI37KZNthVpjMJJ1btJ)gfzYw|V!KbGh$i#DEala0ak% zMdxu_9;QYUqZknR6vu#dS>NtH@&k0{{<D9``--vr0}#MlU*CK0gx!>zS?wE1x!B-4 zo9p)0o0L&oQAx1%-}NoK)(xc}%g^7{7pwX^Vx6+DrIPu9ZE3JKh5Q@aNReJ)SkH|8 zBN*D4A&S|-q!<M6g?2JfCi7zF@<eqQZZ&`Fu`zLT9glqK&DkKBa-8Fk<BtE?aKkU3 z8#|mG%l$i;<q1OWtNohM$9rgH_31HF^s6G^B3EzYbxIVOgQc@{iX<xog_BsloyxhE zC;cOtO+U{|<x%pyg5<ZBR66lT?Z1tp7`RN8gXv#z#!{KQr@N=IU>aBG!F5uM80O4- zHRi9rG+G&2mVzb}Gt7yi$PYAWplv7S8Z}EahBwg(WQA&=Oz<g|Li3%33mgc}$2iDB zt#~dG+K&F1NyZe+9upf`hkVyUS%R|0@jZFRS^-BL%p!eB>}DITVu)Xc`Xw%I_)g#6 z4@TTZRD6>19Wr|)ntQ7Uyk-j9WFmK@I3diX3wxI-@q$EJCC6E=<8M%SG64Dm<l!MP zXzhT;53PK=a}X@8CQ6`>Qn&s@U=wgceXP;oZ4&-V#_{x;Mb5=#9WGqOv>%<_Z^{K+ zJ`J0jb`{GhT|>Rb$BT}_i&paayQcIHKZ8=3pHIY2wxhu$c7ii%XKlZRDLp+?!Dsv? zx+Emrf}6wL_We|n*mt!uzJOsxeQm7d6N(>ocCi;(E)ToiZ$>{wBXhJq3YQIoM^%fG z5L?=n(viIiMF$3dfOno*6BVh$fje4*&`RU@YVt>7FmQOkDy^^retky~cuw@2l60W^ zu%cCax?>!bN0&tGZhK5j#pCe&;O^j@^-rF2^>%!twq%QArNaDsO92wG#h~>T_is(! zo)?N7ALLGpLQ0D{%}6+Py=z}g;q5N}n{s0tos#C5=RqkrZG-4adnw1`S>ubR%jC@< zR}$eb6vFcHD+Wj}zo?IMbEF6rzZ22<GH*1@0IS9T;D=BKWKA8mHyK-bXfv#t)WSc~ zt?k(lu&oxY3f#JRCXJbo*(8q-FqVKsSV%@F2pzSgygXXZI-Dj;#EhT(`xVsBY}oZm z)-9WVo3}Bw{u58BTpYdp2sM<bsV~kM)mMJyVNDjL&z)Hs(b|><W;C2S97_dy=>EL! z-ag*8u;^LeD_slbovmkYQLj}5MNnP;+5N+fPW!iJOvs;su|&b=?_VR=;OoWQ>)LUJ z?D^P?O048#`*B6Yma^#L$JBIE;y(lonSdT}b)v6{WkEW|s7(*MUJe#aqI?$dS8B7g zIQ7jJ2wU<3vHuISeAI~S4M|+5LX6$PelM0aQht8Dg0&)-j<d1d0Frh^hkTG;5qByj zB^A}E`I-C|^TLaexOvnASj6}odhJ&jrnKRi%nDA!gzrFuQpqbysZTYdN^goTEz{8+ zC>JakKUl5gUe$t?@c3%JY)JqU-sos<+9!e+Z<wetA3Xx38Q07?ZG?fLm)TWPM~X$M z=4>?)-FtD()FpDz{5^@mC0t=|G@A1U)bMR(aI;WZ2`*J!Goc}Y9EA=&NSoepsnC_3 z%;-d{l(MS^Cm#d#wC7d41fJcGp9(1g7~1hg>fnG7l|^oVNkIib63)ehu1aj_nZw+T z{~rE1ESk=oswN~q1grmF$Ym)xvrNk}8$hC*)z`_TgR*j(wvzq(y!Dt@cuXAa&KMPE zd`Z_HF;sw%pEC#7E%h7pfXAiY68>cbkKQ<yv7@A;PLM>{)0(=gPBFkbseMVsH3wCA zFVf)G!seIZ1^^r117XQ{N6qYFb;yAee5eLvX{h1Y&7T7cWwq{>-Om5)L#fHQI>TC0 z4Tv&XP;RO^R&{55Ey=3^%q!JZ!8-7yqX9;xz~q$OP}mryD;Ni3T5hc`@z%ULW8Ek) zi{WOEu|88Z*Zys;_4xjbEP0+_#M?^cdiQi77T1o0V3|V$CDEPoCPQ!+ZJrB_EO>}$ zu+=M8?;K03@7v^%YjERho7ZS-n92diGR2a_6iq$!F+QL>gSWpmf$K5{`HAyII2-oX zO}W<3XCw;>Jn@j#r|F!s3t?ueJuR9_B791`*C(idxiD^HrZZ4>;P=&13$sP0Af8Yb z3{uYsilknSUNrKBL*$OU-c5-~?Den`HIeGq&hLr&v8M=TmAh4?55g2ZR*BvA!-2B< zp5b+PIo}B#cRZGxm8Q}uky(_dnH{FLZB6z`?XNk(+cJm9t)<l;zZHov&YX?)QL3Uy z+aApS&<=#*?&40ai??3A_weuW>v_nxvQb#POrcPyqQxETn!|~H)cfuU$2qDhwHW=f zp3onjE<~Ud<o_f@ONA@dZ+})DbKFSYQuPt5i+u-e<L7bc8cyA5)H-pUdv?1X`&u_8 z-8pJezA|>Y-7B&)<2R_UmB7p(G**2}veED^3H>5-v9Jzi8e+ekRt!mHo(I1VO(gQK zq`|0J-uO&8)E4NXcnwj3S(Kch2_<8+<5%BMcRQVkIil~yeC{S)@&!!j6bw<ChO06q z<W`dyX1Q%qnH>Q6RnRZ`%_;(L7j4LAQmkcw940wa>M3@Xxs%r%hmomd%r?ItY4z0y z>2Vh^6?_1JNuRi7iufxiPk37deMf;*Ux@NyJBwB5f-XwYG%FVWTUvTO1Vb%;;vgcP z89H>593I1M65$1cTA3Kd;v<Gpl`FLC!ol@EX6XFZrv}d9Bk0PnmTc<;M8p#pFmuzP zerp5e)3!X4$G5P-j}0%cg64nN?!OiHl?o(K3kBnN8whBWPG108^hbZ#UJ^Kws7tGw z;hMcv`9>3uMJ{H|wX{r5TZ#>74<I1v7<nhXKz?MYXH+w6$T&$W{jKKfqq_7eSzY}- zDa~WQ^0bnHGxjOB3C4z769k6_6t|w&fhW^&BXg+vF5uWp#4I@P+<?M}Vx`v~Yi;A) zc-cBXd~wPlZ&|FooSodAx4u8AIdu}**eC_^iG%R9Ha-2O(~M|3q`R_%Jy}%hKk=!c zuEy0;++9_8>)=VZ1fQYrk>wh?X9_jvrz6aA%BVm_F5kdR{uxK1Yeor7t`RWm{-Df% zgHL^y&fcgmF29xXAC!(WW+E!+EUw5fRZg94_nTH;@m~F)Kek^i3pZ?(`{6TLE_(R% zU1Y;AwP0L<yodVW<Q=Cy88(XJZ_jvgd}aG!BlQ+BH|?G_GB;p<SjsnZ`wGoPApYnP z*PX`7-6L0+%ZY5XOWr-<H#T;&eR%_4Po=T`CCOVwdsoKe{n3|iua8zjA~Ld46O4lc zr*$T&OZ~qGh6@0dOucTsaiKJ1yJ=X!ccvODMLRkZ1_Kj}nB_&kGbV7Q-B@;Upv78s zaWK0<^$l4Hy^8H0+IPGZ6V$JQ4z1u7e=dXrVKkd4jv6mI6kcj!lWI%QT)5Oq-1(I@ zReZc4qnX!i=Q6f`S?6e*G+Rxm5FfSeV!&p)Kb!K}qN4UZmvhb62_H=5LO6$>x?I+7 z&DmBJD}r^huOo9u2K6Kq24n&`a$z{VTn9C`el0$dA)TkvyWCvf#6sdZ_QBuKvfIH{ zK<fZhZZCsF#rz=Gjm~?ebb(sr+1L}8=hf@bd77i{%J|AW0Ph#Wh~kWjtBnzRA7WcU zH#+T_y{=e^-6%ZGlV~a-trq0Y@li9+S1vzTJz~Re=Ny$}Ux%7XB7#H)&tPtOZ6h#O zcNK31a&xnP(aCOL%{yp-vzqbkQBgLA;@U!nn|Pf4kw{5L{%`LnZL`kI47`DUus9+L zj=Vb5^xA2w?aFM+e^_{jXxuble9Gs&)&4*UUVGR*ZfaYsJMnf!hHDDn9$(>K7S0}J zOYBRMb>Z^?EaL#cry1c`dP-r*Xq7<RhLOFIYrfde4uy#<vA?Xs%f2=eP&6>apofd& zI9GUzy$4lb_(~4&^3Q-APyhWC{U^xYfACX@A!av2W838N?<-!9?(J4aYR@Anj&xFy z>&oTAP8p?ik)PL*nJrIuht;}21$lWP#!Mu$KDQ4Y@4$xW3kcL-l8^?BlZxr2M28<m zH#n<)O73s^2HD##H*lJBZhGNQSCba(JRU#3dm2|KDISR>nz@<5LyIRdT!^5BI*k{7 ze19W3NZVXokn@v;`g5NJ(tP#`lU5(Ji4URx9InQD=##GnDq+~2S#MAP=>GM+7~*EP z6OA|1r0sO<dTyITy)GRMkjLx~!8e(u4&U?_(GA0qN!LqTdC2n>c|k0I<lT(JNbBx9 zY%m?EV&<J8jn@UzXYQ#x`etV_h{c{eYaC^5X=0d>$H`d+n5;{FgZDvxR~g{(W1HfX z+ArGs3)1X<fw^Ztz0B$@05^HcQ5@AgZckKD7Q(j{I{%L?8mOGaZc@=Q%Cj*U-E#5a zoQ4h7lwhY4XS1l3?tf`O#gqNU1i|72@i#NOmIiE5J^W2@9ciI{Ty3=#y!9^yy_m_& zQEM8<K;*Z}SMd^{5Yjjj9AttMcRv9wyHI~t#I$+cZ1GM8UuvGXwt#5ko#cye=TAH$ zfcKd~8HOUA^8QzuE*U=7Gytrt;E^=}0Ew2#kP17s$HzaKUh84IvVnwJ$X|#X9k5FY zCxEcLzXGGE4N@>DA1%raMlw^fyanCU9!`aP=G}aG=+JtbTJxA-u>Hn6oe*1qk!N0L z3~7i9eT7xX<Fz(3$o}DX^xy!GDw;T|K<XAH7*OO{!)3+n(E3>Igqikd7qzXxQRg#4 zo1N^i>~1>#PNFgJt<YHn-C)(Ks;TyHXMiOJ0KkR%a*i5<W>>MUD#+<}ojU(78oOQ* z%2Gg-BF?ZMX$?*Tq7?%ncfMcN#ROIBDKMi!&A;JrR&_`qJY9{$_6>go7)G!MG6z52 z4De2%wnYXSf3Vr7$7QcUX&xiugRuU2ig~^mNW_TlkHt)^(#Fm7*)gYBUkZgN^!kbb z9?I!Tr1o&i^RvLYl}5~OB0DuYD-moP2vSF^D<uSUw++MNP3&1V^MbBa`@V&}AL1$7 z36tfcaTRm8by6Yj`K|-}mmeTfz+sPNC&)C0T^gRXix$N=4uQUy6HQOz4IB%XETg!- z{G!E?dG4)af;n}oe2&%8$0y2n+1b^OpoolYVsb2JmrH{wHfDogt*>m_*z_iS{bD-m zOF`VRrIl26c;_vHNd?&nsxy2~585rYi7bt*t&J>wL2I)Xr?JvrBq1uRBl)o7Ak~~Z zpZDe08TF`*XC7|?XCBs8WanhB-|B5TWA8`w=%h{KM94n{BFdb8@Id_<ykePNP;JK2 zl`cy>H2~>$ZSq-ErjCicDzeXwMyWs-G6h0RyXNV9DyYDtqI3v$B@XJa=4FZ<%@26G zW_#ZxRH_q3GP#b7`{Y8WQt%R0C^K31-lwrm8hgF1nOZu5F#8$^dyM<E&xNokJ$g6s z7UjjnKx=W34;WLEQwN_|I^=z9O}EE{GH#D_UIaS?@R*5_xXR{VRK<jLj91Vv>^qq2 zV23gMq1oq?n$?id9;=t9%i?RHtAL{fYFX}UI|H3A=&q_x0oCMND?0EXL+$}4N<pHk zkB=N1{ATr{=g372p}k0sqj?*ZlLdhOZTX=|LZ9f`tq^mClVFjN;z=^_DmuCyEAKT@ z9;62un95HktYAQ0OCaH<vSdOzX<?lvT<V>IyRNy@tlq9%M(p@9)(j4duK-o(HB=kx z;Aqep-6u>_{&+q=E-qhFRXIk7#`B?}p~Vafi4@s(-}PCobP{VgQ5Vo{H!$xzLMfe7 z5)zI4!Tfk?sAKj+GBt&K&{nuac-~6zAL(yLJJf-AAlA_rz~u_rwlW(iQ<(6KC_+Lz z-?leTIMx{CYV*eT{X)A|TK__GKSc{;wZ14o@-_O33**UP;HQS+@DFSJE(986mf5Iw zzRg(BrjI=V6VBgl=w6a>FOG{*>g=TkxXz;VGr|(OjlTmF3)~@7GSo+lX!DDzdyx9Y zgs%7aA8CEJl89cHzrdL(n4HShw!{DW>HE;@b<6^K3JxFq3zy8AQ#m33S)$}_xAcNH z7;CXkc2BGF$H((u>+`iB^+jRl9uz500vzSyGXCV|ROZRQpfo)F4ND>2&2Y*C5@}x! z^mgT^2|KJpN75l<A(ALxKupQo%f3%Ic}Tg+r?l4tBG^z~#c9OIi6I{h?NbdJp|vG( zmguJajst=uhpwuBmaqpH#}RHM|7gOL^tC=5etU1L^kVcexa&IFP+j6=WBZT{z|ySv zk4wQ4$M(fCtzOT&kQ|~Cl6I{WFqO=uChO6)X&m6rMnnJ|a{HLZwO@%aIg!Og9J65v z!9p)EQ~(7;66`>BC4n&#g!QW?G+F<5e8f8rEgv^tGBlylQLxh)Z&*l!=~TW#8AB=B zyQvF-0HbzG@$+T*%R5XqP3g!rNtt}CNt!p)0dT0qC5DOQ-)1Iqwh=QZdzLb~+i;Y( zNG$QefLgQzC%R?0%=mBFAG(GWkoWV2V1?%jaxp0__BgV(@hLb&dZ`ojnHe)L(Ivkz zVcmf213FU@xk3$#h!#fNewD2Wjn=G@fnt~8x)qdPe$L?;wM*V|hZ;M=s$kJCO(lr{ z6_gE*79VgESoddMt?}%=dc;(~Dzoon4RU;EK;x`TIR8&@!Q)qmEr_=|ww2&28Le1N z6$k}8ZVgIcVU8sTpmxedS(GWdmzaL2E3s)}n6Ek^Cd*)Wle90FHq@k2e$h}c*R=Ki zcezc;w~_rf8C+<E!z$&p<OA`HS0@@gUx1p$csunciZJ}y=3i(%j*)dV?VtCm3g_hV z{Q~^<w?vT~JPk6s27GW>rE-NoMCX&;?2s)uOi1i=kVOd2Rp1@^!v%T+w#!e8Le80j zi*7}cGi=0J`{E~r`dTJ>OBgE#IZkJ>?cR3~{jW>V&7+*3@zHlTR}_&@3$ilPNmb6v zC=KQ|WFN+_uaJjK-D*Qi_}>gQn=%AZEfn_)%Q=phmYwb3U;daKQU6fpa48>OJ7$d* zAWr^k^gJm75?HuTJnc)I{(-6wiyy@%W2A%!ICK-_%)oT<0ceArSU}6I9LtvF@0@F- z@gz~B|4Lo0PWH*QDtWs(W!R;CvV8%DX1Gc0a<K+5t~6tYGWpCopCI;N<{^%LHhi)( zlcFxRD#JZD+iUuyE6TC2ggF;zxaLHqk9X6R!y%&t4}I)J%IHK=alzlkM%iDg@sgti z?V6|?sW1};Bz&*xWd>(qH+O-Epwg{t{8Tue*c@y$egsXvA#cB<qP)|e&&wLt&_d0Y z#)HWaZ<FBtM8)OJ_uvBD_3T~egmq7+0|5g#kca5(c3jKabgxRRS%c6GP^Z{b>0oQ^ zTky35ATx3j6QE9#yS^L&xa|EdQT2%iVC4c9K5TA5E5rC&N{NO%o+`daKCC9JivgyZ zI9{K2qmhkevS;Zcd<C169!n7xt_)+WhOnmCKPp}^&*fDBx`rnF>Ly*jN9zF3%T~7$ z?T5>ebQ0n7#%x`R_RZE1Y7KLzVAN)JxUX#dW3z%h$u!}S`1d`uH2ne90^Bi^kaBDn zZbL-Y4lWlCA_Es=E?01PXT=0^_oPUbEbRSMr`y<0*vX`FJt~Js-lWATNd|-Z*ZR&Q z3)nGdRM274bz2tc5n^XjS&$@c008$z6v!AC(MaWK{l(m1dvum+em(bZrbHrbl(+JL zj-v%BlpU(>F)Tjg>c2AdM4uQu--gKf1Rb%j!ngx9q#k|-Xzf$bny8?baj0GYsk_z~ zIk{P1@BD7U(L%)Q$GkK@%yH@lBP<JlXN|IeE=IKNI7q7eyw8N`9s%pXoQ`SefFXPk zjR+QB5Y9X;`;PUn-nNn^yzxS&*TiBjc(fM?6{Nub%t)>7CwSlta3pH~{Pt{82o@-$ zp4zg4c|C_B9NKRP!~)8$qpp()U#q1>4y@!Z+rZwzHqSdOl7a{@Q1fvPn`j0m!&<A& zhbf!Ta*iN_O56oq*|>lsE7v+jW<tdv6zP{y2~$`doHU-MCY2iVt~|-2*GbXdrkYzr z=3WhiuKrT6>VBqy+>dj_rYh)bhIT}4npi!$zxHx*nb2-K%;}6kx|X*HOgxs5p?}e0 zhek79+ueOQ58J%W*BjNOiZZ}~?qrIs_u)>aaei<xu=!Si7qeB!(XmyIqYO2NbnFw( zT<&*J2pwfIDS}p~-y0AgB8)q;;CSY3h(jq{o0=*7P=Wle>vfA5ad9iD-NtEpI{*Nd zy~sr{v7e)LA4X&uu)I%P38(A9eKk0Zf#LU|k1X9baG)+^X#;L-=dj&Ty!=?xIGSOn zR`IF49N5?dxT#1cni=Oua{&n*S`$B^Wvpn0m**H=70T<7!AokUp#Lf~W)UCN-8?S? z^-%?rHNeJiYPwAjCOk7GDBcK9SIzb6AD{@j{-pv^%O{^%1NDnehe!7o4t2!f)6LY4 zTBDHqi8ndBQWQmQ;CYuv3Wackh<#*vr-7oKfja!u$HZ8iQj`xa^3nOs$7YE=e(=n1 z7=lPr32U@d7NZnNdQ&TnV@v)(8xf7Y>26!=N$KXBRp+rI;kNytxteats_0mEY!~(d ziP0)Hcgk&~nFSD(OoUzau8=NL5Qj3|pEfDP)2d0=pPqc1X4%7E(m}FYQaXg0X5B@A zdM|95<c5Lzh!oN5LIbZYiP#F!9}V6^5~UrmyPq*mRkoj@KEBF!HOxaY!t`kvoK@il z2E-cP6@pOU_B*8z#5Lk)IgFV_MoE83bAS8!Iq_~xU-ou-Rn*e+QQau25HXM8oE|ol z`K_KH#cy7eZ#q!Mr#)UU!26r}9Q-57Np@}#A>G<I|LpWwP|j|YJt__9ji<9F?qVH* zlt1orGrNvJ4Qo|}U11JWKu(N=8+Jrf-M0!UwD4aYsv#<$ElF9^zEBGW0Mo@vglqoN z%wer{&%EiTEt8k3kGC8wcEpQi28|0Ah;MS|jaO0gP<_8SUD-vtBB`%7U<-{Cx>Hh< zkZ^#j3i1=b0=d$(QTMkh61qw(32H*uKORbNd^pp9qvLOZzR-2v9#f!DQ)zXf(jN() zsimov#=LGSWzT_J#5#5D;|}p^yM6+9JEpm8oL1z!t(UqVu~l_#JNpU4T9~5gOHlk_ zD(>x1a_pd2@=gZ6E$KB0V{1Q|f-cNNU8*O}g`z?1+C*n7jn3OK5Dstn+zV!-m+m3f z%4mU9*C;>+NsYV>x>~29qu?-d%n-dAeiZ;iwJ7d9<&o7I<>TzzYCh4)T~FV-S+Dez zk!kB&#_E5{#x}27wNn!VLg_!zniKP?E)b$Mi7{3Bq6H>p6_lQ}=l$M`zSR=;!duQ! zHAvk?lP!igB67hH$f0vJN9+Ce_LX>NlqN|{6pXr2SOw@A!*Ty2Fj5?SY@a@|D83;S z%jzsciS=cv%xv+L`F%`-uuZ*y!D8e;kp9JT@k(VIt82K^ur)nrRT)?fjB<BOi@_A5 zEGcFw|H2509xBY8&G&o78t{hezLILeHfnwzdJitSbw1XlLQBRu>fB##7=1LiPtKON zjRjP9962!8?PM{jHSl79JQRfYu}~k54)shFgomDlPCqt{dQyy#k~|5d3O-RtV2~6j zfzw!@RP{$OKtnD7R$^<ltB#iRygPbQm~$t&0p*uGYMurUp_k`chL4Ru^!ES4p$oc( zGVf+FelXbF?LkPvXJE6#3Z3kMBYfw-^s=Be*-b3j!Zu#4ulUN26C=S?f>=Vj8{WX# z2mq&9{2)2^TA#Gnqg_Hbh(#rfEC=L4@MU9E^o<g@qcEfxgVCKui=S;c{d}bg2NlK^ zdl>qI^M2qjubgu2yRM^XqI>urT~{p3ID(d@9n+EEEB?+w`&LVhmuoQ*YH>Jf-|P*J zZR29;58g@DmJAd%*);hSn$h!)(H?B*E%crtZtBI45!Zy#54Ma%i^6x62XimL<+=~T zx_uVj0kZk3*mA^vAW6{9yqg}|jmqzJf{5u(llF!A)^2_)DV!2g;;~jSYWk6F4NbGg zhmyJTR-&`KNJWdbN%F7cvb}u!Fix+j>bNAvQ5Pi=C7BPR9i0^SN-wrg?(X6k1qB5& zy%3JOihdGwS!@|XZF42vWaG;D_4Yz5yEkXTPoG(%qLJ<oZX9z<OJ(?Q3S2%3%By1! pZ%<E8ZHmvCogBDs`wDvopx@}SH)kEsKRp0|&r*t#<>H2Z{|8dGz_I`U literal 0 HcmV?d00001 diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_1_head-384.png b/borestop/src/main/webapp/content/images/jhipster_family_member_1_head-384.png new file mode 100755 index 0000000000000000000000000000000000000000..4a5e9fe4775b79347fcf33c97a7ad10e3f693b2c GIT binary patch literal 15054 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%0Dp_F+A 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 O0c0c;#cM>30{;*Cash(? literal 0 HcmV?d00001 diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_1_head-512.png b/borestop/src/main/webapp/content/images/jhipster_family_member_1_head-512.png new file mode 100755 index 0000000000000000000000000000000000000000..66c625c10626011b5e142ce32ca009cbaea5f0bb GIT binary patch literal 16456 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 literal 0 HcmV?d00001 diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_2.svg b/borestop/src/main/webapp/content/images/jhipster_family_member_2.svg new file mode 100755 index 00000000..51c6a5a9 --- /dev/null +++ b/borestop/src/main/webapp/content/images/jhipster_family_member_2.svg @@ -0,0 +1 @@ +<svg enable-background="new 0 0 792 1135.9" viewBox="0 0 792 1135.9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><clipPath id="a"><path d="m218.1 566.3h368.4v119.1h-368.4z" transform="matrix(.9975 -.0707811 .0707811 .9975 -43.287 30.0417)"/></clipPath><linearGradient id="b"><stop offset="0" stop-color="#a8aaaa"/><stop offset=".06716418" stop-color="#a1a3a3"/><stop offset=".08773019" stop-color="#a8aaaa"/><stop offset=".1178" stop-color="#bcbdbd"/><stop offset=".1535" stop-color="#dcdcdc"/><stop offset=".1766" stop-color="#f4f4f4"/><stop offset=".1785" stop-color="#eff0f0"/><stop offset=".1907" stop-color="#d7d7d7"/><stop offset=".2045" stop-color="#c3c4c4"/><stop offset=".2203" stop-color="#b5b6b6"/><stop offset=".2401" stop-color="#adaeae"/><stop offset=".2761" stop-color="#abacac"/><stop offset=".2957" stop-color="#9a9b9b"/><stop offset=".3202" stop-color="#8f9090"/><stop offset=".3546" stop-color="#888989"/><stop offset=".4502" stop-color="#868787"/><stop offset=".4883" stop-color="#8e8f8f"/><stop offset=".5924" stop-color="#9d9f9f"/><stop offset=".7107" stop-color="#a6a8a8"/><stop offset=".8731" stop-color="#a9abab"/><stop offset=".9627" stop-color="#dcdcdc"/></linearGradient><linearGradient id="c" gradientTransform="matrix(.7554 .6553 .6553 -.7554 -576.0345 2048.7961)" gradientUnits="userSpaceOnUse" x1="-188.9606" x2="-59.2798" xlink:href="#b" y1="1678.3533" y2="1603.4819"/><linearGradient id="d" gradientTransform="matrix(.7554 .6553 .6553 -.7554 -576.0345 2048.7961)" gradientUnits="userSpaceOnUse" x1="-192.1841" x2="-26.456" xlink:href="#b" y1="1696.2814" y2="1600.5984"/><linearGradient id="e" gradientTransform="matrix(.7554 .6553 .6553 -.7554 -576.0345 2048.7961)" gradientUnits="userSpaceOnUse" x1="-180.3568" x2="-42.2597" xlink:href="#b" y1="1695.8671" y2="1616.1365"/><linearGradient id="f" gradientTransform="matrix(.7554 .6553 .6553 -.7554 -576.0345 2048.7961)" gradientUnits="userSpaceOnUse" x1="-163.5929" x2="-66.7436" xlink:href="#b" y1="1682.6437" y2="1626.7278"/><linearGradient id="g" gradientTransform="matrix(.7554 .6553 .6553 -.7554 -576.0345 2048.7961)" gradientUnits="userSpaceOnUse" x1="-173.0439" x2="-37.0958" xlink:href="#b" y1="1698.9542" y2="1620.4646"/><linearGradient id="h" gradientTransform="matrix(.7554 .6553 .6553 -.7554 -576.0345 2048.7961)" gradientUnits="userSpaceOnUse" x1="-192.1338" x2="-12.7169" xlink:href="#b" y1="1720.593" y2="1617.0066"/><linearGradient id="i" gradientTransform="matrix(.7554 .6553 .6553 -.7554 -576.0345 2048.7961)" gradientUnits="userSpaceOnUse" x1="-182.9737" x2="-16.82" xlink:href="#b" y1="1715.4465" y2="1619.5176"/><linearGradient id="j" gradientTransform="matrix(.7554 .6553 .6553 -.7554 -576.0345 2048.7961)" gradientUnits="userSpaceOnUse" x1="-165.1052" x2="-31.8849" xlink:href="#b" y1="1710.3193" y2="1633.4045"/><path d="m417.8 361.5c-2 1.3-4 35-5.5 69.5-1.5-34.6-3.5-68.2-5.5-69.5-4.2-2.8-142.6 4.1-142.6 4.1v134.9s56.9 6.5 148.1 5.8c91.2.7 148.1-5.8 148.1-5.8v-134.8s-138.4-6.9-142.6-4.2z" fill="#0d0905"/><path d="m603.3 547.2c-5.5-36.5-43.2-50.6-61.7-56.1s-49.1-7.6-68.5-18.6c-19.4-11.1-16.3-66.4-16.3-66.4h-41.8-41.9s3.1 55.4-16.3 66.4c-19.4 11.1-50 13.1-68.5 18.6s-49.6 19.7-55.2 56.1c-4.4 29.2-17.6 113.7-17.6 113.7h199.4 199.4c.1.1-6.5-84.5-11-113.7z" fill="#fca65b"/><path d="m369.6 451.1c22.5-4.2 66-18.1 87.2-33.9 0-1.7 0-3.2 0-4.5v-.1c0-.6 0-1.1 0-1.7 0-.1 0-.2 0-.3 0-.4 0-.8.1-1.3 0-.1 0-.2 0-.3 0-.4 0-.7 0-1 0-.1 0-.2 0-.2 0-.3 0-.5 0-.8v-.1c0-.2 0-.3 0-.5s0-.3 0-.3h-41.8-41.9c0-.1 1.4 25.2-3.6 45z" fill="#eb9449"/><path d="m534.2 267.8s17.7-75.4-2.9-117.4c-22.2-45.2-55.4-71.1-116.3-71.1s-94.1 25.8-116.3 71.1c-20.6 41.9-2.9 117.4-2.9 117.4-27.7-5.5-22.5 24.7-13.9 38.4 7.2 11.4 7.3 12.6 11.7 25.1 6.2 18 20.5 5.6 20.5 5.6 8.3 23.1 14.2 28.5 47.3 59.1 28.8 26.6 38.9 26.3 53.5 26.3s24.4.3 53.5-26.3c33.2-30.4 39-36 47.3-59.1 0 0 14.3 12.5 20.5-5.6 4.3-12.5 4.5-13.7 11.6-25.1 8.9-13.7 14.1-44-13.6-38.4z" fill="#f29b50"/><path d="m225 519s-6.4 249-25.4 299.8 71.8 9.2 71.8 9.2l17-36.3s7.9-45.5 7.8-58.4c0-12.8-71.2-214.3-71.2-214.3z" fill="#d31616"/><path d="m608.9 535.4s6.4 208.8 25.4 259.6-81.9 25.4-81.9 25.4l-18.1-42s3.3-15.9 3.3-28.7c.2-12.8 71.3-214.3 71.3-214.3z" fill="#d31616"/><path d="m220.6 575.1c-1.5-34.3-3.9-66.7 31.7-73.2 13.4-2.4 56.6-11.1 56.6-11.1l41-15.2s3.3 64 62.7 64 60.6-67.1 60.6-67.1l58.1 22.8c29 2.3 29.2 4.1 42.5 6.6 32.7 6 37.9 29.2 36.9 62.6-.5 15.3-40.9 134.5-52 225.6-14.3 116.5 17.6 180.3 1.5 197-21 21.7-145.4 20.6-145.4 20.6s-136.4-3.6-153.1-23.6c-17.1-20.6 13.6-122.8-2-225-11.6-75.9-37.7-151.8-39.1-184z" fill="#ea1818"/><path d="m387.8 353.7c-11.6-4 11 18.6 29.3 18s41.4-25.3 26.2-17.9c-5 2.4-12-14.1-21.2-8.9-6.6 3.7-3.4 5.4-9.4-.2-8.1-5.7-16.6 11.8-24.9 9z" fill="#ea1818"/><path d="m364.7 222.9c-12.5.7-30.6 11.6-33.8 20.8-3.9 11.3 10.3-6.3 20.3-10.7 8.5-7.9 24.8-4 34.5 2.2 9.6 6.1 11.6 15.2 11.6 7.2-2.6-7.8-22.5-19.5-32.6-19.5z" fill="#1c140a"/><path d="m468.5 220.5c-12.5.7-30.6 11.6-33.8 20.8-3.9 11.3 10.3-6.3 20.3-10.7 8.5-7.9 24.8-4 34.5 2.2 9.6 6.1 11.6 15.2 11.6 7.2-2.6-7.8-22.5-19.5-32.6-19.5z" fill="#1c140a"/><path d="m398.9 159.6s5.5 16.4 6.7 25.7c1.3 9.3 2.3 20.4 2.3 20.4s2.1-7-.3-20.9-8.7-25.2-8.7-25.2z" fill="#261e14"/><path d="m358.3 216.3s-1.5-15.4 4.6-33.1 21.1-21.5 21.1-21.5-10.7 5.9-17.3 21.8c-6.7 15.8-8.4 32.8-8.4 32.8z" fill="#261e14"/><path d="m450.5 202.9s-.7-13.8-8.5-28.5-21.5-16.1-21.5-16.1 10.2 3.8 18.2 16.8 11.8 27.8 11.8 27.8z" fill="#261e14"/><path d="m484.8 475.4s1.2.1 3.3.3c44 11.9 60.7 14.4 92 19.3 17.5-2.2 40.9 21.1 30.6 42.9s-41.6 218.7-41.6 254.5 1.1 183.8 2.5 196.6-91.6 32.4-104.7 18.7c-7.1-7.4 13.5-91.5 34.2-190.2 17.5-83 8.7-188.6 4.8-211.3-8.7-49.6-41.2-86.6-41.2-86.6" fill="#3d4251"/><path d="m612.7 527.9s21.2 250.4 39.5 298.8-77.8 40.3-77.8 40.3l-16.8-98.2s-5.3-42.4-5.3-54.7c-.1-12.1 60.4-186.2 60.4-186.2z" fill="#363a47"/><path d="m280.9 121.7c.1-.4-23.1 40 .2-1.2 13.1-31.2 178.2-53.9 260.2 0 23.8 25.1 39.9 101.5 23.6 109.1-5.8 2.7-25.3-25.7-55.4-46.8-8.4-5.9-33.2-23.6-98.1-23.6s-89.7 17.7-98.1 23.6c-30.1 21.1-43.4 52.1-49.3 49.3-15.9-7.5-8.9-66.7 16.9-110.4z" fill="#474b56"/><path d="m348.9 482.4s-4.2-4.3-6.3-4.1c-44 11.9-57.7 18.8-89 23.7-17.5-2.2-40.9 21.1-30.6 42.9s41.6 218.7 41.6 254.5-8.9 168.7-10.4 181.5 90.2 38.3 103.3 24.7c7.1-7.4 2.1-94-18.7-192.7-17.5-83-15.1-177-11.1-199.7 8.7-49.6 41.2-86.6 41.2-86.6" fill="#3d4251"/><path d="m221 534.9s-33.4 200.8-40.4 283.7c-2.3 41.2 95.7 21.2 95.7 21.2l-2.7-54.3s14.7-33.9 14.7-46.2-67.3-204.4-67.3-204.4z" fill="#363a47"/><path d="m404.3 268.8h25.1v10.2h-25.1z" fill="#4189c6"/><path d="m553.6 182.8c-34.2-120.3-137.8-120.3-137.8-120.3s-103.6 0-137.9 120.2c-2.9 10.1-.3 24.3-7.1 36.8-49.1 89.1 9.6 380.1 13.7 380.7 1.2-7.3 2.3-20.1 2.3-20.1l2.1 19.6c5.5.4 12.9.7 18.5.2l.2-27.7 4.6 26.6c5.2-.7 17.2-2.1 22.1-3.1l-.5-12.7 4.8 11.9c19-4.7-9.1-359.4-9.1-359.4s17.6-.8 27.6-2l3.9-16 3.7 15.1c4.4-.4 9.1-.9 13.8-1.4l7.5-38.7 5.3 37.4c7.8-.6 19.9-1.4 24.6-1.4h.1l3-22.2 4.7 22.4c10.5.5 25.2 1.9 38.3 3.3l3-37.5 4.9 38.3c12.4 1.4 32.3 2.5 32.3 2.5s-21.8 352.7-6.3 355.7l9.9-33.3-4.5 34.3c6.8 1.2 14.2 2.2 21.8 2.8l6-20.5 2.1 20.9c12.5.4 82.3-278.9 29.6-378.8-6.3-11.1-4.5-24.2-7.2-33.6z" fill="#1c140a"/><path d="m396.9 236.7h-66.6c-4.5 0-8.2 3.7-8.2 8.2v51c0 4.5 3.7 8.2 8.2 8.2h66.6c4.5 0 8.2-3.7 8.2-8.2v-51c0-4.5-3.6-8.2-8.2-8.2zm-1.7 52.1c0 3.4-2.8 6.1-6.2 6.1h-50.4c-3.4 0-6.2-2.7-6.2-6.1v-37.7c0-3.4 2.8-6.1 6.2-6.1h50.4c3.4 0 6.2 2.7 6.2 6.1z" fill="#4189c6"/><path d="m500.9 236.7h-66.6c-4.5 0-8.2 3.7-8.2 8.2v51c0 4.5 3.7 8.2 8.2 8.2h66.6c4.5 0 8.2-3.7 8.2-8.2v-51c0-4.5-3.6-8.2-8.2-8.2zm-1.7 52.1c0 3.4-2.8 6.1-6.2 6.1h-50.4c-3.4 0-6.2-2.7-6.2-6.1v-37.7c0-3.4 2.8-6.1 6.2-6.1h50.4c3.4 0 6.2 2.7 6.2 6.1z" fill="#4189c6"/><path d="m289.6 113.8c.1-.4.1-.7.2-1.1 5.5-20.3 14.6-35.1 26.4-46.7.3-.4.6-.8 1-1.2 16-17.4 21-19.7 27.7-30.6s15.4-20.8 34.7-20.1c10.2.4 10.6 3.2 28.4 2.6 19.9-.6 30-2.9 36.3 0 10.7 4.9 8.3 8 38.7 29.6 6.3 4.5 13 9.7 18.6 16.2 19.6 19 30.5 50.2 30.5 50.2 24.7 40.7 34.4 96.6 19.3 103.6-5.4 2.5-20.9-26.2-48.9-45.8-7.8-5.5-30.9-21.9-91.4-21.9-60.4 0-83.6 16.4-91.4 21.9-28 19.6-38.1 48.2-43.6 45.6-14.8-6.9-10.7-61.7 13.5-102.3z" fill="#3d4251"/><path d="m291.2 106.5c2.2-6.8 3.5-10.2 5.4-13.8 1-.4 11.5-5.4 12.6-5.8 34.9-14.4 83.8-15.5 98-15.5h4.3 4.2c13.9 0 61.7 0 109.3 24.3 2 4.3 4.3 9.3 4.3 9.3 1 2.2 1.4 3.4 2.2 5.4-3.1-8-22.5-14.2-33.1-18.6-31.7-13.1-61.2-12.4-82.7-13.6-2.4-.1-3.8 0-3.9 0h-.3-.5c-.1 0-1.5 0-3.9 0-13.1 0-58.3 1-89.9 14.1-10.7 4.4-20.5 9.9-26.6 16.1" fill="#474b56"/><path d="m471.8 470.6c15.8 23.9 13.3 52.2-6.3 64.5s-49.1 4.1-67.6-18.1z" fill="#d31616"/><path d="m349.9 475.5c-12.3 30.7-8.8 60.9 8.7 68.7 17.5 7.9 42.4-9.5 57.2-39.1z" fill="#d31616"/><path d="m427.7 529.6s-88.1-49.1-95.1-17.5-15.1 55.7 8.2 59.7 86.9-42.2 86.9-42.2z" fill="#3373aa"/><path d="m412.5 522.2c24.8-13.4 73.9-36.4 79.9-13 8.2 31.5 17.1 55.3-6 60.2-16.2 3.5-53.2-17.3-73.8-29.9-.3-15.3.1-2.2-.1-17.3z" fill="#4189c6"/><path d="m229.2 671.5 236.2 204.9c5 4.3 12.6 3.8 16.9-1.2l120-138.2c4.3-5 3.8-12.6-1.2-16.9l-236.2-205c-5-4.3-12.6-3.8-16.9 1.2l-120 138.3c-4.3 5-3.7 12.6 1.2 16.9z" fill="#e1e1e1"/><path clip-path="url(#a)" d="m230.1 672.2 236.2 204.9c5 4.3 12.6 3.8 16.9-1.2l119.9-138.3c4.3-5 3.8-12.6-1.2-16.9l-236.1-204.9c-5-4.3-12.6-3.8-16.9 1.2l-120 138.3c-4.3 5-3.7 12.6 1.2 16.9z" fill="#e6e6e6"/><path d="m462.9 875.1-232.6-201.7c-.5-.4-.5-1.2-.1-1.6l.2-.2c.4-.5 1.2-.5 1.6-.1l232.5 201.7c.5.4.5 1.2.1 1.6l-.2.2c-.3.5-1.1.5-1.5.1z" fill="#b2b1b1"/><circle cx="415.2" cy="695.8" fill="#ededed" r="22.6"/><path d="m374 673.3c.7-.8 1.5-1.4 2.5-2 1-.5 2.1-.9 3.2-1.2 1.2-.2 2.4-.3 3.6-.2 1.3.1 2.5.4 3.7.9-.1-.8-.2-1.6-.3-2.4 0-.8 0-1.6.1-2.3s.2-1.4.4-2 .5-1.2.9-1.6c.5-.6 1.1-1.1 1.6-1.5.6-.4 1.2-.7 1.8-1s1.2-.4 1.9-.5c.6-.1 1.2-.1 1.8-.1.6.1 1.1.2 1.6.4s1 .5 1.3.8c.5.4.9 1 1.1 1.7s.3 1.5.2 2.4-.5 1.9-1 3c-.6 1.1-1.4 2.3-2.5 3.6-.8.9-1.6 1.8-2.4 2.6s-1.6 1.5-2.4 2.2c.2.5.3 1 .5 1.6.2.5.4 1 .5 1.6 0 .1.1.2.1.4.1.2.1.3.2.5 0 .2.1.3.1.4s0 .2-.1.3c0 .1-.1.1-.2.1s-.2 0-.3 0-.2 0-.3 0-.2 0-.2-.1c-.1 0-.3-.1-.4-.3-.3-.3-.6-.7-1-1.2-.3-.5-.7-1.1-1-1.7-1.2.8-2.3 1.5-3.4 2.1s-2.2 1-3.2 1.4c-1 .3-2 .6-2.9.7s-1.8.1-2.5.1c-.8-.1-1.5-.2-2.1-.5-.6-.2-1.1-.5-1.6-.9s-.8-.8-1-1.4c-.2-.5-.3-1.1-.3-1.7s.2-1.3.5-1.9c.4-.9.8-1.6 1.5-2.3zm1.7 2.5c-.5.6-.8 1.1-.8 1.6s.1.9.5 1.2.9.5 1.7.6 1.7 0 2.8-.3 2.3-.8 3.7-1.5 2.8-1.6 4.4-2.9l-.1-.5c-.7-.4-1.4-.7-2.2-.9s-1.6-.3-2.3-.3c-.8 0-1.6.1-2.3.2-.8.1-1.5.3-2.2.6-.7.2-1.3.5-1.8.9-.7.5-1.1.9-1.4 1.3zm15.1-11.9c-.4.5-.7 1-.9 1.6s-.3 1.3-.3 2.1 0 1.6.1 2.4c.1.9.3 1.8.5 2.7.8-.7 1.6-1.5 2.4-2.3s1.7-1.7 2.5-2.7c.6-.7 1-1.3 1.4-1.8.3-.5.5-1 .6-1.4s.1-.8 0-1.1-.2-.5-.5-.7c-.2-.2-.5-.3-.8-.4s-.6-.1-1-.1-.7 0-1.1.1-.8.2-1.1.4c-.4.2-.7.3-1.1.6-.2 0-.5.3-.7.6z" fill="url(#c)"/><path d="m408.7 688.3c-.8.5-1.5 1-2.2 1.6-.6.5-1.2 1-1.6 1.4-.3.4-.5.8-.5 1.1 0 .4.1.7.5 1 .1.1.4.2.6.3.3.1.6.2 1 .2s.9.1 1.5.1 1.2 0 1.9-.1c0 0 0 .2-.1.3 0 .1-.1.4-.2.7s-.3.7-.4 1.2c-.8.1-1.6.1-2.3.1s-1.4-.1-2-.2-1.2-.3-1.6-.5c-.5-.2-.9-.4-1.2-.7-.4-.3-.6-.7-.8-1.1s-.3-.8-.3-1.3.1-.9.3-1.4.5-1 .9-1.5c.1-.2.3-.4.6-.6s.6-.5.9-.7c.3-.3.7-.5 1.2-.8.4-.3.9-.6 1.4-.9-.8-.6-1.6-1.1-2.4-1.7-.8-.5-1.5-1.1-2.3-1.6-.6.3-1.1.7-1.7 1s-1.1.6-1.6.9-.9.5-1.4.8c-.4.2-.8.4-1.1.6-.8.4-1.5.6-1.9.6-.5 0-.8-.1-1-.2-.1-.1-.3-.3-.3-.4-.1-.2-.2-.3-.2-.5s0-.3 0-.5.1-.3.3-.5c.1-.1.2-.2.3-.2 1-.7 2-1.3 3-1.9s2-1.1 2.9-1.6c-.3-.3-.6-.6-.8-.9s-.4-.6-.6-.9c-.1-.3-.2-.7-.2-1.1s.1-.8.2-1.2c.1-.1.1-.2.2-.3s.1-.2.2-.3c.2-.3.4-.3.6-.1.1.1.2.3.2.5s0 .6 0 1c.3.2.6.4.8.7.3.2.6.5.9.7l.8.7c.7-.4 1.3-.7 1.9-1s1.2-.7 1.8-1c.4-.2.7-.5 1-.7.3-.3.6-.5.8-.8.2-.2.4-.4.5-.7.1-.2.2-.4.2-.7 0-.2 0-.4-.1-.6s-.2-.4-.4-.6c-.2-.1-.4-.3-.7-.4s-.6-.3-1-.4-.8-.2-1.3-.3-1.1-.1-1.7-.1c-.2 0-.4 0-.6-.1s-.3-.1-.4-.2c0 0 0-.1.1-.3s.3-.4.5-.6c.3-.3.6-.5.9-.7l1.2-.3c.4 0 .9 0 1.3.1.5.1.9.2 1.4.3.4.2.8.3 1.2.5s.7.4 1 .7c.4.3.7.7 1 1.2.3.4.4.9.5 1.4s0 1-.2 1.5-.5 1.1-1 1.6c-.2.3-.5.5-.9.9-.4.3-.8.7-1.3 1-.5.4-1 .7-1.6 1.1s-1.2.8-1.8 1.1c.6.5 1.3 1 2.1 1.6s1.5 1.2 2.3 1.8c1.1-.7 2.3-1.4 3.5-2.1s2.5-1.4 3.7-2c.4-.2.8-.3 1.2-.3s.7.1 1 .4c.1.1.2.2.3.4.1.1.1.3.2.4v.4c0 .2-.1.3-.3.5-.1.1-.3.3-.4.4-.2.2-.4.3-.6.4-.4.2-.9.5-1.4.8s-1 .6-1.5.9-1.1.6-1.6.9-1.1.6-1.6 1c.4.3.7.5 1 .8.3.2.5.4.6.5.1 0 .1.1.2.1s.1.1.2.1c.2.1.3.3.4.4s.1.2.1.4 0 .2-.1.3-.1.2-.2.3-.2.2-.3.2-.2 0-.4 0c-.1 0-.2-.1-.3-.1-.1-.1-.2-.1-.3-.2-.2-.1-.3-.2-.4-.3s-.1-.1-.2-.1h-.1s0 0-.1 0c0 0-.1-.1-.2-.1-.1-.1-.2-.2-.4-.3-.2-.2-.4-.3-.7-.5-.1-.4-.3-.6-.5-.7z" fill="url(#d)"/><path d="m413.7 700.7c-.4 0-.8 0-1.3-.1s-1-.1-1.5-.3c-.5-.1-1-.3-1.5-.5s-.9-.4-1.2-.7-.5-.5-.6-.8-.2-.5-.2-.8.1-.5.2-.8.3-.5.5-.8c.3-.4.7-.7 1.2-1.1s1-.8 1.6-1.2 1.1-.8 1.7-1.2 1.1-.8 1.6-1.1c.2-.1.4-.2.6-.2s.4 0 .6.1.4.2.6.3.4.2.5.3c.2.2.4.4.4.6s-.1.3-.2.5c-.1.1-.3.3-.6.5s-.6.4-.9.6-.7.5-1.1.7c-.4.3-.8.5-1.2.8s-.7.5-1.1.8c-.3.3-.6.6-.9.8-.2.3-.4.5-.4.7-.1.2 0 .4.2.5.2.2.5.3.9.4s.8.1 1.2.1h1.3s.8 0 1.1 0zm3.8-12.1c.1-.1.3-.3.5-.4s.4-.2.7-.2.5 0 .8.1.6.3.9.5c.2.2.4.4.5.6l.3.6v.6c-.1.2-.2.4-.4.6s-.4.4-.6.5-.5.2-.7.2c-.3 0-.5 0-.8-.1s-.6-.3-.9-.5c-.5-.4-.8-.9-.8-1.3s.1-.9.5-1.2z" fill="url(#e)"/><path d="m416.3 703.5c.6.5 1.2.9 1.7 1.2.6.3 1.1.5 1.7.7.6.1 1.1.2 1.6.2s1.1 0 1.6-.1l-1.6 2c-.4.1-.8.1-1.2.1s-.9-.1-1.3-.2-.9-.3-1.3-.5-.8-.4-1.1-.7l-.1-.1c-.1-.1-.1-.2-.3-.3-.1-.2-.3-.4-.5-.7s-.6-.7-1-1.2l-.1.2c-.9 1-1.8 1.9-2.7 2.6s-1.8 1.2-2.6 1.6-1.5.5-2.2.5-1.2-.2-1.6-.5c-.3-.3-.5-.6-.6-.9s-.1-.7 0-1.1.3-.8.6-1.2.6-.8.9-1.2c.2-.2.5-.5.8-.7s.7-.5 1.1-.7.8-.4 1.3-.6c.4-.2.9-.4 1.3-.6 1-.4 2.1-.8 3.3-1.1.4-.4.9-.8 1.4-1.2s.9-.8 1.4-1.1c.5-.4 1-.7 1.5-.9.5-.3 1-.4 1.5-.5s1-.1 1.5 0 1 .4 1.4.8c.3.3.6.6.9 1 .2.4.4.7.4 1.2 0 .4 0 .8-.2 1.3-.2.4-.4.9-.9 1.4-.3.4-.7.7-1.1 1s-.9.5-1.4.6-1.1.2-1.7.1c-.6 0-1.3-.2-2-.4zm-8.7 1.8s-.1.1-.2.2-.1.3-.2.4c0 .1-.1.3-.1.4s.1.3.2.4.2.1.4 0 .3-.1.5-.3c.2-.1.4-.3.6-.5s.4-.4.6-.6.4-.4.6-.7.4-.4.5-.6c.3-.3.5-.5.7-.8.2-.2.4-.4.5-.5.1-.2.3-.3.4-.4-.3.1-.6.2-.9.4s-.6.3-1 .5c-.3.2-.6.4-.9.6s-.6.4-.8.6c-.3.2-.5.3-.6.5s-.2.3-.3.4zm8.4-3.6c.5.1 1 .2 1.4.2s.8 0 1.2-.1.8-.2 1.1-.4.7-.3 1-.6c.1-.1.3-.2.4-.4.2-.2.3-.3.4-.5s.1-.4.1-.6-.1-.4-.3-.5c-.2-.2-.4-.3-.7-.3s-.5 0-.8.1-.6.3-.9.5-.6.4-1 .7c-.3.3-.6.6-1 .9-.3.3-.7.7-.9 1z" fill="url(#f)"/><path d="m421.4 704.8h1.4s.7 0 .9-.1c.3 0 .5-.1.8-.1.3-.1.5-.1.9-.2.3-.1.8-.2 1.3-.3s1.1-.2 1.9-.4c.2 0 .3-.1.5-.1s.4 0 .5 0c.2 0 .4.1.5.1.2.1.3.2.5.3.3.2.5.5.6.6.1.2.1.4.1.5s0 .3-.1.4-.1.2-.2.3-.3.2-.6.3-.5.1-.8.2c-.3 0-.5.1-.7.1s-.4.1-.5.1c-.2.2-.3.3-.4.5s-.2.3-.3.5-.2.4-.3.6-.2.4-.3.7c-.1.2-.3.5-.5.8s-.5.6-.8 1c.3 0 .7.1 1 .2s.7.2 1 .3c.4.1.7.2 1.1.3s.8.2 1.3.2l-1.7 1.9c-.6 0-1.2-.1-1.9-.3s-1.3-.4-2-.6c-.7-.3-1.3-.6-1.9-.9s-1.2-.7-1.6-1.1c-.3-.3-.6-.6-.9-.9-.2-.3-.4-.6-.5-1-.1-.3-.1-.7-.1-1 .1-.3.2-.7.4-1-.1-.1-.2-.1-.3-.2s-.2-.1-.2-.2c-.1-.1-.2-.2-.2-.2-.1-.1-.1-.2-.1-.2 0-.1 0-.2 0-.3s.1-.2.3-.4c.1-.1.3-.2.4-.3.2-.1.3-.1.5-.1s.3 0 .5 0zm.1 2.1c.1.1.1.2.1.3v.5s.1.4.1.6c.1.2.2.4.4.6s.4.3.6.4.4.1.6 0c.2 0 .4-.1.6-.3.2-.1.3-.3.5-.5.1-.2.3-.3.4-.5s.2-.4.3-.5c.1-.2.2-.3.3-.5s.1-.3.2-.4z" fill="url(#g)"/><path d="m435 719c-.8-.2-1.6-.3-2.2-.4s-1.2-.3-1.7-.4-.9-.3-1.2-.4-.6-.3-.8-.5c-.4-.4-.7-.8-.8-1.4s-.1-1.2.2-1.9c.2-.7.6-1.4 1.1-2.2s1.1-1.6 1.9-2.5c.3-.3.6-.7 1-1.1l1.1-1.1c-.2-.2-.3-.3-.3-.4-.1-.1-.2-.2-.2-.3-.1-.1-.2-.2-.3-.4s-.4-.4-.6-.7c-.1-.1-.2-.3-.2-.4s0-.2 0-.3.1-.2.1-.3c.1-.1.1-.1.2-.2s.2-.2.4-.1c.2 0 .3.1.5.2s.4.3.6.5.4.4.6.5c.2.2.4.3.5.5.1.1.3.2.3.3.8-.6 1.7-1.2 2.5-1.7.9-.5 1.7-.9 2.5-1.2s1.5-.5 2.1-.5 1.2.1 1.5.4c.2.2.4.5.5.8s.1.6 0 1-.2.7-.4 1.1-.4.7-.7 1.1c-.2.3-.5.5-.9.8s-.7.5-1.2.7c-.4.2-.9.4-1.3.6-.5.2-1 .3-1.4.5 0 .1.1.1.2.2s.3.2.4.4c.2.1.3.3.5.5s.3.3.5.5.3.3.5.4c.1.1.3.2.4.3s.1.2.1.4-.1.3-.3.5-.4.3-.6.3-.4 0-.5-.1l-3.3-2.9c-.4.1-.7.2-1.1.2-.4.1-.7.1-1 .2-.3.3-.7.7-1 1-.1.1-.3.3-.4.4-.1.2-.3.3-.4.5-.1.1-.3.3-.4.4s-.2.3-.3.4c-.3.3-.5.6-.6.9s-.2.5-.2.7 0 .4.1.6.3.4.4.5.3.2.5.3.5.2.8.3.6.2 1 .2c.4.1.7.1 1.1.2.4 0 .7.1 1.1.1s.7 0 1.1-.1zm6.7-13.2.2-.2c.1-.1.1-.2.1-.3s0-.2 0-.3-.1-.2-.2-.3-.4-.1-.8 0-.8.3-1.3.6-1 .6-1.6 1c-.5.4-1.1.8-1.6 1.1.1.1.2.2.2.3.1.1.2.2.2.3.4-.1.9-.3 1.4-.5s.9-.4 1.4-.6c.4-.2.8-.4 1.2-.6.4-.1.6-.3.8-.5z" fill="url(#h)"/><path d="m436 723.3c-.5-.5-.9-1-1.2-1.5-.2-.5-.3-1.1-.3-1.7s.1-1.1.4-1.7c.2-.5.6-1.1 1-1.5.3-.3.6-.6 1-.9s.8-.6 1.2-.8.9-.4 1.3-.6c.5-.1.9-.2 1.4-.2s.9.1 1.4.2c.4.1.9.4 1.3.7.3.3.6.6.8.9s.3.7.3 1.1 0 .7-.1 1.1-.3.7-.6 1c-.3.4-.7.6-1.2.8s-1 .3-1.6.4c-.6 0-1.2 0-1.8-.1s-1.3-.3-1.9-.6c0 .2-.1.4-.1.6v.5c0 .1.1.2.2.4l.3.3c.3.3.8.5 1.3.7s1 .3 1.6.4c.5.1 1.1.2 1.6.2s1 0 1.4 0l.1 2.1c-1 .1-1.9.1-2.8 0-.4 0-.8-.1-1.2-.2s-.9-.2-1.3-.3-.8-.3-1.2-.5c-.6-.3-1-.6-1.3-.8zm2.3-5.1c.2.2.5.3.8.4s.7.2 1 .2c.4 0 .7 0 1-.1s.5-.2.7-.4c.2-.3.4-.5.4-.8s0-.4-.1-.5c-.2-.2-.5-.3-.7-.4-.3-.1-.5-.1-.7 0-.2 0-.5.1-.7.3-.2.1-.4.3-.7.4-.2.2-.4.3-.5.5-.2.2-.4.3-.5.4z" fill="url(#i)"/><path d="m441.4 724.8c.2-.3.5-.5.8-.8s.7-.6 1-1 .8-.7 1.2-1 .8-.6 1.2-.9.7-.5 1.1-.8c.3-.2.6-.4.8-.5s.3-.1.4-.2h.3c.1 0 .2 0 .3.1s.2.2.3.3.3.2.3.3c.1.1.1.2.1.3s-.1.2-.1.3c-.1.1-.2.3-.4.4-.2.2-.4.5-.7.8s-.5.6-.8.9l.1.1c.3-.1.7-.3 1.1-.4.4-.2.8-.3 1.2-.4s.8-.1 1.2-.1.7.2 1.1.5l.3.3c.1.1.1.3.1.4v.4c0 .1-.1.3-.2.4s-.2.2-.4.4c-.2.1-.4.3-.6.5s-.4.3-.6.5-.3.3-.4.4c-.2.2-.3.4-.4.6s-.1.3-.1.5c0 .1 0 .3.1.4s.1.2.2.3c.3.2.6.4.9.5.4.1.7.2 1.1.3s.8.1 1.3.1l-1.9 1.9c-.2 0-.5-.1-.8-.1s-.6-.1-.9-.2-.6-.2-.9-.3-.6-.3-.8-.5c-.4-.4-.7-.8-.8-1.2s-.1-.8 0-1.2.3-.8.5-1.2.5-.8.7-1.2l-.1-.1-5.2 2.9c-.3.2-.5.3-.7.4s-.4.1-.5.2c-.2 0-.3 0-.4 0s-.2-.1-.3-.2c-.2-.2-.4-.4-.4-.6-.1-.2 0-.5 0-.7.1-.2.2-.5.3-.7 0-.6.2-.9.4-1.1z" fill="url(#j)"/><path d="m638.7 781s-176.3-27.6-228.3-54.7c-66.8-6.7-22.1 54.2-22.1 54.2l149 51.6s67.8 33.9 81.5 35.1c13.7 1.3 19.9-86.2 19.9-86.2z" fill="#eb9449"/><path d="m400.5 780.8s-61.6 12.8-74.9 5.1-35.9-20.1-35.3-35.1c.7-15 21.6-58.5 40.6-58.3s86 39.7 86 39.7z" fill="#fca65b"/><path d="m620.4 877.8s21.8-31.8 25.7-44c4-12.2 3.3-50.8 3.3-50.8l-66.8-15.2s-24.6 38.4-27.1 49.6c-2.6 11.2.6 43.4.6 43.4z" fill="#d31616"/><path d="m274.6 739.1s181.5-16.3 234.3-41.9c66.9-4.8 20.6 54.8 20.6 54.8l-150.5 47.4s-85.4 26.6-99.1 27.5c-13.6.8-5.3-87.8-5.3-87.8z" fill="#eb9449"/><path d="m493.1 758.6s61.4 17.7 74.6 10.4 35.6-18.9 34.8-34.8c-.7-15.8-21.9-63.2-40.7-64.3-18.8-1-84.7 38.3-84.7 38.3z" fill="#fca65b"/><path d="m246.1 746.8s-1.7 38.5 1.4 51 24 44.9 24 44.9l64.8-22.3s.6-45.5-3.1-56.4-23.4-36.6-23.4-36.6z" fill="#d31616"/><g fill="#333"><path d="m503.4 780.3c-.7-.5-1.2-.9-1.6-1.3s-.7-.7-.9-1-.3-.6-.4-.9c0-.3 0-.6.1-1 .1-.3.3-.6.5-.7.2-.2.5-.3.7-.3.3-.1.6-.1.9-.1s.7 0 1.1-.1h.4c.2 0 .5-.1.9-.1s.8-.1 1.2-.1c.5 0 .9-.1 1.4-.1.4 0 .9-.1 1.2-.1h.9c.1 0 .3 0 .4.1.2 0 .3.1.4.2s.1.2.2.3c0 .1.1.3.1.4v.4.3s0 .1 0 .1c-.1.2-.2.4-.3.5-.2.1-.3.1-.6.1l-7.6.1 5 3.8c.1.1.2.2.3.3s.2.3.3.4c.1.2.1.3.2.5v.6c-.1.2-.2.3-.4.4s-.4.1-.7 0c-.2-.1-.5-.2-.8-.4s-.6-.4-.8-.6c-.3-.2-.6-.5-.9-.7-.6-.5-.9-.8-1.2-1z"/><path d="m509.6 787.2c.2-.8.6-1.5 1.2-2.2.5-.7 1.2-1.4 2-1.9.8-.6 1.6-1 2.6-1.3.9-.3 1.9-.5 3-.5-.4-.5-.7-1.1-1-1.7s-.5-1.1-.7-1.7-.3-1.1-.3-1.6 0-1 .1-1.5c.2-.6.4-1.1.7-1.6s.6-.9 1-1.3.8-.7 1.2-1 .9-.5 1.3-.6.9-.2 1.3-.3c.4 0 .8 0 1.2.1.5.2 1 .4 1.4.9.4.4.7 1 .9 1.7s.3 1.5.2 2.5-.3 2.1-.7 3.4c-.3.9-.6 1.8-.9 2.6s-.7 1.6-1 2.3c.3.3.6.6.9 1 .3.3.6.6.9 1 .1.1.1.2.2.2l.3.3s.2.2.2.3c.1.1.1.2.1.2 0 .1-.1.1-.1.1-.1 0-.1.1-.2.1s-.2.1-.2.1c-.1 0-.1 0-.2 0s-.2 0-.4 0c-.3-.1-.7-.3-1.1-.5-.4-.3-.8-.6-1.3-.9-.6 1-1.2 1.9-1.8 2.6-.6.8-1.3 1.5-1.9 2-.6.6-1.3 1.1-1.9 1.4-.6.4-1.2.7-1.8.9s-1.1.3-1.7.3c-.5 0-1 0-1.4-.2-.5-.1-.8-.4-1.2-.7-.3-.3-.6-.7-.8-1.1-.2-.5-.3-1-.3-1.6-.1-.4 0-1.1.2-1.8zm2.1 1.2c-.2.6-.2 1.1-.1 1.4.1.4.4.6.8.7s.9.1 1.4-.1c.6-.2 1.2-.6 1.9-1.1.7-.6 1.4-1.3 2.2-2.2s1.5-2.1 2.3-3.5l-.3-.3c-.6-.1-1.2 0-1.9.1-.6.1-1.2.3-1.8.6s-1.1.6-1.6.9c-.5.4-1 .7-1.4 1.1s-.8.8-1 1.2c-.2.5-.4.9-.5 1.2zm7.1-13.5c-.1.5-.2.9-.1 1.5.1.5.2 1.1.4 1.6.2.6.5 1.1.9 1.7s.8 1.2 1.3 1.8c.3-.8.7-1.6 1-2.5s.6-1.8.9-2.8c.2-.7.3-1.3.4-1.8s.1-.9 0-1.3c-.1-.3-.2-.6-.3-.8-.2-.2-.3-.3-.6-.4-.2-.1-.4-.1-.7 0-.3 0-.5.1-.8.2s-.5.3-.8.5-.5.4-.7.6-.4.5-.6.7c-.1.4-.2.7-.3 1z"/><path d="m539.7 786.8c-.4.6-.8 1.3-1.1 1.8-.3.6-.5 1.1-.7 1.5-.1.4-.1.7 0 1s.3.5.7.6c.1 0 .3.1.6 0 .2 0 .5-.1.8-.2s.7-.2 1.1-.4.9-.4 1.4-.7v.3.6c0 .2 0 .6.1 1-.6.3-1.1.6-1.7.8-.5.2-1.1.4-1.5.5-.5.1-.9.2-1.3.2s-.8 0-1.1-.1c-.4-.1-.7-.3-.9-.5-.3-.2-.5-.5-.6-.8s-.2-.7-.3-1.1c0-.4 0-.9.2-1.4.1-.2.1-.4.2-.6s.2-.5.4-.8.4-.6.6-1 .4-.7.7-1.1c-.8-.2-1.6-.3-2.3-.4s-1.5-.3-2.2-.4c-.3.4-.6.9-.9 1.3s-.6.8-.9 1.2-.5.7-.7 1-.4.6-.6.8c-.5.5-.9.9-1.2 1-.3.2-.6.2-.8.2-.1 0-.3-.1-.4-.2s-.2-.2-.3-.3-.1-.2-.2-.4c0-.1 0-.3 0-.4s.1-.2.1-.3c.5-.8 1-1.6 1.6-2.3.5-.7 1.1-1.4 1.6-2.1-.3-.1-.6-.2-.9-.4-.3-.1-.5-.3-.7-.5s-.4-.4-.5-.7-.2-.6-.2-1c0-.1 0-.2 0-.3s0-.2.1-.2c.1-.3.2-.4.4-.3.1 0 .2.1.3.3s.2.4.3.7c.3.1.5.1.8.2l.9.3.8.3c.4-.5.7-.9 1.1-1.4.3-.4.7-.9 1-1.3.2-.3.4-.6.5-.8.2-.3.3-.6.4-.8s.1-.4.1-.6 0-.4-.1-.5c-.1-.2-.1-.3-.3-.4-.1-.1-.3-.2-.5-.3s-.4-.1-.6-.1-.5 0-.8.1c-.3 0-.7.1-1.1.2s-.8.3-1.3.5c-.2.1-.3.1-.4.1s-.2 0-.3 0c0 0-.1-.1 0-.3 0-.2.1-.4.1-.6.1-.3.2-.6.5-.8.2-.2.5-.4.8-.6s.6-.3 1-.4.7-.2 1.1-.2h1.1c.3 0 .7.1.9.2.4.1.8.3 1.1.5s.6.5.8.8.3.7.4 1.1c0 .4 0 .9-.2 1.5-.1.3-.2.6-.4.9-.2.4-.4.7-.6 1.2-.2.4-.5.9-.8 1.3-.3.5-.6.9-.9 1.4.6.1 1.3.3 2 .5.8.2 1.5.4 2.3.6.6-.9 1.2-1.8 1.9-2.7s1.3-1.8 2-2.7c.2-.3.5-.5.8-.6s.6-.2.9-.1c.1 0 .2.1.3.2s.2.2.2.3c.1.1.1.2.1.3s0 .3 0 .4-.1.3-.2.5-.2.3-.3.5c-.2.3-.5.7-.8 1-.3.4-.6.7-.8 1.1-.3.4-.6.8-.9 1.2s-.6.8-.8 1.2c.4.1.7.2 1 .2.3.1.5.1.6.1s.1 0 .2 0h.2c.2.1.3.1.4.2s.2.1.2.2.1.2.1.3 0 .2-.1.3c0 .1-.1.2-.2.3s-.2.1-.3.1-.2 0-.3 0-.2 0-.3 0c-.2 0-.3-.1-.4-.1s-.1 0-.2 0c0 0 0 0-.1 0 0 0 0 0-.1 0 0 0-.1 0-.2 0s-.2 0-.4-.1c-.2 0-.4-.1-.6-.1-.1-.4-.3-.4-.5-.5z"/><path d="m550.5 794.5c-.4 0-.8 0-1.1.1-.4 0-.8.1-1.1.1-.4 0-.7 0-1 0s-.6 0-.9-.1-.5-.2-.6-.4-.2-.4-.1-.5c.1-.2.1-.3.2-.5.1-.1.2-.3.3-.3.1-.1.2-.2.3-.2.1-.1.2-.1.3-.1l6.6-.4-5.7-3.7c-.2-.1-.3-.3-.4-.4s-.1-.3 0-.5c0 0 0 0 0-.1s.1-.2.1-.2c.1-.1.1-.2.2-.3l.3-.3s.2-.1.3-.2h.4c.1 0 .2.1.4.2s.4.3.7.5.6.4.9.7c.3.2.6.5.9.7s.6.5.8.7c.3.2.5.4.6.5s.2.2.3.2c.3.2.6.5.8.7.3.2.5.4.7.6s.3.4.4.7c.1.2.1.5 0 .8s-.3.6-.4.9c-.2.2-.5.4-.8.6-.3.1-.8.3-1.3.3-.6-.2-1.2-.1-2.1-.1z"/></g><ellipse cx="365.00674" cy="268.59839" fill="#fff" rx="23.677713" ry="23.107164" stroke-width="1.163297"/><path d="m373.36754 271.42775c-1.1 4.10001-5.6 6.4-10.1 5.2-3.3-.89999-5.6-3.5-6.1-6.39999.4.39999.9.69999 1.5.89999 1.8.5 3.7-.5 4.2-2.1.5-1.69999-.6-3.5-2.5-4-.7-.19999-1.5-.19999-2.2.1 1.8-2.7 5.5-4.1 9.1-3.1 4.5 1 7.2 5.30001 6.1 9.4z" fill="#333"/><ellipse cx="465.42307" cy="269.16895" fill="#fff" rx="23.677713" ry="23.107164" stroke-width="1.163297"/><path d="m473.78386 271.42775c-1.1 4.1-5.6 6.4-10.1 5.2-3.3-.9-5.6-3.5-6.1-6.4.4.4.9.7 1.5.9 1.8.5 3.7-.5 4.2-2.1.5-1.7-.6-3.5-2.5-4-.7-.2-1.5-.2-2.2.1 1.8-2.7 5.5-4.1 9.1-3.1 4.5 1 7.2 5.3 6.1 9.4z" fill="#333"/></svg> \ No newline at end of file diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_2_head-192.png b/borestop/src/main/webapp/content/images/jhipster_family_member_2_head-192.png new file mode 100755 index 0000000000000000000000000000000000000000..24baf78ce8326c3c2756f10ebed90829d0bddf30 GIT binary patch literal 5423 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 X%hVz6s@WHxK!C2Mp+=25A@Y9!nF9~R literal 0 HcmV?d00001 diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_2_head-256.png b/borestop/src/main/webapp/content/images/jhipster_family_member_2_head-256.png new file mode 100755 index 0000000000000000000000000000000000000000..7b25f52f93d109da2df18f8442ef2104a6e14b8f GIT binary patch literal 6687 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 literal 0 HcmV?d00001 diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_2_head-384.png b/borestop/src/main/webapp/content/images/jhipster_family_member_2_head-384.png new file mode 100755 index 0000000000000000000000000000000000000000..e89e120c2f015ccb140678ffff8ccbacb1ae1f20 GIT binary patch literal 9682 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%0A+4!5U9z2gkx4r7lU6;|#JO)I<C8@{~im&J@= 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 V^p!DYUi_f~=xZBm)oD1z{4Y|2cgz3) literal 0 HcmV?d00001 diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_2_head-512.png b/borestop/src/main/webapp/content/images/jhipster_family_member_2_head-512.png new file mode 100755 index 0000000000000000000000000000000000000000..3c0e6cb9af31e2e46d9e9b6c8cec99c0d4c5e5c6 GIT binary patch literal 10514 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 literal 0 HcmV?d00001 diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_3.svg b/borestop/src/main/webapp/content/images/jhipster_family_member_3.svg new file mode 100755 index 00000000..cc0d01f1 --- /dev/null +++ b/borestop/src/main/webapp/content/images/jhipster_family_member_3.svg @@ -0,0 +1 @@ +<svg enable-background="new 0 0 792 1135.9" viewBox="0 0 792 1135.9" xmlns="http://www.w3.org/2000/svg"><path d="m487.4 224.4s22.2 223.1-23.5 212.7c-27.6-6.3 8.8.1-69.6-41.2-64.6-34-129.8-110.9-146.5-141-10.1-18.2-8.5-87.6 48.5-127.4s127.3-65.3 201.3-25.8z" fill="#d4410d"/><path d="m471.5 172.3-54.6 207.7 108.9 56.4s37.7-8.4 36.4-35.4c-1.3-26.9-13.7-18.4 12.9-61.9 26-42.7 17.9-78 13.4-122.4-3.9-38.4-28.3-72.7-30.9-96.9-2.7-24.2-29.6-76.7-86.1-76z" fill="#d4410d"/><path d="m212.9 520.4c6.2-40.9 39.1-58.7 61.9-63 24.6-4.6 51.7-4.7 73.5-17.1 21.7-12.4 21.6-78.3 21.6-78.3h47 46.9s-3.5 62.1 18.3 74.5 56.1 14.7 76.8 20.9 55.7 22.1 61.9 63c5 32.8 9.8 104.5 9.8 104.5l-213.9 2.9-207.7 4.4s-1.1-79.1 3.9-111.8z" fill="#f2b181"/><path d="m468 412.5c-25.3-4.7-74.1-20.3-97.9-38.1 0-1.9 0-3.5 0-5.1 0-.1 0-.1 0-.1 0-.7 0-1.3 0-1.9 0-.1 0-.3 0-.4 0-.5 0-1 0-1.4 0-.1 0-.2 0-.3 0-.4 0-.8 0-1.1 0-.1 0-.2 0-.2 0-.3 0-.6 0-.9 0 0 0-.1 0-.2 0-.2 0-.4 0-.5 0-.2 0-.3 0-.3h47 46.9c-.1-.1-1.7 28.3 4 50.5z" fill="#eb9850"/><path d="m283.2 206.8s-20.1-31.2 3-78.3c24.8-50.7 59.9-84.7 128.3-84.7 68.3 0 107.8 34 132.7 84.7 23.1 47.1 3.4 78.3 3.4 78.3 31.1-6.2 25.3 27.8 15.5 43.1-8 12.7-8.2 14.1-13.1 28.1-6.9 20.2-23 6.2-23 6.2-9.3 25.9-15.9 32-53.1 66.3-32.4 29.8-43.7 29.5-60.1 29.5s-27.4.4-60.1-29.5c-37.3-34.1-43.8-40.4-53.1-66.3 0 0-16.1 14-23-6.2-4.9-14-5-15.4-13.1-28.1-9.6-15.4-15.4-49.3 15.7-43.1z" fill="#f2b181"/><path d="m212.9 520.4c6.2-40.9 37.1-58.7 61.9-63 13.7-2.4 32.9-4.7 50-10.9 7.6-2.7 29-13.7 29-13.7l23.6 34.4h78.7l23.7-34.4s21.5 11 29 13.7c17.2 6.2 36.7 6.9 50 10.9 20.7 6.2 55.7 22.1 61.9 63 5 32.8 45.8 223.2 45.8 223.2l-85.2 27.4-22.3-138.1s-10.4 81.7 9.4 186.9 41.3 123.4 14.6 131.6c-26.6 8.2-259.8 29.5-291.1 24.7-31.3-4.9-18.1-41.5-11.7-100s-18.8-266-18.8-266l-60.4 43.6s6.9-100.6 11.9-133.3z" fill="#f7f6f5"/><path d="m365.3 117.9s-1.3 22.6-21 42.3c-19.7 19.8-36 28.3-32.3 71.5s19.7 58 6.2 80.2c-13.6 22.2-24 28.4-16.3 48.1 7.7 19.8 5.1 27.2-3.5 40.7-8.5 13.6 0 32.1 0 32.1s-15.9-18.5-11-37-19.8-25.9-18.5-50.6c1.2-24.7 17.3-53 1.2-83.9-10.2-19.6-36.3-73.1-24.7-112.3 6.6-22.2 17.5-44.2 32.1-61.2 8.2-9.6 28.8-48 87-44z" fill="#e6511c"/><path d="m478 431.7c13.2 24.4 8.5 51.3-11.4 61.3-19.9 10.1-47.7-.4-63.7-23.4z" fill="#fff"/><path d="m358.9 423.8c-15 29.5-14.1 59.9 2.6 69.2 16.7 9.4 43.1-5.7 60.5-33.9z" fill="#fff"/><path d="m358.9 103.3s-9.3 37.4 43.7 73.2c0 0-7.9-20.1-10.4-39.2 0 0-7 23.2 42.7 34.9 0 0-9.3-3-9.3-15 0 0 77 5.5 90 40.6 13 35.2 17.9 54.5-5.2 79.5s-5.6 47.2.9 77.7c6.4 30.6-2.4 38.6-10.2 50-11.4 16.6 2.1 37.6 2.1 37.6s-12.3-17.3 10.9-32.4c9.7-6.3 24.9-15.4 19.3-46.9s.9-57.4 12.9-68.5c12.1-11.1 41.7-29.6 32.4-71.2-9.3-41.7-9.3-50-4.6-68.5 4.6-18.5-27.9-62-42.3-78.5-32.4-37.1-119-62.8-167.5-32.9z" fill="#e6511c"/><path d="m524.8 960.4 22.7-505.1-22.4-8-23.1 515.3z" fill="#4189c6"/><path d="m342 975.7 25.2-1.5-58-523.1-22.9 4.2z" fill="#4189c6"/><path d="m375.2 310.7c-2.5-1.4-1 .8-.6 1.3 3.4 3.6 19.8 16.6 43.2 16.2 24.1-.4 34.9-9.9 37.8-13 .4-.4.2-1.1-.4-1.3-4.4-1.1-19.9-4.6-32.8-4.6-6.5 0-13.3 2.9-21.8 4.1-6.8.9-15.6 2.7-25.4-2.7z" fill="#ea1818"/><path d="m365.3 203.9c12.8 0 23.2 10.4 23.2 23.2s-10.4 23.2-23.2 23.2-23.2-10.4-23.2-23.2 10.4-23.2 23.2-23.2z" fill="#fff"/><path d="m374.6 226.9c0 5.4-4.4 9.9-9.9 9.9-4 0-7.5-2.4-9-5.9.6.4 1.3.6 2 .6 2.3 0 4.1-1.8 4.1-4.1s-1.8-4.1-4.1-4.1c-.9 0-1.8.3-2.4.8 1.2-4 5-7 9.4-7 5.5-.1 9.9 4.3 9.9 9.8z" fill="#1c4911"/><path d="m470.3 203.9c12.8 0 23.2 10.4 23.2 23.2s-10.4 23.2-23.2 23.2-23.2-10.4-23.2-23.2 10.4-23.2 23.2-23.2z" fill="#fff"/><path d="m479.6 226.9c0 5.4-4.4 9.9-9.9 9.9-4 0-7.5-2.4-9-5.9.6.4 1.3.6 2 .6 2.3 0 4.1-1.8 4.1-4.1s-1.8-4.1-4.1-4.1c-.9 0-1.8.3-2.4.8 1.2-4 5-7 9.4-7 5.5-.1 9.9 4.3 9.9 9.8z" fill="#1c4911"/><path d="m373.2 84s28.6-7.8 44.6-9.1 35.1-2 35.1-2-11.8-4.3-35.8-1.5-43.9 12.6-43.9 12.6z" fill="#d4410d"/><path d="m378.3 100.2s26.3-4.8 57.6 3.4c31.3 8.1 40 33.3 40 33.3s-11.7-17.6-39.9-26.8c-28.1-9.2-57.7-9.9-57.7-9.9z" fill="#d4410d"/><path d="m364.9 174.8c-24.7.5-36.3 6.7-39.6 12.5-4.1 7.3 6.9 4 16.8.1 9.8-3.9 26.3-6.6 36.4-2.6 10 3.9 15.8 6.8 15.8 1.7-2.7-5.1-14.4-11.7-29.4-11.7z" fill="#e6511c"/><path d="m435 186.5c0 5.2 5.8 2.3 15.8-1.7 10.1-4 26.6-1.3 36.4 2.6s20.9 7.2 16.8-.1c-3.3-5.9-14.9-12-39.6-12.5-14.9 0-26.7 6.6-29.4 11.7z" fill="#e6511c"/><path d="m418.9 436.7c-.8-.1-1.5-.2-2.1-.3-.5-.1-1-.2-1.3-.4s-.6-.4-.8-.6-.3-.5-.4-.9c-.1-.3-.1-.6 0-.9.1-.2.3-.5.5-.7s.5-.4.8-.6.6-.4.9-.6c0 0 .1-.1.3-.2s.4-.3.7-.6c.3-.2.6-.5 1-.7.4-.3.7-.5 1.1-.8s.7-.5 1-.7.6-.4.8-.5c.1-.1.2-.1.4-.2h.4c.1 0 .2.1.3.2s.2.2.2.3c.1.1.1.2.2.3 0 .1.1.2.1.3v.1c.1.2 0 .4-.1.6-.1.1-.2.3-.4.4l-6.5 3.9 6.3.7c.1 0 .2 0 .4.1s.3.1.4.2.3.2.4.4c.1.1.2.3.3.5 0 .2 0 .4-.1.6s-.3.3-.6.4-.5.1-.9.1c-.3 0-.7-.1-1-.1-.4-.1-.7-.1-1.1-.2-.5-.1-.9-.1-1.2-.1z" fill="#333"/><path d="m427.7 439.5c-.2-.8-.2-1.6-.1-2.5s.4-1.8.7-2.6c.4-.9.9-1.7 1.5-2.4.6-.8 1.4-1.4 2.3-1.9-.6-.3-1.2-.6-1.7-.9s-1-.7-1.5-1.1c-.4-.4-.8-.8-1.1-1.2s-.5-.9-.6-1.3c-.1-.6-.2-1.2-.2-1.8s.1-1.1.2-1.6.3-1 .5-1.4.5-.8.8-1.2c.3-.3.6-.6 1-.9.4-.2.7-.4 1.1-.5.5-.1 1.1-.1 1.6 0 .6.2 1.1.5 1.6 1s1 1.2 1.5 2.1c.4.9.8 2 1.1 3.3.2 1 .4 1.9.5 2.7.1.9.2 1.7.3 2.5.4.1.8.3 1.2.4s.8.2 1.3.4c.1 0 .2.1.3.1s.3.1.4.1.2.1.3.2l.2.2v.2c0 .1-.1.1-.1.2-.1.1-.1.1-.2.2s-.1.1-.1.1c-.1.1-.2.1-.4.2-.3.1-.7.1-1.2.1s-1-.1-1.6-.2c0 1.1-.1 2.2-.2 3.2s-.4 1.9-.6 2.7c-.3.8-.6 1.5-.9 2.2-.4.6-.7 1.2-1.1 1.7s-.8.8-1.3 1.1c-.4.3-.9.5-1.3.6-.5.1-.9.1-1.4 0-.4-.1-.9-.3-1.2-.6-.4-.3-.7-.7-1-1.2-.2-.9-.4-1.5-.6-2.2zm2.4 0c.1.6.4 1 .7 1.3s.6.3 1 .2.8-.4 1.2-.8c.4-.5.8-1.1 1.1-1.9s.6-1.8.8-3 .3-2.6.2-4.2l-.4-.1c-.6.3-1.1.6-1.6 1s-.9.9-1.3 1.4-.7 1-1 1.6-.5 1.1-.6 1.7c-.2.5-.2 1.1-.3 1.6.1.4.1.8.2 1.2zm-.7-15.3c.1.5.3.9.6 1.3s.7.8 1.2 1.2 1 .7 1.6 1 1.3.6 2 .9c-.1-.8-.2-1.7-.4-2.6s-.4-1.9-.6-2.9c-.2-.7-.3-1.3-.5-1.7-.2-.5-.4-.8-.6-1.1s-.4-.4-.7-.5c-.2-.1-.5-.1-.7 0s-.4.2-.6.3c-.2.2-.4.4-.5.6-.2.2-.3.5-.4.8s-.2.6-.3.9-.1.6-.1.9c-.1.3 0 .6 0 .9z" fill="#333"/><path d="m453.5 424.1v2.1c0 .7.1 1.2.2 1.7.1.4.3.7.5.9s.5.2.9.1c.1 0 .3-.1.5-.3.2-.1.4-.3.6-.6.2-.2.5-.5.7-.9.3-.4.5-.8.8-1.3 0 0 .1.1.2.2s.2.3.3.5.3.5.6.8c-.3.6-.7 1.1-1 1.5-.4.5-.7.9-1.1 1.2s-.7.6-1.1.8-.7.4-1 .4c-.4.1-.7.1-1.1 0-.3-.1-.7-.2-1-.4s-.6-.5-.8-.8c-.2-.4-.4-.8-.5-1.3 0-.2-.1-.4-.1-.7s0-.6-.1-.9c0-.3 0-.7 0-1.1s0-.8 0-1.3c-.8.3-1.5.5-2.2.8s-1.4.5-2.1.7c0 .5-.1 1.1-.1 1.6s-.1 1-.2 1.4-.1.9-.1 1.2c0 .4-.1.7-.1 1-.1.7-.3 1.2-.5 1.5s-.4.5-.6.6c-.1 0-.3 0-.4 0s-.3-.1-.4-.1c-.1-.1-.2-.1-.3-.3-.1-.1-.2-.2-.2-.4 0-.1 0-.2 0-.3 0-1 .1-1.9.2-2.8s.2-1.8.3-2.6c-.3.1-.6.1-.9.1s-.6 0-.9-.1-.5-.2-.8-.4c-.2-.2-.5-.4-.7-.7 0-.1-.1-.2-.1-.3s-.1-.2-.1-.2c-.1-.3 0-.4.2-.5.1 0 .2 0 .4.1s.4.2.7.5c.3-.1.5-.2.8-.2.3-.1.6-.1.9-.2l.8-.2c.1-.6.2-1.2.2-1.7.1-.6.1-1.1.2-1.6 0-.3 0-.7 0-1s-.1-.6-.1-.9c-.1-.2-.1-.4-.2-.6s-.2-.3-.3-.4-.3-.2-.4-.2c-.2 0-.4 0-.6 0s-.4.1-.6.2-.5.3-.7.5c-.3.2-.5.4-.8.7s-.6.6-.9 1c-.1.1-.2.3-.3.3-.1.1-.2.1-.3.1 0 0-.1-.1-.2-.2s-.1-.3-.2-.6-.1-.6 0-.9.2-.6.4-.9.4-.6.7-.8c.3-.3.6-.5.9-.7s.6-.4.9-.5.6-.3.9-.3c.4-.1.8-.1 1.2-.1s.8.1 1.1.3.6.4.9.8.5.8.6 1.4c.1.3.1.6.1 1v1.3 1.5c0 .5-.1 1.1-.1 1.7.6-.2 1.3-.4 2-.6s1.5-.4 2.2-.7c.1-1 .2-2.1.3-3.3.1-1.1.3-2.2.4-3.4.1-.4.2-.7.3-.9.2-.3.4-.4.7-.5h.4c.1 0 .2 0 .3.1s.2.1.3.2.1.2.2.4c0 .1.1.3.1.5v.6c0 .4-.1.8-.2 1.3-.1.4-.1.9-.2 1.4s-.1 1-.1 1.5-.1 1-.1 1.5c.4-.1.7-.2 1-.3s.5-.2.6-.2.1 0 .2-.1h.2c.2 0 .3-.1.4 0 .1 0 .2 0 .3.1.1 0 .1.1.2.2 0 .1.1.2.1.3v.3c0 .1-.1.2-.2.2-.1.1-.1.1-.2.2-.1 0-.2.1-.2.1-.2.1-.3.1-.3.1-.1 0-.1 0-.1.1 0 0 0 0-.1 0 0 0 0 0-.1 0 0 0-.1 0-.2.1-.1 0-.2.1-.4.1-.2.1-.4.1-.6.2-.3.1-.5.2-.7.3z" fill="#333"/><path d="m466.7 425.2c-.3.2-.6.4-1 .6-.3.2-.6.4-.9.7-.3.2-.6.4-.9.6s-.6.3-.8.3c-.3.1-.5.1-.7 0s-.3-.2-.4-.4c0-.2-.1-.4 0-.5 0-.2.1-.3.1-.5.1-.1.1-.3.2-.4s.1-.2.2-.2l5.5-3.6-6.8-.3c-.2 0-.4-.1-.6-.1-.1-.1-.3-.2-.3-.5 0 0 0 0 0-.1s0-.2 0-.3 0-.2 0-.3 0-.2.1-.4c0-.1.1-.2.2-.3s.2-.2.4-.2h.4c.2 0 .5 0 .8.1.3 0 .7.1 1.1.1.4.1.8.1 1.2.2s.7.1 1.1.2c.3 0 .6.1.8.1s.3 0 .3.1c.4.1.7.1 1.1.1.3 0 .6.1.9.2s.5.2.7.3c.2.2.3.4.4.7.1.4.1.7.1 1s-.2.6-.4.9-.6.6-1 1c-.5.1-1.1.5-1.8.9z" fill="#333"/><path d="m432.1 484.9s-88.1-49.1-95.1-17.5-15.1 55.7 8.2 59.7c23.3 4.1 86.9-42.2 86.9-42.2z" fill="#3373aa"/><path d="m416.9 477.6c24.8-13.4 73.9-36.4 79.9-13 8.2 31.5 17.1 55.3-6 60.2-16.2 3.5-53.2-17.3-73.8-29.9-.3-15.3.1-2.2-.1-17.3z" fill="#4189c6"/><path d="m532.2 968.6h-34.7c-.6 0-1.1-.5-1.1-1.1v-49.1c0-.6.5-1.1 1.1-1.1h34.7c.6 0 1.1.5 1.1 1.1v49.1c0 .6-.5 1.1-1.1 1.1z" fill="#ccc"/><path d="m373.6 979.7-34.4 4.7c-.6.1-1.2-.4-1.3-1l-6.6-48.7c-.1-.6.4-1.2 1-1.3l34.4-4.7c.6-.1 1.2.4 1.3 1l6.6 48.7c0 .7-.4 1.3-1 1.3z" fill="#ccc"/><path d="m538.1 526.2c5.3 8.7 5.1 17.9 2.6 27.4-5.1-1.8-1.1-6.2-3.1-10.1-4.2 5.1-9.9 7.9-15.9 12.9 5.6.5 8.3-2.2 11.5-3.5 3.7-1.5 3.8-1.4 4.6 2.8-2.7 2.2-5.2 4.9-8.6 6-1.6.6-3.4.6-5.6 1.7 2.9-1.1 5.4-1.3 7.7-2.1.6 0 1.2.2 1.7.6.9 2.7 1.7 5.4 2.6 8.1.8 1.1 0 1.7-.8 2.2-4.7 5.6-8.4 11.9-12.7 17.9 4.3-1.7 6.4-6.1 10.4-8.1.6-.1 1.3 0 1.8.3 1.2 2.4-.2 4.1-1.4 5.8 1.4-.5 1.3-2.7 2.8-3.3 1.1.2 1.8.6 1.2 1.8-.7 5.9-5.2 11.5-1.5 17.8-.6 3.8-4.3 8 1.3 11.1.5 5.3-3.5 9.5-3.8 14.6.5 1.2.8 2.4-.5 3.4-3.7 2.2-3.9 6.9-7 9.6-.4 1.1-2.7 2.4.4 3.1 2.7.4 4.3-3.2 7.2-1.9.2.6.2 1.2-.2 1.7-.9 3.3-1.5 5.1 2.2 8.5 4.3 4 5.1 12.3 4.1 18.8-1.7 10.2-1.1 19.7 2.3 29.5 2.5 7.1.8 14.2-5.6 21.2-.2-3.7-.4-6-.5-8.8-2.7 2.1-1.6 6.2-5.1 7.8-.2-3.8-.4-7.5-.5-11.2-1-1.3-2.8-1.7-3.7-3.1-1.6-6.1-5.6-10.9-9-16.1-7.3-11.3-10.4-22.9-2.2-35.1 1.5-2.3.3-3.2-1-4.5-2.2-2.3-4-5.5-2.1-8 3.7-5 .6-8.7-1.2-12.8-.2-.6-.2-1.3 0-1.9.5-.4 1.2-.5 1.8-.4 1.9.6 3.1 2.4 5 3 .8.3 1.9.6 2.2-.5.2-.9-.7-1.5-1.3-2-2.3-2.6-6-3.3-8.5-5.7-3.3-3.5-1.2-8.3-3-12.1-4-4.9-4.6-10.5-3.9-16.5 5.5.6 3.9 5.9 5.8 8.9 1.3 1.9 2.7 3.7 5.1 4.3-2.1-1.3-4.9-2-4-5.5 3.3-1.4 5.9 1.6 9 1.4.1.9 0-.6.7 0 .5.5.9 0 .4-.3-2.7-1.5-5.2-3.3-8-4.8-2.9-2.4-6-4.7-7.8-8.2 4.1-7 3.6-13.4-.8-20.5-3.5-5.6-2.5-12.4-1.6-18.8.3-2 .7-3.8-1.4-5.5-9.9-7.8-11.4-18.2-8.6-29.7 1-3.9.7-6.6-2.1-9.8-6.8-7.6-8-16.9-5.1-26.4 1.7-5.5.9-9.2-3.3-13.8-9.5-10.1-10.3-23.1-8-36.1.7-3.9.3-6.4-2.2-9.2-3.7-4.1-6.4-8.9-8.2-14.2-2.8-8.3-.4-13.8 7.9-16.8 9.8-3.5 19.5-1.8 28.8 2 5.5 2.2 10.4 7.3 15.8 7.6 5 .3 9.3-5.8 14.8-7.7 9.2-3.2 18.3-4.1 27.5-.3 5.9 2.4 8.7 6.4 8.6 13.2-.2 15.1-2.4 29.2-13.9 40.3-2.1 2-1.1 4.2-1.2 6.4.7 1.1 0 1.7-.8 2.2-5.2 2.5-5.9 9.2-11 11.9-5.8 3.8-12 6.9-17.4 10.4 4-.9 7.4-5.8 12.8-3.7-2.7 7.9-10.1 7.5-15 9.7 7.7-1.5 15.1-6 22.3-10.9 2-1.3 5-6 8-5.2 1.8 5.2-4 9.9-6.7 12.9-2.3 2.5-5.2 4.2-8.3 5.6-4.3.4-8.1 2.8-11.1 3.4 3.4-1.2 8-2.8 12.7-4 2-1 3.8-2.6 6.2-2.6 1 .3 1.8.8 1.3 2.1 3.6 6.9 5.3 14.1 4 21.9-2.3.7-2.4-2-3.8-2.6-5.7 2.4-8.9 8.6-15.3 9.9 1.8-.2 3.8-2.2 5.1-.3 1.4 2.1-1 3.1-2.6 3.8s-3.2 1.3-4.1 1.8c3.9-1.1 7.7-3.9 11.7-6.4 3.9-2.4 4.9-.4 4.3 3.4-1.5 2.2-3.2 4.2-5.9 5.2-3 0-5.7 1.1-8.4 2.2-.9.3.1 1.2-.3.4 0-.1.1-.3.5-.3 2.5-.6 4.8-2.8 7.7-1.3.9 1.5.2 3.2 1.2 4.1z" fill="#d4410d"/><g fill="#e6511c"><path d="m536.8 555.1c1.2-2.5.1-2.7-1.8-1.7-3.4 1.8-6.7 3.8-10.2 5.5-1.4.7-3.4.9-4.2-.9-.7-1.6-.7-3.4 1.4-4.6 5.6-3.4 11.7-6.2 15.1-12.4.2-.4 1.5-.8 1.7-.6 1.2 1.1 1.8 2.6 1.9 4.2.2 3-2.7 6 0 9-.3 2.3-1.1 4.3-3.8 4.6-1.1-1-.9-2-.1-3.1z"/><path d="m507.9 605.9c-3.5-2.2-1.5-7.6-5.4-9.6-.3-1.6-.2-3 1.2-4 4.3.4 5.1 5.1 8.3 6.9.6 2.4 2.7 3.2 4.5 4.4 1.4.8 3.4 1.5 2.4 3.9-4 1.3-6.5-3.2-10.3-2.7.1.4-.1.9-.7 1.1z"/><path d="m536.8 520.8c2-1.5 4-3 6-4.4 1-4.5-1.2-9.6 2.5-13.6.8 1.4 1.6 2.8 2.5 4.2.4 5.7-2.6 9.9-6 13.9-1.4 1.7-3.8 2.6-3.6 5.4-1.3-.6-1.3-1.9-1.4-3.1-.8-.8-.8-1.6 0-2.4z"/><path d="m536.6 615.7c-1.1-.3-2.1-.9-3.2-.8-1.2.1-5.5.9-8.1 2.5-2.9 1.8 4.8-5.5 5.7-6.7 1.5-1.9 2.8-4.1 4.2-6.1 2 3.5 2.1 7.2 1.4 11.1z"/><path d="m536.9 586.8c-.4-.4-.8-.9-1.2-1.3-1.4-.5-.6-2.1-1.4-2.9-.5 0-.9.1-1.4.1-.9-3.9.7-7.6 1.3-11.3.4-.5.9-.9 1.3-1.4 2.6 5.5 3.8 11 1.4 16.8z"/><path d="m510.7 630.8c-.1.6-.2 1.2-.3 1.7-4.9-5.8-3.7-12.9-3.9-19.7 2.4 3.6 1.3 8.5 4.4 11.8-.5 2.1 1.8 4.1-.2 6.2z"/><path d="m549.2 454.8c.5-.5 1-1.1 1.5-1.6 2.6 5.4 3 11 1 16.7-.6.4-1.2.4-1.7-.1-.9-1-1.4-2.2-1.5-3.6.7-3.7-.6-7.7.7-11.4z"/><path d="m550.5 469.9h1.2c-1.4 5.7-3.4 11.1-7.9 15.2-.5-.5-1-1-1.5-1.5 1.5-5.3 4.9-9.5 8.2-13.7z"/><path d="m536.8 555.1c0 1 .1 2 .1 3.1-.8 1.8-1.9 3.3-4 3.8-.5 0-1.1 0-1.6 0-1.5.9-2.7 1.1-2.6-1.3 2.7-1.8 5.4-3.7 8.1-5.6z"/><path d="m532.8 646.1c-.1-.5-.1-.9-.2-1.4-2.6-3.6-2.6-7.4-1-11.4.4-1 .8-2 1.2-3 2.7 5.3 2.7 10.5 0 15.8z"/><path d="m525.9 708.9c1.8.4 4.3-.1 3.7 3.1-1.1.9-1.4 2.8-3.3 3.1-1.1-1.9-.5-4.1-.4-6.2z"/><path d="m497 457.4c6.1 4.4 13.2 6.9 19.6 10.7-14.5-2.4-27.3-8.2-37.6-19-3.5-4.5-4.7-9.5-3-14.9 1.1-5.6.3-4.9 2.5-1.7 3.1 4.5 7.4 8.8 10.2 12.6 2 1.4-4.4 3.4.3 4.7 2.7 2.6 6.4 4 8 7.6z"/><path d="m518.7 663.5c.4-1.3.3-3.1 1.9-3.2 1.6-.2 1.2 1.6 1.4 2.6.6 2.9.9 5.8 1.4 8.8 2-.5.3-2.8 2.1-3.8 1.1 8.8-2.2 16.9-2.5 26.4-6.8-10.2-14.6-18.9-6.8-30.9.8.9 1.2 1.9 1.2 3.1.3-1.2.5-2.2 1.3-3z"/><path d="m549.2 454.8c1.8 4.5 2.7 8.9-1 12.9-.1.3-.2.5-.3.8-7.7 10.1-18.7 13.7-30.3 16.4 5.1-4.4 12.5-5.2 16.7-10.9.2-1.4 1.1-2.6 2.3-3.1 2.5-1.1 4-2.3 1.6-4.9 3.1-2.9 5.7-6.1 7.8-9.9.7-1.4 1.1-3.3 3.2-1.3z"/><path d="m545.1 415.9c2.9-2.5 5.3-5.3 7.5-8.5 1-1.4 4.2-5.7 4.7-8.2 1.7-8.6 1.3 7.5 1.4 9.7.1 1.9.9 3.8-.3 5.6-1.2 2.2-1.7 4.9-4.5 5.8-6.9 8-19.1 14.2-29.1 14.3 4.8-2.6 8.9-4.9 13-7.1 1.7-3.7 5.5-5.2 8.2-7.8 2.2-1.8-2.7-2-.9-3.8z"/><path d="m545.2 502.9c-.2 4.2-.2 8.5-2 12.4-.2.4-.8.4-.9-.1-.2-1.4-.2-3.1-2.9-.7-4.2 3.7-9.4 5.4-15.6 7.4-.5.2-.9-.5-.5-.8 3-2.3 6.2-3.2 9-5.7.4-.4 0-1-.5-.8-2.5 1.1-4.6 2-7 3-.4.2-.8-.3-.6-.7 1.4-2.6 3.7-3.3 5.6-4.4 4.6-2.6 10.1-4.9 11.8-10.1 1.9-5.7 1.4-4.9 3.5.3.1 0 .1.1.1.2z"/><path d="m488.7 493.2c-.2-.1-.5-.2-.5-.4-1-4.2-4.8-9.6-.4-12.2 2.1-1.2 5.8 5.6 9.1 8.4 1.3 4.8 8 4.5 9.1 9.6 2.2 2.9 6.3 2.5 10.1 6.2-9.9-2.6-17.6-5.5-24.2-11.1-.7-.6-1.9-4.8-3.4-.4z"/><path d="m488.8 450.7c-2.7-.2-4.4-1.6-5.3-4.4 1.9-.3 4.4 2.3 5.2-1.2 10.3 5.9 21.1 11 31.2 18.7-8.2-1.2-14.6-5.3-21.5-7.8-3.8-.7-6.7-3.1-9.6-5.3z"/><path d="m513.6 542.5c1.1.6 2.2 1.3 5 2.9-9.4-.2-14.5-5.9-20.8-8.4-1.1.4-1.6-.3-2.1-1.1-2.1-4.2-3.9-8.5-.9-13.6 3.2 3.4 6.1 6.5 9 9.6.5 1.2.1 2.7 1.3 3.6 2.7 2.5 6.4 3.7 8.5 7z"/><path d="m534.2 571.4c2.5 4.1.2 7.7-1.3 11.3-2.3 3.7-5.7 6.5-9.1 9.3-.7.6-1.6 1.7-2.8.8 1.6-1.7-2.2-2.1-.8-3.9 4.5-5.9 9.6-11.3 12.4-18.4.5.3 1 .6 1.6.9z"/><path d="m506.5 570.2c-2.6-3.6-3.9-9.1-2.1-13.6 11.6 20 17.5 17.6 19.9 20-6.8-.6-11.2-4.6-16.6-6.4-.4.7-.8.7-1.2 0z"/><path d="m476.3 434.2c-.8 5.3.9 10.1 2.7 14.9 3.5 9.4 10.3 15.5 19.2 19.6.6 1.4-.1 2.1-1.3 2.6-14.6-4.5-25.4-23.9-20.6-37.1z"/><path d="m538.2 465.9c1.1 2.9 3 1.6 5.9-.4-2.3 5.7-7 5.9-9.8 8.4-5.6.7-9.9 5.3-16.4 5.6 6.1-6.4 13.4-9.7 20.3-13.6z"/><path d="m545.1 415.9c.5.4 1.1.9 1.6 1.3 1.2.8 3.3-1.4 3.6.5.3 2-1.8 2.5-3.6 2.6-3.3 2.2-6.4 4.9-10.5 5.8-4.9 1.8-9.5 4.6-15.9 5.5 8.7-6.1 16.4-11.5 24.8-15.7z"/><path d="m553.1 419.4c1.1-2 1.6-4.5 4.2-5.5-.1 10.1-4.4 17.6-13.7 22.1-1.6.2-3.7 2-4.1-1.4 5.8-2.7 10.7-6.5 13.9-12.2.7-1.1 1.7-2.2-.3-3z"/><path d="m531.6 633.3c1.6 3.7.7 7.6 1 11.4-2.5 0-3.2 5.3-6.8 2.4-.2-1.7-1-3-2.3-4 3.2-2.9 3.8-7.8 8.1-9.8z"/><path d="m531.1 698.3c-3.2-7.1-4.1-14 2.3-21.2 1.8 6.5-1.5 11.6-.9 16.9-1.2 1.2.3 3.3-1.4 4.3z"/><path d="m547.9 468.4c0-.3.1-.6.3-.8 1.9-.4 2 1 2.3 2.2-2.5 4.7-4.4 9.8-8.2 13.7-1.8 1-3.5 2-5.3 3-1.5.4-3.1 1.1-2.9-1.6 6.1-4.1 12.9-7.8 13.8-16.5z"/><path d="m506.1 498.6c-2.7-3.5-9.8-2.8-9.1-9.5 5 2.5 10.2 4.5 14.8 8.6-1.9 1.8-4 .2-5.7.9z"/><path d="m503.4 535.8c-4.8-1.7.2-2.6.3-3.9 5.6 2.7 11.3 5.4 16.2 9.8-2 1.7-3.4-.6-5-.4-4.3-.8-7.7-3.7-11.5-5.5z"/><path d="m495.6 535.8c.7.4 1.4.8 2.1 1.1 2.3 5.6 8.1 7.7 12.4 11.6-6.4.5-11.9-4.4-14.5-12.7z"/><path d="m518.9 629.4c1.7 1.2 4.9 2.2 3.2 4.9-1.6 2.6-4.5 1.6-6.7.2-1.3-.8-2.3-2.1-3.4-3.2-1-2.6.8-2.6 2.4-2.5 1.5 0 2.8 1.5 4.5.6z"/><path d="m488.8 492.9c5.8 6.5 7.8 9.2 13.6 11.4.1 2.6-1.2 2.2-2.8 1.4-5.4-2.6-9.9-6.9-11.4-12.9-.1-3.3.6.1.6.1z"/><path d="m518.9 607.4c-.8-2.2-2.8-2.4-4.6-3.2-2.1-.9-3.9-2.3-2.3-5 4 2.3 8.5 3.9 12.2 7.9-2.2 0-3.7.2-5.3.3z"/><path d="m477.4 402.7c-3.2-5-2.7-28.7-2.3-27.2 1.7 5.3 3.7 9.3 4.2 10.3 2.7 4.6 6.7 8 10.6 11.4.7 1.1 0 2.1-.3 3.1.5 2.9 2 2.3 4.6 6.3 7.3 5.4 15.9 8.3 23.6 12.9-13.1-2.5-25.3-7.1-35.6-15.8-.9-.8-1.5-3.4-3.5-1.1-.4.7-.8.7-1.3.1z"/><path d="m488.7 400.3c.4-1 .9-2 1.3-3.1 9.4 4.4 18.4 9.6 27.8 16.6-9.4-1.3-16.2-5.9-23.6-8.9-2.1-1.2-5.2-1.3-5.5-4.6z"/><path d="m477.4 402.7c.4 0 .8-.1 1.2-.1 4.7 7 10.7 12.6 18.2 16.7 1.1 1.6 1.1 2.6-1.3 2.5-9.1-3.4-15-9.8-18.1-19.1z"/><path d="m495.6 421.9c1-.5 1.3-1.4 1.3-2.5 5.4 1.2 10.5 3.4 15.3 6.5-5.6-1.3-11.1-2.7-16.6-4z"/><path d="m518.9 629.4c-.9 2.3-2.2 2.4-4 .9-1.3-1.1-2.4-.8-2.9.9-.4-.3-.8-.4-1.3-.5.4-2-2.5-4.1.1-6.1 2.9 1.3 5.7 2.6 8.1 4.8z"/><path d="m539.5 434.7c1 1.6 2.6 1.1 4.1 1.3-4.9 1.4-9.9 2.8-14.8 4.2-.2-.5-.4-1-.6-1.5 3.8-1.3 7.5-2.7 11.3-4z"/><path d="m534 485c.6 1.3 1.8 1.3 2.9 1.6-5.1 1.4-10.1 2.8-15.2 4.2 3.8-3.1 7.9-4.9 12.3-5.8z"/><path d="m531.1 698.3c.3-1.5-.2-3.2 1.4-4.3.6 4.7 4.9 7.2 6.7 11.3-3-2.2-6.9-3-8.1-7z"/><path d="m523.5 643.1c1.1-.1 2.7-.6 3-.1 1 1.4.9 3-.7 4.1-1.4.2-2.9 2.3-4.3.3-1.3-2.1.8-3.1 2-4.3z"/><path d="m518.7 663.5v9.1c-3.4-2.9-2.1-6.2-2.5-9.3 1-1.3 1.7.2 2.5.2z"/><path d="m536.8 520.8v2.4c-3.7.8-7.4 1.7-11.1 2.5 3.3-2.7 6.8-4.8 11.1-4.9z"/><path d="m499.6 505.7c1.1-.1 2.3-.1 2.8-1.4 3 .7 6.1 1.3 9.3 4-4.7-.3-8.5-.9-12.1-2.6z"/><path d="m503.4 535.8c4.3.8 8 2.9 11.5 5.4-.4.4-.8.8-1.2 1.2-4.1-1.3-7.4-3.6-10.3-6.6z"/><path d="m496.9 471.3c.4-.9.9-1.8 1.3-2.6 2.7 1 5.4 1.9 8.1 2.9.3 1.2.1 1.8-1.3 1.3-2.7-.5-5.4-1-8.1-1.6z"/><path d="m534.2 582.6c.5 1 1 1.9 1.4 2.9-1.1 2.9-2.6 5.5-7.1 7.1 2.4-4 5.5-6.3 5.7-10z"/><path d="m507.9 605.9c.3-.4.5-.9.8-1.3 2.2 2.7 5.2 4.2 9.4 6.8-5.7 0-8.2-2.3-10.2-5.5z"/><path d="m488.8 450.7c3.6 1 6.5 3.3 9.6 5.4-.5.4-.9.9-1.4 1.3-3-2-6.5-3.2-8.2-6.7z"/><path d="m506.5 570.2c.4 0 .8 0 1.2-.1 1.8 2.3 3.7 4.6 5.7 7.1-3.5-1-6-3-6.9-7z"/><path d="m505 472.9 1.3-1.3c2.5.9 5 1.7 9.1 3.2-5 .9-7.8-.3-10.4-1.9z"/><path d="m528.7 560.7c.5 1.3 1.6 1.1 2.6 1.3-2.8 2.2-6.5 1.2-10.8 3.6 2.8-4 5.9-3.7 8.2-4.9z"/><path d="m485.7 412.8c1.8 1.5 3.7 3.1 5.5 4.6 0 .6.1 1.1.1 1.7-2.4-1.7-5.1-3-7-5.1-1.6-1.7.5-1.2 1.4-1.2z"/><path d="m581.5 273.2s-6.7 28.9-13.1 43.6c-6.5 14.7-14.9 31.9-14.9 31.9s9.4-8.4 18.3-30.8c8.8-22.5 9.7-44.7 9.7-44.7z"/></g><path d="m262.7 616.1c-1.7 7.4 4.6 2.4 4.6 2.4l-13.3 184.4s-64.7-9.3-72-72.7c18-87.4 28.3-199.2 28.3-199.2s32.9-6.4 52.4 85.1z" fill="#f7f6f5"/><path d="m255.8 834.7s53.1-13.4 70.8-3.6 47.6 25.7 48.1 42.5-22.3 64.3-46.5 62.5-88.9-47.9-88.9-47.9z" fill="#f2b181"/><path d="m295 873.4c10.3-3.1 26.4-30.9 21.5-39.3-24.5 3.9-61.9-107-57.5-100 4.7 7.4-21.6-48.5-70-23.2-23.2 28 9.7 124.8 45.7 167.9 6.8 8.1 19.6 9.1 24.2 7.4 6.6-2.5 25.6-9.6 36.1-12.8z" fill="#f7f6f5"/><path d="m226.2 875.5s14.7-35.7 22.7-45.7 40.7-30.6 40.7-30.6l30.9 33.8s-18.6 41.6-26.6 49.9-36.6 23.3-36.6 23.3z" fill="#fff"/><path d="m576.7 826.7s-54.2-14.1-71.6-3.8c-17.5 10.2-47 26.7-46.8 44.3s25.1 67.1 49.4 65.3 87.8-49.9 87.8-49.9z" fill="#f2b181"/><path d="m536.9 857.7c-8.4-4.4-12.2-16.4-6.5-22.8.9-.8 73.9-111.9 69-106.6-5.3 5.6 26.6-24.2 64.5 5.4 15.5 27.8-37.2 107.4-75.5 138.4-7.2 5.8-18.5 4.6-22.2 2.4-5.4-3.2-20.7-12.4-29.3-16.8z" fill="#f7f6f5"/><path d="m610.7 876.3s-11.8-36.7-19-47.3-38.1-33.7-38.1-33.7l-37.6 27.2s15.3 42.9 22.6 51.8 34.7 26.1 34.7 26.1z" fill="#fff"/></svg> \ No newline at end of file diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_3_head-192.png b/borestop/src/main/webapp/content/images/jhipster_family_member_3_head-192.png new file mode 100755 index 0000000000000000000000000000000000000000..b1e4fb3c8654570012950a3c888f11cb92c23bdd GIT binary patch literal 6148 zcmX9?byyT#7vEiKfu&PA1Q9_{DGBLrMClFz0i}^#x<RBBNoj$l8x|0dkZuH)SUPs; z=3C!yo;x$=-usL5%sKPVjndLkBqE?A0000)%1UxNm^b|24aUMeZ9tiV008JfOHEfE zGd({$IXgW$J4P+3P@SI~9c->GtI{Ae>CR4$78EFu+6<VW^w%6xn;rwhfG4CO|EDY{ zQD9au>l0FtIR&y4#K=GJKPfaC2Az;5Iy*i7$J$w0QlZAg7#)oMIR^0Gzyuhh(_{1` z28rHZ*P_R;&Q6Xo`j~Nie6oR2LmyytHvU<kVs`&a<``plw!ewNV5Z3bSQ-iaXNS9P z1!HJf@Vp{9#uQx{fZ5gh+;`NKy_e-QDMN&zhrnhWaz|q7W{#?$iz-x@G^8VYUbvOq z-{0?~X^DsZI>%gRC)-ricUNau7pE8Jr#q<{_ji}$VtAML_d>zlN5{wfF2(0Jcjs4E zh^>94xIUSvo`Zb5qlNKtVc-D@y|s^;d;5@1i6pmsSu?SJKgwp#?Ahtg+6i*WA$OG9 zr(^HC;n~sQ?Aq?w()LMr)>M|qlrmN07!q1B<yAa!daz^q^^acapjKGz;QUtY5aLVI z!qxiZ#X|4tK<O=d`+TharB~T{qWgjj;bW(QuFsCk9_l;nEYli{2t_i%_(_NK4pe{3 z0lXs7(fGhod&NV1PeyQF9DDc?pmS;?q3X|NeMn)T1p;b%;A6PpAPraNnqHc$?D)Cc zT)bWNee*}`eOF9KrvG}DUtOe~{aYnnB`IOQdIc!V>{E8Q!y6+%T`zM@GAZ21n%Qqn z<3YuJ`-QRDh8m(4{IeQ#tnczD&9b&jlLFp*yMO*@6>O~GA`jpOOv8#ZVd?QdV)spz zYBgUVHR&+b+0bQP)p&4J9lR5$x-LhAP^0-*Q&lQVrM6x(p|YJ1GwiqQ1$V=Aj%q_^ z<VdDuh*9~jn}!_wNfyV=u}Ae0n64X_f~;uLEvr&*eUx5QrabBRvY<$@Y4&6<))3PJ zJD#$rGM}+m1n6=<RI!Jc;K~N3<8|G2G+qNP_vol8h#rDhiMvfM&Nf?uPEfit)q79y z4#NBd5Cth-s^ZVNIY#>BC0R$lZA`(+ljB3*ndG^2SZclRxmb+ZogR{4xSI0vvO!OD zGz3FE3<Tm@?H2(6N*850X<cvA$&A7G^va|WZlp>|{4f@V{1E<E1XfD?&muqXJywX2 z*p{r^Ir!9(?bBhinY!(m7gBD|Q|{$+WP+=mcBgw=Mwjb#kN4*aCeaw!_(rSAX^~{U zZP4&|F<aJuR0s9o`?Sd+iA$ri2a2}!LC6k)fJ0i_u4l(`y9{fHMcZ5Hpp`{=JhQ0r z+t~_z7F-fWah$92>s%QESscxt>3qIy?!3{~z8ZZw;j}lTTZ^k1qbSu%&}QE~eAaG| z+Ag0KJ4biML$ts<bZWh3J%uB>GA_o&S}pHmUHTt)pGk9}2LqJFR3w@?SKN}#@%2vm z&=gj;vN{-Gl;(wK&kU(2QhkE3^E{!F^Jexll{wBbh)&rMFO8s`sD{K9o6_$|m!>O- z2UMt=jocC~fLe~WC)NN%)gBkr^l-;Q*a>JT!`ufnrT3q-697v2Vinox2qSjhY=iv8 zf#2fuw_G?JWZSHRM6;q_2|*YM?cZ32Mdhyb6A)gu{Ka)2zQM17vpK)FAuwL~q$b-& z{;~p}9*}3KFA^)tv2j6%169O+;~Oh~@}xSnt_|;<pweS?^GJ}I$2z%qj5LQWR}?R& zW6+Jss5jhFs?PPd0WL`#0Z-8B>!)yrrvUt{-kHLa85R}|b0mz221RTip1I?W(BL=! z3%^p%`PxeF29Qf{Y2PWw4}M&4r)<{!t1h5hh;yXoTROP^i^23=OH!#E*5%=3Tuj$> z4gOE8Aw^V%pw5h(+gxS4HQHG{N2=?th#|<fZ0qKJDcgxS5cly)6mfn0PERXbl?P@S z=x^K^V3x)$#gMh6T|d;{NN|1dk~%_SzdXB+;}N|CI_8x88qF7_2j*vVvhsSNsir<L z-99+Nuvd<?;Qb<^H8kt1Xht@iEXY~iG?JCEfC)Gu0K^9pk!L%VV+E~Qn6hEB21@0L zW?kyQX;tX+bDm0I^GAIZ)!1vKw+v2Wgy`QHEHr5hsb=8<l=mcsVeD&ek3m>|{i3rO z57Fa1=F}0quM<RuuHqV&s>b*-V$s@i)t7@EVw?rw6H34M?F6Cr>yY&0sHnB(HSe;# z@Kvra>@$;ZVz@P&Y?`W(=5?j@`>g7D(-HzoE!8q|Gtnv!lcQ7Mcx?L{pXtqiMC+Kr zjnx)=@ff;012y_N0w>?9ZoE7m9Ml;RcSyGogv3V787=#^8f>%~I8?H?T^d8@2ComU zZv#Jo=XP*{!a&I=D7*_#f0FgUXe@r-rFk?>UGlBTA{@NpDFrrai6)ye5h-t@qoRj? zyvANoc{K|fePN}BUtF=mNj5*b1SfNrr*s^rB;y>6dx#t4%otR=s~f|~$@#TaoS*;W zr{<L4kI{ibWW8f0h5Bqk#+C7ILC&Y6yB$P4FwUcEwN-(M)tVrYb_KCF%21*l_6O%k zwKr0ZRGkHWLqD4Fq+c?-y^JqDw|Rs*0gDg}vx4#-H#f&HFMrbX`$N8~HZ6Jh*IKgh z*E_+cTVbGv*AA&Ub3Inl<;^JGxk~m@4gsYwI0LxYsMmasCS43xaFi{j$(|g2n+3G2 zr#3ek-dy%RPSV*9sig@W5?g99;7*yngIL9jcEIXFb6)_4b3t6fhb};h$G~LzYQV0x z0to)O+m0b@i;d6k#J=Pg#9#C?j#~6-;1RCJXAf3HZYDm%Z;AYFJh-6IMv!@QM!%w0 zIw8dIi3Y=1#O-~v+p#A8z0}HPG{E~!41h(4yLfu_@0Cy1^Ix(Bd);huNWQ&CAfDM| zoC^S*Gb!UBu+el-hmD(L{rr;z0SpwK^jE6s@vzE1{25VFlQZDumw>7mOB{NNKy%eh zIiSXiKS*^)MRoPvQUEW`sd7$wKcjbT6b^8SD{YXzk)t;CNm>KNJWl~{jYolHbomKZ z{{~Lk4@t)iJP61~H2642ZhS=cMpy3Wrh)jYXz(GR=kod7gi)jVFNl7*0;?j<R=<s} z!jUm#rHCcDNY?17)(ND+hmvm=|KqhI_mluIyfEY~fW`HxGyQH*Yd{|rsCKlh5$${} zRC{JH5W?sW64k_-Ov(T>sLFZ*C;*Xvu<i27@LEHm--{PBqW_ZkvS7RKit!F#x|%KH z-au3`?6n=~5v{%NmpkqVOd0mLWaYz0RPp_9j_h%Y_gk^9(?hA;u0*a+I72<lbZFqL zoUi~XW=W;ORiWn@&&i$}v%=9*waHhS*QF5&UWqmaV8*A27a-6GFsDdueoG`JOBI}F zXwDkS!!WH-IWjV0#%xj+22^3{dRqYa^-&Lqh#ih`iwcQP4Cg^C6CUTgZxhzkRN~vd zqp85d12Gkf&z`E$xb{_l@+~}w=ZbPXsT0WW7ylb8gN?1GqN&H}WmbkAtydLW$NvOB z-2}`#q!k{G3wE?hIJKgC`Lw5Vl~#u`bTasBS$3s?(m0K9k_Tz}P-^W`u4&xM6s%s_ zw^CzQbf=+XV|AxW+7S-Sy~>SEKx~AaP(y;4PgC&f6re~NT<5LN?(0hJCXxLJ7?-JT zoJL8|%XTBDPZG83qeIHZ7VfZa>}OFI!Yl@~T92aCZwZ}K(}A|gOQ{vsU8B$%rpD)c zhtgOpeL+mrK{BQIK%r|Ffp2<R!vtv}{Zuz~;Y<tod%!+50t5wX8-w1{Xpc<1Ua^Fd zvavU$7dmXzA*T?BF?N%2IPsEU_k9F{Po8vkN{*JQ&(|PyY%?n{yf7K>LMyL|?bm0A z=ZPK@45?$(Cn}0~$!*u)BFY1?$sMEYu{ZrZKO8Y?G6lFF#|kZpW`>6xN`YQaYBQ8T zrZNXY(FA(7Ac8R5x6+*`#0to#Jr#$qu2E?D(v903rbSDV$RH6x7#7S8wZM`!78>kL z7%54U_Pn%=peLiowy^Tk0<-YqoY<TwG?TJSoElM%pH@53Zp0?g;BK241JKeewq<g2 zz+1kDg@@wzlxtFc$V`wTm_PC%^tPnXVzH)Nm+U6VKcAVe7!m-so=PJ(_?u|+5JAPH zK&9~!NV|e7$Y{_RsTzC10#7P5^q<?8Dh<EfsQjp=BwJLA_4lKnu*R=KB1i$v=*xvw zWNlZBG1UBpy|P}+byXkx&j{o4ucTJz?zXGHiVWMJ=f0WPE0JHx8w${g5`d23C*TE+ z`2AqGr>p-1`CRtxBEB_BZL4(o@q0?35@Ru0h94V^EX2%6EZ?+8GR?<()vFQ5?gbrF z$04ZEBk6168a>__$z7TZ)YFvABXkwS9l5MVto6H0yN0;l{-RzJ+HLyctcII2OYED^ zng366T`ijeou;rf2O)m;`Ren?HQ%T&UDU6&_ZeQEd($)uH5ixZ+S*d5rGB{2|J`xK zJHmOuq_>6&T$PfO&Ht`vrjspx{Y}Z>ew^U;h~{v~B$nIj2@h!y;V-lkXO9rX%44vy zrpj4}VOPue!svr0;s>_7Sf+u2sbOY@K?eS^Vv9T}DPTsx>BE#8<Qui@gRwb|cPsC* z4?8}(IJ}5VyT99)*KKNf?o~#<WXaeSB1vIqNn!alz75$T4z?MIq6wHCq4n`n+3Tvy zKrW0K+c-bY=~x4+-|t6n%EYQVE|knf4URO_Z2B%Ad~mhrru=U0?c|&oc-e_MDToQ| zsNU%W{;I;)@~NRg#WDN0N%k{8YN+D>kzvElSv_z_d}_w<Vy=ht!7Ivv)O$fU=UgXi zFNSHHC<2BbD#fJM{4s}(xFOGI)l9#f*qF_CCDO!w4z=2~r0;+3={Pq_jOJ~J5k|$i zOb@@Bby236<yp6=;Zyd^UGU$Q<t>v-qDyr!98gM<wk<iYavR>VMmB{qq_3@?bCYha zW!~=#zw0$!wg(bCLrmP?@f>z#-=U8sCBIqI0uaR3B=QG5@DIy}SCyX449+>Mwi~Z6 zo#L|ZZs)9R%(C{72?ft^aX{18(dI4X`#XKiW=sS_iqM}*59#6*x;hbjVBxz{3UP54 zFlDUVL|_YND)NK1E=T_I?9;6K#KR*K*B>7)IdFQrQcg!0_xAQ$8~Me^2`oUIZfgp- zOj+h!qGCdV?K(p-<6K(Q1-2ED?*^F}8JP`6gqH=xEPg8#k;0o>u~zDqXmt<wi^N7G zx4RekvDT4%JR~>|{~n$l*`)FzFM_#reYW?M!-2z3Og5>j%89kcWB?!@K(YDOwdv2< z4Kv~mg|2i~^6w_u#21NgnOr!?0-TD6@)!}n_Qs+ZSkrd)H-V$05E$F8-J93i;88Ew zoKeA_*@5FuQgLHem?)ANW#wPf7yWWp#f_gPcZ9PIm&(N92Z@$Z%EvA%Fk%{v4c`Cd zGr~pf+x%jdX3xlo=}d3?nE6b<0v_`zp7$u?k)nZiBU2ytf#*EHBS$6iljNi~-OA6C zQpzNa@m1*k&-P9y?7>YrZEga-Bz$N}qdVGoI$>g%6q}YVl=XAKd|B?FN~{15c<;AY zd6_hgU5jG3IVyT~xH2>%`3M#eY6O=f{kp-o?&K5(LLBp%A~lx<WaL>J1o4M|OFs(; z0<lQMA8nOllfH^<V~6MK^?{Z`Ts2zHqzvGdT7%idIir!r{RiDLu;U7VJevR8+SpYA zBUiPtj<k72ZVD8tGDvD}&dXEv)2`zFIt(~P>`3W~O6qi!FY%2HhRYQ37)fwLQIsHB zLLh%J6{sp@u6@b|r<26@rN)pA4l$Nr3V^_04krh%n9@-08Eh6WxW)ncXJI7Yf)w}t z8dkIbck-AnAE7O4m~DU}7QC|<NDbmjPyx8@oOaO0Vr$o{R}$$yn&1<uXIc0Dgr^af zw%nTnP!o$oe;=C#PO3sQ-vfUdZ(-?Mz(jPzP?0t<MMqan<LJQ;6jG1*aG;*N&`TgT zKRNJSyq4qfc9>nU=t?+lHW3km|BjeBP=m)twbFA%a)M+{RjM3?5E%M0QD*U&u&0#x z-cXcWcQO`%xIsb5b25>0GpeMC0h~^_bUPscexh7^sbTR3J>sh_DZ&QLuXZ;<QiwyI zdXHnAyNCUNItP2bXAo$-Ji-7B9i3PCpk{a*^TyA6k^pDocsC{{;mDhC06Fe#Ojy5& z${OC7#MURy5hqAvV9GEt`OX+62REWj4lt#Y7<QR8Q}ZvuN7Owa(z2Sy{!F;9+vqwR zf-n&X8l;`<4yA@pptugO4G9uhp-2`MEx$6B4B1ibP`dAvAbw#wC*Ns%tRZ%&kv2KN z*4~VZS#L@F@sgT@&NMw^H}6+K;x+ISC;LKhAH8@Q#o%uX$?+i>_?EbXn_b_!u~b%n zFjUD)F8BH5yZfZEP=V$Qm|-o@Hi8Up911bF1wHKmXM1Mz*x%Q50@R&zN(QuEYJy>* zS$aovj(6*V`G4$+#MCVd`l?!#e)Mb4s%^U6^d_|M$BkF^oYG4978^hM8#Kh#{EmIY z^c^i@FLCJvgt}gl2EYnGb9rEzDDqu@+{*D;BPkXmuen#E8ifpUNlS+WZc!vLYUNAW z5@Vgh!V&o?${Z`firZiwg7dKi2$P6jlxOp={zKFB+(^VP49{|aJ;?S+#J=|W(=U(F zB0VYtjQiU_Kz1%bip1QRwk1Z+vRy5=avjX)0Thje1PkS0QuvqfMH1y6`w{(&2QX7; zKpDJ{KWp;vz0zwP>`i%RtOZwxjBi|;SdCvSyb|TmyIwEdm$8H=YQ=U$bINS?o_^s% zBlt&FTog0~lWVyC6BJ60QrtR2dMYsI#8(sr1Fe1CGa)(mKt1vmyFj8|XcmNltF0N3 zi-TcDW~ilHPP|SHGf>itI}xX<lOSNTHbTu%GT0AP-rZ0`HP!~8@-MX??`dy6C8w@_ zzxA3HwF0d$4hPmY*I_<_N>+HfFDcaD7a~B9J4ysQ*&Bnukby3?{HAHn0A9Jya|ut( zGW8s=MSW33jgM|mFK|hmCL8nCNkspZf4<nyNa*OI8qfLNwqc?8;pB}F;1j12r;}pR zf@RZhW)9@=Yx<n;&eT2ZM4mMG_)J|iO-}&jfYFoUg~`It1{Miy|Ek4fBr2X5(m0mK zi2c^EB6ThorWmy-Z<}T{$gv_S<zP1x?#Mqdt%IA<S5U3E2?l-<Hi&-`(DNH0ilvyK zy;R$V<OwdA_z6>tP+si0U@S?ddc=ujpH%UGT7k|47NfcLwROCn5f@nso#rr04BJhX zU@OG;RP4|he9)fH-?h*QX$Ip3-$Jm86w4I9!AIZudu*5i=)SA?x&uGsqFsnhPPg#j zi?(i~JU04*rVs>7l=6(Lq~-TtvYLq2$v>TCOj$xLyT&}G^h^hBo|WTFZGtjjmYfl> zTt=9_`l|tIzPD-l<6HGy`(tPUR=CN9Hm<W|h7_Q#me-W0WhAckLs}OThX+kY-;GP^ zyRcgkDZr_-Q%pm@b>qC>$G4@gXY+p@SlYHE^HQo@-;%-$&q;^XkP06Dsu3k7F22dL zCTfmVbD(=%_(6{Tz-0B;W~wu;rWTP;+|=F{fnS0E&BJjq(-Qhd-~Y3bmif9%D6`|j z&<l<C3J=IDn5IsEXjLgH`{MH-!+s;@@NS<&H6(W&^FC2@Xej7&deOMZ8j?QJq8@(+ zZ>w|SEUlgvsrvW-<cU13{_9!jsxb*LArhkS_h@LO(Pou8V9S+gz$5a+_0|PAN0jxt zn>yUwA}s>Vy+z3%E(ZBNVmK;VMCG^xcxq;59E86Y?djda7}B!{v1I=2#m8&pcs376 z?C#lDXDo%>d0z%U_{@E|zS8E640ucOQS6(T!_qEcRJ*NAct(M>B-7G2zjC38>(ug+ zx@nnIRqdv_udf~odN#LejI;o}GnZ0{&62jeC*+M}8%B_*ErqbT)$+3aiUtz_e|Yu6 z&$!ca36plwMt0{$hlrUe(}k&t`B7^@=ly#;P0so5KKu_hn8Qtgvb=^|g^YRd{{U3N B<5&Oy literal 0 HcmV?d00001 diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_3_head-256.png b/borestop/src/main/webapp/content/images/jhipster_family_member_3_head-256.png new file mode 100755 index 0000000000000000000000000000000000000000..aa058c7a0aba654a4991c8bbd5d3e2d32517acd1 GIT binary patch literal 8028 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 I)*|@-0J^?0w*UYD literal 0 HcmV?d00001 diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_3_head-384.png b/borestop/src/main/webapp/content/images/jhipster_family_member_3_head-384.png new file mode 100755 index 0000000000000000000000000000000000000000..1d10bd5da3d4d417aedfd3bf2e8515eff092c506 GIT binary patch literal 11998 zcmaL7WmFtZv@Sd|FgU?og1ZI{?(PsQxCAG-%is<{f;++8AxLlw?(XhR(D``JxqrSN z_x7sp+V%9VZB@0aSFMgvQIbYQB18fJ0I0Gu5^4Yd5c1!R0P~I{5=h1X0HAXf1r5pf z=9((;x*X1$EcScZQzia?lqG4*4F$YqX{>!!qCHijT@|8D1-$+DE-Hj;a@aGXsPAP- z3S&o^a8VLtPW;3FB3p|1E7F)VA}H_8+5dRn36xn8)CCFjcfJ3^gYqtCNeXjS=6{8t z?0q3S{Kj!$%zU0~v8RN87O8vP6nb43xT}D78lrwx1G#PpKD7C~|CR2t*!?2k=>(#1 z=q0tUMR{55a$Os6Rpoo+EOL=$cNS-OS>}0F;r*`hrZw)iEB$_X==JIl`uqTeLf;<m zo_A;Nr<(4Diti4$7B=RGX9w@^ZZ{9l+J{?s4O!{bNmX5BV+z8uYEp@0(XqtfAO8Jw z4zN2oz4-U~dUknL)>d@xrgdhfa4OG#!ohHakAH-LbxcWiBJ}A@Q~U@QZ(bI6@e9?o zAi}a9^ST}XiW%>MGRaB$m-9mF<DW`rIY!4RDwkEh|9MmkxhnBGJKVcI-n*{$JKo<t zKia<?DL*Xpxvvkb2sBG~*PqUGHdd8-Y6^BSP?QkjQ;`yiu+dyA@ZjX+?3br_x4a|P z=HdSC;qLZ!Yw7;>>i+ut9lSd`yuZDE2jA)Uw<pzU)1N{2cX$6a?`{s#{ojep>4C!^ zj_*910frBEcmFHoy?OS#*r{+TuzJ3zYyO?hAnmVu;)rN?KW|WPbmP+V<NfVYze@bD zeC&`wNS|}j^y9<b#M)u&=vtiy|J}yK{odmJ$<BL6{j{-^rpeIq;p&mi>zkWjeH#*y zgZGyw54Tt5*%KVjr3`jOEDj~g!FBF={YyKiBa#Gn+p~A;WA~S*z7=zyJ*tM54g{h` ze;Vp73BxD1t^AqYlkltg=9YYS^Pg*Xa~=10H|9S(&WGFNf`7l$d$Jg-F3Rt!&;C@u zKM#vyTPJr>!4|*XXZ(|knvyyI4ileD$vVDeXkq^fn#+Wu8T#NY{uz3?*Jk`aIiREO z_htUSWqBwxCE}f~a{mwgzg)ck7ySPP%bwfi!Xfuy;&J`|xrm_5kI+!)22^Xo=L8Bh zyq$u^K%tIMu_WFis8hr9<?R3PYh?eQZXq3;`~QbLqxv7>6$;I>PWeCBdo^S!uJ~Rx zK%p7XcBrId(s&jCz)&bFA*$g4Je{924rNCGh){j-$)3H>slV5Ce{7}y@P<wGfqhRc zqa>|Vj!|97@tZDsXEO2$H&>(dnOZUBIKp|<<-AMt!5PCH!ln?Bn(e*yCs%_m-|YDQ zb*aBo-M+D{WgS5y1DoscDIwwCF{Zv<Xi-wO@aPP9?Uv5cJfts%4Y^bp6lfJ_NVq?1 zSUf-W@8JY^cVm92t#<6K^3CP>08#}EQ0pgV{|MYCa6pnnZ+rN&`rGbeh#_Z7IFNLM zNL6DvRdApCDRKC13#U<<sOhFSYD3~j42yD!`LwpcpY}+@;W1_X$q!wp#Sxi;q^i;k zaF^UT8$;u0rTo*{n{TRShO2t2#hfr6!gxy~hmhYzqt=+=g{R?On*=Qrh)fE~C3um* z)$rXc5_M%W)J^us3quuu5Cl2C!Aew7wlryaT}$48k(&CI5oYrXm93M4qKrOR{Zp?W zSSwv_O1KPikc7os<iXc+R}9})_u*vj4;9{_FlMT<MA--WSdGq5a6N~CItQEwK?JA1 zG^;PN1w*wZQFMP8Css=#et@c`oa{305hRX6bcZ6}D-ij22+5KULxQuP1XSL-vII<+ z8nLT4?clMgPqiN!+GpfPli=hnDNaF>Ek!||h((Btm>J;`tz>1%NqYUELJP>_33!OK zpupI{vKC`01()uE?4q8+Os50@v&VpCcHGpZ);jLIYh5+xxfMFRNkhBjKlgcN+Q>e! z`BhY0E<CvObe1;1&|=eSzb#qHqLxU<L)4c)?J@2c@es`Z%(rxZMAf4zZ4c;2T8K2! zKj6tlwd{?iw!!YFFY*NO<OkJjZ;Ci7^~dt(CClo6W#W}owZ9>dFfB7<vW!#>*XO1$ z!CE#Vzts|ZL|6KZj323T>VOy%SIQq?3?s=)9HD<Fqd#qKhP<{f9)9)%SaJv@i6UuK z*1y?QK3#iAFW^Q8T(Wj3d3`$ScpyV3Wd|W6lgq6`U7aoozV{js9gGnAL6@DI+m0!z zibkaj4YK=Qp&xc$KkZq^{T1kVn0{8?Bc5)S$Kv(>NP}*X)D;X~vbkU)isuPdb&&G1 zOhdR^4;eOVM>4LX&)}?P2@Cj67D=TL>hK$n<${w`p$O9?OU@&~K*x=u+RWw~H&8(K zyWT4CVKh1K!8qJ_&97ad%<Rw_u<&*yO7^dm6p7p9$OwMyQgd_<B=0La&Ij!SOd8#U zX;uYAaU;#kTx<jwB7t*|$3fk-2-}xYt>_TZeT<?EL+)*yRJe|PMvd++DRLI(&0356 zFC#pMgm8_B)OwVK5_)i3zC|CpP&X1#KH7OOqr2_WJW!}uH()1Q9o}HU8}0nV%|bJu zaY_UAB$shnjTNnjkHSGb?!|0dal}GH|9uc_2nfuo;`r?I`Qp!sOm$26wg9T?a2|HD zV(rAH3qEe_Ak_-C>w{Gynf=$lk?xs0b@bLB>GYgLJJ5=tuhJ`kb6m?=uN8NRGK$XO z_^RugXP3Y@;mpSlbh(O%he_2?K;04YkX0fAJqCDVkMm3I1Py2KcmJG+Pk{dAD?b|X z9})YN^ShcRLZn+GMYyzR@PA%zUow#ay`gB1nV{fw_i&2uI|+lI_5WeD<+J{I@*HSm z|6~_|<}8b@5nKJkEq=>UTsp*|;SDaYwF#g=M9NFCX52BIz8Ygs=iZ(|S*bNEZFRh( z_Z1#9_HIqf@Rff-XL1tSQm3E6cSTX3n<SR8KlR&uFzENLYHUXSIzp7M291we2Fnk+ zW?Jm74Gv!hjZjqfMDAKVO?rCA)Z+q;fT41Ielk*V>^)EtasF?%!ivk<DaIXYQY}D= zYu2F!?KqTVE{|l4mQ33?{9)!Nf)osft+q`p6Dbdz&)tqiy#Nt`MC@NW^%{-_NS=tw z9`(gmdQ9I}QI8JSFScR=RRETw50!XIo^V5reh<=#NcFP^vU&@S3D4-yTtBhBHHS6s zK3gY|`H+4Ony!dDCVy(W!#tnsus(V|I7o?2rvE&S?nT$VAURXF!a$Vxz(FwTk#r<( z{v%_bp~Nnd58Rqz^0QF7WdhGo@cR5E7Jh|GJyP7lFwxCDbg_kqL_^Fc<?nO05Y6w5 zgpz(Y`XZ-o?6{VRf92IeSsTo2pWEmFNenWk1rgHdUm_lM(jrHmf8}4X*(GqQgy#}6 zgar5cohf?@3pd+l>T_rX)O8x9#6CDy?Fx=elZ4wu@ij77k`N(>`Oe^VS#V^)ZAo$P zcTDg8yK?xY<+Z56yL;0K=*(WKpIYSg6I(|4(DT+5bYYk}cZGk%B}~s3|FCYg@n_9U zDUPOW=n6~RVKK+h)h}m`&X&l}$&&J-b+GZ~fuCa}%w+i*%WPMW_2J0Ji5_d}!0%sN z+s&di30%*mo%eZc>|uvi7$ctq_D+JM?8WSZKZHmc^wDh4w0^ev8!!B;*+{i0O7UU9 zA%L@&O;P->9{IIsuCZlp+8Oy0R(cu*&|ibTX9kP@-oX@2j)%DoAV|D0<C0D&<+~6H zSh=Gwz+kC`+T<q?U3oil{X`>_bVk06*eTS6r0H?T+KmKs55+7x0&OA@*d%DK2z{gr zQa|`~D`tfG{ENg>P01>>3`*8$jVGsyK_f4C25*{aKs?DzkFMz)xT4!cB`|>V!^G)9 z<1V`oIqGKEgF$poPa}rJJKusC{8sVF8A||DUo7!VF6kn-M3MsO{hv>aPt_FC*1}Z- zg|l4TKJmt-j1<=7T4Regi>T12lpEhCV2|sQZcB<_h$r1HcESEYyYGfms$93^OwYmm zr;Rx+GHDGPfP;>I&Eyu17vSm&n>t1Z;DF4W-yY3F)MsaW0omDYuPp<}4gxe2CLS1z znx-Ep1&c!K5p%sMUR{3c1xO+CYQxoqIOt<6`ow6(u6-zoy=|Z{6^Uz2v*i+T4*|^S z7R(fbi4&>6j^)Fq80x-vQB2x`_w44JB1}7N6O}`_lmXFT0G*~V$x5z*eEbrk0P`?{ zH(lHg+C|15$t#Y>2qH8IU?Ui?$8#0nLZF6=%stESUCqnK5ZKiIYM5=XrT=GX1pqU4 z?y&kKzXR#6nQJKD^iA9`0wihcB<kO{{WE>41StaEA+jzZ>n`s^`1y@KSPVx>%<{|8 zq)*KW;=%Rl{n4g=i;8eAU%MP@xMy)j<|OenU}F2tfGm!{q|`n?tnqI&{OQ1h#<{a8 zPxyd-Hd;bn)-kdg15ki0wbMh`;m@vEh9G={&<k^*m~`Hnmw%u`t|UUabm>|dwFiD{ zo2drGH3U|K^cI>jD9B}hWRwbN^JpRG6DS-{c%s`<pnh#nDb?Ex6ji-uk)R*&S^NBk zh_7zKZjyn}l&}tGq7m4N-ff00T`xK??5hm1qNb@O5&NN(Bn-jqPKcXYutG{zO#;~k zNevrrf|yD_A?;*Yt{Pe#ye^vdO)>4#VEIQlO69#yZrn()rA>NnOwuvwMbYsZ&|yT{ zFXsgK&{N2r)0LvGksVjSy^>IV95q`*okQJl^7inHokC$-yA2fi%b}w{CWQDsUPxT{ zEzzBH#O_26KXm(cJuM%Q_hbJYd*m0)`VSV34%Ynj8G|<z=LRH21jze0sNhD!?V?^l z+w*rI18r_8D&AfzW!KF(@2Abj<+OR${dB5?LW~rP3o`ri3~}Fh=B+#-)GiGi1D=n- z6ZHYO@UrCuswf~cNSURmbo?SDekdVf9qbTlEwzaV(=@B~(}P0(_70zWkGWgaUiw3D z@(FBv^=~Gl#Cm**nVyIB!&ra@bv<QSMq9z&n;v!^UGq<_G^XOd22!IK-~=L}!RWN{ zShSR;MC=v-@Ew7WWkTbq-ARs~<2VNu?72zO-76nM1s`ZB<?+0%iy|+AUTf;mn*)kR z^-~K?)akc|tUA*nGr4Q>J1H>huw&-{hdSJuLK!nfuDY;v9B#)xolKtM2*HRjjeJqs z%*c_2%U#1W6EA^G19n5^5l_LYaB%-}YCkf5i`qsMr~YE^n&vdw=_$tlErVhtm|9lM z*KXR0gDvBeQOqY!N<ua6uAe_2`-wIu`KE4)GqC%3ZQISGzaCp{_2*|zteg4kG|~@E z9WELRRNJZ<nh-c;P%jz;MdAx-8Zd&Vlz&=Uk+yVUUcSr{qaldBK?mkJOIZ_^E#&v0 z$eGl+lQ@oXM!TYZvTz7rCWQZt=zt7riUKE*M28FZ@VlOMXL<4ftK%GS9eMbz^~AKN zKcl=}v2y2WEGDyKf2<~G(mo;K*hdvE1~w(R1}1pR%k{11v%iHUV0@9tYpGsjIcJ>* ztY>>E+hbaP&FpXY6jQm@Hit-7$E~Y>FOn6@V|XDhMeD56{dg7;vOU2CFt=*zW|UVW zzGmbS%ge(?jF6cPs@di>#)lKFq-vM>4oM^dWKZn40aI|`c+vUXG6GJhy`gI*)3%NL zYX%C<8w3qs$MlPLe`kA9bWMlkb{&s0Q~JUPw)!S_<}T+7yXY;%IqGjUEWi4>a~_Z5 z_X{6A!1tD2j(I|uL}7feT=MW>X|=wbsXPfR+QoUTb=S-hzCAAX)+=)m-g${X^r5!e zFrhYL&kzhXFRetY58@HFfBS<cyl(KKvoJ}df&D#iB>OX>X$U{JMI?souZPbN;@&~H z&wQ2-zon$k$oQ@lAd-7jfaq&(X%(lVqB`Op+5qy{Qn%j)Rmpxca}B||*KU2-<(D=W zr0AJ?^GT+Epe3GO$Vurz@z?m#URj!(NL=vA^ay+PFqbbv-NP{Y+<mk~w!CFpp=;}w zRS##UaK*%<jH90c*aN*koV328?Fx^s>2z9t*v97+ZQi(O5L@8DuXeH=0<{Q6MLEIJ z^US?M2Aa_~+qjCC2%F%8lq}dR(Y`9uy7=B~Jf~Il%fffnX%;f!`*Q8yCqAG+nt#Om zU&vL0MJo;B{3%9T{&<k%z+N?=qZ({IB8iU7@MEIMp0|KwDQW?7!krvNXn~e*v8TXE zn<*aXZ5h>uSmLCih}JDDOANxYKxL4<GflOvWR>IwWi2>1D_{d}oeVnyF>Ktn5#3RG zUi8Xl%Ds4N;3PzsEY$&5oC|Jq#U1JRNTY(sTj)0kvtQ|&nbXb3(a~coSbU*!A9k0V z*jsGUiM3L4gF@sS{EYljs{q;O&2+rTwj5OjfYzQ!Y3Z5H-KB38i&+vGmH$ae>WKkH zrL7D9^i=BaPZzD#pj#7i$c?YE9&9Ja{_sQe2%wr9hf&ReXfs=2fM;h@EZhI*wJDf2 z1o)38ixjfzKLSYELrf>wK$D;v|64VCPg7kOp;M@^kr4X=3qV_^X1=WVQ$qgtoK(L< zhsnMf;sS8s-(rk(v`3egKk$AN)*-ZKEJSFLBjsRhrXrWA)dHJEknx4RTqbfvn30X_ z!H76emQL}6_wC`yBEPr^IC8gdF1XXwmn9eM#iP6kVl=a0MXd74vk4V|^DlWUoO6?l zSRI3m4%BobQ&)U%u2LC=W>_jqC<OgwTCnx$Cu5^B+v@On!cx8`_}%3Cg<fJ!vqmUd z375D4*qlG(gs-PV^Pa;xZjSA-LbrLByf6ATMfti;ZfljZL?*}|xtFF!lsa95*gD}T zVSPJZ&EsfaeO-(DbVqO!M^2O{P8e1dC;-IO<mg5eHXsh9JVHtk8>Z%opJP65ZgsRc z8Y+r{g<62;Pqi!zU}`Q-lYd+d2&kLJpC6zO1D0mALcz%q{s2Z7yUexyCmVte2Hk2L zB<7+8{Y5KZ{<w*7DgzL0cRJWYWW?=Sg#ju^u;6PODh!H(p^tei7?=Z%Sd4xmA-jgK zyj(RkiIKs$jSDf^$TTJ%j=r<S5|&_x`)jO#ICVI}{p;Te$CihyI}`zB&VgN&3cp}$ zIB@|Wy3kq`g<>W}obTFMPiO8qG&X+`it}=^L!$fyt~{<;$sne0cp@ZG*02C2yk5G7 zus!Nv^$Fyl)WpexO!W7|Tg9&=VB^(5h@v7(<~B=sfj6**lLBlj$_7Qb{bGEW9xwx& zOw#~b9h|Wn7WxGPyJ&-(L?Hr54eLDw<D!tDiSx*V%V|W`zo3^Xv=|$iSWp|c1p@%o zd$27evu|tpej)>s_^FVuLARY3>~j{sGTA!-TKAh)7=mBVg1&P9)<w@{8~`elL8uT~ zHGxi92tTfR-4xdnUINu1`r?B(f3*jQobt97_8dNps}ewLc8-UNQ{_;M@)H1LKx#>T zjCfEV2OSp{?lK6*^1jkmdRn9pCA#>;qhq34AQ(Kpx$t;MX2NK}w;a4DorXMdBmlT9 zs_39MrNI4&P?LD)Rv8VP9pK=c5!-{s-Ns5VA3#5kj3xC<I@pC1X5~<3UU4R&kJuT> zdGhQqVRRLRk43Ch)9Mj8B+U`bCO1Tbt<kb3>+VAEvS+N8vz}wpaGXrA1y>MJdrW;K zyyqRp$z8v=+dck!%ILn;&97auohzA&GUsTRkH-2y5gzrX*K@KQ5uLkaEtTVa%pH@N z$ltXGlk6USEu^iC?x81xich2z;+D}Qkhah``t6*nGD1ZSVydS)Ijv!im)i{`R1*s} zYQDUjw09x-9qm23|GbcGqKljXwiV$}Gej&4ynrX&>kR@n5zXx|J@_8!4|1<9%ek*& zEl#VZUM^C>R)~}TPDOM8;#`hP$L_g8>)de-)t(&yP<n&aqhHlTw!ghrJMoAyiCGRa z4}`l~O=T&+%<DttEJu*}2aYSB33Bc+pRN0bGrH=OS^$BO7CdMmZF;?WC&^##HmtU; zos}Ixm;6+<iis0;T>v(}lj!EsGG!1tXPePCnAU(la@0X?c0Z9W({lV_^^AyR3ZY)6 zy1CYPTVx1NPKX*FW^f2kcJ<%to~y4fCk!|!E$6gv8H~EY;#AQlvW^Kn0QJ-55!3GI zM;H;U>IF8?lWlo!xf$^2k9$>Fup*T`js&(8s4$@jgW5PB9oZby$FjnFr5qOr&A3r9 zaC(0DZ<PPf@Ez&<xB4`Z9|0kGNL1wXN~XtQ<jOi-o~gb(VnYE+IS0D5?U6Hp!wK_0 zv5MY&!Y_uc*VodT$^$6AQswz3=f$d#KFLx6qq}Tk+Ti$K0Pa~gdqAZC8{++*>vuf* zAS_bOw!P#K{|b`wwNIb;?j7bjQj<{VV_-@5KP8G1v&qRMIEG#vlTZF~93z_yEj`<d z+2rfMWh=f<3L|;ek`IenIL3<mxGqi7t?<u-7dgzl%aTkyXMi}2eou_t<*soCL))=Y zx8}xlm3ZQqbqdzCw>t}3ksm;7Bb??X$2Twh6GKvFh)F)Fx(7X;EecDm1y)O#kK~G} z8I5;Y6i%sn4^*%3n8w=~Ihs{vb*vueGmDEc7)UPBOE<o4OpO&SITV#~g8^t)y4yfA z>eN1xV1;xw+Nx9~{o0D7+&sBeIK#WEwXoYo-}$71M2<ONMIkwoU>sdzvVYpsj8ncW z3fg;1Sz9q26OM{DPyE<EcDibL#)D;wCR_fPIQ&DM>Qg{ZF!`(l{M7-T0Q1*nwNlWg zNbz45(61P&LvBOd6zeeo5(!0g(h<wlt5h`tPTA7#;=4z%mNY&euq@lPhx^eOD{S$b zrCaN~obPd|a=I;9A-1XPzo3q11T`Z09e|KGD@n5pMjYlcRhgw-YNm56HdoQ{&WO=@ z;>5~M!)MyBCz;OH%2CP9qFINKE_<<qfq;A1gXe2>yKHLmY(dpJ|M8{yKervZ$`f(h zu7I@Blkd_yS8FR*REE~>k3j;gk3S%IaJyEO?yeV0NOrajL`d1tg&coqm@vjv`{khl z0esU1%(#z?psd8ubgGBegYZL8(7&gJ%Ic%aa^(QOji+;Xts%#fuby295J^8;Gv_CL zcr-h(w4=uiA0hP2@Fcldh*dzFRR~}PKnV*TU-%;g?ywo$&zekYe*infPHcFvK<@`M zHQ_JGqPOf3EQC9D;34O8P@x8_!@fP7`NWvvZPOC89?ThRCl+zxr!5k{JG2YoYs1_y zyl-)s;oIWjAJ<~>v#pRK1A9>&XboRX2fdrJ0bcVV1Uf!4-|g}Ksr)!qZ084I3F&lr zjnyi9<515P_t=I1c_h>E;U4H_dg`3)CyUS-aBHNO7@9@f^%U0jzFve1ot<eBPNyMg zTUoa#%|XlzQUw>aaoaEPS%mftvxxDDG0_K+g<`u2iJ(H=-{<<B{}^~rWSN{@%DCP3 z`Fs6LX14*9@lA3Fv9o6rO=gKLw&WXx8R*we5gSm&Pu$+)t#=P{fMeDrl(0RCfpz=? zacl0@H$%hT?e=3wTedg4A+$JR_zEUi{c5dw8f6N5MOa=L=-X2Z%>A?kf0c`-<@C)5 zE)E=fzd(8sXA_O=a0fiJp88{W$CqZx1qBwz$1KdXaSc>-)%aGKnzb3$je;lDLu%|0 zrdp21hb@r)U7K2rXWvl15No4nbVTI$akSHEFK?g6fM_guGH(y}a!6j$&?ydPBmgsn z=nd9W119Dap_C5!RzZocNLEr^F$Y53hY+J684;73TA*Bm-JBp%NKw|(XSDfj)VkJz zgK)rfV+M>i!!kn(!)Iq^ilYc0f8Ew4aGuaWUG$aMuRa1ptRIE!hY@rQ6~d1ZgDg-) zwwW?|3P`)$Hx8NEkIt}B>Vo$V0Y#e6PwJ8VIxnYS9x6g+odEQY*u#ULJbb?87=7G8 z_%+e)g6AWIq^TQ?lFJHW-YU&6D2$N6ADv~;@s<&9c?l*&^UpXFrTFyFFW4<$^jmW8 z6wko3!4=llN&+B9qo5iP{%mATRtgmTIP@#Y?Twt1U&Qlc-F?4tUYLI?>gcYH@@yWf zazKYefF8mRpn^LRKslP_ezgTvLoh|Q_-7LfXH*RKZmUXeBL~T5`o;Mbh5H3{&4`zg zSOf5Vuf$lWz|(E$?x%<;L{!OBs*J(GrcDV8-<QbVYSW!Nxbh~la|G@i5ZJz0%%3?= zFis|?lf%e}{Pl=eYUL%JxwF#q$;`qTT9+^c5LjqAiQWns5YN`P_;1M7U`<rrAK$?@ z#v$bTr<WY4OX?ODMu7Ev=wQfXP-w}qd*ZBN{li;-3w^k+vtOrN27hSqiA2an;-O-Y z^ol|XsSo@N%%P$XHHkT!Lch7}<ZY;*>453B*pw*80AgD^h*$jMf_Ly7vhXCO$p!Q} z1ng@&e8*l+Tubi~;LV`1aaXd5=`Q?=n49aOAzI;yh7I-~md|I$dD`nZRdsM0$zlvt zoD@|c&s@lr&7$)k1M2Y(rpFy%#Uzu7qOdFA@ga?y@x;Oun;(*iR_Q$(>9kzm!9m<5 zJ`YrhW5{~Y>^^+oAcD6jUgg2lbw=WojizTt=Homn++HB=nuI4GNQdC}bxira+#fgo zoa~lq*1|Okrh1g2NrVm3eSU&rb9>Q=73jhQ>-t7qoP{Xu3ur>vvV5pGnutX_+F$PA zHxH=bc812tdh8F)b_nA}MG(DmOzN>e7&5I#I;B%Uoc&}`KB2Zxe5ck+%uB2&e@mQ8 z6xnGP3l9*j#6J2N)#{UOf_@(*a7;0d#D%dQCq`RW9;t#$XXzQ@Lx&i;s20E8AB>xp z&E%39x^0?~?hR$as*^PmblEM^&r^ivA(3g3fwcYTbo80j7`}Lkz)X_yBs&=(LJJ&Y z1+4{M6MmShGDWOB1g6*roS%pk&MU+I_zuS=LnPu!0jD_Zb1=p`d#EanX)zjt02=)M z2Rke_|J?JBC8Y`h8Ayhw4XZJmB1?{0VO1eQp}Q1rjPu?{8*z(+(qpD6c&KiL6}bPi z^pJQmA|7Z)(TpzQ>8Pg_kSl4uE6#qxW^4Og^RH0@_&8eJpXH53XV$?9YdUN|0jd24 z*x{V>X8__pb(uZq8I{BXu0xnABS6_X28BpQ2Y4(5AV`8-Qy6Z~EKmb(j(euepx6-~ z3zjOfXokTN;2jVsa2g8;4Tvli<OFL_BTV=vFf2w<-JH=#T>Kjw>K!39K;xA9E%+rs z;Vf^4upjHu$x{HRl<-;pJ8@{6i(+{1$l_pu2<7hqoJwecNRTZWH692?3CLuiP_n7O zfk#mXmzFW@2*~^=@5ZANuiQosVO0W<sC!!~ffcG7a-I~v^b$%|MF?bLxc-KbV40=f zs<#&MctO+)5a7VbN(@NQ<Z`FwI}J^i$C}|&nJyk1!^C3(lKGVIus*$Zhs6y9jE6Ih z^8$5sN2~Z%_3Pw~tQc@Zzvj|Bc_GIJu_0|gz@j6?3yK<OqfEeXF`Lh1m7u0#(WS7& zDr5DBMdB*WKMhQmy0p#biU1Hh$tKuY|BA@F^_Is`ibTCT(}wk3DOaPyeY@vu@^;t7 zuP$43O-D4rR;l8ka4;v}>t<l#;xUs-RP>S?tu<TcY$h@@i~i^l!>SN-zS6?=<0@Bx zxr8(7@ip>CpO<gMhpk5RO*BZe6lvUR5qH;99PI4u>*|W3U;agMe)+Oz12Szdkw7QR zIg5emz__pt(OnTQ7nv4W5Dlu1zyO@wd`0*;7_iQQm+20=ZD{v(-(FA_BICr>ANqc^ zPMyp11ic@}mx{4D*_n}7pXrJ=V)$W1%`dk_!P1FMU!Ytq!e=kNMSqumr-qh(#0Y!Z z!_w8`l>*q2Xs3!;f2w4pkYw!{E3c4Qk|8tOGU8slK|%RD<+ZUE<us|c^2fycBsHz| z;bj~u(+ST;>{Vh)o8VX>smI)dSl(wj=-^!jGkl;8*_sq*r9-|n^RAWR#cwN;a1h`m zG95l}2?&E%j?a>j`Lq+f`x{nFPY$+-IyK?%y!bm9nrMI<LEBS@yq*`&(sOnsBUIe4 z1<9$&k{RmE2UA-2MOCV%)FdH{QZYVe(335C(bZugP8k+sIf;GQ9@kdbEn_7}Zbfpi zlzaOIhfqWsc_yKzG&3&6&P<3rNXb}la{ZmQOH}Eahq@E=0y&e=RXX{4PH4P`%J{tE z#|VPA8{W7Lh(fldolf9W3hU{n`+$@HLr?|MpfWVQ!U3G*{mF)5_vh6N{w)$UjyHZm z6A+ZPYjZ8Q2|URYPQ=^PP)}hR2M26wJ$H$UUUQwnIb1!v^2gsxS#lK(lm8p;Fx{k} zEyEj|7dKSF%YCubf%H*K@xI3E%>;x|4o^fw;@~Y7m3~pT7E~ZbbpI#|zF1?1!BfBD zzt%>RbfaJ%9@SL1Njlt2E(!&GGz8IxCFC3dKFXlIl7`FL4<`G{_J2+o{+I(|^;N%S z4Mp`a61?sH{6kH{)X9gsN;Y=>J|M+lVM4Aix*5RA?TId9FP&Ul`E@HezwnP7kQFTa zCuEGKrrV3I39Hnw=eUlmy2bxvazKWlDq4@N;BDYG2SW4yP78bcD`898`;jXJ5@d5y zoWua#AMPln3{zx^Ynk3*hLd{Z6F{kk^a<<H{ZO2%X^$^2JI{|6u^rnf;X45gPdWJC zJ+Y;%{=B%TWW+GW1@HX`d%<U`sO2AKCwYbd_R?rv#PW2^DCvXYh>!khAOnVN9;({^ z#&Ww^MBlmSmXoKGm*sB&z#sT6pPOpQ>yRV2C{^=|3;6>B;wr)hTCW#fM^^a4QwcJ* zPVz-dL|!`z>>cKk7oD#>O>03VT=7OL6bapALnfmOJTFf2*3k{(#hYf|n`xup9KfBG ze>X!Iz$IzE2S(T2i8m!_p^vC4G8If(RqFeT`X%LuDP0+&4kJkTi+pa0L=&l;EiHu_ zztx<mvsRWgOkNh%<&35LTOXYLdk9`GZiOM>ag*Wj{LgZ*JR$MnR!6piNpEzSFLdZv z6$o>MMZJUqxHtG+^Wy&GEFxE((H7Jkv=H=__@;S=F0>MQ#9x`GLv<A;S^}$KuDqQ6 z^V{fnM7DCBs~^Uj;XDKsx^;K^X15o;4ku>8i|MrZHivj!6WTJ&v6W#$9l2*nIcC`H z#-xL8QE#~R-Fz>dqWra~s@v|(#Pkc#gnVo8!ILm6aRI=uXufYe+s>(Ft4nGob;Oy) z9*lJ55inPkOch~XnXkf*@}DXhob;yFbNTuVJLZi^ev9eqyw8be=Uj8zN`_hwlh5RC zXodrbYss8wz~1Vx>6HlD$PCSWMY=5z!g_LpmjZiaWtiGZ#GbxgAvFQQYI&s=q;pH0 zG0Lup{Z7S;|B7;s5+g1+$@P!8w<pF5yZL)$?P!yQRrTB9RXY%DRC&=I`M%|ph9$hq zm`HL><YU7jj|0Bj@YxmkhGt%v>j%JVB7ck-P6vC`$nw{|m}~2cmUgG3D3Z6mvn93A zHu)23uT`YW_M~$%VHA?RE3l`X*SrbjtU@GE&<d|s@e{lynB?hC)^c>+mAX;IP*t=z z$=h`^Ilg_H^L6>%<OlpF7K>1Sr{ct~>VL>9dhTb;?1eX9MAn%Yc&B1Zn@~odx9Ow( z>H5gm1)UVB@{oIhrRyT25$i91I&S3n-66m7q$!C9J|Yw+@=gWBACIAnm1LeYJ7p79 zakyXB6<YaU+;SI^9+6}TprG6&9G$7Ndx&Dd`(PHcb`>6@yXy8Hl1y@b2nZ_svzp`x zT)ZXtpCmZg*wIzQpL5!aBi_5O<<hT4k^b)TvJ&j8`Lcc<!yi%614zUa2%USNMIXeS z*t`+}rD(=-46i*YhTrLy;R|8qT>)$l;2+o;O#_=qpBP_%l{IU9>WD&`WOwT79kqz8 znuEptiTM?cS{MnBBb`tBZ!Sn+e>Unld6#iivu%Q}Z8Y`2#35T^SB`v~!Z(sP9O;fb zkjmX_l~s2)iMI=u$ts!yk6_)Z?YaDo4bGT3(R|O}O;}d;LDOY}ZWwFKrxC(ce7wOK z1jKCr1#`Nlpp;a}a!C$%sRYndeap`8K-tRjZa_2E)^t2(!EvUSnqfN4D&+^A;W+%W z^%zy@&qgPCXoq{e%!HR9iJ3<1QTk|VD-|3UB^XoG?}QFbgqOJEf7X6w{i~}2!#EK) zhIF9HN*OK|;1^9pnpHkkVydI{yHSkseY8**X6&-JzOyf;KhK0KTJg78&02cT3w>@T z*50)m%H7UhHxio9YqC>k*j0ZOmQJHf!!TDOyz0&kB;cDc%l>{~=#n|a)*o&0^zB@# zdCyVK%b?6z@j7wdz>lKNTdj<4kt{S{ThG<q-j{B(FeV-ud7DIg5MUXL{;7egC~Bis zUA(O3PDPhrm33YmxJ1s*+C|MG^5ta|^g?;K1!bjdBK5il$jCC@fLeOxtX~^rk=U?= z>j508WEmH^@988*RT>W50g?#PeTBs{Qf?RpaqkE*S?1LXO^g3oNzE$xxIlSr((251 zs3)0A^Q_(S&Y)S?@bYcw;e8+*v;KK5a|QN962=GV`hNWS0S36yV_PA3(Zr}_ew;V! zX7U)n?-M?dx!G5v37-jTaR)1i%z=-Be6F)`SbsN(oVzzYhO*}LHlXPT^tH(%!A@Xn zuzOh5HaW_>bu;<2qpgGS1#txNfCPeMq|lc&V`PMq>A&@(@V^D%Ras>}j93ha)D`Xq zZ)R~-$OIa5{Ffux8#Cs6$PX}fKMZez8enr~jMz<1-sNo{tek7krB;+3?O?kJF2z#k zvm%DZ=dj<ZQ1D|oR`5}Q$iF<p;E9Yp1Wzy-O_6X{{kN<s@=x#gei|)C#PovMo_j2C zYmSt>q4H?2I3-ic4Ugd>yA0e_eA*U_-d0Qz;qfbNRsR`xDAuDmnow|D7>nF>L&9g9 z5lY2SskQ|tc)LwJL_eWr)z_n>2g@J=wwKQ18<Q7H6s$v*`EU2`Alc28EI><a0hqR+ z79IuABgU~GlKr=>NF+4S4&q!rM1yT<4yPzNr3z<7yy)_>!es=nS6i_301<avOT^}d z?veKmad(p!{;*zZ#Sat)z?yBg;Ebb{%BtIO<5c+G`eH`#zil5ZFhbuHWy#dHN-*nU zG;Q3_%j4J*>tB$-iUg2Fn15d5jG?iDeIQb>XsUT|x=r!?#Q*JfO<nE%Ae_n2dWGM> zI*svQeAp1WTl@8_;`ZD$)ew4cN?)55PSf<UqqN(`r_{lY@!FXBJHfPf(A}8uxF2~v z7KRt|>#rig>G=In3JB4h@!zC%{<oK>jN@-eHRTJR`ptn-bg*q~nX$`7w|)tYzq3ex zs4E;RE8W^8UJPJA%`}-4PCqNU>*litzBQe1cO~fwO_I2Vf)}y9r(K19jK!S6O{%Ap z>R@7QCsvO>b%0b<EH&h@?(cfwqhGq$chTR}p2WQ`N(6t{55w1et6Hg(zr<6iV?4|J z$@L5E(zJo`-uTZlW5reb(Vcwah&G^94`QJ7kbAe7jq?4WQdcl@DQm<slZP6J4o_*5 zuE`=SWPRqEX_EBR(T`TJ!1yzLEbX=B6W`$nr{tr9!7+c}_72iw`amiC`)|7dSxF^{ JDlwzL{|{o5JG}q^ literal 0 HcmV?d00001 diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_3_head-512.png b/borestop/src/main/webapp/content/images/jhipster_family_member_3_head-512.png new file mode 100755 index 0000000000000000000000000000000000000000..e719f1df805db311c8e4c4e8e62a5b00d2cc90ed GIT binary patch literal 13555 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 Miq93w<*dT~Kc8Q=KmY&$ literal 0 HcmV?d00001 diff --git a/borestop/src/main/webapp/content/images/logo-jhipster.png b/borestop/src/main/webapp/content/images/logo-jhipster.png new file mode 100644 index 0000000000000000000000000000000000000000..6a005bf5e4b6d9d1cffd5aa688612a7a67be3809 GIT binary patch literal 605 zcmeAS@N?(olHy`uVBq!ia0vp^X+W&S!3-qJX5VuMQV9V*A+A8$ynd@i<2K!rWe%MO zfe6CTEm;od!bFzA8A!@Ng7%#U&=f-y7*(!~;k;V~v_rNe$S;^dLBPSG;lPKF3m#0k zup!_<L4v`Cgarl{4@_t%2;jK1cqsz|W51`1V@O5Z)*EjpEmja{eRx@+>3-m1&$LT# z{@#DO%XD(lN=Ikwlf}&WqV4t#|26l{_?Yedt>4MV+Uoz()Amt^3}<F~{R_Ltp&0Pa zIrgekhCw*rO=G4fHAil&{&H;Xla39OfAc1Hvxt~5wM_kXJH|A5x>bBdbYtk#@~gIH zfr*v<M^}CG-_a#dy#JFiv)mMagO~G{hkhznx7lLnd5=vn+0s?mXY!KQtrJ^$mkGA6 zcu?YO;9KS4sr1@n?exT%YBSvC3HD8vKY8N#$4_S(3%6JlXUyp@Pe0{+`A?$ep+kFZ zi`gCiy_IBMP+R}3>IvHpZth5i#nV@c_)SZl@@3IgDekNY73Mt+zmIHRlhU|b!&oTn znAf^lljejsNIAN7pVOW)b^W;zF2R-M=a%Fe3z}(s-sH1xV{_LMAKkta&XNY5N`*J4 zmTNk2D;GK+yglphc3&H%`x=Ln%IpsLvM8pWI;-xtC-^&;`<&Sks{i(_wdZWV_)^Ga z&B3g7yVkpye{G3hRQ%Cm?`coPC104<FFGXOvHz2PU}gzlf+H{v89ZJ6T-G@yGywqA C^9}?6 literal 0 HcmV?d00001 diff --git a/borestop/src/main/webapp/content/scss/_bootstrap-variables.scss b/borestop/src/main/webapp/content/scss/_bootstrap-variables.scss new file mode 100644 index 00000000..a64158a6 --- /dev/null +++ b/borestop/src/main/webapp/content/scss/_bootstrap-variables.scss @@ -0,0 +1,45 @@ +/* +* Bootstrap overrides https://getbootstrap.com/docs/4.0/getting-started/theming/ +* All values defined in bootstrap source +* https://github.com/twbs/bootstrap/blob/v4-dev/scss/_variables.scss can be overwritten here +* Make sure not to add !default to values here +*/ + +// Colors: +// Grayscale and brand colors for use across Bootstrap. + +$primary: #3e8acc; +$success: #28a745; +$info: #17a2b8; +$warning: #ffc107; +$danger: #dc3545; + +// Options: +// Quickly modify global styling by enabling or disabling optional features. +$enable-rounded: true; +$enable-shadows: false; +$enable-gradients: false; +$enable-transitions: true; +$enable-hover-media-query: false; +$enable-grid-classes: true; +$enable-print-styles: true; + +// Components: +// Define common padding and border radius sizes and more. + +$border-radius: 0.15rem; +$border-radius-lg: 0.125rem; +$border-radius-sm: 0.1rem; + +// Body: +// Settings for the `<body>` element. + +$body-bg: #e4e5e6; + +// Typography: +// Font, line-height, and color for body text, headings, and more. + +$font-size-base: 1rem; + +$dropdown-link-hover-color: white; +$dropdown-link-hover-bg: #343a40; diff --git a/borestop/src/main/webapp/content/scss/global.scss b/borestop/src/main/webapp/content/scss/global.scss new file mode 100644 index 00000000..543a62c1 --- /dev/null +++ b/borestop/src/main/webapp/content/scss/global.scss @@ -0,0 +1,195 @@ +@import 'bootstrap-variables'; +@import '~bootstrap/scss/functions'; +@import '~bootstrap/scss/variables'; + +/* ============================================================== +Bootstrap tweaks +===============================================================*/ + +body, +h1, +h2, +h3, +h4 { + font-weight: 300; +} + +/* Increase contrast of links to get 100% on Lighthouse Accessability Audit. Override this color if you want to change the link color, or use a Bootswatch theme */ +a { + color: #533f03; + font-weight: bold; +} + +a:hover { + color: #533f03; +} + +/* override hover color for dropdown-item forced by bootstrap to all a:not([href]):not([tabindex]) elements in _reboot.scss */ +a:not([href]):not([tabindex]):hover.dropdown-item { + color: $dropdown-link-hover-color; +} + +/* override .dropdown-item.active background-color on hover */ +.dropdown-item.active:hover { + background-color: mix($dropdown-link-hover-bg, $dropdown-link-active-bg, 50%); +} + +a:hover { + /* make sure browsers use the pointer cursor for anchors, even with no href */ + cursor: pointer; +} + +.dropdown-item:hover { + color: $dropdown-link-hover-color; +} + +/* ========================================================================== +Browser Upgrade Prompt +========================================================================== */ +.browserupgrade { + margin: 0.2em 0; + background: #ccc; + color: #000; + padding: 0.2em 0; +} + +/* ========================================================================== +Generic styles +========================================================================== */ + +/* Error highlight on input fields */ +.ng-valid[required], +.ng-valid.required { + border-left: 5px solid green; +} + +.ng-invalid:not(form) { + border-left: 5px solid red; +} + +/* other generic styles */ + +.jh-card { + padding: 1.5%; + margin-top: 20px; + border: none; +} + +.error { + color: white; + background-color: red; +} + +.pad { + padding: 10px; +} + +.w-40 { + width: 40% !important; +} + +.w-60 { + width: 60% !important; +} + +.break { + white-space: normal; + word-break: break-all; +} + +.readonly { + background-color: #eee; + opacity: 1; +} + +.footer { + border-top: 1px solid rgba(0, 0, 0, 0.125); +} + +.hand, +[jhisortby] { + cursor: pointer; +} + +/* ========================================================================== +Custom alerts for notification +========================================================================== */ +.alerts { + .alert { + text-overflow: ellipsis; + pre { + background: none; + border: none; + font: inherit; + color: inherit; + padding: 0; + margin: 0; + } + .popover pre { + font-size: 10px; + } + } + .jhi-toast { + position: fixed; + width: 100%; + &.left { + left: 5px; + } + &.right { + right: 5px; + } + &.top { + top: 55px; + } + &.bottom { + bottom: 55px; + } + } +} + +@media screen and (min-width: 480px) { + .alerts .jhi-toast { + width: 50%; + } +} + +/* ========================================================================== +entity detail page css +========================================================================== */ +.row.jh-entity-details > { + dd { + margin-bottom: 15px; + } +} + +@media screen and (min-width: 768px) { + .row.jh-entity-details > { + dt { + margin-bottom: 15px; + } + dd { + border-bottom: 1px solid #eee; + padding-left: 180px; + margin-left: 0; + } + } +} + +/* ========================================================================== +ui bootstrap tweaks +========================================================================== */ +.nav, +.pagination, +.carousel, +.panel-title a { + cursor: pointer; +} + +.thread-dump-modal-lock { + max-width: 450px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +/* jhipster-needle-scss-add-main JHipster will add new css style */ diff --git a/borestop/src/main/webapp/content/scss/vendor.scss b/borestop/src/main/webapp/content/scss/vendor.scss new file mode 100644 index 00000000..31688d04 --- /dev/null +++ b/borestop/src/main/webapp/content/scss/vendor.scss @@ -0,0 +1,12 @@ +/* after changing this file run 'npm run webpack:build' */ + +/*************************** +put Sass variables here: +eg $input-color: red; +****************************/ +// Override Bootstrap variables +@import 'bootstrap-variables'; +// Import Bootstrap source files from node_modules +@import '~bootstrap/scss/bootstrap'; + +/* jhipster-needle-scss-add-vendor JHipster will add new css style */ diff --git a/borestop/src/main/webapp/favicon.ico b/borestop/src/main/webapp/favicon.ico new file mode 100755 index 0000000000000000000000000000000000000000..4179874f53b3c3b0ba9e2a401412f814ab6296bd GIT binary patch literal 1574 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 Ye;H)0173J!PXGV_07*qoM6N<$g5<mIe*gdg literal 0 HcmV?d00001 diff --git a/borestop/src/main/webapp/i18n/en/activate.json b/borestop/src/main/webapp/i18n/en/activate.json new file mode 100644 index 00000000..058bd497 --- /dev/null +++ b/borestop/src/main/webapp/i18n/en/activate.json @@ -0,0 +1,9 @@ +{ + "activate": { + "title": "Activation", + "messages": { + "success": "<strong>Your user account has been activated.</strong> Please ", + "error": "<strong>Your user could not be activated.</strong> Please use the registration form to sign up." + } + } +} diff --git a/borestop/src/main/webapp/i18n/en/audits.json b/borestop/src/main/webapp/i18n/en/audits.json new file mode 100644 index 00000000..8af22b20 --- /dev/null +++ b/borestop/src/main/webapp/i18n/en/audits.json @@ -0,0 +1,28 @@ +{ + "audits": { + "title": "Audits", + "filter": { + "title": "Filter per date", + "from": "from", + "to": "to", + "button": { + "weeks": "Weeks", + "today": "today", + "clear": "clear", + "close": "close" + } + }, + "table": { + "header": { + "principal": "User", + "date": "Date", + "status": "State", + "data": "Extra data" + }, + "data": { + "remoteAddress": "Remote Address:" + } + }, + "notFound": "No audit found" + } +} diff --git a/borestop/src/main/webapp/i18n/en/configuration.json b/borestop/src/main/webapp/i18n/en/configuration.json new file mode 100644 index 00000000..09c9a1af --- /dev/null +++ b/borestop/src/main/webapp/i18n/en/configuration.json @@ -0,0 +1,10 @@ +{ + "configuration": { + "title": "Configuration", + "filter": "Filter (by prefix)", + "table": { + "prefix": "Prefix", + "properties": "Properties" + } + } +} diff --git a/borestop/src/main/webapp/i18n/en/error.json b/borestop/src/main/webapp/i18n/en/error.json new file mode 100644 index 00000000..d2575632 --- /dev/null +++ b/borestop/src/main/webapp/i18n/en/error.json @@ -0,0 +1,14 @@ +{ + "error": { + "title": "Error page!", + "http": { + "400": "Bad request.", + "403": "You are not authorized to access this page.", + "404": "The page does not exist.", + "405": "The HTTP verb you used is not supported for this URL.", + "500": "Internal server error." + }, + "concurrencyFailure": "Another user modified this data at the same time as you. Your changes were rejected.", + "validation": "Validation error on the server." + } +} diff --git a/borestop/src/main/webapp/i18n/en/global.json b/borestop/src/main/webapp/i18n/en/global.json new file mode 100644 index 00000000..8d7ada07 --- /dev/null +++ b/borestop/src/main/webapp/i18n/en/global.json @@ -0,0 +1,140 @@ +{ + "global": { + "title": "Borestop", + "browsehappy": "You are using an <strong>outdated</strong> browser. Please <a href=\"http://browsehappy.com/?locale=en\">upgrade your browser</a> to improve your experience.", + "menu": { + "home": "Home", + "jhipster-needle-menu-add-element": "JHipster will add additional menu entries here (do not translate!)", + "entities": { + "main": "Entities", + "jhipster-needle-menu-add-entry": "JHipster will add additional entities here (do not translate!)" + }, + "account": { + "main": "Account", + "settings": "Settings", + "password": "Password", + "sessions": "Sessions", + "login": "Sign in", + "logout": "Sign out", + "register": "Register" + }, + "admin": { + "main": "Administration", + "userManagement": "User management", + "tracker": "User tracker", + "metrics": "Metrics", + "health": "Health", + "configuration": "Configuration", + "logs": "Logs", + "audits": "Audits", + "apidocs": "API", + "database": "Database", + "jhipster-needle-menu-add-admin-element": "JHipster will add additional menu entries here (do not translate!)" + }, + "language": "Language" + }, + "form": { + "username.label": "Username", + "username.placeholder": "Your username", + "currentpassword.label": "Current password", + "currentpassword.placeholder": "Current password", + "newpassword.label": "New password", + "newpassword.placeholder": "New password", + "confirmpassword.label": "New password confirmation", + "confirmpassword.placeholder": "Confirm the new password", + "email.label": "Email", + "email.placeholder": "Your email" + }, + "messages": { + "info": { + "authenticated": { + "prefix": "If you want to ", + "link": "sign in", + "suffix": ", you can try the default accounts:<br/>- Administrator (login=\"admin\" and password=\"admin\") <br/>- User (login=\"user\" and password=\"user\")." + }, + "register": { + "noaccount": "You don't have an account yet?", + "link": "Register a new account" + } + }, + "error": { + "dontmatch": "The password and its confirmation do not match!" + }, + "validate": { + "newpassword": { + "required": "Your password is required.", + "minlength": "Your password is required to be at least 4 characters.", + "maxlength": "Your password cannot be longer than 50 characters.", + "strength": "Password strength:" + }, + "confirmpassword": { + "required": "Your confirmation password is required.", + "minlength": "Your confirmation password is required to be at least 4 characters.", + "maxlength": "Your confirmation password cannot be longer than 50 characters." + }, + "email": { + "required": "Your email is required.", + "invalid": "Your email is invalid.", + "minlength": "Your email is required to be at least 5 characters.", + "maxlength": "Your email cannot be longer than 50 characters." + } + } + }, + "field": { + "id": "ID" + }, + "ribbon": { + "dev": "Development" + }, + "item-count": "Showing {{first}} - {{second}} of {{total}} items." + }, + "entity": { + "action": { + "addblob": "Add blob", + "addimage": "Add image", + "back": "Back", + "cancel": "Cancel", + "delete": "Delete", + "edit": "Edit", + "open": "Open", + "save": "Save", + "view": "View" + }, + "detail": { + "field": "Field", + "value": "Value" + }, + "delete": { + "title": "Confirm delete operation" + }, + "validation": { + "required": "This field is required.", + "minlength": "This field is required to be at least {{ min }} characters.", + "maxlength": "This field cannot be longer than {{ max }} characters.", + "min": "This field should be at least {{ min }}.", + "max": "This field cannot be more than {{ max }}.", + "minbytes": "This field should be at least {{ min }} bytes.", + "maxbytes": "This field cannot be more than {{ max }} bytes.", + "pattern": "This field should follow pattern for {{ pattern }}.", + "number": "This field should be a number.", + "datetimelocal": "This field should be a date and time.", + "patternLogin": "This field can only contain letters, digits and e-mail addresses." + } + }, + "error": { + "internalServerError": "Internal server error", + "server.not.reachable": "Server not reachable", + "url.not.found": "Not found", + "NotNull": "Field {{ fieldName }} cannot be empty!", + "Size": "Field {{ fieldName }} does not meet min/max size requirements!", + "userexists": "Login name already used!", + "emailexists": "Email is already in use!", + "idexists": "A new {{ entityName }} cannot already have an ID", + "idnull": "Invalid ID", + "file": { + "could.not.extract": "Could not extract file", + "not.image": "File was expected to be an image but was found to be \"{{ fileType }}\"" + } + }, + "footer": "This is your footer" +} diff --git a/borestop/src/main/webapp/i18n/en/health.json b/borestop/src/main/webapp/i18n/en/health.json new file mode 100644 index 00000000..0cbff266 --- /dev/null +++ b/borestop/src/main/webapp/i18n/en/health.json @@ -0,0 +1,29 @@ +{ + "health": { + "title": "Health Checks", + "refresh.button": "Refresh", + "stacktrace": "Stacktrace", + "details": { + "details": "Details", + "properties": "Properties", + "name": "Name", + "value": "Value", + "error": "Error" + }, + "indicator": { + "diskSpace": "Disk space", + "mail": "Email", + "ping": "Application", + "db": "Database" + }, + "table": { + "service": "Service name", + "status": "Status" + }, + "status": { + "UNKNOWN": "UNKNOWN", + "UP": "UP", + "DOWN": "DOWN" + } + } +} diff --git a/borestop/src/main/webapp/i18n/en/home.json b/borestop/src/main/webapp/i18n/en/home.json new file mode 100644 index 00000000..d9fc4990 --- /dev/null +++ b/borestop/src/main/webapp/i18n/en/home.json @@ -0,0 +1,19 @@ +{ + "home": { + "title": "Welcome, Java Hipster!", + "subtitle": "This is your homepage", + "logged": { + "message": "You are logged in as user \"{{username}}\"." + }, + "question": "If you have any question on JHipster:", + "link": { + "homepage": "JHipster homepage", + "stackoverflow": "JHipster on Stack Overflow", + "bugtracker": "JHipster bug tracker", + "chat": "JHipster public chat room", + "follow": "follow @jhipster on Twitter" + }, + "like": "If you like JHipster, don't forget to give us a star on", + "github": "GitHub" + } +} diff --git a/borestop/src/main/webapp/i18n/en/login.json b/borestop/src/main/webapp/i18n/en/login.json new file mode 100644 index 00000000..46679588 --- /dev/null +++ b/borestop/src/main/webapp/i18n/en/login.json @@ -0,0 +1,19 @@ +{ + "login": { + "title": "Sign in", + "form": { + "password": "Password", + "password.placeholder": "Your password", + "rememberme": "Remember me", + "button": "Sign in" + }, + "messages": { + "error": { + "authentication": "<strong>Failed to sign in!</strong> Please check your credentials and try again." + } + }, + "password": { + "forgot": "Did you forget your password?" + } + } +} diff --git a/borestop/src/main/webapp/i18n/en/logs.json b/borestop/src/main/webapp/i18n/en/logs.json new file mode 100644 index 00000000..8ee0ba5a --- /dev/null +++ b/borestop/src/main/webapp/i18n/en/logs.json @@ -0,0 +1,11 @@ +{ + "logs": { + "title": "Logs", + "nbloggers": "There are {{ total }} loggers.", + "filter": "Filter", + "table": { + "name": "Name", + "level": "Level" + } + } +} diff --git a/borestop/src/main/webapp/i18n/en/metrics.json b/borestop/src/main/webapp/i18n/en/metrics.json new file mode 100644 index 00000000..c514dee7 --- /dev/null +++ b/borestop/src/main/webapp/i18n/en/metrics.json @@ -0,0 +1,102 @@ +{ + "metrics": { + "title": "Application Metrics", + "refresh.button": "Refresh", + "updating": "Updating...", + "jvm": { + "title": "JVM Metrics", + "memory": { + "title": "Memory", + "total": "Total Memory", + "heap": "Heap Memory", + "nonheap": "Non-Heap Memory" + }, + "threads": { + "title": "Threads", + "all": "All", + "runnable": "Runnable", + "timedwaiting": "Timed waiting", + "waiting": "Waiting", + "blocked": "Blocked", + "dump": { + "title": "Threads dump", + "id": "Id: ", + "blockedtime": "Blocked Time", + "blockedcount": "Blocked Count", + "waitedtime": "Waited Time", + "waitedcount": "Waited Count", + "lockname": "Lock name", + "stacktrace": "Stacktrace", + "show": "Show Stacktrace", + "hide": "Hide Stacktrace" + } + }, + "gc": { + "title": "Garbage collections", + "marksweepcount": "Mark Sweep count", + "marksweeptime": "Mark Sweep time", + "scavengecount": "Scavenge count", + "scavengetime": "Scavenge time" + }, + "http": { + "title": "HTTP requests (time in millisecond)", + "active": "Active requests:", + "total": "Total requests:", + "table": { + "code": "Code", + "count": "Count", + "mean": "Mean", + "average": "Average", + "max": "Max" + }, + "code": { + "ok": "Ok", + "notfound": "Not found", + "servererror": "Server Error" + } + } + }, + "servicesstats": { + "title": "Services statistics (time in millisecond)", + "table": { + "name": "Service name", + "count": "Count", + "mean": "Mean", + "min": "Min", + "max": "Max", + "p50": "p50", + "p75": "p75", + "p95": "p95", + "p99": "p99" + } + }, + "cache": { + "title": "Cache statistics", + "cachename": "Cache name", + "hits": "Cache Hits", + "misses": "Cache Misses", + "gets": "Cache Gets", + "puts": "Cache Puts", + "removals": "Cache Removals", + "evictions": "Cache Evictions", + "hitPercent": "Cache Hit %", + "missPercent": "Cache Miss %", + "averageGetTime": "Average get time (µs)", + "averagePutTime": "Average put time (µs)", + "averageRemoveTime": "Average remove time (µs)" + }, + "datasource": { + "usage": "Connection Pool Usage", + "title": "DataSource statistics (time in millisecond)", + "name": "Pool usage", + "count": "Count", + "mean": "Mean", + "min": "Min", + "max": "Max", + "p50": "p50", + "p75": "p75", + "p95": "p95", + "p99": "p99" + } + } +} diff --git a/borestop/src/main/webapp/i18n/en/password.json b/borestop/src/main/webapp/i18n/en/password.json new file mode 100644 index 00000000..fc9b6c94 --- /dev/null +++ b/borestop/src/main/webapp/i18n/en/password.json @@ -0,0 +1,12 @@ +{ + "password": { + "title": "Password for [<strong>{{username}}</strong>]", + "form": { + "button": "Save" + }, + "messages": { + "error": "<strong>An error has occurred!</strong> The password could not be changed.", + "success": "<strong>Password changed!</strong>" + } + } +} diff --git a/borestop/src/main/webapp/i18n/en/register.json b/borestop/src/main/webapp/i18n/en/register.json new file mode 100644 index 00000000..1a0aeecf --- /dev/null +++ b/borestop/src/main/webapp/i18n/en/register.json @@ -0,0 +1,24 @@ +{ + "register": { + "title": "Registration", + "form": { + "button": "Register" + }, + "messages": { + "validate": { + "login": { + "required": "Your username is required.", + "minlength": "Your username is required to be at least 1 character.", + "maxlength": "Your username cannot be longer than 50 characters.", + "pattern": "Your username is invalid." + } + }, + "success": "<strong>Registration saved!</strong> Please check your email for confirmation.", + "error": { + "fail": "<strong>Registration failed!</strong> Please try again later.", + "userexists": "<strong>Login name already registered!</strong> Please choose another one.", + "emailexists": "<strong>Email is already in use!</strong> Please choose another one." + } + } + } +} diff --git a/borestop/src/main/webapp/i18n/en/reset.json b/borestop/src/main/webapp/i18n/en/reset.json new file mode 100644 index 00000000..4c35e9a2 --- /dev/null +++ b/borestop/src/main/webapp/i18n/en/reset.json @@ -0,0 +1,26 @@ +{ + "reset": { + "request": { + "title": "Reset your password", + "form": { + "button": "Reset password" + }, + "messages": { + "info": "Enter the email address you used to register", + "success": "Check your emails for details on how to reset your password." + } + }, + "finish": { + "title": "Reset password", + "form": { + "button": "Validate new password" + }, + "messages": { + "info": "Choose a new password", + "success": "<strong>Your password has been reset.</strong> Please ", + "keymissing": "The reset key is missing.", + "error": "Your password couldn't be reset. Remember a password request is only valid for 24 hours." + } + } + } +} diff --git a/borestop/src/main/webapp/i18n/en/sessions.json b/borestop/src/main/webapp/i18n/en/sessions.json new file mode 100644 index 00000000..38bf44f7 --- /dev/null +++ b/borestop/src/main/webapp/i18n/en/sessions.json @@ -0,0 +1,15 @@ +{ + "sessions": { + "title": "Active sessions for [<strong>{{username}}</strong>]", + "table": { + "ipaddress": "IP address", + "useragent": "User Agent", + "date": "Date", + "button": "Invalidate" + }, + "messages": { + "success": "<strong>Session invalidated!</strong>", + "error": "<strong>An error has occurred!</strong> The session could not be invalidated." + } + } +} diff --git a/borestop/src/main/webapp/i18n/en/settings.json b/borestop/src/main/webapp/i18n/en/settings.json new file mode 100644 index 00000000..508c037c --- /dev/null +++ b/borestop/src/main/webapp/i18n/en/settings.json @@ -0,0 +1,32 @@ +{ + "settings": { + "title": "User settings for [<strong>{{username}}</strong>]", + "form": { + "firstname": "First Name", + "firstname.placeholder": "Your first name", + "lastname": "Last Name", + "lastname.placeholder": "Your last name", + "language": "Language", + "button": "Save" + }, + "messages": { + "error": { + "fail": "<strong>An error has occurred!</strong> Settings could not be saved.", + "emailexists": "<strong>Email is already in use!</strong> Please choose another one." + }, + "success": "<strong>Settings saved!</strong>", + "validate": { + "firstname": { + "required": "Your first name is required.", + "minlength": "Your first name is required to be at least 1 character", + "maxlength": "Your first name cannot be longer than 50 characters" + }, + "lastname": { + "required": "Your last name is required.", + "minlength": "Your last name is required to be at least 1 character", + "maxlength": "Your last name cannot be longer than 50 characters" + } + } + } + } +} diff --git a/borestop/src/main/webapp/i18n/en/user-management.json b/borestop/src/main/webapp/i18n/en/user-management.json new file mode 100644 index 00000000..4923c091 --- /dev/null +++ b/borestop/src/main/webapp/i18n/en/user-management.json @@ -0,0 +1,30 @@ +{ + "userManagement": { + "home": { + "title": "Users", + "createLabel": "Create a new user", + "createOrEditLabel": "Create or edit a user" + }, + "created": "A new user is created with identifier {{ param }}", + "updated": "A user is updated with identifier {{ param }}", + "deleted": "A user is deleted with identifier {{ param }}", + "delete": { + "question": "Are you sure you want to delete user {{ login }}?" + }, + "detail": { + "title": "User" + }, + "login": "Login", + "firstName": "First name", + "lastName": "Last name", + "email": "Email", + "activated": "Activated", + "deactivated": "Deactivated", + "profiles": "Profiles", + "langKey": "Language", + "createdBy": "Created by", + "createdDate": "Created date", + "lastModifiedBy": "Modified by", + "lastModifiedDate": "Modified date" + } +} diff --git a/borestop/src/main/webapp/index.html b/borestop/src/main/webapp/index.html new file mode 100644 index 00000000..6f64fe50 --- /dev/null +++ b/borestop/src/main/webapp/index.html @@ -0,0 +1,108 @@ +<!doctype html> +<html class="no-js" lang="en" dir="ltr"> +<head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>borestop</title> + <meta name="description" content="Description for borestop"> + <meta name="google" content="notranslate"> + <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> + <meta name="theme-color" content="#000000"> + <link rel="icon" href="favicon.ico" /> + <link rel="manifest" href="manifest.webapp" /> + <link rel="stylesheet" href="content/css/loading.css"> + <!-- jhipster-needle-add-resources-to-root - JHipster will add new resources here --> +</head> +<body> + <!--[if lt IE 9]> + <p class="browserupgrade">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p> + <![endif]--> + <jhi-main> + <div class="app-loading"> + <div class="lds-css ng-scope"> + <div class="lds-pacman"> + <div><div></div><div></div><div></div></div> + <div><div></div><div></div><div></div></div> + </div> + </div> + </div> + <div class="app-loading"> + <div id="jhipster-error" style="display:none"> + <!-- This content is for troubleshooting purpose and will be removed when app renders --> + <h1>An error has occurred :-(</h1> + <h2>Usual error causes</h2> + <ol> + <li>You started the application from an IDE and you didn't run <code style="color:red">npm start</code> or <code style="color:red">npm run webpack:build</code>.</li> + <li>You had a network error while running <code style="color:red">npm install</code>. If you are behind a corporate proxy, it is likely that this error was caused by your proxy. Have a look at the JHipster error logs, you will probably have the cause of the error.</li> + <li>You installed a Node.js version that doesn't work with JHipster: please use an LTS (long-term support) version, as it's the only version we support.</li> + </ol> + <h2>Building the client side code again</h2> + <p>If you want to go fast, run <code style="color:red">./mvnw</code> to build and run everything.</p> + <p>If you want to have more control, so you can debug your issue more easily, you should follow the following steps:</p> + <ol> + <li>Install npm dependencies with the command <code style="color:red">npm install</code></li> + <li>Build the client with the command <code style="color:red">npm run webpack:build</code> or <code style="color:red">npm start</code></li> + <li>Start the server with <code style="color:red">./mvnw</code> or using your IDE</li> + </ol> + + <h2>Getting more help</h2> + + <h3>If you have a question on how to use JHipster</h3> + <p> + Go to Stack Overflow with the <a href="http://stackoverflow.com/tags/jhipster" target="_blank" rel="noopener noreferrer">"jhipster"</a> tag. + </p> + + <h3>If you have a bug or a feature request</h3> + <p> + First read our <a href="https://github.com/jhipster/generator-jhipster/blob/master/CONTRIBUTING.md" target="_blank" rel="noopener noreferrer">contributing guidelines</a>. + </p> + <p> + Then, fill a ticket on our <a href="https://github.com/jhipster/generator-jhipster/issues/new/choose" target="_blank" rel="noopener noreferrer">bug tracker</a>, we'll be happy to resolve your issue! + </p> + + <h3>If you want to chat with contributors and other users</h3> + <p> + Join our chat room on <a href="https://gitter.im/jhipster/generator-jhipster" target="_blank" rel="noopener noreferrer">Gitter.im</a>. Please note that this is a public chat room, and that we expect you to respect other people and write in a correct English language! + </p> + <!-- end of troubleshooting content --> + </div> + </div> + </jhi-main> + <noscript> + <h1>You must enable javascript to view this page.</h1> + </noscript> + <script type="text/javascript" language="javascript"> + // show an error message if the app loading takes more than 5 sec + window.onload=function() { + setTimeout(showError, 4000); + } + function showError() { + var errorElm = document.getElementById("jhipster-error"); + if (errorElm && errorElm.style) { + errorElm.style.display = "block"; + } + } + </script> + <!-- uncomment this for adding service worker + <script> + if ('serviceWorker' in navigator) { + window.addEventListener('load', function() { + navigator.serviceWorker.register('/service-worker.js') + .then(function () { + console.log('Service Worker Registered'); + }); + }); + } + </script> + --> + <!-- Google Analytics: uncomment and change UA-XXXXX-X to be your site's ID. + <script> + (function(b,o,i,l,e,r){b.GoogleAnalyticsObject=l;b[l]||(b[l]= + function(){(b[l].q=b[l].q||[]).push(arguments)});b[l].l=+new Date; + e=o.createElement(i);r=o.getElementsByTagName(i)[0]; + e.src='//www.google-analytics.com/analytics.js'; + r.parentNode.insertBefore(e,r)}(window,document,'script','ga')); + ga('create','UA-XXXXX-X');ga('send','pageview'); + </script>--> +</body> +</html> diff --git a/borestop/src/main/webapp/manifest.webapp b/borestop/src/main/webapp/manifest.webapp new file mode 100644 index 00000000..b74d738c --- /dev/null +++ b/borestop/src/main/webapp/manifest.webapp @@ -0,0 +1,31 @@ +{ + "name": "Borestop", + "short_name": "Borestop", + "icons": [ + { + "src": "./content/images/jhipster_family_member_2_head-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "./content/images/jhipster_family_member_2_head-256.png", + "sizes": "256x256", + "type": "image/png" + }, + { + "src": "./content/images/jhipster_family_member_2_head-384.png", + "sizes": "384x384", + "type": "image/png" + }, + { + "src": "./content/images/jhipster_family_member_2_head-512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#000000", + "background_color": "#e0e0e0", + "start_url": ".", + "display": "standalone", + "orientation": "portrait" +} diff --git a/borestop/src/main/webapp/robots.txt b/borestop/src/main/webapp/robots.txt new file mode 100644 index 00000000..7cda2747 --- /dev/null +++ b/borestop/src/main/webapp/robots.txt @@ -0,0 +1,11 @@ +# robotstxt.org/ + +User-agent: * +Disallow: /api/account +Disallow: /api/account/change-password +Disallow: /api/account/sessions +Disallow: /api/audits/ +Disallow: /api/logs/ +Disallow: /api/users/ +Disallow: /management/ +Disallow: /v2/api-docs/ diff --git a/borestop/src/main/webapp/swagger-ui/dist/images/throbber.gif b/borestop/src/main/webapp/swagger-ui/dist/images/throbber.gif new file mode 100644 index 0000000000000000000000000000000000000000..06393889242fb3ea9e0205fa84369ec7bb66d15a GIT binary patch literal 9257 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 literal 0 HcmV?d00001 diff --git a/borestop/src/main/webapp/swagger-ui/index.html b/borestop/src/main/webapp/swagger-ui/index.html new file mode 100644 index 00000000..bdabf17b --- /dev/null +++ b/borestop/src/main/webapp/swagger-ui/index.html @@ -0,0 +1,65 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <title>borestop - Swagger UI</title> + <link rel="stylesheet" type="text/css" href="./swagger-ui.css"> + <link rel="icon" type="image/png" href="./favicon-32x32.png" sizes="32x32"/> + <link rel="icon" type="image/png" href="./favicon-16x16.png" sizes="16x16"/> +</head> + +<body> +<div id="swagger-ui"></div> + +<script src="./swagger-ui-bundle.js"></script> +<script src="./swagger-ui-standalone-preset.js"></script> +<script src="./axios.min.js"></script> + + +<script type="text/javascript"> + window.onload = function () { + + + var urls = []; + axios.get("/swagger-resources").then(function (response) { + response.data.forEach(function (resource) { + urls.push({"name": resource.name, "url": resource.location}); + }); + + urls.sort(function (a, b) { + var x = a.name.toLowerCase(), y = b.name.toLowerCase(); + return x < y ? -1 : x > y ? 1 : 0; + }); + + // Build a system + var ui = SwaggerUIBundle({ + urls: urls, + dom_id: '#swagger-ui', + deepLinking: true, + filter: true, + layout: "StandaloneLayout", + withCredentials: true, + presets: [ + SwaggerUIBundle.presets.apis, + SwaggerUIStandalonePreset + ], + plugins: [ + SwaggerUIBundle.plugins.DownloadUrl + ], + requestInterceptor: function (req) { + var authToken = JSON.parse(localStorage.getItem("jhi-authenticationtoken") + || sessionStorage.getItem("jhi-authenticationtoken")); + if (authToken) { + req.headers['Authorization'] = "Bearer " + authToken; + } + return req; + } + }); + + window.ui = ui + }); + + }; +</script> +</body> +</html> diff --git a/borestop/src/test/java/com/ippon/borestop/ArchTest.java b/borestop/src/test/java/com/ippon/borestop/ArchTest.java new file mode 100644 index 00000000..7a9744e8 --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/ArchTest.java @@ -0,0 +1,29 @@ +package com.ippon.borestop; + +import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses; + +import com.tngtech.archunit.core.domain.JavaClasses; +import com.tngtech.archunit.core.importer.ClassFileImporter; +import com.tngtech.archunit.core.importer.ImportOption; +import org.junit.jupiter.api.Test; + +class ArchTest { + + @Test + void servicesAndRepositoriesShouldNotDependOnWebLayer() { + JavaClasses importedClasses = new ClassFileImporter() + .withImportOption(ImportOption.Predefined.DO_NOT_INCLUDE_TESTS) + .importPackages("com.ippon.borestop"); + + noClasses() + .that() + .resideInAnyPackage("com.ippon.borestop.service..") + .or() + .resideInAnyPackage("com.ippon.borestop.repository..") + .should() + .dependOnClassesThat() + .resideInAnyPackage("..com.ippon.borestop.web..") + .because("Services and repositories should not depend on web layer") + .check(importedClasses); + } +} diff --git a/borestop/src/test/java/com/ippon/borestop/config/NoOpMailConfiguration.java b/borestop/src/test/java/com/ippon/borestop/config/NoOpMailConfiguration.java new file mode 100644 index 00000000..bfec6ca7 --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/config/NoOpMailConfiguration.java @@ -0,0 +1,24 @@ +package com.ippon.borestop.config; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.mock; + +import com.ippon.borestop.service.MailService; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class NoOpMailConfiguration { + private final MailService mockMailService; + + public NoOpMailConfiguration() { + mockMailService = mock(MailService.class); + doNothing().when(mockMailService).sendActivationEmail(any()); + } + + @Bean + public MailService mailService() { + return mockMailService; + } +} diff --git a/borestop/src/test/java/com/ippon/borestop/config/StaticResourcesWebConfigurerTest.java b/borestop/src/test/java/com/ippon/borestop/config/StaticResourcesWebConfigurerTest.java new file mode 100644 index 00000000..959eb671 --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/config/StaticResourcesWebConfigurerTest.java @@ -0,0 +1,75 @@ +package com.ippon.borestop.config; + +import static com.ippon.borestop.config.StaticResourcesWebConfiguration.*; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.*; + +import io.github.jhipster.config.JHipsterDefaults; +import io.github.jhipster.config.JHipsterProperties; +import java.util.concurrent.TimeUnit; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.http.CacheControl; +import org.springframework.mock.web.MockServletContext; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistration; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; + +public class StaticResourcesWebConfigurerTest { + public static final int MAX_AGE_TEST = 5; + public StaticResourcesWebConfiguration staticResourcesWebConfiguration; + private ResourceHandlerRegistry resourceHandlerRegistry; + private MockServletContext servletContext; + private WebApplicationContext applicationContext; + private JHipsterProperties props; + + @BeforeEach + void setUp() { + servletContext = spy(new MockServletContext()); + applicationContext = mock(WebApplicationContext.class); + resourceHandlerRegistry = spy(new ResourceHandlerRegistry(applicationContext, servletContext)); + props = new JHipsterProperties(); + staticResourcesWebConfiguration = spy(new StaticResourcesWebConfiguration(props)); + } + + @Test + public void shouldAppendResourceHandlerAndInitiliazeIt() { + staticResourcesWebConfiguration.addResourceHandlers(resourceHandlerRegistry); + + verify(resourceHandlerRegistry, times(1)).addResourceHandler(RESOURCE_PATHS); + verify(staticResourcesWebConfiguration, times(1)).initializeResourceHandler(any(ResourceHandlerRegistration.class)); + for (String testingPath : RESOURCE_PATHS) { + assertThat(resourceHandlerRegistry.hasMappingForPattern(testingPath)).isTrue(); + } + } + + @Test + public void shouldInitializeResourceHandlerWithCacheControlAndLocations() { + CacheControl ccExpected = CacheControl.maxAge(5, TimeUnit.DAYS).cachePublic(); + when(staticResourcesWebConfiguration.getCacheControl()).thenReturn(ccExpected); + ResourceHandlerRegistration resourceHandlerRegistration = spy(new ResourceHandlerRegistration(RESOURCE_PATHS)); + + staticResourcesWebConfiguration.initializeResourceHandler(resourceHandlerRegistration); + + verify(staticResourcesWebConfiguration, times(1)).getCacheControl(); + verify(resourceHandlerRegistration, times(1)).setCacheControl(ccExpected); + verify(resourceHandlerRegistration, times(1)).addResourceLocations(RESOURCE_LOCATIONS); + } + + @Test + public void shoudCreateCacheControlBasedOnJhipsterDefaultProperties() { + CacheControl cacheExpected = CacheControl.maxAge(JHipsterDefaults.Http.Cache.timeToLiveInDays, TimeUnit.DAYS).cachePublic(); + assertThat(staticResourcesWebConfiguration.getCacheControl()) + .extracting(CacheControl::getHeaderValue) + .isEqualTo(cacheExpected.getHeaderValue()); + } + + @Test + public void shoudCreateCacheControlWithSpecificConfigurationInProperties() { + props.getHttp().getCache().setTimeToLiveInDays(MAX_AGE_TEST); + CacheControl cacheExpected = CacheControl.maxAge(MAX_AGE_TEST, TimeUnit.DAYS).cachePublic(); + assertThat(staticResourcesWebConfiguration.getCacheControl()) + .extracting(CacheControl::getHeaderValue) + .isEqualTo(cacheExpected.getHeaderValue()); + } +} diff --git a/borestop/src/test/java/com/ippon/borestop/config/WebConfigurerTest.java b/borestop/src/test/java/com/ippon/borestop/config/WebConfigurerTest.java new file mode 100644 index 00000000..dad507c5 --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/config/WebConfigurerTest.java @@ -0,0 +1,147 @@ +package com.ippon.borestop.config; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.options; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import io.github.jhipster.config.JHipsterConstants; +import io.github.jhipster.config.JHipsterProperties; +import io.github.jhipster.web.filter.CachingHttpHeadersFilter; +import java.io.File; +import java.util.*; +import javax.servlet.*; +import org.h2.server.web.WebServlet; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory; +import org.springframework.http.HttpHeaders; +import org.springframework.mock.env.MockEnvironment; +import org.springframework.mock.web.MockServletContext; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; + +/** + * Unit tests for the {@link WebConfigurer} class. + */ +public class WebConfigurerTest { + private WebConfigurer webConfigurer; + + private MockServletContext servletContext; + + private MockEnvironment env; + + private JHipsterProperties props; + + @BeforeEach + public void setup() { + servletContext = spy(new MockServletContext()); + doReturn(mock(FilterRegistration.Dynamic.class)).when(servletContext).addFilter(anyString(), any(Filter.class)); + doReturn(mock(ServletRegistration.Dynamic.class)).when(servletContext).addServlet(anyString(), any(Servlet.class)); + + env = new MockEnvironment(); + props = new JHipsterProperties(); + + webConfigurer = new WebConfigurer(env, props); + } + + @Test + public void testStartUpProdServletContext() throws ServletException { + env.setActiveProfiles(JHipsterConstants.SPRING_PROFILE_PRODUCTION); + webConfigurer.onStartup(servletContext); + + verify(servletContext, never()).addServlet(eq("H2Console"), any(WebServlet.class)); + } + + @Test + public void testStartUpDevServletContext() throws ServletException { + env.setActiveProfiles(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT); + webConfigurer.onStartup(servletContext); + + verify(servletContext).addServlet(eq("H2Console"), any(WebServlet.class)); + } + + @Test + public void testCustomizeServletContainer() { + env.setActiveProfiles(JHipsterConstants.SPRING_PROFILE_PRODUCTION); + UndertowServletWebServerFactory container = new UndertowServletWebServerFactory(); + webConfigurer.customize(container); + assertThat(container.getMimeMappings().get("abs")).isEqualTo("audio/x-mpeg"); + assertThat(container.getMimeMappings().get("html")).isEqualTo("text/html;charset=utf-8"); + assertThat(container.getMimeMappings().get("json")).isEqualTo("text/html;charset=utf-8"); + if (container.getDocumentRoot() != null) { + assertThat(container.getDocumentRoot()).isEqualTo(new File("target/classes/static/")); + } + } + + @Test + public void testCorsFilterOnApiPath() throws Exception { + props.getCors().setAllowedOrigins(Collections.singletonList("*")); + props.getCors().setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE")); + props.getCors().setAllowedHeaders(Collections.singletonList("*")); + props.getCors().setMaxAge(1800L); + props.getCors().setAllowCredentials(true); + + MockMvc mockMvc = MockMvcBuilders.standaloneSetup(new WebConfigurerTestController()).addFilters(webConfigurer.corsFilter()).build(); + + mockMvc + .perform( + options("/api/test-cors").header(HttpHeaders.ORIGIN, "other.domain.com").header(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "POST") + ) + .andExpect(status().isOk()) + .andExpect(header().string(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, "other.domain.com")) + .andExpect(header().string(HttpHeaders.VARY, "Origin")) + .andExpect(header().string(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, "GET,POST,PUT,DELETE")) + .andExpect(header().string(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true")) + .andExpect(header().string(HttpHeaders.ACCESS_CONTROL_MAX_AGE, "1800")); + + mockMvc + .perform(get("/api/test-cors").header(HttpHeaders.ORIGIN, "other.domain.com")) + .andExpect(status().isOk()) + .andExpect(header().string(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, "other.domain.com")); + } + + @Test + public void testCorsFilterOnOtherPath() throws Exception { + props.getCors().setAllowedOrigins(Collections.singletonList("*")); + props.getCors().setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE")); + props.getCors().setAllowedHeaders(Collections.singletonList("*")); + props.getCors().setMaxAge(1800L); + props.getCors().setAllowCredentials(true); + + MockMvc mockMvc = MockMvcBuilders.standaloneSetup(new WebConfigurerTestController()).addFilters(webConfigurer.corsFilter()).build(); + + mockMvc + .perform(get("/test/test-cors").header(HttpHeaders.ORIGIN, "other.domain.com")) + .andExpect(status().isOk()) + .andExpect(header().doesNotExist(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN)); + } + + @Test + public void testCorsFilterDeactivated() throws Exception { + props.getCors().setAllowedOrigins(null); + + MockMvc mockMvc = MockMvcBuilders.standaloneSetup(new WebConfigurerTestController()).addFilters(webConfigurer.corsFilter()).build(); + + mockMvc + .perform(get("/api/test-cors").header(HttpHeaders.ORIGIN, "other.domain.com")) + .andExpect(status().isOk()) + .andExpect(header().doesNotExist(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN)); + } + + @Test + public void testCorsFilterDeactivated2() throws Exception { + props.getCors().setAllowedOrigins(new ArrayList<>()); + + MockMvc mockMvc = MockMvcBuilders.standaloneSetup(new WebConfigurerTestController()).addFilters(webConfigurer.corsFilter()).build(); + + mockMvc + .perform(get("/api/test-cors").header(HttpHeaders.ORIGIN, "other.domain.com")) + .andExpect(status().isOk()) + .andExpect(header().doesNotExist(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN)); + } +} diff --git a/borestop/src/test/java/com/ippon/borestop/config/WebConfigurerTestController.java b/borestop/src/test/java/com/ippon/borestop/config/WebConfigurerTestController.java new file mode 100644 index 00000000..6a9fdff2 --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/config/WebConfigurerTestController.java @@ -0,0 +1,14 @@ +package com.ippon.borestop.config; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class WebConfigurerTestController { + + @GetMapping("/api/test-cors") + public void testCorsOnApiPath() {} + + @GetMapping("/test/test-cors") + public void testCorsOnOtherPath() {} +} diff --git a/borestop/src/test/java/com/ippon/borestop/config/timezone/HibernateTimeZoneIT.java b/borestop/src/test/java/com/ippon/borestop/config/timezone/HibernateTimeZoneIT.java new file mode 100644 index 00000000..c1a99327 --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/config/timezone/HibernateTimeZoneIT.java @@ -0,0 +1,162 @@ +package com.ippon.borestop.config.timezone; + +import static java.lang.String.format; +import static org.assertj.core.api.Assertions.assertThat; + +import com.ippon.borestop.BorestopApp; +import com.ippon.borestop.repository.timezone.DateTimeWrapper; +import com.ippon.borestop.repository.timezone.DateTimeWrapperRepository; +import java.time.*; +import java.time.format.DateTimeFormatter; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.support.rowset.SqlRowSet; +import org.springframework.transaction.annotation.Transactional; + +/** + * Integration tests for the ZoneId Hibernate configuration. + */ +@SpringBootTest(classes = BorestopApp.class) +public class HibernateTimeZoneIT { + @Autowired + private DateTimeWrapperRepository dateTimeWrapperRepository; + + @Autowired + private JdbcTemplate jdbcTemplate; + + @Value("${spring.jpa.properties.hibernate.jdbc.time_zone:UTC}") + private String zoneId; + + private DateTimeWrapper dateTimeWrapper; + private DateTimeFormatter dateTimeFormatter; + private DateTimeFormatter timeFormatter; + private DateTimeFormatter dateFormatter; + + @BeforeEach + public void setup() { + dateTimeWrapper = new DateTimeWrapper(); + dateTimeWrapper.setInstant(Instant.parse("2014-11-12T05:50:00.0Z")); + dateTimeWrapper.setLocalDateTime(LocalDateTime.parse("2014-11-12T07:50:00.0")); + dateTimeWrapper.setOffsetDateTime(OffsetDateTime.parse("2011-12-14T08:30:00.0Z")); + dateTimeWrapper.setZonedDateTime(ZonedDateTime.parse("2011-12-14T08:30:00.0Z")); + dateTimeWrapper.setLocalTime(LocalTime.parse("14:30:00")); + dateTimeWrapper.setOffsetTime(OffsetTime.parse("14:30:00+02:00")); + dateTimeWrapper.setLocalDate(LocalDate.parse("2016-09-10")); + + dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S").withZone(ZoneId.of(zoneId)); + + timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss").withZone(ZoneId.of(zoneId)); + + dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + } + + @Test + @Transactional + public void storeInstantWithZoneIdConfigShouldBeStoredOnGMTTimeZone() { + dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper); + + String request = generateSqlRequest("instant", dateTimeWrapper.getId()); + SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request); + String expectedValue = dateTimeFormatter.format(dateTimeWrapper.getInstant()); + + assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue); + } + + @Test + @Transactional + public void storeLocalDateTimeWithZoneIdConfigShouldBeStoredOnGMTTimeZone() { + dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper); + + String request = generateSqlRequest("local_date_time", dateTimeWrapper.getId()); + SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request); + String expectedValue = dateTimeWrapper.getLocalDateTime().atZone(ZoneId.systemDefault()).format(dateTimeFormatter); + + assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue); + } + + @Test + @Transactional + public void storeOffsetDateTimeWithZoneIdConfigShouldBeStoredOnGMTTimeZone() { + dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper); + + String request = generateSqlRequest("offset_date_time", dateTimeWrapper.getId()); + SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request); + String expectedValue = dateTimeWrapper.getOffsetDateTime().format(dateTimeFormatter); + + assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue); + } + + @Test + @Transactional + public void storeZoneDateTimeWithZoneIdConfigShouldBeStoredOnGMTTimeZone() { + dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper); + + String request = generateSqlRequest("zoned_date_time", dateTimeWrapper.getId()); + SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request); + String expectedValue = dateTimeWrapper.getZonedDateTime().format(dateTimeFormatter); + + assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue); + } + + @Test + @Transactional + public void storeLocalTimeWithZoneIdConfigShouldBeStoredOnGMTTimeZoneAccordingToHis1stJan1970Value() { + dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper); + + String request = generateSqlRequest("local_time", dateTimeWrapper.getId()); + SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request); + String expectedValue = dateTimeWrapper + .getLocalTime() + .atDate(LocalDate.of(1970, Month.JANUARY, 1)) + .atZone(ZoneId.systemDefault()) + .format(timeFormatter); + + assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue); + } + + @Test + @Transactional + public void storeOffsetTimeWithZoneIdConfigShouldBeStoredOnGMTTimeZoneAccordingToHis1stJan1970Value() { + dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper); + + String request = generateSqlRequest("offset_time", dateTimeWrapper.getId()); + SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request); + String expectedValue = dateTimeWrapper + .getOffsetTime() + .toLocalTime() + .atDate(LocalDate.of(1970, Month.JANUARY, 1)) + .atZone(ZoneId.systemDefault()) + .format(timeFormatter); + + assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue); + } + + @Test + @Transactional + public void storeLocalDateWithZoneIdConfigShouldBeStoredWithoutTransformation() { + dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper); + + String request = generateSqlRequest("local_date", dateTimeWrapper.getId()); + SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request); + String expectedValue = dateTimeWrapper.getLocalDate().format(dateFormatter); + + assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue); + } + + private String generateSqlRequest(String fieldName, long id) { + return format("SELECT %s FROM jhi_date_time_wrapper where id=%d", fieldName, id); + } + + private void assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(SqlRowSet sqlRowSet, String expectedValue) { + while (sqlRowSet.next()) { + String dbValue = sqlRowSet.getString(1); + + assertThat(dbValue).isNotNull(); + assertThat(dbValue).isEqualTo(expectedValue); + } + } +} diff --git a/borestop/src/test/java/com/ippon/borestop/repository/CustomAuditEventRepositoryIT.java b/borestop/src/test/java/com/ippon/borestop/repository/CustomAuditEventRepositoryIT.java new file mode 100644 index 00000000..22d84fe9 --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/repository/CustomAuditEventRepositoryIT.java @@ -0,0 +1,154 @@ +package com.ippon.borestop.repository; + +import static com.ippon.borestop.repository.CustomAuditEventRepository.EVENT_DATA_COLUMN_MAX_LENGTH; +import static org.assertj.core.api.Assertions.assertThat; + +import com.ippon.borestop.BorestopApp; +import com.ippon.borestop.config.Constants; +import com.ippon.borestop.config.audit.AuditEventConverter; +import com.ippon.borestop.domain.PersistentAuditEvent; +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.servlet.http.HttpSession; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.actuate.audit.AuditEvent; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.mock.web.MockHttpSession; +import org.springframework.security.web.authentication.WebAuthenticationDetails; +import org.springframework.transaction.annotation.Transactional; + +/** + * Integration tests for {@link CustomAuditEventRepository}. + */ +@SpringBootTest(classes = BorestopApp.class) +@Transactional +public class CustomAuditEventRepositoryIT { + @Autowired + private PersistenceAuditEventRepository persistenceAuditEventRepository; + + @Autowired + private AuditEventConverter auditEventConverter; + + private CustomAuditEventRepository customAuditEventRepository; + + @BeforeEach + public void setup() { + customAuditEventRepository = new CustomAuditEventRepository(persistenceAuditEventRepository, auditEventConverter); + persistenceAuditEventRepository.deleteAll(); + Instant oneHourAgo = Instant.now().minusSeconds(3600); + + PersistentAuditEvent testUserEvent = new PersistentAuditEvent(); + testUserEvent.setPrincipal("test-user"); + testUserEvent.setAuditEventType("test-type"); + testUserEvent.setAuditEventDate(oneHourAgo); + Map<String, String> data = new HashMap<>(); + data.put("test-key", "test-value"); + testUserEvent.setData(data); + + PersistentAuditEvent testOldUserEvent = new PersistentAuditEvent(); + testOldUserEvent.setPrincipal("test-user"); + testOldUserEvent.setAuditEventType("test-type"); + testOldUserEvent.setAuditEventDate(oneHourAgo.minusSeconds(10000)); + + PersistentAuditEvent testOtherUserEvent = new PersistentAuditEvent(); + testOtherUserEvent.setPrincipal("other-test-user"); + testOtherUserEvent.setAuditEventType("test-type"); + testOtherUserEvent.setAuditEventDate(oneHourAgo); + } + + @Test + public void addAuditEvent() { + Map<String, Object> data = new HashMap<>(); + data.put("test-key", "test-value"); + AuditEvent event = new AuditEvent("test-user", "test-type", data); + customAuditEventRepository.add(event); + List<PersistentAuditEvent> persistentAuditEvents = persistenceAuditEventRepository.findAll(); + assertThat(persistentAuditEvents).hasSize(1); + PersistentAuditEvent persistentAuditEvent = persistentAuditEvents.get(0); + assertThat(persistentAuditEvent.getPrincipal()).isEqualTo(event.getPrincipal()); + assertThat(persistentAuditEvent.getAuditEventType()).isEqualTo(event.getType()); + assertThat(persistentAuditEvent.getData()).containsKey("test-key"); + assertThat(persistentAuditEvent.getData().get("test-key")).isEqualTo("test-value"); + assertThat(persistentAuditEvent.getAuditEventDate().truncatedTo(ChronoUnit.MILLIS)) + .isEqualTo(event.getTimestamp().truncatedTo(ChronoUnit.MILLIS)); + } + + @Test + public void addAuditEventTruncateLargeData() { + Map<String, Object> data = new HashMap<>(); + StringBuilder largeData = new StringBuilder(); + for (int i = 0; i < EVENT_DATA_COLUMN_MAX_LENGTH + 10; i++) { + largeData.append("a"); + } + data.put("test-key", largeData); + AuditEvent event = new AuditEvent("test-user", "test-type", data); + customAuditEventRepository.add(event); + List<PersistentAuditEvent> persistentAuditEvents = persistenceAuditEventRepository.findAll(); + assertThat(persistentAuditEvents).hasSize(1); + PersistentAuditEvent persistentAuditEvent = persistentAuditEvents.get(0); + assertThat(persistentAuditEvent.getPrincipal()).isEqualTo(event.getPrincipal()); + assertThat(persistentAuditEvent.getAuditEventType()).isEqualTo(event.getType()); + assertThat(persistentAuditEvent.getData()).containsKey("test-key"); + String actualData = persistentAuditEvent.getData().get("test-key"); + assertThat(actualData.length()).isEqualTo(EVENT_DATA_COLUMN_MAX_LENGTH); + assertThat(actualData).isSubstringOf(largeData); + assertThat(persistentAuditEvent.getAuditEventDate().truncatedTo(ChronoUnit.MILLIS)) + .isEqualTo(event.getTimestamp().truncatedTo(ChronoUnit.MILLIS)); + } + + @Test + public void testAddEventWithWebAuthenticationDetails() { + HttpSession session = new MockHttpSession(null, "test-session-id"); + MockHttpServletRequest request = new MockHttpServletRequest(); + request.setSession(session); + request.setRemoteAddr("1.2.3.4"); + WebAuthenticationDetails details = new WebAuthenticationDetails(request); + Map<String, Object> data = new HashMap<>(); + data.put("test-key", details); + AuditEvent event = new AuditEvent("test-user", "test-type", data); + customAuditEventRepository.add(event); + List<PersistentAuditEvent> persistentAuditEvents = persistenceAuditEventRepository.findAll(); + assertThat(persistentAuditEvents).hasSize(1); + PersistentAuditEvent persistentAuditEvent = persistentAuditEvents.get(0); + assertThat(persistentAuditEvent.getData().get("remoteAddress")).isEqualTo("1.2.3.4"); + assertThat(persistentAuditEvent.getData().get("sessionId")).isEqualTo("test-session-id"); + } + + @Test + public void testAddEventWithNullData() { + Map<String, Object> data = new HashMap<>(); + data.put("test-key", null); + AuditEvent event = new AuditEvent("test-user", "test-type", data); + customAuditEventRepository.add(event); + List<PersistentAuditEvent> persistentAuditEvents = persistenceAuditEventRepository.findAll(); + assertThat(persistentAuditEvents).hasSize(1); + PersistentAuditEvent persistentAuditEvent = persistentAuditEvents.get(0); + assertThat(persistentAuditEvent.getData().get("test-key")).isEqualTo("null"); + } + + @Test + public void addAuditEventWithAnonymousUser() { + Map<String, Object> data = new HashMap<>(); + data.put("test-key", "test-value"); + AuditEvent event = new AuditEvent(Constants.ANONYMOUS_USER, "test-type", data); + customAuditEventRepository.add(event); + List<PersistentAuditEvent> persistentAuditEvents = persistenceAuditEventRepository.findAll(); + assertThat(persistentAuditEvents).hasSize(0); + } + + @Test + public void addAuditEventWithAuthorizationFailureType() { + Map<String, Object> data = new HashMap<>(); + data.put("test-key", "test-value"); + AuditEvent event = new AuditEvent("test-user", "AUTHORIZATION_FAILURE", data); + customAuditEventRepository.add(event); + List<PersistentAuditEvent> persistentAuditEvents = persistenceAuditEventRepository.findAll(); + assertThat(persistentAuditEvents).hasSize(0); + } +} diff --git a/borestop/src/test/java/com/ippon/borestop/repository/timezone/DateTimeWrapper.java b/borestop/src/test/java/com/ippon/borestop/repository/timezone/DateTimeWrapper.java new file mode 100644 index 00000000..625d95d3 --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/repository/timezone/DateTimeWrapper.java @@ -0,0 +1,132 @@ +package com.ippon.borestop.repository.timezone; + +import java.io.Serializable; +import java.time.*; +import java.util.Objects; +import javax.persistence.*; + +@Entity +@Table(name = "jhi_date_time_wrapper") +public class DateTimeWrapper implements Serializable { + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator") + @SequenceGenerator(name = "sequenceGenerator") + private Long id; + + @Column(name = "instant") + private Instant instant; + + @Column(name = "local_date_time") + private LocalDateTime localDateTime; + + @Column(name = "offset_date_time") + private OffsetDateTime offsetDateTime; + + @Column(name = "zoned_date_time") + private ZonedDateTime zonedDateTime; + + @Column(name = "local_time") + private LocalTime localTime; + + @Column(name = "offset_time") + private OffsetTime offsetTime; + + @Column(name = "local_date") + private LocalDate localDate; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Instant getInstant() { + return instant; + } + + public void setInstant(Instant instant) { + this.instant = instant; + } + + public LocalDateTime getLocalDateTime() { + return localDateTime; + } + + public void setLocalDateTime(LocalDateTime localDateTime) { + this.localDateTime = localDateTime; + } + + public OffsetDateTime getOffsetDateTime() { + return offsetDateTime; + } + + public void setOffsetDateTime(OffsetDateTime offsetDateTime) { + this.offsetDateTime = offsetDateTime; + } + + public ZonedDateTime getZonedDateTime() { + return zonedDateTime; + } + + public void setZonedDateTime(ZonedDateTime zonedDateTime) { + this.zonedDateTime = zonedDateTime; + } + + public LocalTime getLocalTime() { + return localTime; + } + + public void setLocalTime(LocalTime localTime) { + this.localTime = localTime; + } + + public OffsetTime getOffsetTime() { + return offsetTime; + } + + public void setOffsetTime(OffsetTime offsetTime) { + this.offsetTime = offsetTime; + } + + public LocalDate getLocalDate() { + return localDate; + } + + public void setLocalDate(LocalDate localDate) { + this.localDate = localDate; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + DateTimeWrapper dateTimeWrapper = (DateTimeWrapper) o; + return !(dateTimeWrapper.getId() == null || getId() == null) && Objects.equals(getId(), dateTimeWrapper.getId()); + } + + @Override + public int hashCode() { + return Objects.hashCode(getId()); + } + + // prettier-ignore + @Override + public String toString() { + return "TimeZoneTest{" + + "id=" + id + + ", instant=" + instant + + ", localDateTime=" + localDateTime + + ", offsetDateTime=" + offsetDateTime + + ", zonedDateTime=" + zonedDateTime + + '}'; + } +} diff --git a/borestop/src/test/java/com/ippon/borestop/repository/timezone/DateTimeWrapperRepository.java b/borestop/src/test/java/com/ippon/borestop/repository/timezone/DateTimeWrapperRepository.java new file mode 100644 index 00000000..65e5603f --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/repository/timezone/DateTimeWrapperRepository.java @@ -0,0 +1,10 @@ +package com.ippon.borestop.repository.timezone; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +/** + * Spring Data JPA repository for the {@link DateTimeWrapper} entity. + */ +@Repository +public interface DateTimeWrapperRepository extends JpaRepository<DateTimeWrapper, Long> {} diff --git a/borestop/src/test/java/com/ippon/borestop/security/DomainUserDetailsServiceIT.java b/borestop/src/test/java/com/ippon/borestop/security/DomainUserDetailsServiceIT.java new file mode 100644 index 00000000..c922548b --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/security/DomainUserDetailsServiceIT.java @@ -0,0 +1,111 @@ +package com.ippon.borestop.security; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; + +import com.ippon.borestop.BorestopApp; +import com.ippon.borestop.domain.User; +import com.ippon.borestop.repository.UserRepository; +import java.util.Locale; +import org.apache.commons.lang3.RandomStringUtils; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.transaction.annotation.Transactional; + +/** + * Integrations tests for {@link DomainUserDetailsService}. + */ +@SpringBootTest(classes = BorestopApp.class) +@Transactional +public class DomainUserDetailsServiceIT { + private static final String USER_ONE_LOGIN = "test-user-one"; + private static final String USER_ONE_EMAIL = "test-user-one@localhost"; + private static final String USER_TWO_LOGIN = "test-user-two"; + private static final String USER_TWO_EMAIL = "test-user-two@localhost"; + private static final String USER_THREE_LOGIN = "test-user-three"; + private static final String USER_THREE_EMAIL = "test-user-three@localhost"; + + @Autowired + private UserRepository userRepository; + + @Autowired + private UserDetailsService domainUserDetailsService; + + @BeforeEach + public void init() { + User userOne = new User(); + userOne.setLogin(USER_ONE_LOGIN); + userOne.setPassword(RandomStringUtils.random(60)); + userOne.setActivated(true); + userOne.setEmail(USER_ONE_EMAIL); + userOne.setFirstName("userOne"); + userOne.setLastName("doe"); + userOne.setLangKey("en"); + userRepository.save(userOne); + + User userTwo = new User(); + userTwo.setLogin(USER_TWO_LOGIN); + userTwo.setPassword(RandomStringUtils.random(60)); + userTwo.setActivated(true); + userTwo.setEmail(USER_TWO_EMAIL); + userTwo.setFirstName("userTwo"); + userTwo.setLastName("doe"); + userTwo.setLangKey("en"); + userRepository.save(userTwo); + + User userThree = new User(); + userThree.setLogin(USER_THREE_LOGIN); + userThree.setPassword(RandomStringUtils.random(60)); + userThree.setActivated(false); + userThree.setEmail(USER_THREE_EMAIL); + userThree.setFirstName("userThree"); + userThree.setLastName("doe"); + userThree.setLangKey("en"); + userRepository.save(userThree); + } + + @Test + public void assertThatUserCanBeFoundByLogin() { + UserDetails userDetails = domainUserDetailsService.loadUserByUsername(USER_ONE_LOGIN); + assertThat(userDetails).isNotNull(); + assertThat(userDetails.getUsername()).isEqualTo(USER_ONE_LOGIN); + } + + @Test + public void assertThatUserCanBeFoundByLoginIgnoreCase() { + UserDetails userDetails = domainUserDetailsService.loadUserByUsername(USER_ONE_LOGIN.toUpperCase(Locale.ENGLISH)); + assertThat(userDetails).isNotNull(); + assertThat(userDetails.getUsername()).isEqualTo(USER_ONE_LOGIN); + } + + @Test + public void assertThatUserCanBeFoundByEmail() { + UserDetails userDetails = domainUserDetailsService.loadUserByUsername(USER_TWO_EMAIL); + assertThat(userDetails).isNotNull(); + assertThat(userDetails.getUsername()).isEqualTo(USER_TWO_LOGIN); + } + + @Test + public void assertThatUserCanBeFoundByEmailIgnoreCase() { + UserDetails userDetails = domainUserDetailsService.loadUserByUsername(USER_TWO_EMAIL.toUpperCase(Locale.ENGLISH)); + assertThat(userDetails).isNotNull(); + assertThat(userDetails.getUsername()).isEqualTo(USER_TWO_LOGIN); + } + + @Test + public void assertThatEmailIsPrioritizedOverLogin() { + UserDetails userDetails = domainUserDetailsService.loadUserByUsername(USER_ONE_EMAIL); + assertThat(userDetails).isNotNull(); + assertThat(userDetails.getUsername()).isEqualTo(USER_ONE_LOGIN); + } + + @Test + public void assertThatUserNotActivatedExceptionIsThrownForNotActivatedUsers() { + assertThatExceptionOfType(UserNotActivatedException.class) + .isThrownBy(() -> domainUserDetailsService.loadUserByUsername(USER_THREE_LOGIN)); + } +} diff --git a/borestop/src/test/java/com/ippon/borestop/security/SecurityUtilsUnitTest.java b/borestop/src/test/java/com/ippon/borestop/security/SecurityUtilsUnitTest.java new file mode 100644 index 00000000..c6976072 --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/security/SecurityUtilsUnitTest.java @@ -0,0 +1,69 @@ +package com.ippon.borestop.security; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Optional; +import org.junit.jupiter.api.Test; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; + +/** + * Test class for the {@link SecurityUtils} utility class. + */ +public class SecurityUtilsUnitTest { + + @Test + public void testGetCurrentUserLogin() { + SecurityContext securityContext = SecurityContextHolder.createEmptyContext(); + securityContext.setAuthentication(new UsernamePasswordAuthenticationToken("admin", "admin")); + SecurityContextHolder.setContext(securityContext); + Optional<String> login = SecurityUtils.getCurrentUserLogin(); + assertThat(login).contains("admin"); + } + + @Test + public void testgetCurrentUserJWT() { + SecurityContext securityContext = SecurityContextHolder.createEmptyContext(); + securityContext.setAuthentication(new UsernamePasswordAuthenticationToken("admin", "token")); + SecurityContextHolder.setContext(securityContext); + Optional<String> jwt = SecurityUtils.getCurrentUserJWT(); + assertThat(jwt).contains("token"); + } + + @Test + public void testIsAuthenticated() { + SecurityContext securityContext = SecurityContextHolder.createEmptyContext(); + securityContext.setAuthentication(new UsernamePasswordAuthenticationToken("admin", "admin")); + SecurityContextHolder.setContext(securityContext); + boolean isAuthenticated = SecurityUtils.isAuthenticated(); + assertThat(isAuthenticated).isTrue(); + } + + @Test + public void testAnonymousIsNotAuthenticated() { + SecurityContext securityContext = SecurityContextHolder.createEmptyContext(); + Collection<GrantedAuthority> authorities = new ArrayList<>(); + authorities.add(new SimpleGrantedAuthority(AuthoritiesConstants.ANONYMOUS)); + securityContext.setAuthentication(new UsernamePasswordAuthenticationToken("anonymous", "anonymous", authorities)); + SecurityContextHolder.setContext(securityContext); + boolean isAuthenticated = SecurityUtils.isAuthenticated(); + assertThat(isAuthenticated).isFalse(); + } + + @Test + public void testIsCurrentUserInRole() { + SecurityContext securityContext = SecurityContextHolder.createEmptyContext(); + Collection<GrantedAuthority> authorities = new ArrayList<>(); + authorities.add(new SimpleGrantedAuthority(AuthoritiesConstants.USER)); + securityContext.setAuthentication(new UsernamePasswordAuthenticationToken("user", "user", authorities)); + SecurityContextHolder.setContext(securityContext); + + assertThat(SecurityUtils.isCurrentUserInRole(AuthoritiesConstants.USER)).isTrue(); + assertThat(SecurityUtils.isCurrentUserInRole(AuthoritiesConstants.ADMIN)).isFalse(); + } +} diff --git a/borestop/src/test/java/com/ippon/borestop/security/jwt/JWTFilterTest.java b/borestop/src/test/java/com/ippon/borestop/security/jwt/JWTFilterTest.java new file mode 100644 index 00000000..1ea6d015 --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/security/jwt/JWTFilterTest.java @@ -0,0 +1,115 @@ +package com.ippon.borestop.security.jwt; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.ippon.borestop.security.AuthoritiesConstants; +import io.github.jhipster.config.JHipsterProperties; +import io.jsonwebtoken.io.Decoders; +import io.jsonwebtoken.security.Keys; +import java.util.Collections; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.http.HttpStatus; +import org.springframework.mock.web.MockFilterChain; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.mock.web.MockHttpServletResponse; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.test.util.ReflectionTestUtils; + +public class JWTFilterTest { + private TokenProvider tokenProvider; + + private JWTFilter jwtFilter; + + @BeforeEach + public void setup() { + JHipsterProperties jHipsterProperties = new JHipsterProperties(); + tokenProvider = new TokenProvider(jHipsterProperties); + ReflectionTestUtils.setField( + tokenProvider, + "key", + Keys.hmacShaKeyFor( + Decoders.BASE64.decode("fd54a45s65fds737b9aafcb3412e07ed99b267f33413274720ddbb7f6c5e64e9f14075f2d7ed041592f0b7657baf8") + ) + ); + + ReflectionTestUtils.setField(tokenProvider, "tokenValidityInMilliseconds", 60000); + jwtFilter = new JWTFilter(tokenProvider); + SecurityContextHolder.getContext().setAuthentication(null); + } + + @Test + public void testJWTFilter() throws Exception { + UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken( + "test-user", + "test-password", + Collections.singletonList(new SimpleGrantedAuthority(AuthoritiesConstants.USER)) + ); + String jwt = tokenProvider.createToken(authentication, false); + MockHttpServletRequest request = new MockHttpServletRequest(); + request.addHeader(JWTFilter.AUTHORIZATION_HEADER, "Bearer " + jwt); + request.setRequestURI("/api/test"); + MockHttpServletResponse response = new MockHttpServletResponse(); + MockFilterChain filterChain = new MockFilterChain(); + jwtFilter.doFilter(request, response, filterChain); + assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value()); + assertThat(SecurityContextHolder.getContext().getAuthentication().getName()).isEqualTo("test-user"); + assertThat(SecurityContextHolder.getContext().getAuthentication().getCredentials().toString()).isEqualTo(jwt); + } + + @Test + public void testJWTFilterInvalidToken() throws Exception { + String jwt = "wrong_jwt"; + MockHttpServletRequest request = new MockHttpServletRequest(); + request.addHeader(JWTFilter.AUTHORIZATION_HEADER, "Bearer " + jwt); + request.setRequestURI("/api/test"); + MockHttpServletResponse response = new MockHttpServletResponse(); + MockFilterChain filterChain = new MockFilterChain(); + jwtFilter.doFilter(request, response, filterChain); + assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value()); + assertThat(SecurityContextHolder.getContext().getAuthentication()).isNull(); + } + + @Test + public void testJWTFilterMissingAuthorization() throws Exception { + MockHttpServletRequest request = new MockHttpServletRequest(); + request.setRequestURI("/api/test"); + MockHttpServletResponse response = new MockHttpServletResponse(); + MockFilterChain filterChain = new MockFilterChain(); + jwtFilter.doFilter(request, response, filterChain); + assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value()); + assertThat(SecurityContextHolder.getContext().getAuthentication()).isNull(); + } + + @Test + public void testJWTFilterMissingToken() throws Exception { + MockHttpServletRequest request = new MockHttpServletRequest(); + request.addHeader(JWTFilter.AUTHORIZATION_HEADER, "Bearer "); + request.setRequestURI("/api/test"); + MockHttpServletResponse response = new MockHttpServletResponse(); + MockFilterChain filterChain = new MockFilterChain(); + jwtFilter.doFilter(request, response, filterChain); + assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value()); + assertThat(SecurityContextHolder.getContext().getAuthentication()).isNull(); + } + + @Test + public void testJWTFilterWrongScheme() throws Exception { + UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken( + "test-user", + "test-password", + Collections.singletonList(new SimpleGrantedAuthority(AuthoritiesConstants.USER)) + ); + String jwt = tokenProvider.createToken(authentication, false); + MockHttpServletRequest request = new MockHttpServletRequest(); + request.addHeader(JWTFilter.AUTHORIZATION_HEADER, "Basic " + jwt); + request.setRequestURI("/api/test"); + MockHttpServletResponse response = new MockHttpServletResponse(); + MockFilterChain filterChain = new MockFilterChain(); + jwtFilter.doFilter(request, response, filterChain); + assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value()); + assertThat(SecurityContextHolder.getContext().getAuthentication()).isNull(); + } +} diff --git a/borestop/src/test/java/com/ippon/borestop/security/jwt/TokenProviderTest.java b/borestop/src/test/java/com/ippon/borestop/security/jwt/TokenProviderTest.java new file mode 100644 index 00000000..72c5e1d3 --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/security/jwt/TokenProviderTest.java @@ -0,0 +1,106 @@ +package com.ippon.borestop.security.jwt; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.ippon.borestop.security.AuthoritiesConstants; +import io.github.jhipster.config.JHipsterProperties; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import io.jsonwebtoken.io.Decoders; +import io.jsonwebtoken.security.Keys; +import java.security.Key; +import java.util.*; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.test.util.ReflectionTestUtils; + +public class TokenProviderTest { + private static final long ONE_MINUTE = 60000; + + private Key key; + private TokenProvider tokenProvider; + + @BeforeEach + public void setup() { + tokenProvider = new TokenProvider(new JHipsterProperties()); + key = + Keys.hmacShaKeyFor( + Decoders.BASE64.decode("fd54a45s65fds737b9aafcb3412e07ed99b267f33413274720ddbb7f6c5e64e9f14075f2d7ed041592f0b7657baf8") + ); + + ReflectionTestUtils.setField(tokenProvider, "key", key); + ReflectionTestUtils.setField(tokenProvider, "tokenValidityInMilliseconds", ONE_MINUTE); + } + + @Test + public void testReturnFalseWhenJWThasInvalidSignature() { + boolean isTokenValid = tokenProvider.validateToken(createTokenWithDifferentSignature()); + + assertThat(isTokenValid).isEqualTo(false); + } + + @Test + public void testReturnFalseWhenJWTisMalformed() { + Authentication authentication = createAuthentication(); + String token = tokenProvider.createToken(authentication, false); + String invalidToken = token.substring(1); + boolean isTokenValid = tokenProvider.validateToken(invalidToken); + + assertThat(isTokenValid).isEqualTo(false); + } + + @Test + public void testReturnFalseWhenJWTisExpired() { + ReflectionTestUtils.setField(tokenProvider, "tokenValidityInMilliseconds", -ONE_MINUTE); + + Authentication authentication = createAuthentication(); + String token = tokenProvider.createToken(authentication, false); + + boolean isTokenValid = tokenProvider.validateToken(token); + + assertThat(isTokenValid).isEqualTo(false); + } + + @Test + public void testReturnFalseWhenJWTisUnsupported() { + String unsupportedToken = createUnsupportedToken(); + + boolean isTokenValid = tokenProvider.validateToken(unsupportedToken); + + assertThat(isTokenValid).isEqualTo(false); + } + + @Test + public void testReturnFalseWhenJWTisInvalid() { + boolean isTokenValid = tokenProvider.validateToken(""); + + assertThat(isTokenValid).isEqualTo(false); + } + + private Authentication createAuthentication() { + Collection<GrantedAuthority> authorities = new ArrayList<>(); + authorities.add(new SimpleGrantedAuthority(AuthoritiesConstants.ANONYMOUS)); + return new UsernamePasswordAuthenticationToken("anonymous", "anonymous", authorities); + } + + private String createUnsupportedToken() { + return Jwts.builder().setPayload("payload").signWith(key, SignatureAlgorithm.HS512).compact(); + } + + private String createTokenWithDifferentSignature() { + Key otherKey = Keys.hmacShaKeyFor( + Decoders.BASE64.decode("Xfd54a45s65fds737b9aafcb3412e07ed99b267f33413274720ddbb7f6c5e64e9f14075f2d7ed041592f0b7657baf8") + ); + + return Jwts + .builder() + .setSubject("anonymous") + .signWith(otherKey, SignatureAlgorithm.HS512) + .setExpiration(new Date(new Date().getTime() + ONE_MINUTE)) + .compact(); + } +} diff --git a/borestop/src/test/java/com/ippon/borestop/service/AuditEventServiceIT.java b/borestop/src/test/java/com/ippon/borestop/service/AuditEventServiceIT.java new file mode 100644 index 00000000..984cd63b --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/service/AuditEventServiceIT.java @@ -0,0 +1,75 @@ +package com.ippon.borestop.service; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.ippon.borestop.BorestopApp; +import com.ippon.borestop.domain.PersistentAuditEvent; +import com.ippon.borestop.repository.PersistenceAuditEventRepository; +import io.github.jhipster.config.JHipsterProperties; +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.transaction.annotation.Transactional; + +/** + * Integration tests for {@link AuditEventService}. + */ +@SpringBootTest(classes = BorestopApp.class) +@Transactional +public class AuditEventServiceIT { + @Autowired + private AuditEventService auditEventService; + + @Autowired + private PersistenceAuditEventRepository persistenceAuditEventRepository; + + @Autowired + private JHipsterProperties jHipsterProperties; + + private PersistentAuditEvent auditEventOld; + + private PersistentAuditEvent auditEventWithinRetention; + + private PersistentAuditEvent auditEventNew; + + @BeforeEach + public void init() { + auditEventOld = new PersistentAuditEvent(); + auditEventOld.setAuditEventDate(Instant.now().minus(jHipsterProperties.getAuditEvents().getRetentionPeriod() + 1, ChronoUnit.DAYS)); + auditEventOld.setPrincipal("test-user-old"); + auditEventOld.setAuditEventType("test-type"); + + auditEventWithinRetention = new PersistentAuditEvent(); + auditEventWithinRetention.setAuditEventDate( + Instant.now().minus(jHipsterProperties.getAuditEvents().getRetentionPeriod() - 1, ChronoUnit.DAYS) + ); + auditEventWithinRetention.setPrincipal("test-user-retention"); + auditEventWithinRetention.setAuditEventType("test-type"); + + auditEventNew = new PersistentAuditEvent(); + auditEventNew.setAuditEventDate(Instant.now()); + auditEventNew.setPrincipal("test-user-new"); + auditEventNew.setAuditEventType("test-type"); + } + + @Test + @Transactional + public void verifyOldAuditEventsAreDeleted() { + persistenceAuditEventRepository.deleteAll(); + persistenceAuditEventRepository.save(auditEventOld); + persistenceAuditEventRepository.save(auditEventWithinRetention); + persistenceAuditEventRepository.save(auditEventNew); + + persistenceAuditEventRepository.flush(); + auditEventService.removeOldAuditEvents(); + persistenceAuditEventRepository.flush(); + + assertThat(persistenceAuditEventRepository.findAll().size()).isEqualTo(2); + assertThat(persistenceAuditEventRepository.findByPrincipal("test-user-old")).isEmpty(); + assertThat(persistenceAuditEventRepository.findByPrincipal("test-user-retention")).isNotEmpty(); + assertThat(persistenceAuditEventRepository.findByPrincipal("test-user-new")).isNotEmpty(); + } +} diff --git a/borestop/src/test/java/com/ippon/borestop/service/MailServiceIT.java b/borestop/src/test/java/com/ippon/borestop/service/MailServiceIT.java new file mode 100644 index 00000000..8e9a8619 --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/service/MailServiceIT.java @@ -0,0 +1,244 @@ +package com.ippon.borestop.service; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; + +import com.ippon.borestop.BorestopApp; +import com.ippon.borestop.config.Constants; +import com.ippon.borestop.domain.User; +import io.github.jhipster.config.JHipsterProperties; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStreamReader; +import java.net.URI; +import java.net.URL; +import java.nio.charset.Charset; +import java.util.Properties; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import javax.mail.Multipart; +import javax.mail.internet.MimeBodyPart; +import javax.mail.internet.MimeMessage; +import javax.mail.internet.MimeMultipart; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.MockitoAnnotations; +import org.mockito.Spy; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.MessageSource; +import org.springframework.mail.MailSendException; +import org.springframework.mail.javamail.JavaMailSenderImpl; +import org.thymeleaf.spring5.SpringTemplateEngine; + +/** + * Integration tests for {@link MailService}. + */ +@SpringBootTest(classes = BorestopApp.class) +public class MailServiceIT { + private static final String[] languages = { + "en" + // jhipster-needle-i18n-language-constant - JHipster will add/remove languages in this array + }; + private static final Pattern PATTERN_LOCALE_3 = Pattern.compile("([a-z]{2})-([a-zA-Z]{4})-([a-z]{2})"); + private static final Pattern PATTERN_LOCALE_2 = Pattern.compile("([a-z]{2})-([a-z]{2})"); + + @Autowired + private JHipsterProperties jHipsterProperties; + + @Autowired + private MessageSource messageSource; + + @Autowired + private SpringTemplateEngine templateEngine; + + @Spy + private JavaMailSenderImpl javaMailSender; + + @Captor + private ArgumentCaptor<MimeMessage> messageCaptor; + + private MailService mailService; + + @BeforeEach + public void setup() { + MockitoAnnotations.initMocks(this); + doNothing().when(javaMailSender).send(any(MimeMessage.class)); + mailService = new MailService(jHipsterProperties, javaMailSender, messageSource, templateEngine); + } + + @Test + public void testSendEmail() throws Exception { + mailService.sendEmail("john.doe@example.com", "testSubject", "testContent", false, false); + verify(javaMailSender).send(messageCaptor.capture()); + MimeMessage message = messageCaptor.getValue(); + assertThat(message.getSubject()).isEqualTo("testSubject"); + assertThat(message.getAllRecipients()[0].toString()).isEqualTo("john.doe@example.com"); + assertThat(message.getFrom()[0].toString()).isEqualTo(jHipsterProperties.getMail().getFrom()); + assertThat(message.getContent()).isInstanceOf(String.class); + assertThat(message.getContent().toString()).isEqualTo("testContent"); + assertThat(message.getDataHandler().getContentType()).isEqualTo("text/plain; charset=UTF-8"); + } + + @Test + public void testSendHtmlEmail() throws Exception { + mailService.sendEmail("john.doe@example.com", "testSubject", "testContent", false, true); + verify(javaMailSender).send(messageCaptor.capture()); + MimeMessage message = messageCaptor.getValue(); + assertThat(message.getSubject()).isEqualTo("testSubject"); + assertThat(message.getAllRecipients()[0].toString()).isEqualTo("john.doe@example.com"); + assertThat(message.getFrom()[0].toString()).isEqualTo(jHipsterProperties.getMail().getFrom()); + assertThat(message.getContent()).isInstanceOf(String.class); + assertThat(message.getContent().toString()).isEqualTo("testContent"); + assertThat(message.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8"); + } + + @Test + public void testSendMultipartEmail() throws Exception { + mailService.sendEmail("john.doe@example.com", "testSubject", "testContent", true, false); + verify(javaMailSender).send(messageCaptor.capture()); + MimeMessage message = messageCaptor.getValue(); + MimeMultipart mp = (MimeMultipart) message.getContent(); + MimeBodyPart part = (MimeBodyPart) ((MimeMultipart) mp.getBodyPart(0).getContent()).getBodyPart(0); + ByteArrayOutputStream aos = new ByteArrayOutputStream(); + part.writeTo(aos); + assertThat(message.getSubject()).isEqualTo("testSubject"); + assertThat(message.getAllRecipients()[0].toString()).isEqualTo("john.doe@example.com"); + assertThat(message.getFrom()[0].toString()).isEqualTo(jHipsterProperties.getMail().getFrom()); + assertThat(message.getContent()).isInstanceOf(Multipart.class); + assertThat(aos.toString()).isEqualTo("\r\ntestContent"); + assertThat(part.getDataHandler().getContentType()).isEqualTo("text/plain; charset=UTF-8"); + } + + @Test + public void testSendMultipartHtmlEmail() throws Exception { + mailService.sendEmail("john.doe@example.com", "testSubject", "testContent", true, true); + verify(javaMailSender).send(messageCaptor.capture()); + MimeMessage message = messageCaptor.getValue(); + MimeMultipart mp = (MimeMultipart) message.getContent(); + MimeBodyPart part = (MimeBodyPart) ((MimeMultipart) mp.getBodyPart(0).getContent()).getBodyPart(0); + ByteArrayOutputStream aos = new ByteArrayOutputStream(); + part.writeTo(aos); + assertThat(message.getSubject()).isEqualTo("testSubject"); + assertThat(message.getAllRecipients()[0].toString()).isEqualTo("john.doe@example.com"); + assertThat(message.getFrom()[0].toString()).isEqualTo(jHipsterProperties.getMail().getFrom()); + assertThat(message.getContent()).isInstanceOf(Multipart.class); + assertThat(aos.toString()).isEqualTo("\r\ntestContent"); + assertThat(part.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8"); + } + + @Test + public void testSendEmailFromTemplate() throws Exception { + User user = new User(); + user.setLogin("john"); + user.setEmail("john.doe@example.com"); + user.setLangKey("en"); + mailService.sendEmailFromTemplate(user, "mail/testEmail", "email.test.title"); + verify(javaMailSender).send(messageCaptor.capture()); + MimeMessage message = messageCaptor.getValue(); + assertThat(message.getSubject()).isEqualTo("test title"); + assertThat(message.getAllRecipients()[0].toString()).isEqualTo(user.getEmail()); + assertThat(message.getFrom()[0].toString()).isEqualTo(jHipsterProperties.getMail().getFrom()); + assertThat(message.getContent().toString()).isEqualToNormalizingNewlines("<html>test title, http://127.0.0.1:8080, john</html>\n"); + assertThat(message.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8"); + } + + @Test + public void testSendActivationEmail() throws Exception { + User user = new User(); + user.setLangKey(Constants.DEFAULT_LANGUAGE); + user.setLogin("john"); + user.setEmail("john.doe@example.com"); + mailService.sendActivationEmail(user); + verify(javaMailSender).send(messageCaptor.capture()); + MimeMessage message = messageCaptor.getValue(); + assertThat(message.getAllRecipients()[0].toString()).isEqualTo(user.getEmail()); + assertThat(message.getFrom()[0].toString()).isEqualTo(jHipsterProperties.getMail().getFrom()); + assertThat(message.getContent().toString()).isNotEmpty(); + assertThat(message.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8"); + } + + @Test + public void testCreationEmail() throws Exception { + User user = new User(); + user.setLangKey(Constants.DEFAULT_LANGUAGE); + user.setLogin("john"); + user.setEmail("john.doe@example.com"); + mailService.sendCreationEmail(user); + verify(javaMailSender).send(messageCaptor.capture()); + MimeMessage message = messageCaptor.getValue(); + assertThat(message.getAllRecipients()[0].toString()).isEqualTo(user.getEmail()); + assertThat(message.getFrom()[0].toString()).isEqualTo(jHipsterProperties.getMail().getFrom()); + assertThat(message.getContent().toString()).isNotEmpty(); + assertThat(message.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8"); + } + + @Test + public void testSendPasswordResetMail() throws Exception { + User user = new User(); + user.setLangKey(Constants.DEFAULT_LANGUAGE); + user.setLogin("john"); + user.setEmail("john.doe@example.com"); + mailService.sendPasswordResetMail(user); + verify(javaMailSender).send(messageCaptor.capture()); + MimeMessage message = messageCaptor.getValue(); + assertThat(message.getAllRecipients()[0].toString()).isEqualTo(user.getEmail()); + assertThat(message.getFrom()[0].toString()).isEqualTo(jHipsterProperties.getMail().getFrom()); + assertThat(message.getContent().toString()).isNotEmpty(); + assertThat(message.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8"); + } + + @Test + public void testSendEmailWithException() { + doThrow(MailSendException.class).when(javaMailSender).send(any(MimeMessage.class)); + try { + mailService.sendEmail("john.doe@example.com", "testSubject", "testContent", false, false); + } catch (Exception e) { + fail("Exception shouldn't have been thrown"); + } + } + + @Test + public void testSendLocalizedEmailForAllSupportedLanguages() throws Exception { + User user = new User(); + user.setLogin("john"); + user.setEmail("john.doe@example.com"); + for (String langKey : languages) { + user.setLangKey(langKey); + mailService.sendEmailFromTemplate(user, "mail/testEmail", "email.test.title"); + verify(javaMailSender, atLeastOnce()).send(messageCaptor.capture()); + MimeMessage message = messageCaptor.getValue(); + + String propertyFilePath = "i18n/messages_" + getJavaLocale(langKey) + ".properties"; + URL resource = this.getClass().getClassLoader().getResource(propertyFilePath); + File file = new File(new URI(resource.getFile()).getPath()); + Properties properties = new Properties(); + properties.load(new InputStreamReader(new FileInputStream(file), Charset.forName("UTF-8"))); + + String emailTitle = (String) properties.get("email.test.title"); + assertThat(message.getSubject()).isEqualTo(emailTitle); + assertThat(message.getContent().toString()) + .isEqualToNormalizingNewlines("<html>" + emailTitle + ", http://127.0.0.1:8080, john</html>\n"); + } + } + + /** + * Convert a lang key to the Java locale. + */ + private String getJavaLocale(String langKey) { + String javaLangKey = langKey; + Matcher matcher2 = PATTERN_LOCALE_2.matcher(langKey); + if (matcher2.matches()) { + javaLangKey = matcher2.group(1) + "_" + matcher2.group(2).toUpperCase(); + } + Matcher matcher3 = PATTERN_LOCALE_3.matcher(langKey); + if (matcher3.matches()) { + javaLangKey = matcher3.group(1) + "_" + matcher3.group(2) + "_" + matcher3.group(3).toUpperCase(); + } + return javaLangKey; + } +} diff --git a/borestop/src/test/java/com/ippon/borestop/service/UserServiceIT.java b/borestop/src/test/java/com/ippon/borestop/service/UserServiceIT.java new file mode 100644 index 00000000..8d5c83d3 --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/service/UserServiceIT.java @@ -0,0 +1,197 @@ +package com.ippon.borestop.service; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.when; + +import com.ippon.borestop.BorestopApp; +import com.ippon.borestop.config.Constants; +import com.ippon.borestop.domain.User; +import com.ippon.borestop.repository.UserRepository; +import com.ippon.borestop.service.dto.UserDTO; +import io.github.jhipster.security.RandomUtil; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; +import java.util.List; +import java.util.Optional; +import org.apache.commons.lang3.RandomStringUtils; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.auditing.AuditingHandler; +import org.springframework.data.auditing.DateTimeProvider; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.transaction.annotation.Transactional; + +/** + * Integration tests for {@link UserService}. + */ +@SpringBootTest(classes = BorestopApp.class) +@Transactional +public class UserServiceIT { + private static final String DEFAULT_LOGIN = "johndoe"; + + private static final String DEFAULT_EMAIL = "johndoe@localhost"; + + private static final String DEFAULT_FIRSTNAME = "john"; + + private static final String DEFAULT_LASTNAME = "doe"; + + private static final String DEFAULT_IMAGEURL = "http://placehold.it/50x50"; + + private static final String DEFAULT_LANGKEY = "dummy"; + + @Autowired + private UserRepository userRepository; + + @Autowired + private UserService userService; + + @Autowired + private AuditingHandler auditingHandler; + + @Mock + private DateTimeProvider dateTimeProvider; + + private User user; + + @BeforeEach + public void init() { + user = new User(); + user.setLogin(DEFAULT_LOGIN); + user.setPassword(RandomStringUtils.random(60)); + user.setActivated(true); + user.setEmail(DEFAULT_EMAIL); + user.setFirstName(DEFAULT_FIRSTNAME); + user.setLastName(DEFAULT_LASTNAME); + user.setImageUrl(DEFAULT_IMAGEURL); + user.setLangKey(DEFAULT_LANGKEY); + + when(dateTimeProvider.getNow()).thenReturn(Optional.of(LocalDateTime.now())); + auditingHandler.setDateTimeProvider(dateTimeProvider); + } + + @Test + @Transactional + public void assertThatUserMustExistToResetPassword() { + userRepository.saveAndFlush(user); + Optional<User> maybeUser = userService.requestPasswordReset("invalid.login@localhost"); + assertThat(maybeUser).isNotPresent(); + + maybeUser = userService.requestPasswordReset(user.getEmail()); + assertThat(maybeUser).isPresent(); + assertThat(maybeUser.orElse(null).getEmail()).isEqualTo(user.getEmail()); + assertThat(maybeUser.orElse(null).getResetDate()).isNotNull(); + assertThat(maybeUser.orElse(null).getResetKey()).isNotNull(); + } + + @Test + @Transactional + public void assertThatOnlyActivatedUserCanRequestPasswordReset() { + user.setActivated(false); + userRepository.saveAndFlush(user); + + Optional<User> maybeUser = userService.requestPasswordReset(user.getLogin()); + assertThat(maybeUser).isNotPresent(); + userRepository.delete(user); + } + + @Test + @Transactional + public void assertThatResetKeyMustNotBeOlderThan24Hours() { + Instant daysAgo = Instant.now().minus(25, ChronoUnit.HOURS); + String resetKey = RandomUtil.generateResetKey(); + user.setActivated(true); + user.setResetDate(daysAgo); + user.setResetKey(resetKey); + userRepository.saveAndFlush(user); + + Optional<User> maybeUser = userService.completePasswordReset("johndoe2", user.getResetKey()); + assertThat(maybeUser).isNotPresent(); + userRepository.delete(user); + } + + @Test + @Transactional + public void assertThatResetKeyMustBeValid() { + Instant daysAgo = Instant.now().minus(25, ChronoUnit.HOURS); + user.setActivated(true); + user.setResetDate(daysAgo); + user.setResetKey("1234"); + userRepository.saveAndFlush(user); + + Optional<User> maybeUser = userService.completePasswordReset("johndoe2", user.getResetKey()); + assertThat(maybeUser).isNotPresent(); + userRepository.delete(user); + } + + @Test + @Transactional + public void assertThatUserCanResetPassword() { + String oldPassword = user.getPassword(); + Instant daysAgo = Instant.now().minus(2, ChronoUnit.HOURS); + String resetKey = RandomUtil.generateResetKey(); + user.setActivated(true); + user.setResetDate(daysAgo); + user.setResetKey(resetKey); + userRepository.saveAndFlush(user); + + Optional<User> maybeUser = userService.completePasswordReset("johndoe2", user.getResetKey()); + assertThat(maybeUser).isPresent(); + assertThat(maybeUser.orElse(null).getResetDate()).isNull(); + assertThat(maybeUser.orElse(null).getResetKey()).isNull(); + assertThat(maybeUser.orElse(null).getPassword()).isNotEqualTo(oldPassword); + + userRepository.delete(user); + } + + @Test + @Transactional + public void assertThatNotActivatedUsersWithNotNullActivationKeyCreatedBefore3DaysAreDeleted() { + Instant now = Instant.now(); + when(dateTimeProvider.getNow()).thenReturn(Optional.of(now.minus(4, ChronoUnit.DAYS))); + user.setActivated(false); + user.setActivationKey(RandomStringUtils.random(20)); + User dbUser = userRepository.saveAndFlush(user); + dbUser.setCreatedDate(now.minus(4, ChronoUnit.DAYS)); + userRepository.saveAndFlush(user); + Instant threeDaysAgo = now.minus(3, ChronoUnit.DAYS); + List<User> users = userRepository.findAllByActivatedIsFalseAndActivationKeyIsNotNullAndCreatedDateBefore(threeDaysAgo); + assertThat(users).isNotEmpty(); + userService.removeNotActivatedUsers(); + users = userRepository.findAllByActivatedIsFalseAndActivationKeyIsNotNullAndCreatedDateBefore(threeDaysAgo); + assertThat(users).isEmpty(); + } + + @Test + @Transactional + public void assertThatNotActivatedUsersWithNullActivationKeyCreatedBefore3DaysAreNotDeleted() { + Instant now = Instant.now(); + when(dateTimeProvider.getNow()).thenReturn(Optional.of(now.minus(4, ChronoUnit.DAYS))); + user.setActivated(false); + User dbUser = userRepository.saveAndFlush(user); + dbUser.setCreatedDate(now.minus(4, ChronoUnit.DAYS)); + userRepository.saveAndFlush(user); + Instant threeDaysAgo = now.minus(3, ChronoUnit.DAYS); + List<User> users = userRepository.findAllByActivatedIsFalseAndActivationKeyIsNotNullAndCreatedDateBefore(threeDaysAgo); + assertThat(users).isEmpty(); + userService.removeNotActivatedUsers(); + Optional<User> maybeDbUser = userRepository.findById(dbUser.getId()); + assertThat(maybeDbUser).contains(dbUser); + } + + @Test + @Transactional + public void assertThatAnonymousUserIsNotGet() { + user.setLogin(Constants.ANONYMOUS_USER); + if (!userRepository.findOneByLogin(Constants.ANONYMOUS_USER).isPresent()) { + userRepository.saveAndFlush(user); + } + final PageRequest pageable = PageRequest.of(0, (int) userRepository.count()); + final Page<UserDTO> allManagedUsers = userService.getAllManagedUsers(pageable); + assertThat(allManagedUsers.getContent().stream().noneMatch(user -> Constants.ANONYMOUS_USER.equals(user.getLogin()))).isTrue(); + } +} diff --git a/borestop/src/test/java/com/ippon/borestop/service/mapper/UserMapperTest.java b/borestop/src/test/java/com/ippon/borestop/service/mapper/UserMapperTest.java new file mode 100644 index 00000000..172ef840 --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/service/mapper/UserMapperTest.java @@ -0,0 +1,134 @@ +package com.ippon.borestop.service.mapper; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.ippon.borestop.domain.User; +import com.ippon.borestop.service.dto.UserDTO; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import org.apache.commons.lang3.RandomStringUtils; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +/** + * Unit tests for {@link UserMapper}. + */ +public class UserMapperTest { + private static final String DEFAULT_LOGIN = "johndoe"; + private static final Long DEFAULT_ID = 1L; + + private UserMapper userMapper; + private User user; + private UserDTO userDto; + + @BeforeEach + public void init() { + userMapper = new UserMapper(); + user = new User(); + user.setLogin(DEFAULT_LOGIN); + user.setPassword(RandomStringUtils.random(60)); + user.setActivated(true); + user.setEmail("johndoe@localhost"); + user.setFirstName("john"); + user.setLastName("doe"); + user.setImageUrl("image_url"); + user.setLangKey("en"); + + userDto = new UserDTO(user); + } + + @Test + public void usersToUserDTOsShouldMapOnlyNonNullUsers() { + List<User> users = new ArrayList<>(); + users.add(user); + users.add(null); + + List<UserDTO> userDTOS = userMapper.usersToUserDTOs(users); + + assertThat(userDTOS).isNotEmpty(); + assertThat(userDTOS).size().isEqualTo(1); + } + + @Test + public void userDTOsToUsersShouldMapOnlyNonNullUsers() { + List<UserDTO> usersDto = new ArrayList<>(); + usersDto.add(userDto); + usersDto.add(null); + + List<User> users = userMapper.userDTOsToUsers(usersDto); + + assertThat(users).isNotEmpty(); + assertThat(users).size().isEqualTo(1); + } + + @Test + public void userDTOsToUsersWithAuthoritiesStringShouldMapToUsersWithAuthoritiesDomain() { + Set<String> authoritiesAsString = new HashSet<>(); + authoritiesAsString.add("ADMIN"); + userDto.setAuthorities(authoritiesAsString); + + List<UserDTO> usersDto = new ArrayList<>(); + usersDto.add(userDto); + + List<User> users = userMapper.userDTOsToUsers(usersDto); + + assertThat(users).isNotEmpty(); + assertThat(users).size().isEqualTo(1); + assertThat(users.get(0).getAuthorities()).isNotNull(); + assertThat(users.get(0).getAuthorities()).isNotEmpty(); + assertThat(users.get(0).getAuthorities().iterator().next().getName()).isEqualTo("ADMIN"); + } + + @Test + public void userDTOsToUsersMapWithNullAuthoritiesStringShouldReturnUserWithEmptyAuthorities() { + userDto.setAuthorities(null); + + List<UserDTO> usersDto = new ArrayList<>(); + usersDto.add(userDto); + + List<User> users = userMapper.userDTOsToUsers(usersDto); + + assertThat(users).isNotEmpty(); + assertThat(users).size().isEqualTo(1); + assertThat(users.get(0).getAuthorities()).isNotNull(); + assertThat(users.get(0).getAuthorities()).isEmpty(); + } + + @Test + public void userDTOToUserMapWithAuthoritiesStringShouldReturnUserWithAuthorities() { + Set<String> authoritiesAsString = new HashSet<>(); + authoritiesAsString.add("ADMIN"); + userDto.setAuthorities(authoritiesAsString); + + User user = userMapper.userDTOToUser(userDto); + + assertThat(user).isNotNull(); + assertThat(user.getAuthorities()).isNotNull(); + assertThat(user.getAuthorities()).isNotEmpty(); + assertThat(user.getAuthorities().iterator().next().getName()).isEqualTo("ADMIN"); + } + + @Test + public void userDTOToUserMapWithNullAuthoritiesStringShouldReturnUserWithEmptyAuthorities() { + userDto.setAuthorities(null); + + User user = userMapper.userDTOToUser(userDto); + + assertThat(user).isNotNull(); + assertThat(user.getAuthorities()).isNotNull(); + assertThat(user.getAuthorities()).isEmpty(); + } + + @Test + public void userDTOToUserMapWithNullUserShouldReturnNull() { + assertThat(userMapper.userDTOToUser(null)).isNull(); + } + + @Test + public void testUserFromId() { + assertThat(userMapper.userFromId(DEFAULT_ID).getId()).isEqualTo(DEFAULT_ID); + assertThat(userMapper.userFromId(null)).isNull(); + } +} diff --git a/borestop/src/test/java/com/ippon/borestop/web/rest/AccountResourceIT.java b/borestop/src/test/java/com/ippon/borestop/web/rest/AccountResourceIT.java new file mode 100644 index 00000000..e4cab98c --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/web/rest/AccountResourceIT.java @@ -0,0 +1,755 @@ +package com.ippon.borestop.web.rest; + +import static com.ippon.borestop.web.rest.AccountResourceIT.TEST_USER_LOGIN; +import static org.assertj.core.api.Assertions.assertThat; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +import com.ippon.borestop.BorestopApp; +import com.ippon.borestop.config.Constants; +import com.ippon.borestop.domain.User; +import com.ippon.borestop.repository.AuthorityRepository; +import com.ippon.borestop.repository.UserRepository; +import com.ippon.borestop.security.AuthoritiesConstants; +import com.ippon.borestop.service.UserService; +import com.ippon.borestop.service.dto.PasswordChangeDTO; +import com.ippon.borestop.service.dto.UserDTO; +import com.ippon.borestop.web.rest.vm.KeyAndPasswordVM; +import com.ippon.borestop.web.rest.vm.ManagedUserVM; +import java.time.Instant; +import java.util.*; +import org.apache.commons.lang3.RandomStringUtils; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.transaction.annotation.Transactional; + +/** + * Integration tests for the {@link AccountResource} REST controller. + */ +@AutoConfigureMockMvc +@WithMockUser(value = TEST_USER_LOGIN) +@SpringBootTest(classes = BorestopApp.class) +public class AccountResourceIT { + static final String TEST_USER_LOGIN = "test"; + + @Autowired + private UserRepository userRepository; + + @Autowired + private AuthorityRepository authorityRepository; + + @Autowired + private UserService userService; + + @Autowired + private PasswordEncoder passwordEncoder; + + @Autowired + private MockMvc restAccountMockMvc; + + @Test + @WithUnauthenticatedMockUser + public void testNonAuthenticatedUser() throws Exception { + restAccountMockMvc + .perform(get("/api/authenticate").accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().string("")); + } + + @Test + public void testAuthenticatedUser() throws Exception { + restAccountMockMvc + .perform( + get("/api/authenticate") + .with( + request -> { + request.setRemoteUser(TEST_USER_LOGIN); + return request; + } + ) + .accept(MediaType.APPLICATION_JSON) + ) + .andExpect(status().isOk()) + .andExpect(content().string(TEST_USER_LOGIN)); + } + + @Test + public void testGetExistingAccount() throws Exception { + Set<String> authorities = new HashSet<>(); + authorities.add(AuthoritiesConstants.ADMIN); + + UserDTO user = new UserDTO(); + user.setLogin(TEST_USER_LOGIN); + user.setFirstName("john"); + user.setLastName("doe"); + user.setEmail("john.doe@jhipster.com"); + user.setImageUrl("http://placehold.it/50x50"); + user.setLangKey("en"); + user.setAuthorities(authorities); + userService.createUser(user); + + restAccountMockMvc + .perform(get("/api/account").accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.login").value(TEST_USER_LOGIN)) + .andExpect(jsonPath("$.firstName").value("john")) + .andExpect(jsonPath("$.lastName").value("doe")) + .andExpect(jsonPath("$.email").value("john.doe@jhipster.com")) + .andExpect(jsonPath("$.imageUrl").value("http://placehold.it/50x50")) + .andExpect(jsonPath("$.langKey").value("en")) + .andExpect(jsonPath("$.authorities").value(AuthoritiesConstants.ADMIN)); + } + + @Test + public void testGetUnknownAccount() throws Exception { + restAccountMockMvc.perform(get("/api/account").accept(MediaType.APPLICATION_PROBLEM_JSON)).andExpect(status().isInternalServerError()); + } + + @Test + @Transactional + public void testRegisterValid() throws Exception { + ManagedUserVM validUser = new ManagedUserVM(); + validUser.setLogin("test-register-valid"); + validUser.setPassword("password"); + validUser.setFirstName("Alice"); + validUser.setLastName("Test"); + validUser.setEmail("test-register-valid@example.com"); + validUser.setImageUrl("http://placehold.it/50x50"); + validUser.setLangKey(Constants.DEFAULT_LANGUAGE); + validUser.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + assertThat(userRepository.findOneByLogin("test-register-valid").isPresent()).isFalse(); + + restAccountMockMvc + .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(validUser))) + .andExpect(status().isCreated()); + + assertThat(userRepository.findOneByLogin("test-register-valid").isPresent()).isTrue(); + } + + @Test + @Transactional + public void testRegisterInvalidLogin() throws Exception { + ManagedUserVM invalidUser = new ManagedUserVM(); + invalidUser.setLogin("funky-log(n"); // <-- invalid + invalidUser.setPassword("password"); + invalidUser.setFirstName("Funky"); + invalidUser.setLastName("One"); + invalidUser.setEmail("funky@example.com"); + invalidUser.setActivated(true); + invalidUser.setImageUrl("http://placehold.it/50x50"); + invalidUser.setLangKey(Constants.DEFAULT_LANGUAGE); + invalidUser.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + restAccountMockMvc + .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(invalidUser))) + .andExpect(status().isBadRequest()); + + Optional<User> user = userRepository.findOneByEmailIgnoreCase("funky@example.com"); + assertThat(user.isPresent()).isFalse(); + } + + @Test + @Transactional + public void testRegisterInvalidEmail() throws Exception { + ManagedUserVM invalidUser = new ManagedUserVM(); + invalidUser.setLogin("bob"); + invalidUser.setPassword("password"); + invalidUser.setFirstName("Bob"); + invalidUser.setLastName("Green"); + invalidUser.setEmail("invalid"); // <-- invalid + invalidUser.setActivated(true); + invalidUser.setImageUrl("http://placehold.it/50x50"); + invalidUser.setLangKey(Constants.DEFAULT_LANGUAGE); + invalidUser.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + restAccountMockMvc + .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(invalidUser))) + .andExpect(status().isBadRequest()); + + Optional<User> user = userRepository.findOneByLogin("bob"); + assertThat(user.isPresent()).isFalse(); + } + + @Test + @Transactional + public void testRegisterInvalidPassword() throws Exception { + ManagedUserVM invalidUser = new ManagedUserVM(); + invalidUser.setLogin("bob"); + invalidUser.setPassword("123"); // password with only 3 digits + invalidUser.setFirstName("Bob"); + invalidUser.setLastName("Green"); + invalidUser.setEmail("bob@example.com"); + invalidUser.setActivated(true); + invalidUser.setImageUrl("http://placehold.it/50x50"); + invalidUser.setLangKey(Constants.DEFAULT_LANGUAGE); + invalidUser.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + restAccountMockMvc + .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(invalidUser))) + .andExpect(status().isBadRequest()); + + Optional<User> user = userRepository.findOneByLogin("bob"); + assertThat(user.isPresent()).isFalse(); + } + + @Test + @Transactional + public void testRegisterNullPassword() throws Exception { + ManagedUserVM invalidUser = new ManagedUserVM(); + invalidUser.setLogin("bob"); + invalidUser.setPassword(null); // invalid null password + invalidUser.setFirstName("Bob"); + invalidUser.setLastName("Green"); + invalidUser.setEmail("bob@example.com"); + invalidUser.setActivated(true); + invalidUser.setImageUrl("http://placehold.it/50x50"); + invalidUser.setLangKey(Constants.DEFAULT_LANGUAGE); + invalidUser.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + restAccountMockMvc + .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(invalidUser))) + .andExpect(status().isBadRequest()); + + Optional<User> user = userRepository.findOneByLogin("bob"); + assertThat(user.isPresent()).isFalse(); + } + + @Test + @Transactional + public void testRegisterDuplicateLogin() throws Exception { + // First registration + ManagedUserVM firstUser = new ManagedUserVM(); + firstUser.setLogin("alice"); + firstUser.setPassword("password"); + firstUser.setFirstName("Alice"); + firstUser.setLastName("Something"); + firstUser.setEmail("alice@example.com"); + firstUser.setImageUrl("http://placehold.it/50x50"); + firstUser.setLangKey(Constants.DEFAULT_LANGUAGE); + firstUser.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + // Duplicate login, different email + ManagedUserVM secondUser = new ManagedUserVM(); + secondUser.setLogin(firstUser.getLogin()); + secondUser.setPassword(firstUser.getPassword()); + secondUser.setFirstName(firstUser.getFirstName()); + secondUser.setLastName(firstUser.getLastName()); + secondUser.setEmail("alice2@example.com"); + secondUser.setImageUrl(firstUser.getImageUrl()); + secondUser.setLangKey(firstUser.getLangKey()); + secondUser.setCreatedBy(firstUser.getCreatedBy()); + secondUser.setCreatedDate(firstUser.getCreatedDate()); + secondUser.setLastModifiedBy(firstUser.getLastModifiedBy()); + secondUser.setLastModifiedDate(firstUser.getLastModifiedDate()); + secondUser.setAuthorities(new HashSet<>(firstUser.getAuthorities())); + + // First user + restAccountMockMvc + .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(firstUser))) + .andExpect(status().isCreated()); + + // Second (non activated) user + restAccountMockMvc + .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(secondUser))) + .andExpect(status().isCreated()); + + Optional<User> testUser = userRepository.findOneByEmailIgnoreCase("alice2@example.com"); + assertThat(testUser.isPresent()).isTrue(); + testUser.get().setActivated(true); + userRepository.save(testUser.get()); + + // Second (already activated) user + restAccountMockMvc + .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(secondUser))) + .andExpect(status().is4xxClientError()); + } + + @Test + @Transactional + public void testRegisterDuplicateEmail() throws Exception { + // First user + ManagedUserVM firstUser = new ManagedUserVM(); + firstUser.setLogin("test-register-duplicate-email"); + firstUser.setPassword("password"); + firstUser.setFirstName("Alice"); + firstUser.setLastName("Test"); + firstUser.setEmail("test-register-duplicate-email@example.com"); + firstUser.setImageUrl("http://placehold.it/50x50"); + firstUser.setLangKey(Constants.DEFAULT_LANGUAGE); + firstUser.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + // Register first user + restAccountMockMvc + .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(firstUser))) + .andExpect(status().isCreated()); + + Optional<User> testUser1 = userRepository.findOneByLogin("test-register-duplicate-email"); + assertThat(testUser1.isPresent()).isTrue(); + + // Duplicate email, different login + ManagedUserVM secondUser = new ManagedUserVM(); + secondUser.setLogin("test-register-duplicate-email-2"); + secondUser.setPassword(firstUser.getPassword()); + secondUser.setFirstName(firstUser.getFirstName()); + secondUser.setLastName(firstUser.getLastName()); + secondUser.setEmail(firstUser.getEmail()); + secondUser.setImageUrl(firstUser.getImageUrl()); + secondUser.setLangKey(firstUser.getLangKey()); + secondUser.setAuthorities(new HashSet<>(firstUser.getAuthorities())); + + // Register second (non activated) user + restAccountMockMvc + .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(secondUser))) + .andExpect(status().isCreated()); + + Optional<User> testUser2 = userRepository.findOneByLogin("test-register-duplicate-email"); + assertThat(testUser2.isPresent()).isFalse(); + + Optional<User> testUser3 = userRepository.findOneByLogin("test-register-duplicate-email-2"); + assertThat(testUser3.isPresent()).isTrue(); + + // Duplicate email - with uppercase email address + ManagedUserVM userWithUpperCaseEmail = new ManagedUserVM(); + userWithUpperCaseEmail.setId(firstUser.getId()); + userWithUpperCaseEmail.setLogin("test-register-duplicate-email-3"); + userWithUpperCaseEmail.setPassword(firstUser.getPassword()); + userWithUpperCaseEmail.setFirstName(firstUser.getFirstName()); + userWithUpperCaseEmail.setLastName(firstUser.getLastName()); + userWithUpperCaseEmail.setEmail("TEST-register-duplicate-email@example.com"); + userWithUpperCaseEmail.setImageUrl(firstUser.getImageUrl()); + userWithUpperCaseEmail.setLangKey(firstUser.getLangKey()); + userWithUpperCaseEmail.setAuthorities(new HashSet<>(firstUser.getAuthorities())); + + // Register third (not activated) user + restAccountMockMvc + .perform( + post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(userWithUpperCaseEmail)) + ) + .andExpect(status().isCreated()); + + Optional<User> testUser4 = userRepository.findOneByLogin("test-register-duplicate-email-3"); + assertThat(testUser4.isPresent()).isTrue(); + assertThat(testUser4.get().getEmail()).isEqualTo("test-register-duplicate-email@example.com"); + + testUser4.get().setActivated(true); + userService.updateUser((new UserDTO(testUser4.get()))); + + // Register 4th (already activated) user + restAccountMockMvc + .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(secondUser))) + .andExpect(status().is4xxClientError()); + } + + @Test + @Transactional + public void testRegisterAdminIsIgnored() throws Exception { + ManagedUserVM validUser = new ManagedUserVM(); + validUser.setLogin("badguy"); + validUser.setPassword("password"); + validUser.setFirstName("Bad"); + validUser.setLastName("Guy"); + validUser.setEmail("badguy@example.com"); + validUser.setActivated(true); + validUser.setImageUrl("http://placehold.it/50x50"); + validUser.setLangKey(Constants.DEFAULT_LANGUAGE); + validUser.setAuthorities(Collections.singleton(AuthoritiesConstants.ADMIN)); + + restAccountMockMvc + .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(validUser))) + .andExpect(status().isCreated()); + + Optional<User> userDup = userRepository.findOneWithAuthoritiesByLogin("badguy"); + assertThat(userDup.isPresent()).isTrue(); + assertThat(userDup.get().getAuthorities()).hasSize(1).containsExactly(authorityRepository.findById(AuthoritiesConstants.USER).get()); + } + + @Test + @Transactional + public void testActivateAccount() throws Exception { + final String activationKey = "some activation key"; + User user = new User(); + user.setLogin("activate-account"); + user.setEmail("activate-account@example.com"); + user.setPassword(RandomStringUtils.random(60)); + user.setActivated(false); + user.setActivationKey(activationKey); + + userRepository.saveAndFlush(user); + + restAccountMockMvc.perform(get("/api/activate?key={activationKey}", activationKey)).andExpect(status().isOk()); + + user = userRepository.findOneByLogin(user.getLogin()).orElse(null); + assertThat(user.getActivated()).isTrue(); + } + + @Test + @Transactional + public void testActivateAccountWithWrongKey() throws Exception { + restAccountMockMvc.perform(get("/api/activate?key=wrongActivationKey")).andExpect(status().isInternalServerError()); + } + + @Test + @Transactional + @WithMockUser("save-account") + public void testSaveAccount() throws Exception { + User user = new User(); + user.setLogin("save-account"); + user.setEmail("save-account@example.com"); + user.setPassword(RandomStringUtils.random(60)); + user.setActivated(true); + userRepository.saveAndFlush(user); + + UserDTO userDTO = new UserDTO(); + userDTO.setLogin("not-used"); + userDTO.setFirstName("firstname"); + userDTO.setLastName("lastname"); + userDTO.setEmail("save-account@example.com"); + userDTO.setActivated(false); + userDTO.setImageUrl("http://placehold.it/50x50"); + userDTO.setLangKey(Constants.DEFAULT_LANGUAGE); + userDTO.setAuthorities(Collections.singleton(AuthoritiesConstants.ADMIN)); + + restAccountMockMvc + .perform(post("/api/account").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(userDTO))) + .andExpect(status().isOk()); + + User updatedUser = userRepository.findOneWithAuthoritiesByLogin(user.getLogin()).orElse(null); + assertThat(updatedUser.getFirstName()).isEqualTo(userDTO.getFirstName()); + assertThat(updatedUser.getLastName()).isEqualTo(userDTO.getLastName()); + assertThat(updatedUser.getEmail()).isEqualTo(userDTO.getEmail()); + assertThat(updatedUser.getLangKey()).isEqualTo(userDTO.getLangKey()); + assertThat(updatedUser.getPassword()).isEqualTo(user.getPassword()); + assertThat(updatedUser.getImageUrl()).isEqualTo(userDTO.getImageUrl()); + assertThat(updatedUser.getActivated()).isEqualTo(true); + assertThat(updatedUser.getAuthorities()).isEmpty(); + } + + @Test + @Transactional + @WithMockUser("save-invalid-email") + public void testSaveInvalidEmail() throws Exception { + User user = new User(); + user.setLogin("save-invalid-email"); + user.setEmail("save-invalid-email@example.com"); + user.setPassword(RandomStringUtils.random(60)); + user.setActivated(true); + + userRepository.saveAndFlush(user); + + UserDTO userDTO = new UserDTO(); + userDTO.setLogin("not-used"); + userDTO.setFirstName("firstname"); + userDTO.setLastName("lastname"); + userDTO.setEmail("invalid email"); + userDTO.setActivated(false); + userDTO.setImageUrl("http://placehold.it/50x50"); + userDTO.setLangKey(Constants.DEFAULT_LANGUAGE); + userDTO.setAuthorities(Collections.singleton(AuthoritiesConstants.ADMIN)); + + restAccountMockMvc + .perform(post("/api/account").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(userDTO))) + .andExpect(status().isBadRequest()); + + assertThat(userRepository.findOneByEmailIgnoreCase("invalid email")).isNotPresent(); + } + + @Test + @Transactional + @WithMockUser("save-existing-email") + public void testSaveExistingEmail() throws Exception { + User user = new User(); + user.setLogin("save-existing-email"); + user.setEmail("save-existing-email@example.com"); + user.setPassword(RandomStringUtils.random(60)); + user.setActivated(true); + userRepository.saveAndFlush(user); + + User anotherUser = new User(); + anotherUser.setLogin("save-existing-email2"); + anotherUser.setEmail("save-existing-email2@example.com"); + anotherUser.setPassword(RandomStringUtils.random(60)); + anotherUser.setActivated(true); + + userRepository.saveAndFlush(anotherUser); + + UserDTO userDTO = new UserDTO(); + userDTO.setLogin("not-used"); + userDTO.setFirstName("firstname"); + userDTO.setLastName("lastname"); + userDTO.setEmail("save-existing-email2@example.com"); + userDTO.setActivated(false); + userDTO.setImageUrl("http://placehold.it/50x50"); + userDTO.setLangKey(Constants.DEFAULT_LANGUAGE); + userDTO.setAuthorities(Collections.singleton(AuthoritiesConstants.ADMIN)); + + restAccountMockMvc + .perform(post("/api/account").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(userDTO))) + .andExpect(status().isBadRequest()); + + User updatedUser = userRepository.findOneByLogin("save-existing-email").orElse(null); + assertThat(updatedUser.getEmail()).isEqualTo("save-existing-email@example.com"); + } + + @Test + @Transactional + @WithMockUser("save-existing-email-and-login") + public void testSaveExistingEmailAndLogin() throws Exception { + User user = new User(); + user.setLogin("save-existing-email-and-login"); + user.setEmail("save-existing-email-and-login@example.com"); + user.setPassword(RandomStringUtils.random(60)); + user.setActivated(true); + userRepository.saveAndFlush(user); + + UserDTO userDTO = new UserDTO(); + userDTO.setLogin("not-used"); + userDTO.setFirstName("firstname"); + userDTO.setLastName("lastname"); + userDTO.setEmail("save-existing-email-and-login@example.com"); + userDTO.setActivated(false); + userDTO.setImageUrl("http://placehold.it/50x50"); + userDTO.setLangKey(Constants.DEFAULT_LANGUAGE); + userDTO.setAuthorities(Collections.singleton(AuthoritiesConstants.ADMIN)); + + restAccountMockMvc + .perform(post("/api/account").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(userDTO))) + .andExpect(status().isOk()); + + User updatedUser = userRepository.findOneByLogin("save-existing-email-and-login").orElse(null); + assertThat(updatedUser.getEmail()).isEqualTo("save-existing-email-and-login@example.com"); + } + + @Test + @Transactional + @WithMockUser("change-password-wrong-existing-password") + public void testChangePasswordWrongExistingPassword() throws Exception { + User user = new User(); + String currentPassword = RandomStringUtils.random(60); + user.setPassword(passwordEncoder.encode(currentPassword)); + user.setLogin("change-password-wrong-existing-password"); + user.setEmail("change-password-wrong-existing-password@example.com"); + userRepository.saveAndFlush(user); + + restAccountMockMvc + .perform( + post("/api/account/change-password") + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(new PasswordChangeDTO("1" + currentPassword, "new password"))) + ) + .andExpect(status().isBadRequest()); + + User updatedUser = userRepository.findOneByLogin("change-password-wrong-existing-password").orElse(null); + assertThat(passwordEncoder.matches("new password", updatedUser.getPassword())).isFalse(); + assertThat(passwordEncoder.matches(currentPassword, updatedUser.getPassword())).isTrue(); + } + + @Test + @Transactional + @WithMockUser("change-password") + public void testChangePassword() throws Exception { + User user = new User(); + String currentPassword = RandomStringUtils.random(60); + user.setPassword(passwordEncoder.encode(currentPassword)); + user.setLogin("change-password"); + user.setEmail("change-password@example.com"); + userRepository.saveAndFlush(user); + + restAccountMockMvc + .perform( + post("/api/account/change-password") + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(new PasswordChangeDTO(currentPassword, "new password"))) + ) + .andExpect(status().isOk()); + + User updatedUser = userRepository.findOneByLogin("change-password").orElse(null); + assertThat(passwordEncoder.matches("new password", updatedUser.getPassword())).isTrue(); + } + + @Test + @Transactional + @WithMockUser("change-password-too-small") + public void testChangePasswordTooSmall() throws Exception { + User user = new User(); + String currentPassword = RandomStringUtils.random(60); + user.setPassword(passwordEncoder.encode(currentPassword)); + user.setLogin("change-password-too-small"); + user.setEmail("change-password-too-small@example.com"); + userRepository.saveAndFlush(user); + + String newPassword = RandomStringUtils.random(ManagedUserVM.PASSWORD_MIN_LENGTH - 1); + + restAccountMockMvc + .perform( + post("/api/account/change-password") + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(new PasswordChangeDTO(currentPassword, newPassword))) + ) + .andExpect(status().isBadRequest()); + + User updatedUser = userRepository.findOneByLogin("change-password-too-small").orElse(null); + assertThat(updatedUser.getPassword()).isEqualTo(user.getPassword()); + } + + @Test + @Transactional + @WithMockUser("change-password-too-long") + public void testChangePasswordTooLong() throws Exception { + User user = new User(); + String currentPassword = RandomStringUtils.random(60); + user.setPassword(passwordEncoder.encode(currentPassword)); + user.setLogin("change-password-too-long"); + user.setEmail("change-password-too-long@example.com"); + userRepository.saveAndFlush(user); + + String newPassword = RandomStringUtils.random(ManagedUserVM.PASSWORD_MAX_LENGTH + 1); + + restAccountMockMvc + .perform( + post("/api/account/change-password") + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(new PasswordChangeDTO(currentPassword, newPassword))) + ) + .andExpect(status().isBadRequest()); + + User updatedUser = userRepository.findOneByLogin("change-password-too-long").orElse(null); + assertThat(updatedUser.getPassword()).isEqualTo(user.getPassword()); + } + + @Test + @Transactional + @WithMockUser("change-password-empty") + public void testChangePasswordEmpty() throws Exception { + User user = new User(); + String currentPassword = RandomStringUtils.random(60); + user.setPassword(passwordEncoder.encode(currentPassword)); + user.setLogin("change-password-empty"); + user.setEmail("change-password-empty@example.com"); + userRepository.saveAndFlush(user); + + restAccountMockMvc + .perform( + post("/api/account/change-password") + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(new PasswordChangeDTO(currentPassword, ""))) + ) + .andExpect(status().isBadRequest()); + + User updatedUser = userRepository.findOneByLogin("change-password-empty").orElse(null); + assertThat(updatedUser.getPassword()).isEqualTo(user.getPassword()); + } + + @Test + @Transactional + public void testRequestPasswordReset() throws Exception { + User user = new User(); + user.setPassword(RandomStringUtils.random(60)); + user.setActivated(true); + user.setLogin("password-reset"); + user.setEmail("password-reset@example.com"); + userRepository.saveAndFlush(user); + + restAccountMockMvc.perform(post("/api/account/reset-password/init").content("password-reset@example.com")).andExpect(status().isOk()); + } + + @Test + @Transactional + public void testRequestPasswordResetUpperCaseEmail() throws Exception { + User user = new User(); + user.setPassword(RandomStringUtils.random(60)); + user.setActivated(true); + user.setLogin("password-reset-upper-case"); + user.setEmail("password-reset-upper-case@example.com"); + userRepository.saveAndFlush(user); + + restAccountMockMvc + .perform(post("/api/account/reset-password/init").content("password-reset-upper-case@EXAMPLE.COM")) + .andExpect(status().isOk()); + } + + @Test + public void testRequestPasswordResetWrongEmail() throws Exception { + restAccountMockMvc + .perform(post("/api/account/reset-password/init").content("password-reset-wrong-email@example.com")) + .andExpect(status().isOk()); + } + + @Test + @Transactional + public void testFinishPasswordReset() throws Exception { + User user = new User(); + user.setPassword(RandomStringUtils.random(60)); + user.setLogin("finish-password-reset"); + user.setEmail("finish-password-reset@example.com"); + user.setResetDate(Instant.now().plusSeconds(60)); + user.setResetKey("reset key"); + userRepository.saveAndFlush(user); + + KeyAndPasswordVM keyAndPassword = new KeyAndPasswordVM(); + keyAndPassword.setKey(user.getResetKey()); + keyAndPassword.setNewPassword("new password"); + + restAccountMockMvc + .perform( + post("/api/account/reset-password/finish") + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(keyAndPassword)) + ) + .andExpect(status().isOk()); + + User updatedUser = userRepository.findOneByLogin(user.getLogin()).orElse(null); + assertThat(passwordEncoder.matches(keyAndPassword.getNewPassword(), updatedUser.getPassword())).isTrue(); + } + + @Test + @Transactional + public void testFinishPasswordResetTooSmall() throws Exception { + User user = new User(); + user.setPassword(RandomStringUtils.random(60)); + user.setLogin("finish-password-reset-too-small"); + user.setEmail("finish-password-reset-too-small@example.com"); + user.setResetDate(Instant.now().plusSeconds(60)); + user.setResetKey("reset key too small"); + userRepository.saveAndFlush(user); + + KeyAndPasswordVM keyAndPassword = new KeyAndPasswordVM(); + keyAndPassword.setKey(user.getResetKey()); + keyAndPassword.setNewPassword("foo"); + + restAccountMockMvc + .perform( + post("/api/account/reset-password/finish") + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(keyAndPassword)) + ) + .andExpect(status().isBadRequest()); + + User updatedUser = userRepository.findOneByLogin(user.getLogin()).orElse(null); + assertThat(passwordEncoder.matches(keyAndPassword.getNewPassword(), updatedUser.getPassword())).isFalse(); + } + + @Test + @Transactional + public void testFinishPasswordResetWrongKey() throws Exception { + KeyAndPasswordVM keyAndPassword = new KeyAndPasswordVM(); + keyAndPassword.setKey("wrong reset key"); + keyAndPassword.setNewPassword("new password"); + + restAccountMockMvc + .perform( + post("/api/account/reset-password/finish") + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(keyAndPassword)) + ) + .andExpect(status().isInternalServerError()); + } +} diff --git a/borestop/src/test/java/com/ippon/borestop/web/rest/AuditResourceIT.java b/borestop/src/test/java/com/ippon/borestop/web/rest/AuditResourceIT.java new file mode 100644 index 00000000..ceccde2c --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/web/rest/AuditResourceIT.java @@ -0,0 +1,135 @@ +package com.ippon.borestop.web.rest; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.hamcrest.Matchers.hasItem; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +import com.ippon.borestop.BorestopApp; +import com.ippon.borestop.domain.PersistentAuditEvent; +import com.ippon.borestop.repository.PersistenceAuditEventRepository; +import com.ippon.borestop.security.AuthoritiesConstants; +import java.time.Instant; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.web.PageableHandlerMethodArgumentResolver; +import org.springframework.http.MediaType; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.transaction.annotation.Transactional; + +/** + * Integration tests for the {@link AuditResource} REST controller. + */ +@AutoConfigureMockMvc +@WithMockUser(authorities = AuthoritiesConstants.ADMIN) +@SpringBootTest(classes = BorestopApp.class) +@Transactional +public class AuditResourceIT { + private static final String SAMPLE_PRINCIPAL = "SAMPLE_PRINCIPAL"; + private static final String SAMPLE_TYPE = "SAMPLE_TYPE"; + private static final Instant SAMPLE_TIMESTAMP = Instant.parse("2015-08-04T10:11:30Z"); + private static final long SECONDS_PER_DAY = 60 * 60 * 24; + + @Autowired + private PersistenceAuditEventRepository auditEventRepository; + + private PersistentAuditEvent auditEvent; + + @Autowired + private MockMvc restAuditMockMvc; + + @BeforeEach + public void initTest() { + auditEventRepository.deleteAll(); + auditEvent = new PersistentAuditEvent(); + auditEvent.setAuditEventType(SAMPLE_TYPE); + auditEvent.setPrincipal(SAMPLE_PRINCIPAL); + auditEvent.setAuditEventDate(SAMPLE_TIMESTAMP); + } + + @Test + public void getAllAudits() throws Exception { + // Initialize the database + auditEventRepository.save(auditEvent); + + // Get all the audits + restAuditMockMvc + .perform(get("/management/audits")) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.[*].principal").value(hasItem(SAMPLE_PRINCIPAL))); + } + + @Test + public void getAudit() throws Exception { + // Initialize the database + auditEventRepository.save(auditEvent); + + // Get the audit + restAuditMockMvc + .perform(get("/management/audits/{id}", auditEvent.getId())) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.principal").value(SAMPLE_PRINCIPAL)); + } + + @Test + public void getAuditsByDate() throws Exception { + // Initialize the database + auditEventRepository.save(auditEvent); + + // Generate dates for selecting audits by date, making sure the period will contain the audit + String fromDate = SAMPLE_TIMESTAMP.minusSeconds(SECONDS_PER_DAY).toString().substring(0, 10); + String toDate = SAMPLE_TIMESTAMP.plusSeconds(SECONDS_PER_DAY).toString().substring(0, 10); + + // Get the audit + restAuditMockMvc + .perform(get("/management/audits?fromDate=" + fromDate + "&toDate=" + toDate)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.[*].principal").value(hasItem(SAMPLE_PRINCIPAL))); + } + + @Test + public void getNonExistingAuditsByDate() throws Exception { + // Initialize the database + auditEventRepository.save(auditEvent); + + // Generate dates for selecting audits by date, making sure the period will not contain the sample audit + String fromDate = SAMPLE_TIMESTAMP.minusSeconds(2 * SECONDS_PER_DAY).toString().substring(0, 10); + String toDate = SAMPLE_TIMESTAMP.minusSeconds(SECONDS_PER_DAY).toString().substring(0, 10); + + // Query audits but expect no results + restAuditMockMvc + .perform(get("/management/audits?fromDate=" + fromDate + "&toDate=" + toDate)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(header().string("X-Total-Count", "0")); + } + + @Test + public void getNonExistingAudit() throws Exception { + // Get the audit + restAuditMockMvc.perform(get("/management/audits/{id}", Long.MAX_VALUE)).andExpect(status().isNotFound()); + } + + @Test + public void testPersistentAuditEventEquals() throws Exception { + TestUtil.equalsVerifier(PersistentAuditEvent.class); + PersistentAuditEvent auditEvent1 = new PersistentAuditEvent(); + auditEvent1.setId(1L); + PersistentAuditEvent auditEvent2 = new PersistentAuditEvent(); + auditEvent2.setId(auditEvent1.getId()); + assertThat(auditEvent1).isEqualTo(auditEvent2); + auditEvent2.setId(2L); + assertThat(auditEvent1).isNotEqualTo(auditEvent2); + auditEvent1.setId(null); + assertThat(auditEvent1).isNotEqualTo(auditEvent2); + } +} diff --git a/borestop/src/test/java/com/ippon/borestop/web/rest/ClientForwardControllerTest.java b/borestop/src/test/java/com/ippon/borestop/web/rest/ClientForwardControllerTest.java new file mode 100644 index 00000000..d27571d2 --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/web/rest/ClientForwardControllerTest.java @@ -0,0 +1,57 @@ +package com.ippon.borestop.web.rest; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.forwardedUrl; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.ResultActions; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * Unit tests for the {@link ClientForwardController} REST controller. + */ +public class ClientForwardControllerTest { + private MockMvc restMockMvc; + + @BeforeEach + public void setup() { + ClientForwardController clientForwardController = new ClientForwardController(); + this.restMockMvc = MockMvcBuilders.standaloneSetup(clientForwardController, new TestController()).build(); + } + + @Test + public void getBackendEndpoint() throws Exception { + restMockMvc + .perform(get("/test")) + .andExpect(status().isOk()) + .andExpect(content().contentTypeCompatibleWith(MediaType.TEXT_PLAIN_VALUE)) + .andExpect(content().string("test")); + } + + @Test + public void getClientEndpoint() throws Exception { + ResultActions perform = restMockMvc.perform(get("/non-existant-mapping")); + perform.andExpect(status().isOk()).andExpect(forwardedUrl("/")); + } + + @Test + public void getNestedClientEndpoint() throws Exception { + restMockMvc.perform(get("/admin/user-management")).andExpect(status().isOk()).andExpect(forwardedUrl("/")); + } + + @RestController + public static class TestController { + + @RequestMapping(value = "/test") + public String test() { + return "test"; + } + } +} diff --git a/borestop/src/test/java/com/ippon/borestop/web/rest/TestUtil.java b/borestop/src/test/java/com/ippon/borestop/web/rest/TestUtil.java new file mode 100644 index 00000000..da4ba505 --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/web/rest/TestUtil.java @@ -0,0 +1,154 @@ +package com.ippon.borestop.web.rest; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import java.io.IOException; +import java.time.ZonedDateTime; +import java.time.format.DateTimeParseException; +import java.util.List; +import javax.persistence.EntityManager; +import javax.persistence.TypedQuery; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; +import org.hamcrest.Description; +import org.hamcrest.TypeSafeDiagnosingMatcher; +import org.springframework.format.datetime.standard.DateTimeFormatterRegistrar; +import org.springframework.format.support.DefaultFormattingConversionService; +import org.springframework.format.support.FormattingConversionService; + +/** + * Utility class for testing REST controllers. + */ +public final class TestUtil { + private static final ObjectMapper mapper = createObjectMapper(); + + private static ObjectMapper createObjectMapper() { + ObjectMapper mapper = new ObjectMapper(); + mapper.configure(SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS, false); + mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY); + mapper.registerModule(new JavaTimeModule()); + return mapper; + } + + /** + * Convert an object to JSON byte array. + * + * @param object the object to convert. + * @return the JSON byte array. + * @throws IOException + */ + public static byte[] convertObjectToJsonBytes(Object object) throws IOException { + return mapper.writeValueAsBytes(object); + } + + /** + * Create a byte array with a specific size filled with specified data. + * + * @param size the size of the byte array. + * @param data the data to put in the byte array. + * @return the JSON byte array. + */ + public static byte[] createByteArray(int size, String data) { + byte[] byteArray = new byte[size]; + for (int i = 0; i < size; i++) { + byteArray[i] = Byte.parseByte(data, 2); + } + return byteArray; + } + + /** + * A matcher that tests that the examined string represents the same instant as the reference datetime. + */ + public static class ZonedDateTimeMatcher extends TypeSafeDiagnosingMatcher<String> { + private final ZonedDateTime date; + + public ZonedDateTimeMatcher(ZonedDateTime date) { + this.date = date; + } + + @Override + protected boolean matchesSafely(String item, Description mismatchDescription) { + try { + if (!date.isEqual(ZonedDateTime.parse(item))) { + mismatchDescription.appendText("was ").appendValue(item); + return false; + } + return true; + } catch (DateTimeParseException e) { + mismatchDescription.appendText("was ").appendValue(item).appendText(", which could not be parsed as a ZonedDateTime"); + return false; + } + } + + @Override + public void describeTo(Description description) { + description.appendText("a String representing the same Instant as ").appendValue(date); + } + } + + /** + * Creates a matcher that matches when the examined string represents the same instant as the reference datetime. + * + * @param date the reference datetime against which the examined string is checked. + */ + public static ZonedDateTimeMatcher sameInstant(ZonedDateTime date) { + return new ZonedDateTimeMatcher(date); + } + + /** + * Verifies the equals/hashcode contract on the domain object. + */ + public static <T> void equalsVerifier(Class<T> clazz) throws Exception { + T domainObject1 = clazz.getConstructor().newInstance(); + assertThat(domainObject1.toString()).isNotNull(); + assertThat(domainObject1).isEqualTo(domainObject1); + assertThat(domainObject1.hashCode()).isEqualTo(domainObject1.hashCode()); + + // Test with an instance of another class + Object testOtherObject = new Object(); + assertThat(domainObject1).isNotEqualTo(testOtherObject); + assertThat(domainObject1).isNotEqualTo(null); + + // Test with an instance of the same class + T domainObject2 = clazz.getConstructor().newInstance(); + assertThat(domainObject1).isNotEqualTo(domainObject2); + + // HashCodes are equals because the objects are not persisted yet + assertThat(domainObject1.hashCode()).isEqualTo(domainObject2.hashCode()); + } + + /** + * Create a {@link FormattingConversionService} which use ISO date format, instead of the localized one. + * @return the {@link FormattingConversionService}. + */ + public static FormattingConversionService createFormattingConversionService() { + DefaultFormattingConversionService dfcs = new DefaultFormattingConversionService(); + DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar(); + registrar.setUseIsoFormat(true); + registrar.registerFormatters(dfcs); + return dfcs; + } + + /** + * Makes a an executes a query to the EntityManager finding all stored objects. + * @param <T> The type of objects to be searched + * @param em The instance of the EntityManager + * @param clss The class type to be searched + * @return A list of all found objects + */ + public static <T> List<T> findAll(EntityManager em, Class<T> clss) { + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery<T> cq = cb.createQuery(clss); + Root<T> rootEntry = cq.from(clss); + CriteriaQuery<T> all = cq.select(rootEntry); + TypedQuery<T> allQuery = em.createQuery(all); + return allQuery.getResultList(); + } + + private TestUtil() {} +} diff --git a/borestop/src/test/java/com/ippon/borestop/web/rest/UserJWTControllerIT.java b/borestop/src/test/java/com/ippon/borestop/web/rest/UserJWTControllerIT.java new file mode 100644 index 00000000..f7f1d3ff --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/web/rest/UserJWTControllerIT.java @@ -0,0 +1,99 @@ +package com.ippon.borestop.web.rest; + +import static org.hamcrest.Matchers.emptyString; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.nullValue; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import com.ippon.borestop.BorestopApp; +import com.ippon.borestop.domain.User; +import com.ippon.borestop.repository.UserRepository; +import com.ippon.borestop.web.rest.vm.LoginVM; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.transaction.annotation.Transactional; + +/** + * Integration tests for the {@link UserJWTController} REST controller. + */ +@AutoConfigureMockMvc +@SpringBootTest(classes = BorestopApp.class) +public class UserJWTControllerIT { + @Autowired + private UserRepository userRepository; + + @Autowired + private PasswordEncoder passwordEncoder; + + @Autowired + private MockMvc mockMvc; + + @Test + @Transactional + public void testAuthorize() throws Exception { + User user = new User(); + user.setLogin("user-jwt-controller"); + user.setEmail("user-jwt-controller@example.com"); + user.setActivated(true); + user.setPassword(passwordEncoder.encode("test")); + + userRepository.saveAndFlush(user); + + LoginVM login = new LoginVM(); + login.setUsername("user-jwt-controller"); + login.setPassword("test"); + mockMvc + .perform(post("/api/authenticate").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(login))) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.id_token").isString()) + .andExpect(jsonPath("$.id_token").isNotEmpty()) + .andExpect(header().string("Authorization", not(nullValue()))) + .andExpect(header().string("Authorization", not(is(emptyString())))); + } + + @Test + @Transactional + public void testAuthorizeWithRememberMe() throws Exception { + User user = new User(); + user.setLogin("user-jwt-controller-remember-me"); + user.setEmail("user-jwt-controller-remember-me@example.com"); + user.setActivated(true); + user.setPassword(passwordEncoder.encode("test")); + + userRepository.saveAndFlush(user); + + LoginVM login = new LoginVM(); + login.setUsername("user-jwt-controller-remember-me"); + login.setPassword("test"); + login.setRememberMe(true); + mockMvc + .perform(post("/api/authenticate").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(login))) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.id_token").isString()) + .andExpect(jsonPath("$.id_token").isNotEmpty()) + .andExpect(header().string("Authorization", not(nullValue()))) + .andExpect(header().string("Authorization", not(is(emptyString())))); + } + + @Test + public void testAuthorizeFails() throws Exception { + LoginVM login = new LoginVM(); + login.setUsername("wrong-user"); + login.setPassword("wrong password"); + mockMvc + .perform(post("/api/authenticate").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(login))) + .andExpect(status().isUnauthorized()) + .andExpect(jsonPath("$.id_token").doesNotExist()) + .andExpect(header().doesNotExist("Authorization")); + } +} diff --git a/borestop/src/test/java/com/ippon/borestop/web/rest/UserResourceIT.java b/borestop/src/test/java/com/ippon/borestop/web/rest/UserResourceIT.java new file mode 100644 index 00000000..53f246ae --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/web/rest/UserResourceIT.java @@ -0,0 +1,562 @@ +package com.ippon.borestop.web.rest; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.hasItems; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +import com.ippon.borestop.BorestopApp; +import com.ippon.borestop.domain.Authority; +import com.ippon.borestop.domain.User; +import com.ippon.borestop.repository.UserRepository; +import com.ippon.borestop.security.AuthoritiesConstants; +import com.ippon.borestop.service.dto.UserDTO; +import com.ippon.borestop.service.mapper.UserMapper; +import com.ippon.borestop.web.rest.vm.ManagedUserVM; +import java.time.Instant; +import java.util.*; +import java.util.function.Consumer; +import javax.persistence.EntityManager; +import org.apache.commons.lang3.RandomStringUtils; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.transaction.annotation.Transactional; + +/** + * Integration tests for the {@link UserResource} REST controller. + */ +@AutoConfigureMockMvc +@WithMockUser(authorities = AuthoritiesConstants.ADMIN) +@SpringBootTest(classes = BorestopApp.class) +public class UserResourceIT { + private static final String DEFAULT_LOGIN = "johndoe"; + private static final String UPDATED_LOGIN = "jhipster"; + + private static final Long DEFAULT_ID = 1L; + + private static final String DEFAULT_PASSWORD = "passjohndoe"; + private static final String UPDATED_PASSWORD = "passjhipster"; + + private static final String DEFAULT_EMAIL = "johndoe@localhost"; + private static final String UPDATED_EMAIL = "jhipster@localhost"; + + private static final String DEFAULT_FIRSTNAME = "john"; + private static final String UPDATED_FIRSTNAME = "jhipsterFirstName"; + + private static final String DEFAULT_LASTNAME = "doe"; + private static final String UPDATED_LASTNAME = "jhipsterLastName"; + + private static final String DEFAULT_IMAGEURL = "http://placehold.it/50x50"; + private static final String UPDATED_IMAGEURL = "http://placehold.it/40x40"; + + private static final String DEFAULT_LANGKEY = "en"; + private static final String UPDATED_LANGKEY = "fr"; + + @Autowired + private UserRepository userRepository; + + @Autowired + private UserMapper userMapper; + + @Autowired + private EntityManager em; + + @Autowired + private MockMvc restUserMockMvc; + + private User user; + + /** + * Create a User. + * + * This is a static method, as tests for other entities might also need it, + * if they test an entity which has a required relationship to the User entity. + */ + public static User createEntity(EntityManager em) { + User user = new User(); + user.setLogin(DEFAULT_LOGIN + RandomStringUtils.randomAlphabetic(5)); + user.setPassword(RandomStringUtils.random(60)); + user.setActivated(true); + user.setEmail(RandomStringUtils.randomAlphabetic(5) + DEFAULT_EMAIL); + user.setFirstName(DEFAULT_FIRSTNAME); + user.setLastName(DEFAULT_LASTNAME); + user.setImageUrl(DEFAULT_IMAGEURL); + user.setLangKey(DEFAULT_LANGKEY); + return user; + } + + @BeforeEach + public void initTest() { + user = createEntity(em); + user.setLogin(DEFAULT_LOGIN); + user.setEmail(DEFAULT_EMAIL); + } + + @Test + @Transactional + public void createUser() throws Exception { + int databaseSizeBeforeCreate = userRepository.findAll().size(); + + // Create the User + ManagedUserVM managedUserVM = new ManagedUserVM(); + managedUserVM.setLogin(DEFAULT_LOGIN); + managedUserVM.setPassword(DEFAULT_PASSWORD); + managedUserVM.setFirstName(DEFAULT_FIRSTNAME); + managedUserVM.setLastName(DEFAULT_LASTNAME); + managedUserVM.setEmail(DEFAULT_EMAIL); + managedUserVM.setActivated(true); + managedUserVM.setImageUrl(DEFAULT_IMAGEURL); + managedUserVM.setLangKey(DEFAULT_LANGKEY); + managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + restUserMockMvc + .perform(post("/api/users").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(managedUserVM))) + .andExpect(status().isCreated()); + + // Validate the User in the database + assertPersistedUsers( + users -> { + assertThat(users).hasSize(databaseSizeBeforeCreate + 1); + User testUser = users.get(users.size() - 1); + assertThat(testUser.getLogin()).isEqualTo(DEFAULT_LOGIN); + assertThat(testUser.getFirstName()).isEqualTo(DEFAULT_FIRSTNAME); + assertThat(testUser.getLastName()).isEqualTo(DEFAULT_LASTNAME); + assertThat(testUser.getEmail()).isEqualTo(DEFAULT_EMAIL); + assertThat(testUser.getImageUrl()).isEqualTo(DEFAULT_IMAGEURL); + assertThat(testUser.getLangKey()).isEqualTo(DEFAULT_LANGKEY); + } + ); + } + + @Test + @Transactional + public void createUserWithExistingId() throws Exception { + int databaseSizeBeforeCreate = userRepository.findAll().size(); + + ManagedUserVM managedUserVM = new ManagedUserVM(); + managedUserVM.setId(1L); + managedUserVM.setLogin(DEFAULT_LOGIN); + managedUserVM.setPassword(DEFAULT_PASSWORD); + managedUserVM.setFirstName(DEFAULT_FIRSTNAME); + managedUserVM.setLastName(DEFAULT_LASTNAME); + managedUserVM.setEmail(DEFAULT_EMAIL); + managedUserVM.setActivated(true); + managedUserVM.setImageUrl(DEFAULT_IMAGEURL); + managedUserVM.setLangKey(DEFAULT_LANGKEY); + managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + // An entity with an existing ID cannot be created, so this API call must fail + restUserMockMvc + .perform(post("/api/users").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(managedUserVM))) + .andExpect(status().isBadRequest()); + + // Validate the User in the database + assertPersistedUsers(users -> assertThat(users).hasSize(databaseSizeBeforeCreate)); + } + + @Test + @Transactional + public void createUserWithExistingLogin() throws Exception { + // Initialize the database + userRepository.saveAndFlush(user); + int databaseSizeBeforeCreate = userRepository.findAll().size(); + + ManagedUserVM managedUserVM = new ManagedUserVM(); + managedUserVM.setLogin(DEFAULT_LOGIN); // this login should already be used + managedUserVM.setPassword(DEFAULT_PASSWORD); + managedUserVM.setFirstName(DEFAULT_FIRSTNAME); + managedUserVM.setLastName(DEFAULT_LASTNAME); + managedUserVM.setEmail("anothermail@localhost"); + managedUserVM.setActivated(true); + managedUserVM.setImageUrl(DEFAULT_IMAGEURL); + managedUserVM.setLangKey(DEFAULT_LANGKEY); + managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + // Create the User + restUserMockMvc + .perform(post("/api/users").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(managedUserVM))) + .andExpect(status().isBadRequest()); + + // Validate the User in the database + assertPersistedUsers(users -> assertThat(users).hasSize(databaseSizeBeforeCreate)); + } + + @Test + @Transactional + public void createUserWithExistingEmail() throws Exception { + // Initialize the database + userRepository.saveAndFlush(user); + int databaseSizeBeforeCreate = userRepository.findAll().size(); + + ManagedUserVM managedUserVM = new ManagedUserVM(); + managedUserVM.setLogin("anotherlogin"); + managedUserVM.setPassword(DEFAULT_PASSWORD); + managedUserVM.setFirstName(DEFAULT_FIRSTNAME); + managedUserVM.setLastName(DEFAULT_LASTNAME); + managedUserVM.setEmail(DEFAULT_EMAIL); // this email should already be used + managedUserVM.setActivated(true); + managedUserVM.setImageUrl(DEFAULT_IMAGEURL); + managedUserVM.setLangKey(DEFAULT_LANGKEY); + managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + // Create the User + restUserMockMvc + .perform(post("/api/users").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(managedUserVM))) + .andExpect(status().isBadRequest()); + + // Validate the User in the database + assertPersistedUsers(users -> assertThat(users).hasSize(databaseSizeBeforeCreate)); + } + + @Test + @Transactional + public void getAllUsers() throws Exception { + // Initialize the database + userRepository.saveAndFlush(user); + + // Get all the users + restUserMockMvc + .perform(get("/api/users?sort=id,desc").accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.[*].login").value(hasItem(DEFAULT_LOGIN))) + .andExpect(jsonPath("$.[*].firstName").value(hasItem(DEFAULT_FIRSTNAME))) + .andExpect(jsonPath("$.[*].lastName").value(hasItem(DEFAULT_LASTNAME))) + .andExpect(jsonPath("$.[*].email").value(hasItem(DEFAULT_EMAIL))) + .andExpect(jsonPath("$.[*].imageUrl").value(hasItem(DEFAULT_IMAGEURL))) + .andExpect(jsonPath("$.[*].langKey").value(hasItem(DEFAULT_LANGKEY))); + } + + @Test + @Transactional + public void getUser() throws Exception { + // Initialize the database + userRepository.saveAndFlush(user); + + // Get the user + restUserMockMvc + .perform(get("/api/users/{login}", user.getLogin())) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.login").value(user.getLogin())) + .andExpect(jsonPath("$.firstName").value(DEFAULT_FIRSTNAME)) + .andExpect(jsonPath("$.lastName").value(DEFAULT_LASTNAME)) + .andExpect(jsonPath("$.email").value(DEFAULT_EMAIL)) + .andExpect(jsonPath("$.imageUrl").value(DEFAULT_IMAGEURL)) + .andExpect(jsonPath("$.langKey").value(DEFAULT_LANGKEY)); + } + + @Test + @Transactional + public void getNonExistingUser() throws Exception { + restUserMockMvc.perform(get("/api/users/unknown")).andExpect(status().isNotFound()); + } + + @Test + @Transactional + public void updateUser() throws Exception { + // Initialize the database + userRepository.saveAndFlush(user); + int databaseSizeBeforeUpdate = userRepository.findAll().size(); + + // Update the user + User updatedUser = userRepository.findById(user.getId()).get(); + + ManagedUserVM managedUserVM = new ManagedUserVM(); + managedUserVM.setId(updatedUser.getId()); + managedUserVM.setLogin(updatedUser.getLogin()); + managedUserVM.setPassword(UPDATED_PASSWORD); + managedUserVM.setFirstName(UPDATED_FIRSTNAME); + managedUserVM.setLastName(UPDATED_LASTNAME); + managedUserVM.setEmail(UPDATED_EMAIL); + managedUserVM.setActivated(updatedUser.getActivated()); + managedUserVM.setImageUrl(UPDATED_IMAGEURL); + managedUserVM.setLangKey(UPDATED_LANGKEY); + managedUserVM.setCreatedBy(updatedUser.getCreatedBy()); + managedUserVM.setCreatedDate(updatedUser.getCreatedDate()); + managedUserVM.setLastModifiedBy(updatedUser.getLastModifiedBy()); + managedUserVM.setLastModifiedDate(updatedUser.getLastModifiedDate()); + managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + restUserMockMvc + .perform(put("/api/users").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(managedUserVM))) + .andExpect(status().isOk()); + + // Validate the User in the database + assertPersistedUsers( + users -> { + assertThat(users).hasSize(databaseSizeBeforeUpdate); + User testUser = users.get(users.size() - 1); + assertThat(testUser.getFirstName()).isEqualTo(UPDATED_FIRSTNAME); + assertThat(testUser.getLastName()).isEqualTo(UPDATED_LASTNAME); + assertThat(testUser.getEmail()).isEqualTo(UPDATED_EMAIL); + assertThat(testUser.getImageUrl()).isEqualTo(UPDATED_IMAGEURL); + assertThat(testUser.getLangKey()).isEqualTo(UPDATED_LANGKEY); + } + ); + } + + @Test + @Transactional + public void updateUserLogin() throws Exception { + // Initialize the database + userRepository.saveAndFlush(user); + int databaseSizeBeforeUpdate = userRepository.findAll().size(); + + // Update the user + User updatedUser = userRepository.findById(user.getId()).get(); + + ManagedUserVM managedUserVM = new ManagedUserVM(); + managedUserVM.setId(updatedUser.getId()); + managedUserVM.setLogin(UPDATED_LOGIN); + managedUserVM.setPassword(UPDATED_PASSWORD); + managedUserVM.setFirstName(UPDATED_FIRSTNAME); + managedUserVM.setLastName(UPDATED_LASTNAME); + managedUserVM.setEmail(UPDATED_EMAIL); + managedUserVM.setActivated(updatedUser.getActivated()); + managedUserVM.setImageUrl(UPDATED_IMAGEURL); + managedUserVM.setLangKey(UPDATED_LANGKEY); + managedUserVM.setCreatedBy(updatedUser.getCreatedBy()); + managedUserVM.setCreatedDate(updatedUser.getCreatedDate()); + managedUserVM.setLastModifiedBy(updatedUser.getLastModifiedBy()); + managedUserVM.setLastModifiedDate(updatedUser.getLastModifiedDate()); + managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + restUserMockMvc + .perform(put("/api/users").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(managedUserVM))) + .andExpect(status().isOk()); + + // Validate the User in the database + assertPersistedUsers( + users -> { + assertThat(users).hasSize(databaseSizeBeforeUpdate); + User testUser = users.get(users.size() - 1); + assertThat(testUser.getLogin()).isEqualTo(UPDATED_LOGIN); + assertThat(testUser.getFirstName()).isEqualTo(UPDATED_FIRSTNAME); + assertThat(testUser.getLastName()).isEqualTo(UPDATED_LASTNAME); + assertThat(testUser.getEmail()).isEqualTo(UPDATED_EMAIL); + assertThat(testUser.getImageUrl()).isEqualTo(UPDATED_IMAGEURL); + assertThat(testUser.getLangKey()).isEqualTo(UPDATED_LANGKEY); + } + ); + } + + @Test + @Transactional + public void updateUserExistingEmail() throws Exception { + // Initialize the database with 2 users + userRepository.saveAndFlush(user); + + User anotherUser = new User(); + anotherUser.setLogin("jhipster"); + anotherUser.setPassword(RandomStringUtils.random(60)); + anotherUser.setActivated(true); + anotherUser.setEmail("jhipster@localhost"); + anotherUser.setFirstName("java"); + anotherUser.setLastName("hipster"); + anotherUser.setImageUrl(""); + anotherUser.setLangKey("en"); + userRepository.saveAndFlush(anotherUser); + + // Update the user + User updatedUser = userRepository.findById(user.getId()).get(); + + ManagedUserVM managedUserVM = new ManagedUserVM(); + managedUserVM.setId(updatedUser.getId()); + managedUserVM.setLogin(updatedUser.getLogin()); + managedUserVM.setPassword(updatedUser.getPassword()); + managedUserVM.setFirstName(updatedUser.getFirstName()); + managedUserVM.setLastName(updatedUser.getLastName()); + managedUserVM.setEmail("jhipster@localhost"); // this email should already be used by anotherUser + managedUserVM.setActivated(updatedUser.getActivated()); + managedUserVM.setImageUrl(updatedUser.getImageUrl()); + managedUserVM.setLangKey(updatedUser.getLangKey()); + managedUserVM.setCreatedBy(updatedUser.getCreatedBy()); + managedUserVM.setCreatedDate(updatedUser.getCreatedDate()); + managedUserVM.setLastModifiedBy(updatedUser.getLastModifiedBy()); + managedUserVM.setLastModifiedDate(updatedUser.getLastModifiedDate()); + managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + restUserMockMvc + .perform(put("/api/users").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(managedUserVM))) + .andExpect(status().isBadRequest()); + } + + @Test + @Transactional + public void updateUserExistingLogin() throws Exception { + // Initialize the database + userRepository.saveAndFlush(user); + + User anotherUser = new User(); + anotherUser.setLogin("jhipster"); + anotherUser.setPassword(RandomStringUtils.random(60)); + anotherUser.setActivated(true); + anotherUser.setEmail("jhipster@localhost"); + anotherUser.setFirstName("java"); + anotherUser.setLastName("hipster"); + anotherUser.setImageUrl(""); + anotherUser.setLangKey("en"); + userRepository.saveAndFlush(anotherUser); + + // Update the user + User updatedUser = userRepository.findById(user.getId()).get(); + + ManagedUserVM managedUserVM = new ManagedUserVM(); + managedUserVM.setId(updatedUser.getId()); + managedUserVM.setLogin("jhipster"); // this login should already be used by anotherUser + managedUserVM.setPassword(updatedUser.getPassword()); + managedUserVM.setFirstName(updatedUser.getFirstName()); + managedUserVM.setLastName(updatedUser.getLastName()); + managedUserVM.setEmail(updatedUser.getEmail()); + managedUserVM.setActivated(updatedUser.getActivated()); + managedUserVM.setImageUrl(updatedUser.getImageUrl()); + managedUserVM.setLangKey(updatedUser.getLangKey()); + managedUserVM.setCreatedBy(updatedUser.getCreatedBy()); + managedUserVM.setCreatedDate(updatedUser.getCreatedDate()); + managedUserVM.setLastModifiedBy(updatedUser.getLastModifiedBy()); + managedUserVM.setLastModifiedDate(updatedUser.getLastModifiedDate()); + managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + restUserMockMvc + .perform(put("/api/users").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(managedUserVM))) + .andExpect(status().isBadRequest()); + } + + @Test + @Transactional + public void deleteUser() throws Exception { + // Initialize the database + userRepository.saveAndFlush(user); + int databaseSizeBeforeDelete = userRepository.findAll().size(); + + // Delete the user + restUserMockMvc + .perform(delete("/api/users/{login}", user.getLogin()).accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isNoContent()); + + // Validate the database is empty + assertPersistedUsers(users -> assertThat(users).hasSize(databaseSizeBeforeDelete - 1)); + } + + @Test + @Transactional + public void getAllAuthorities() throws Exception { + restUserMockMvc + .perform(get("/api/users/authorities").accept(MediaType.APPLICATION_JSON).contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$").isArray()) + .andExpect(jsonPath("$").value(hasItems(AuthoritiesConstants.USER, AuthoritiesConstants.ADMIN))); + } + + @Test + public void testUserEquals() throws Exception { + TestUtil.equalsVerifier(User.class); + User user1 = new User(); + user1.setId(1L); + User user2 = new User(); + user2.setId(user1.getId()); + assertThat(user1).isEqualTo(user2); + user2.setId(2L); + assertThat(user1).isNotEqualTo(user2); + user1.setId(null); + assertThat(user1).isNotEqualTo(user2); + } + + @Test + public void testUserDTOtoUser() { + UserDTO userDTO = new UserDTO(); + userDTO.setId(DEFAULT_ID); + userDTO.setLogin(DEFAULT_LOGIN); + userDTO.setFirstName(DEFAULT_FIRSTNAME); + userDTO.setLastName(DEFAULT_LASTNAME); + userDTO.setEmail(DEFAULT_EMAIL); + userDTO.setActivated(true); + userDTO.setImageUrl(DEFAULT_IMAGEURL); + userDTO.setLangKey(DEFAULT_LANGKEY); + userDTO.setCreatedBy(DEFAULT_LOGIN); + userDTO.setLastModifiedBy(DEFAULT_LOGIN); + userDTO.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + User user = userMapper.userDTOToUser(userDTO); + assertThat(user.getId()).isEqualTo(DEFAULT_ID); + assertThat(user.getLogin()).isEqualTo(DEFAULT_LOGIN); + assertThat(user.getFirstName()).isEqualTo(DEFAULT_FIRSTNAME); + assertThat(user.getLastName()).isEqualTo(DEFAULT_LASTNAME); + assertThat(user.getEmail()).isEqualTo(DEFAULT_EMAIL); + assertThat(user.getActivated()).isEqualTo(true); + assertThat(user.getImageUrl()).isEqualTo(DEFAULT_IMAGEURL); + assertThat(user.getLangKey()).isEqualTo(DEFAULT_LANGKEY); + assertThat(user.getCreatedBy()).isNull(); + assertThat(user.getCreatedDate()).isNotNull(); + assertThat(user.getLastModifiedBy()).isNull(); + assertThat(user.getLastModifiedDate()).isNotNull(); + assertThat(user.getAuthorities()).extracting("name").containsExactly(AuthoritiesConstants.USER); + } + + @Test + public void testUserToUserDTO() { + user.setId(DEFAULT_ID); + user.setCreatedBy(DEFAULT_LOGIN); + user.setCreatedDate(Instant.now()); + user.setLastModifiedBy(DEFAULT_LOGIN); + user.setLastModifiedDate(Instant.now()); + Set<Authority> authorities = new HashSet<>(); + Authority authority = new Authority(); + authority.setName(AuthoritiesConstants.USER); + authorities.add(authority); + user.setAuthorities(authorities); + + UserDTO userDTO = userMapper.userToUserDTO(user); + + assertThat(userDTO.getId()).isEqualTo(DEFAULT_ID); + assertThat(userDTO.getLogin()).isEqualTo(DEFAULT_LOGIN); + assertThat(userDTO.getFirstName()).isEqualTo(DEFAULT_FIRSTNAME); + assertThat(userDTO.getLastName()).isEqualTo(DEFAULT_LASTNAME); + assertThat(userDTO.getEmail()).isEqualTo(DEFAULT_EMAIL); + assertThat(userDTO.isActivated()).isEqualTo(true); + assertThat(userDTO.getImageUrl()).isEqualTo(DEFAULT_IMAGEURL); + assertThat(userDTO.getLangKey()).isEqualTo(DEFAULT_LANGKEY); + assertThat(userDTO.getCreatedBy()).isEqualTo(DEFAULT_LOGIN); + assertThat(userDTO.getCreatedDate()).isEqualTo(user.getCreatedDate()); + assertThat(userDTO.getLastModifiedBy()).isEqualTo(DEFAULT_LOGIN); + assertThat(userDTO.getLastModifiedDate()).isEqualTo(user.getLastModifiedDate()); + assertThat(userDTO.getAuthorities()).containsExactly(AuthoritiesConstants.USER); + assertThat(userDTO.toString()).isNotNull(); + } + + @Test + public void testAuthorityEquals() { + Authority authorityA = new Authority(); + assertThat(authorityA).isEqualTo(authorityA); + assertThat(authorityA).isNotEqualTo(null); + assertThat(authorityA).isNotEqualTo(new Object()); + assertThat(authorityA.hashCode()).isEqualTo(0); + assertThat(authorityA.toString()).isNotNull(); + + Authority authorityB = new Authority(); + assertThat(authorityA).isEqualTo(authorityB); + + authorityB.setName(AuthoritiesConstants.ADMIN); + assertThat(authorityA).isNotEqualTo(authorityB); + + authorityA.setName(AuthoritiesConstants.USER); + assertThat(authorityA).isNotEqualTo(authorityB); + + authorityB.setName(AuthoritiesConstants.USER); + assertThat(authorityA).isEqualTo(authorityB); + assertThat(authorityA.hashCode()).isEqualTo(authorityB.hashCode()); + } + + private void assertPersistedUsers(Consumer<List<User>> userAssertion) { + userAssertion.accept(userRepository.findAll()); + } +} diff --git a/borestop/src/test/java/com/ippon/borestop/web/rest/WithUnauthenticatedMockUser.java b/borestop/src/test/java/com/ippon/borestop/web/rest/WithUnauthenticatedMockUser.java new file mode 100644 index 00000000..35024207 --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/web/rest/WithUnauthenticatedMockUser.java @@ -0,0 +1,23 @@ +package com.ippon.borestop.web.rest; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.test.context.support.WithSecurityContext; +import org.springframework.security.test.context.support.WithSecurityContextFactory; + +@Target({ ElementType.METHOD, ElementType.TYPE }) +@Retention(RetentionPolicy.RUNTIME) +@WithSecurityContext(factory = WithUnauthenticatedMockUser.Factory.class) +public @interface WithUnauthenticatedMockUser { + class Factory implements WithSecurityContextFactory<WithUnauthenticatedMockUser> { + + @Override + public SecurityContext createSecurityContext(WithUnauthenticatedMockUser annotation) { + return SecurityContextHolder.createEmptyContext(); + } + } +} diff --git a/borestop/src/test/java/com/ippon/borestop/web/rest/errors/ExceptionTranslatorIT.java b/borestop/src/test/java/com/ippon/borestop/web/rest/errors/ExceptionTranslatorIT.java new file mode 100644 index 00000000..853322e5 --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/web/rest/errors/ExceptionTranslatorIT.java @@ -0,0 +1,117 @@ +package com.ippon.borestop.web.rest.errors; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import com.ippon.borestop.BorestopApp; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.web.servlet.MockMvc; + +/** + * Integration tests {@link ExceptionTranslator} controller advice. + */ +@WithMockUser +@AutoConfigureMockMvc +@SpringBootTest(classes = BorestopApp.class) +public class ExceptionTranslatorIT { + @Autowired + private MockMvc mockMvc; + + @Test + public void testConcurrencyFailure() throws Exception { + mockMvc + .perform(get("/api/exception-translator-test/concurrency-failure")) + .andExpect(status().isConflict()) + .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) + .andExpect(jsonPath("$.message").value(ErrorConstants.ERR_CONCURRENCY_FAILURE)); + } + + @Test + public void testMethodArgumentNotValid() throws Exception { + mockMvc + .perform(post("/api/exception-translator-test/method-argument").content("{}").contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()) + .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) + .andExpect(jsonPath("$.message").value(ErrorConstants.ERR_VALIDATION)) + .andExpect(jsonPath("$.fieldErrors.[0].objectName").value("test")) + .andExpect(jsonPath("$.fieldErrors.[0].field").value("test")) + .andExpect(jsonPath("$.fieldErrors.[0].message").value("NotNull")); + } + + @Test + public void testMissingServletRequestPartException() throws Exception { + mockMvc + .perform(get("/api/exception-translator-test/missing-servlet-request-part")) + .andExpect(status().isBadRequest()) + .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) + .andExpect(jsonPath("$.message").value("error.http.400")); + } + + @Test + public void testMissingServletRequestParameterException() throws Exception { + mockMvc + .perform(get("/api/exception-translator-test/missing-servlet-request-parameter")) + .andExpect(status().isBadRequest()) + .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) + .andExpect(jsonPath("$.message").value("error.http.400")); + } + + @Test + public void testAccessDenied() throws Exception { + mockMvc + .perform(get("/api/exception-translator-test/access-denied")) + .andExpect(status().isForbidden()) + .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) + .andExpect(jsonPath("$.message").value("error.http.403")) + .andExpect(jsonPath("$.detail").value("test access denied!")); + } + + @Test + public void testUnauthorized() throws Exception { + mockMvc + .perform(get("/api/exception-translator-test/unauthorized")) + .andExpect(status().isUnauthorized()) + .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) + .andExpect(jsonPath("$.message").value("error.http.401")) + .andExpect(jsonPath("$.path").value("/api/exception-translator-test/unauthorized")) + .andExpect(jsonPath("$.detail").value("test authentication failed!")); + } + + @Test + public void testMethodNotSupported() throws Exception { + mockMvc + .perform(post("/api/exception-translator-test/access-denied")) + .andExpect(status().isMethodNotAllowed()) + .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) + .andExpect(jsonPath("$.message").value("error.http.405")) + .andExpect(jsonPath("$.detail").value("Request method 'POST' not supported")); + } + + @Test + public void testExceptionWithResponseStatus() throws Exception { + mockMvc + .perform(get("/api/exception-translator-test/response-status")) + .andExpect(status().isBadRequest()) + .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) + .andExpect(jsonPath("$.message").value("error.http.400")) + .andExpect(jsonPath("$.title").value("test response status")); + } + + @Test + public void testInternalServerError() throws Exception { + mockMvc + .perform(get("/api/exception-translator-test/internal-server-error")) + .andExpect(status().isInternalServerError()) + .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) + .andExpect(jsonPath("$.message").value("error.http.500")) + .andExpect(jsonPath("$.title").value("Internal Server Error")); + } +} diff --git a/borestop/src/test/java/com/ippon/borestop/web/rest/errors/ExceptionTranslatorTestController.java b/borestop/src/test/java/com/ippon/borestop/web/rest/errors/ExceptionTranslatorTestController.java new file mode 100644 index 00000000..c3effbbe --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/web/rest/errors/ExceptionTranslatorTestController.java @@ -0,0 +1,65 @@ +package com.ippon.borestop.web.rest.errors; + +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import org.springframework.dao.ConcurrencyFailureException; +import org.springframework.http.HttpStatus; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/api/exception-translator-test") +public class ExceptionTranslatorTestController { + + @GetMapping("/concurrency-failure") + public void concurrencyFailure() { + throw new ConcurrencyFailureException("test concurrency failure"); + } + + @PostMapping("/method-argument") + public void methodArgument(@Valid @RequestBody TestDTO testDTO) {} + + @GetMapping("/missing-servlet-request-part") + public void missingServletRequestPartException(@RequestPart String part) {} + + @GetMapping("/missing-servlet-request-parameter") + public void missingServletRequestParameterException(@RequestParam String param) {} + + @GetMapping("/access-denied") + public void accessdenied() { + throw new AccessDeniedException("test access denied!"); + } + + @GetMapping("/unauthorized") + public void unauthorized() { + throw new BadCredentialsException("test authentication failed!"); + } + + @GetMapping("/response-status") + public void exceptionWithResponseStatus() { + throw new TestResponseStatusException(); + } + + @GetMapping("/internal-server-error") + public void internalServerError() { + throw new RuntimeException(); + } + + public static class TestDTO { + @NotNull + private String test; + + public String getTest() { + return test; + } + + public void setTest(String test) { + this.test = test; + } + } + + @ResponseStatus(value = HttpStatus.BAD_REQUEST, reason = "test response status") + @SuppressWarnings("serial") + public static class TestResponseStatusException extends RuntimeException {} +} diff --git a/borestop/src/test/javascript/jest-global-mocks.ts b/borestop/src/test/javascript/jest-global-mocks.ts new file mode 100644 index 00000000..a802d1b3 --- /dev/null +++ b/borestop/src/test/javascript/jest-global-mocks.ts @@ -0,0 +1,3 @@ +Object.defineProperty(window, 'getComputedStyle', { + value: () => ['-webkit-appearance'] +}); diff --git a/borestop/src/test/javascript/jest.conf.js b/borestop/src/test/javascript/jest.conf.js new file mode 100644 index 00000000..17293489 --- /dev/null +++ b/borestop/src/test/javascript/jest.conf.js @@ -0,0 +1,53 @@ +const tsconfig = require('../../../tsconfig.base.json'); + +module.exports = { + preset: 'jest-preset-angular', + setupFiles: ['jest-date-mock'], + setupFilesAfterEnv: ['<rootDir>/src/test/javascript/jest.ts'], + cacheDirectory: '<rootDir>/target/jest-cache', + coverageDirectory: '<rootDir>/target/test-results/', + globals: { + 'ts-jest': { + stringifyContentPathRegex: '\\.html$', + tsConfig: '<rootDir>/tsconfig.base.json', + astTransformers: ['jest-preset-angular/build/InlineFilesTransformer', 'jest-preset-angular/build/StripStylesTransformer'] + } + }, + coveragePathIgnorePatterns: ['<rootDir>/src/test/javascript'], + moduleNameMapper: mapTypescriptAliasToJestAlias(), + reporters: ['default', ['jest-junit', { outputDirectory: './target/test-results/', outputName: 'TESTS-results-jest.xml' }]], + testResultsProcessor: 'jest-sonar-reporter', + transformIgnorePatterns: ['node_modules/'], + testMatch: ['<rootDir>/src/test/javascript/spec/**/@(*.)@(spec.ts)'], + rootDir: '../../../', + testURL: 'http://localhost/' +}; + +function mapTypescriptAliasToJestAlias(alias = {}) { + const jestAliases = { ...alias }; + if (!tsconfig.compilerOptions.paths) { + return jestAliases; + } + Object.entries(tsconfig.compilerOptions.paths) + .filter(([key, value]) => { + // use Typescript alias in Jest only if this has value + if (value.length) { + return true; + } + return false; + }) + .map(([key, value]) => { + // if Typescript alias ends with /* then in Jest: + // - alias key must end with /(.*) + // - alias value must end with /$1 + const regexToReplace = /(.*)\/\*$/; + const aliasKey = key.replace(regexToReplace, '$1/(.*)'); + const aliasValue = value[0].replace(regexToReplace, '$1/$$1'); + return [aliasKey, `<rootDir>/${aliasValue}`]; + }) + .reduce((aliases, [key, value]) => { + aliases[key] = value; + return aliases; + }, jestAliases); + return jestAliases; +} diff --git a/borestop/src/test/javascript/jest.ts b/borestop/src/test/javascript/jest.ts new file mode 100644 index 00000000..904329f5 --- /dev/null +++ b/borestop/src/test/javascript/jest.ts @@ -0,0 +1,2 @@ +import 'jest-preset-angular'; +import './jest-global-mocks'; diff --git a/borestop/src/test/javascript/spec/app/account/activate/activate.component.spec.ts b/borestop/src/test/javascript/spec/app/account/activate/activate.component.spec.ts new file mode 100644 index 00000000..89ef80ec --- /dev/null +++ b/borestop/src/test/javascript/spec/app/account/activate/activate.component.spec.ts @@ -0,0 +1,72 @@ +import { TestBed, async, tick, fakeAsync, inject } from '@angular/core/testing'; +import { ActivatedRoute } from '@angular/router'; +import { of, throwError } from 'rxjs'; + +import { BorestopTestModule } from '../../../test.module'; +import { MockActivatedRoute } from '../../../helpers/mock-route.service'; +import { ActivateService } from 'app/account/activate/activate.service'; +import { ActivateComponent } from 'app/account/activate/activate.component'; + +describe('Component Tests', () => { + describe('ActivateComponent', () => { + let comp: ActivateComponent; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [BorestopTestModule], + declarations: [ActivateComponent], + providers: [ + { + provide: ActivatedRoute, + useValue: new MockActivatedRoute({ key: 'ABC123' }) + } + ] + }) + .overrideTemplate(ActivateComponent, '') + .compileComponents(); + })); + + beforeEach(() => { + const fixture = TestBed.createComponent(ActivateComponent); + comp = fixture.componentInstance; + }); + + it('calls activate.get with the key from params', inject( + [ActivateService], + fakeAsync((service: ActivateService) => { + spyOn(service, 'get').and.returnValue(of()); + + comp.ngOnInit(); + tick(); + + expect(service.get).toHaveBeenCalledWith('ABC123'); + }) + )); + + it('should set set success to true upon successful activation', inject( + [ActivateService], + fakeAsync((service: ActivateService) => { + spyOn(service, 'get').and.returnValue(of({})); + + comp.ngOnInit(); + tick(); + + expect(comp.error).toBe(false); + expect(comp.success).toBe(true); + }) + )); + + it('should set set error to true upon activation failure', inject( + [ActivateService], + fakeAsync((service: ActivateService) => { + spyOn(service, 'get').and.returnValue(throwError('ERROR')); + + comp.ngOnInit(); + tick(); + + expect(comp.error).toBe(true); + expect(comp.success).toBe(false); + }) + )); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/account/password-reset/finish/password-reset-finish.component.spec.ts b/borestop/src/test/javascript/spec/app/account/password-reset/finish/password-reset-finish.component.spec.ts new file mode 100644 index 00000000..005fe2db --- /dev/null +++ b/borestop/src/test/javascript/spec/app/account/password-reset/finish/password-reset-finish.component.spec.ts @@ -0,0 +1,102 @@ +import { ElementRef } from '@angular/core'; +import { ComponentFixture, TestBed, inject, tick, fakeAsync } from '@angular/core/testing'; +import { FormBuilder } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { of, throwError } from 'rxjs'; + +import { BorestopTestModule } from '../../../../test.module'; +import { PasswordResetFinishComponent } from 'app/account/password-reset/finish/password-reset-finish.component'; +import { PasswordResetFinishService } from 'app/account/password-reset/finish/password-reset-finish.service'; +import { MockActivatedRoute } from '../../../../helpers/mock-route.service'; + +describe('Component Tests', () => { + describe('PasswordResetFinishComponent', () => { + let fixture: ComponentFixture<PasswordResetFinishComponent>; + let comp: PasswordResetFinishComponent; + + beforeEach(() => { + fixture = TestBed.configureTestingModule({ + imports: [BorestopTestModule], + declarations: [PasswordResetFinishComponent], + providers: [ + FormBuilder, + { + provide: ActivatedRoute, + useValue: new MockActivatedRoute({ key: 'XYZPDQ' }) + } + ] + }) + .overrideTemplate(PasswordResetFinishComponent, '') + .createComponent(PasswordResetFinishComponent); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(PasswordResetFinishComponent); + comp = fixture.componentInstance; + comp.ngOnInit(); + }); + + it('should define its initial state', () => { + expect(comp.initialized).toBe(true); + expect(comp.key).toEqual('XYZPDQ'); + }); + + it('sets focus after the view has been initialized', () => { + const node = { + focus(): void {} + }; + comp.newPassword = new ElementRef(node); + spyOn(node, 'focus'); + + comp.ngAfterViewInit(); + + expect(node.focus).toHaveBeenCalled(); + }); + + it('should ensure the two passwords entered match', () => { + comp.passwordForm.patchValue({ + newPassword: 'password', + confirmPassword: 'non-matching' + }); + + comp.finishReset(); + + expect(comp.doNotMatch).toBe(true); + }); + + it('should update success to true after resetting password', inject( + [PasswordResetFinishService], + fakeAsync((service: PasswordResetFinishService) => { + spyOn(service, 'save').and.returnValue(of({})); + comp.passwordForm.patchValue({ + newPassword: 'password', + confirmPassword: 'password' + }); + + comp.finishReset(); + tick(); + + expect(service.save).toHaveBeenCalledWith('XYZPDQ', 'password'); + expect(comp.success).toBe(true); + }) + )); + + it('should notify of generic error', inject( + [PasswordResetFinishService], + fakeAsync((service: PasswordResetFinishService) => { + spyOn(service, 'save').and.returnValue(throwError('ERROR')); + comp.passwordForm.patchValue({ + newPassword: 'password', + confirmPassword: 'password' + }); + + comp.finishReset(); + tick(); + + expect(service.save).toHaveBeenCalledWith('XYZPDQ', 'password'); + expect(comp.success).toBe(false); + expect(comp.error).toBe(true); + }) + )); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/account/password-reset/init/password-reset-init.component.spec.ts b/borestop/src/test/javascript/spec/app/account/password-reset/init/password-reset-init.component.spec.ts new file mode 100644 index 00000000..abbe693c --- /dev/null +++ b/borestop/src/test/javascript/spec/app/account/password-reset/init/password-reset-init.component.spec.ts @@ -0,0 +1,66 @@ +import { ElementRef } from '@angular/core'; +import { ComponentFixture, TestBed, inject } from '@angular/core/testing'; +import { FormBuilder } from '@angular/forms'; +import { of, throwError } from 'rxjs'; + +import { BorestopTestModule } from '../../../../test.module'; +import { PasswordResetInitComponent } from 'app/account/password-reset/init/password-reset-init.component'; +import { PasswordResetInitService } from 'app/account/password-reset/init/password-reset-init.service'; + +describe('Component Tests', () => { + describe('PasswordResetInitComponent', () => { + let fixture: ComponentFixture<PasswordResetInitComponent>; + let comp: PasswordResetInitComponent; + + beforeEach(() => { + fixture = TestBed.configureTestingModule({ + imports: [BorestopTestModule], + declarations: [PasswordResetInitComponent], + providers: [FormBuilder] + }) + .overrideTemplate(PasswordResetInitComponent, '') + .createComponent(PasswordResetInitComponent); + comp = fixture.componentInstance; + }); + + it('sets focus after the view has been initialized', () => { + const node = { + focus(): void {} + }; + comp.email = new ElementRef(node); + spyOn(node, 'focus'); + + comp.ngAfterViewInit(); + + expect(node.focus).toHaveBeenCalled(); + }); + + it('notifies of success upon successful requestReset', inject([PasswordResetInitService], (service: PasswordResetInitService) => { + spyOn(service, 'save').and.returnValue(of({})); + comp.resetRequestForm.patchValue({ + email: 'user@domain.com' + }); + + comp.requestReset(); + + expect(service.save).toHaveBeenCalledWith('user@domain.com'); + expect(comp.success).toBe(true); + })); + + it('no notification of success upon error response', inject([PasswordResetInitService], (service: PasswordResetInitService) => { + spyOn(service, 'save').and.returnValue( + throwError({ + status: 503, + data: 'something else' + }) + ); + comp.resetRequestForm.patchValue({ + email: 'user@domain.com' + }); + comp.requestReset(); + + expect(service.save).toHaveBeenCalledWith('user@domain.com'); + expect(comp.success).toBe(false); + })); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/account/password/password-strength-bar.component.spec.ts b/borestop/src/test/javascript/spec/app/account/password/password-strength-bar.component.spec.ts new file mode 100644 index 00000000..ff1297e1 --- /dev/null +++ b/borestop/src/test/javascript/spec/app/account/password/password-strength-bar.component.spec.ts @@ -0,0 +1,48 @@ +import { ComponentFixture, TestBed, async } from '@angular/core/testing'; + +import { PasswordStrengthBarComponent } from 'app/account/password/password-strength-bar.component'; + +describe('Component Tests', () => { + describe('PasswordStrengthBarComponent', () => { + let comp: PasswordStrengthBarComponent; + let fixture: ComponentFixture<PasswordStrengthBarComponent>; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [PasswordStrengthBarComponent] + }) + .overrideTemplate(PasswordStrengthBarComponent, '') + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PasswordStrengthBarComponent); + comp = fixture.componentInstance; + }); + + describe('PasswordStrengthBarComponents', () => { + it('should initialize with default values', () => { + expect(comp.measureStrength('')).toBe(0); + expect(comp.colors).toEqual(['#F00', '#F90', '#FF0', '#9F0', '#0F0']); + expect(comp.getColor(0).idx).toBe(1); + expect(comp.getColor(0).color).toBe(comp.colors[0]); + }); + + it('should increase strength upon password value change', () => { + expect(comp.measureStrength('')).toBe(0); + expect(comp.measureStrength('aa')).toBeGreaterThanOrEqual(comp.measureStrength('')); + expect(comp.measureStrength('aa^6')).toBeGreaterThanOrEqual(comp.measureStrength('aa')); + expect(comp.measureStrength('Aa090(**)')).toBeGreaterThanOrEqual(comp.measureStrength('aa^6')); + expect(comp.measureStrength('Aa090(**)+-07365')).toBeGreaterThanOrEqual(comp.measureStrength('Aa090(**)')); + }); + + it('should change the color based on strength', () => { + expect(comp.getColor(0).color).toBe(comp.colors[0]); + expect(comp.getColor(11).color).toBe(comp.colors[1]); + expect(comp.getColor(22).color).toBe(comp.colors[2]); + expect(comp.getColor(33).color).toBe(comp.colors[3]); + expect(comp.getColor(44).color).toBe(comp.colors[4]); + }); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/account/password/password.component.spec.ts b/borestop/src/test/javascript/spec/app/account/password/password.component.spec.ts new file mode 100644 index 00000000..f367d788 --- /dev/null +++ b/borestop/src/test/javascript/spec/app/account/password/password.component.spec.ts @@ -0,0 +1,102 @@ +import { ComponentFixture, TestBed, async } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { FormBuilder } from '@angular/forms'; +import { of, throwError } from 'rxjs'; + +import { BorestopTestModule } from '../../../test.module'; +import { PasswordComponent } from 'app/account/password/password.component'; +import { PasswordService } from 'app/account/password/password.service'; + +describe('Component Tests', () => { + describe('PasswordComponent', () => { + let comp: PasswordComponent; + let fixture: ComponentFixture<PasswordComponent>; + let service: PasswordService; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [BorestopTestModule], + declarations: [PasswordComponent], + providers: [FormBuilder] + }) + .overrideTemplate(PasswordComponent, '') + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PasswordComponent); + comp = fixture.componentInstance; + service = fixture.debugElement.injector.get(PasswordService); + }); + + it('should show error if passwords do not match', () => { + // GIVEN + comp.passwordForm.patchValue({ + newPassword: 'password1', + confirmPassword: 'password2' + }); + // WHEN + comp.changePassword(); + // THEN + expect(comp.doNotMatch).toBe(true); + expect(comp.error).toBe(false); + expect(comp.success).toBe(false); + }); + + it('should call Auth.changePassword when passwords match', () => { + // GIVEN + const passwordValues = { + currentPassword: 'oldPassword', + newPassword: 'myPassword' + }; + + spyOn(service, 'save').and.returnValue(of(new HttpResponse({ body: true }))); + + comp.passwordForm.patchValue({ + currentPassword: passwordValues.currentPassword, + newPassword: passwordValues.newPassword, + confirmPassword: passwordValues.newPassword + }); + + // WHEN + comp.changePassword(); + + // THEN + expect(service.save).toHaveBeenCalledWith(passwordValues.newPassword, passwordValues.currentPassword); + }); + + it('should set success to true upon success', () => { + // GIVEN + spyOn(service, 'save').and.returnValue(of(new HttpResponse({ body: true }))); + comp.passwordForm.patchValue({ + newPassword: 'myPassword', + confirmPassword: 'myPassword' + }); + + // WHEN + comp.changePassword(); + + // THEN + expect(comp.doNotMatch).toBe(false); + expect(comp.error).toBe(false); + expect(comp.success).toBe(true); + }); + + it('should notify of error if change password fails', () => { + // GIVEN + spyOn(service, 'save').and.returnValue(throwError('ERROR')); + comp.passwordForm.patchValue({ + newPassword: 'myPassword', + confirmPassword: 'myPassword' + }); + + // WHEN + comp.changePassword(); + + // THEN + expect(comp.doNotMatch).toBe(false); + expect(comp.success).toBe(false); + expect(comp.error).toBe(true); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/account/register/register.component.spec.ts b/borestop/src/test/javascript/spec/app/account/register/register.component.spec.ts new file mode 100644 index 00000000..da8c51fc --- /dev/null +++ b/borestop/src/test/javascript/spec/app/account/register/register.component.spec.ts @@ -0,0 +1,137 @@ +import { ComponentFixture, TestBed, async, inject, tick, fakeAsync } from '@angular/core/testing'; +import { FormBuilder } from '@angular/forms'; +import { of, throwError } from 'rxjs'; +import { JhiLanguageService } from 'ng-jhipster'; + +import { MockLanguageService } from '../../../helpers/mock-language.service'; +import { BorestopTestModule } from '../../../test.module'; +import { EMAIL_ALREADY_USED_TYPE, LOGIN_ALREADY_USED_TYPE } from 'app/shared/constants/error.constants'; +import { RegisterService } from 'app/account/register/register.service'; +import { RegisterComponent } from 'app/account/register/register.component'; + +describe('Component Tests', () => { + describe('RegisterComponent', () => { + let fixture: ComponentFixture<RegisterComponent>; + let comp: RegisterComponent; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [BorestopTestModule], + declarations: [RegisterComponent], + providers: [FormBuilder] + }) + .overrideTemplate(RegisterComponent, '') + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(RegisterComponent); + comp = fixture.componentInstance; + }); + + it('should ensure the two passwords entered match', () => { + comp.registerForm.patchValue({ + password: 'password', + confirmPassword: 'non-matching' + }); + + comp.register(); + + expect(comp.doNotMatch).toBe(true); + }); + + it('should update success to true after creating an account', inject( + [RegisterService, JhiLanguageService], + fakeAsync((service: RegisterService, mockTranslate: MockLanguageService) => { + spyOn(service, 'save').and.returnValue(of({})); + comp.registerForm.patchValue({ + password: 'password', + confirmPassword: 'password' + }); + + comp.register(); + tick(); + + expect(service.save).toHaveBeenCalledWith({ + email: '', + password: 'password', + login: '', + langKey: 'en' + }); + expect(comp.success).toBe(true); + expect(mockTranslate.getCurrentLanguageSpy).toHaveBeenCalled(); + expect(comp.errorUserExists).toBe(false); + expect(comp.errorEmailExists).toBe(false); + expect(comp.error).toBe(false); + }) + )); + + it('should notify of user existence upon 400/login already in use', inject( + [RegisterService], + fakeAsync((service: RegisterService) => { + spyOn(service, 'save').and.returnValue( + throwError({ + status: 400, + error: { type: LOGIN_ALREADY_USED_TYPE } + }) + ); + comp.registerForm.patchValue({ + password: 'password', + confirmPassword: 'password' + }); + + comp.register(); + tick(); + + expect(comp.errorUserExists).toBe(true); + expect(comp.errorEmailExists).toBe(false); + expect(comp.error).toBe(false); + }) + )); + + it('should notify of email existence upon 400/email address already in use', inject( + [RegisterService], + fakeAsync((service: RegisterService) => { + spyOn(service, 'save').and.returnValue( + throwError({ + status: 400, + error: { type: EMAIL_ALREADY_USED_TYPE } + }) + ); + comp.registerForm.patchValue({ + password: 'password', + confirmPassword: 'password' + }); + + comp.register(); + tick(); + + expect(comp.errorEmailExists).toBe(true); + expect(comp.errorUserExists).toBe(false); + expect(comp.error).toBe(false); + }) + )); + + it('should notify of generic error', inject( + [RegisterService], + fakeAsync((service: RegisterService) => { + spyOn(service, 'save').and.returnValue( + throwError({ + status: 503 + }) + ); + comp.registerForm.patchValue({ + password: 'password', + confirmPassword: 'password' + }); + + comp.register(); + tick(); + + expect(comp.errorUserExists).toBe(false); + expect(comp.errorEmailExists).toBe(false); + expect(comp.error).toBe(true); + }) + )); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/account/settings/settings.component.spec.ts b/borestop/src/test/javascript/spec/app/account/settings/settings.component.spec.ts new file mode 100644 index 00000000..a6dd52ac --- /dev/null +++ b/borestop/src/test/javascript/spec/app/account/settings/settings.component.spec.ts @@ -0,0 +1,89 @@ +import { ComponentFixture, TestBed, async } from '@angular/core/testing'; +import { FormBuilder } from '@angular/forms'; +import { throwError, of } from 'rxjs'; + +import { BorestopTestModule } from '../../../test.module'; +import { AccountService } from 'app/core/auth/account.service'; +import { Account } from 'app/core/user/account.model'; +import { SettingsComponent } from 'app/account/settings/settings.component'; +import { MockAccountService } from '../../../helpers/mock-account.service'; + +describe('Component Tests', () => { + describe('SettingsComponent', () => { + let comp: SettingsComponent; + let fixture: ComponentFixture<SettingsComponent>; + let mockAuth: MockAccountService; + const accountValues: Account = { + firstName: 'John', + lastName: 'Doe', + activated: true, + email: 'john.doe@mail.com', + langKey: 'en', + login: 'john', + authorities: [], + imageUrl: '' + }; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [BorestopTestModule], + declarations: [SettingsComponent], + providers: [FormBuilder] + }) + .overrideTemplate(SettingsComponent, '') + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SettingsComponent); + comp = fixture.componentInstance; + mockAuth = TestBed.get(AccountService); + mockAuth.setIdentityResponse(accountValues); + }); + + it('should send the current identity upon save', () => { + // GIVEN + mockAuth.saveSpy.and.returnValue(of({})); + const settingsFormValues = { + firstName: 'John', + lastName: 'Doe', + email: 'john.doe@mail.com', + langKey: 'en' + }; + + // WHEN + comp.ngOnInit(); + comp.save(); + + // THEN + expect(mockAuth.identitySpy).toHaveBeenCalled(); + expect(mockAuth.saveSpy).toHaveBeenCalledWith(accountValues); + expect(mockAuth.authenticateSpy).toHaveBeenCalledWith(accountValues); + expect(comp.settingsForm.value).toEqual(settingsFormValues); + }); + + it('should notify of success upon successful save', () => { + // GIVEN + mockAuth.saveSpy.and.returnValue(of({})); + + // WHEN + comp.ngOnInit(); + comp.save(); + + // THEN + expect(comp.success).toBe(true); + }); + + it('should notify of error upon failed save', () => { + // GIVEN + mockAuth.saveSpy.and.returnValue(throwError('ERROR')); + + // WHEN + comp.ngOnInit(); + comp.save(); + + // THEN + expect(comp.success).toBe(false); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/admin/audits/audits.component.spec.ts b/borestop/src/test/javascript/spec/app/admin/audits/audits.component.spec.ts new file mode 100644 index 00000000..56197a0a --- /dev/null +++ b/borestop/src/test/javascript/spec/app/admin/audits/audits.component.spec.ts @@ -0,0 +1,204 @@ +import { ComponentFixture, TestBed, async } from '@angular/core/testing'; +import { HttpHeaders, HttpResponse } from '@angular/common/http'; +import { Router, ActivatedRoute } from '@angular/router'; +import { of } from 'rxjs'; +import { advanceTo } from 'jest-date-mock'; + +import { BorestopTestModule } from '../../../test.module'; +import { AuditsComponent } from 'app/admin/audits/audits.component'; +import { AuditsService } from 'app/admin/audits/audits.service'; +import { Audit } from 'app/admin/audits/audit.model'; +import { ITEMS_PER_PAGE } from 'app/shared/constants/pagination.constants'; +import { MockRouter, MockActivatedRoute } from '../../../helpers/mock-route.service'; + +function build2DigitsDatePart(datePart: number): string { + return `0${datePart}`.slice(-2); +} + +function getDate(isToday = true): string { + let date: Date = new Date(); + if (isToday) { + // Today + 1 day - needed if the current day must be included + date.setDate(date.getDate() + 1); + } else { + // get last month + if (date.getMonth() === 0) { + date = new Date(date.getFullYear() - 1, 11, date.getDate()); + } else { + date = new Date(date.getFullYear(), date.getMonth() - 1, date.getDate()); + } + } + const monthString = build2DigitsDatePart(date.getMonth() + 1); + const dateString = build2DigitsDatePart(date.getDate()); + return `${date.getFullYear()}-${monthString}-${dateString}`; +} + +describe('Component Tests', () => { + describe('AuditsComponent', () => { + let comp: AuditsComponent; + let fixture: ComponentFixture<AuditsComponent>; + let service: AuditsService; + let mockRouter: MockRouter; + let mockActivatedRoute: MockActivatedRoute; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [BorestopTestModule], + declarations: [AuditsComponent], + providers: [AuditsService] + }) + .overrideTemplate(AuditsComponent, '') + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AuditsComponent); + comp = fixture.componentInstance; + service = fixture.debugElement.injector.get(AuditsService); + mockRouter = TestBed.get(Router); + mockActivatedRoute = TestBed.get(ActivatedRoute); + }); + + describe('today function', () => { + it('should set toDate to current date', () => { + comp.ngOnInit(); + expect(comp.toDate).toBe(getDate()); + }); + + it('if current day is last day of month then should set toDate to first day of next month', () => { + advanceTo(new Date(2019, 0, 31, 0, 0, 0)); + comp.ngOnInit(); + expect(comp.toDate).toBe('2019-02-01'); + }); + + it('if current day is not last day of month then should set toDate to next day of current month', () => { + advanceTo(new Date(2019, 0, 27, 0, 0, 0)); + comp.ngOnInit(); + expect(comp.toDate).toBe('2019-01-28'); + }); + }); + + describe('previousMonth function', () => { + it('should set fromDate to previous month', () => { + comp.ngOnInit(); + expect(comp.fromDate).toBe(getDate(false)); + }); + + it('if current month is January then should set fromDate to previous year last month', () => { + advanceTo(new Date(2019, 0, 20, 0, 0, 0)); + comp.ngOnInit(); + expect(comp.fromDate).toBe('2018-12-20'); + }); + + it('if current month is not January then should set fromDate to current year previous month', () => { + advanceTo(new Date(2019, 1, 20, 0, 0, 0)); + comp.ngOnInit(); + expect(comp.fromDate).toBe('2019-01-20'); + }); + }); + + describe('By default, on init', () => { + it('should set all default values correctly', () => { + fixture.detectChanges(); + expect(comp.toDate).toBe(getDate()); + expect(comp.fromDate).toBe(getDate(false)); + expect(comp.itemsPerPage).toBe(ITEMS_PER_PAGE); + expect(comp.page).toBe(1); + expect(comp.ascending).toBe(false); + expect(comp.predicate).toBe('id'); + }); + }); + + describe('OnInit', () => { + it('Should call load all on init', () => { + // GIVEN + const headers = new HttpHeaders().append('X-Total-Count', '1'); + const audit = new Audit({ remoteAddress: '127.0.0.1', sessionId: '123' }, 'user', '20140101', 'AUTHENTICATION_SUCCESS'); + spyOn(service, 'query').and.returnValue( + of( + new HttpResponse({ + body: [audit], + headers + }) + ) + ); + + // WHEN + comp.ngOnInit(); + + // THEN + expect(service.query).toHaveBeenCalledTimes(1); + expect(comp.audits && comp.audits[0]).toEqual(jasmine.objectContaining(audit)); + expect(comp.totalItems).toBe(1); + }); + }); + + describe('Create sort object', () => { + beforeEach(() => { + spyOn(service, 'query').and.returnValue(of(new HttpResponse({ body: null }))); + }); + + it('Should sort only by id asc', () => { + // GIVEN + mockActivatedRoute.setParameters({ + sort: 'id,desc' + }); + + // WHEN + comp.ngOnInit(); + + // THEN + expect(service.query).toBeCalledWith( + expect.objectContaining({ + sort: ['id,desc'] + }) + ); + }); + + it('Should sort by timestamp asc then by id', () => { + // GIVEN + mockActivatedRoute.setParameters({ + sort: 'timestamp,asc' + }); + + // WHEN + comp.ngOnInit(); + + // THEN + expect(service.query).toBeCalledWith( + expect.objectContaining({ + sort: ['timestamp,asc', 'id'] + }) + ); + }); + }); + + describe('transition', () => { + it('Should not query data if fromDate and toDate are empty', () => { + // GIVEN + comp.toDate = ''; + comp.fromDate = ''; + + // WHEN + comp.transition(); + + // THEN + expect(comp.canLoad()).toBe(false); + expect(mockRouter.navigateSpy).not.toBeCalled(); + }); + + it('Should query data if fromDate and toDate are not empty', () => { + // GIVEN + comp.toDate = getDate(); + comp.fromDate = getDate(false); + + // WHEN + comp.transition(); + + // THEN + expect(comp.canLoad()).toBe(true); + expect(mockRouter.navigateSpy).toBeCalled(); + }); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/admin/audits/audits.service.spec.ts b/borestop/src/test/javascript/spec/app/admin/audits/audits.service.spec.ts new file mode 100644 index 00000000..d5073e2c --- /dev/null +++ b/borestop/src/test/javascript/spec/app/admin/audits/audits.service.spec.ts @@ -0,0 +1,70 @@ +import { TestBed } from '@angular/core/testing'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; +import { HttpResponse, HttpErrorResponse } from '@angular/common/http'; + +import { AuditsService, AuditsQuery } from 'app/admin/audits/audits.service'; +import { Audit } from 'app/admin/audits/audit.model'; +import { SERVER_API_URL } from 'app/app.constants'; + +describe('Service Tests', () => { + describe('Audits Service', () => { + let service: AuditsService; + let httpMock: HttpTestingController; + const fakeRequest: AuditsQuery = { page: 0, size: 0, sort: [], fromDate: '', toDate: '' }; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule] + }); + + service = TestBed.get(AuditsService); + httpMock = TestBed.get(HttpTestingController); + }); + + afterEach(() => { + httpMock.verify(); + }); + + describe('Service methods', () => { + it('should call correct URL', () => { + service.query(fakeRequest).subscribe(); + + const req = httpMock.expectOne({ method: 'GET' }); + const resourceUrl = SERVER_API_URL + 'management/audits'; + expect(req.request.url).toEqual(resourceUrl); + }); + + it('should return Audits', () => { + let expectedResult: HttpResponse<Audit[]> = new HttpResponse({ body: [] }); + const audit = new Audit({ remoteAddress: '127.0.0.1', sessionId: '123' }, 'user', '20140101', 'AUTHENTICATION_SUCCESS'); + + service.query(fakeRequest).subscribe(received => { + expectedResult = received; + }); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush([audit]); + let audits: Audit[] = []; + if (expectedResult.body !== null) { + audits = expectedResult.body; + } + expect(audits.length).toBe(1); + expect(audits[0]).toEqual(audit); + }); + + it('should propagate not found response', () => { + let expectedResult = 0; + service.query(fakeRequest).subscribe(null, (error: HttpErrorResponse) => { + expectedResult = error.status; + }); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush('Invalid request parameters', { + status: 404, + statusText: 'Bad Request' + }); + expect(expectedResult).toEqual(404); + }); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/admin/configuration/configuration.component.spec.ts b/borestop/src/test/javascript/spec/app/admin/configuration/configuration.component.spec.ts new file mode 100644 index 00000000..f26dc2bb --- /dev/null +++ b/borestop/src/test/javascript/spec/app/admin/configuration/configuration.component.spec.ts @@ -0,0 +1,68 @@ +import { ComponentFixture, TestBed, async } from '@angular/core/testing'; +import { of } from 'rxjs'; + +import { BorestopTestModule } from '../../../test.module'; +import { ConfigurationComponent } from 'app/admin/configuration/configuration.component'; +import { ConfigurationService, Bean, PropertySource } from 'app/admin/configuration/configuration.service'; + +describe('Component Tests', () => { + describe('ConfigurationComponent', () => { + let comp: ConfigurationComponent; + let fixture: ComponentFixture<ConfigurationComponent>; + let service: ConfigurationService; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [BorestopTestModule], + declarations: [ConfigurationComponent], + providers: [ConfigurationService] + }) + .overrideTemplate(ConfigurationComponent, '') + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ConfigurationComponent); + comp = fixture.componentInstance; + service = fixture.debugElement.injector.get(ConfigurationService); + }); + + describe('OnInit', () => { + it('Should call load all on init', () => { + // GIVEN + const beans: Bean[] = [ + { + prefix: 'jhipster', + properties: { + clientApp: { + name: 'jhipsterApp' + } + } + } + ]; + const propertySources: PropertySource[] = [ + { + name: 'server.ports', + properties: { + 'local.server.port': { + value: '8080' + } + } + } + ]; + spyOn(service, 'getBeans').and.returnValue(of(beans)); + spyOn(service, 'getPropertySources').and.returnValue(of(propertySources)); + + // WHEN + comp.ngOnInit(); + + // THEN + expect(service.getBeans).toHaveBeenCalled(); + expect(service.getPropertySources).toHaveBeenCalled(); + expect(comp.allBeans).toEqual(beans); + expect(comp.beans).toEqual(beans); + expect(comp.propertySources).toEqual(propertySources); + }); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/admin/configuration/configuration.service.spec.ts b/borestop/src/test/javascript/spec/app/admin/configuration/configuration.service.spec.ts new file mode 100644 index 00000000..2715a8fa --- /dev/null +++ b/borestop/src/test/javascript/spec/app/admin/configuration/configuration.service.spec.ts @@ -0,0 +1,81 @@ +import { TestBed } from '@angular/core/testing'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; + +import { ConfigurationService, ConfigProps, Env, Bean, PropertySource } from 'app/admin/configuration/configuration.service'; +import { SERVER_API_URL } from 'app/app.constants'; + +describe('Service Tests', () => { + describe('Logs Service', () => { + let service: ConfigurationService; + let httpMock: HttpTestingController; + let expectedResult: Bean[] | PropertySource[] | null; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule] + }); + + expectedResult = null; + service = TestBed.get(ConfigurationService); + httpMock = TestBed.get(HttpTestingController); + }); + + afterEach(() => { + httpMock.verify(); + }); + + describe('Service methods', () => { + it('should call correct URL', () => { + service.getBeans().subscribe(); + + const req = httpMock.expectOne({ method: 'GET' }); + const resourceUrl = SERVER_API_URL + 'management/configprops'; + expect(req.request.url).toEqual(resourceUrl); + }); + + it('should get the config', () => { + const bean: Bean = { + prefix: 'jhipster', + properties: { + clientApp: { + name: 'jhipsterApp' + } + } + }; + const configProps: ConfigProps = { + contexts: { + jhipster: { + beans: { + 'io.github.jhipster.config.JHipsterProperties': bean + } + } + } + }; + service.getBeans().subscribe(received => (expectedResult = received)); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush(configProps); + expect(expectedResult).toEqual([bean]); + }); + + it('should get the env', () => { + const propertySources: PropertySource[] = [ + { + name: 'server.ports', + properties: { + 'local.server.port': { + value: '8080' + } + } + } + ]; + const env: Env = { propertySources }; + service.getPropertySources().subscribe(received => (expectedResult = received)); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush(env); + expect(expectedResult).toEqual(propertySources); + }); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/admin/health/health.component.spec.ts b/borestop/src/test/javascript/spec/app/admin/health/health.component.spec.ts new file mode 100644 index 00000000..9d926e00 --- /dev/null +++ b/borestop/src/test/javascript/spec/app/admin/health/health.component.spec.ts @@ -0,0 +1,67 @@ +import { ComponentFixture, TestBed, async } from '@angular/core/testing'; +import { HttpErrorResponse } from '@angular/common/http'; +import { of, throwError } from 'rxjs'; + +import { BorestopTestModule } from '../../../test.module'; +import { HealthComponent } from 'app/admin/health/health.component'; +import { HealthService, Health } from 'app/admin/health/health.service'; + +describe('Component Tests', () => { + describe('HealthComponent', () => { + let comp: HealthComponent; + let fixture: ComponentFixture<HealthComponent>; + let service: HealthService; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [BorestopTestModule], + declarations: [HealthComponent] + }) + .overrideTemplate(HealthComponent, '') + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HealthComponent); + comp = fixture.componentInstance; + service = fixture.debugElement.injector.get(HealthService); + }); + + describe('getBadgeClass', () => { + it('should get badge class', () => { + const upBadgeClass = comp.getBadgeClass('UP'); + const downBadgeClass = comp.getBadgeClass('DOWN'); + expect(upBadgeClass).toEqual('badge-success'); + expect(downBadgeClass).toEqual('badge-danger'); + }); + }); + + describe('refresh', () => { + it('should call refresh on init', () => { + // GIVEN + const health: Health = { status: 'UP', components: { mail: { status: 'UP', details: 'mailDetails' } } }; + spyOn(service, 'checkHealth').and.returnValue(of(health)); + + // WHEN + comp.ngOnInit(); + + // THEN + expect(service.checkHealth).toHaveBeenCalled(); + expect(comp.health).toEqual(health); + }); + + it('should handle a 503 on refreshing health data', () => { + // GIVEN + const health: Health = { status: 'DOWN', components: { mail: { status: 'DOWN', details: 'mailDetails' } } }; + spyOn(service, 'checkHealth').and.returnValue(throwError(new HttpErrorResponse({ status: 503, error: health }))); + + // WHEN + comp.refresh(); + + // THEN + expect(service.checkHealth).toHaveBeenCalled(); + expect(comp.health).toEqual(health); + }); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/admin/logs/logs.component.spec.ts b/borestop/src/test/javascript/spec/app/admin/logs/logs.component.spec.ts new file mode 100644 index 00000000..b5acfc16 --- /dev/null +++ b/borestop/src/test/javascript/spec/app/admin/logs/logs.component.spec.ts @@ -0,0 +1,85 @@ +import { ComponentFixture, TestBed, async } from '@angular/core/testing'; +import { of } from 'rxjs'; + +import { BorestopTestModule } from '../../../test.module'; +import { LogsComponent } from 'app/admin/logs/logs.component'; +import { LogsService } from 'app/admin/logs/logs.service'; +import { Log } from 'app/admin/logs/log.model'; + +describe('Component Tests', () => { + describe('LogsComponent', () => { + let comp: LogsComponent; + let fixture: ComponentFixture<LogsComponent>; + let service: LogsService; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [BorestopTestModule], + declarations: [LogsComponent], + providers: [LogsService] + }) + .overrideTemplate(LogsComponent, '') + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(LogsComponent); + comp = fixture.componentInstance; + service = fixture.debugElement.injector.get(LogsService); + }); + + describe('OnInit', () => { + it('should set all default values correctly', () => { + expect(comp.filter).toBe(''); + expect(comp.orderProp).toBe('name'); + expect(comp.reverse).toBe(false); + }); + + it('Should call load all on init', () => { + // GIVEN + const log = new Log('main', 'WARN'); + spyOn(service, 'findAll').and.returnValue( + of({ + loggers: { + main: { + effectiveLevel: 'WARN' + } + } + }) + ); + + // WHEN + comp.ngOnInit(); + + // THEN + expect(service.findAll).toHaveBeenCalled(); + expect(comp.loggers && comp.loggers[0]).toEqual(jasmine.objectContaining(log)); + }); + }); + + describe('change log level', () => { + it('should change log level correctly', () => { + // GIVEN + const log = new Log('main', 'ERROR'); + spyOn(service, 'changeLevel').and.returnValue(of({})); + spyOn(service, 'findAll').and.returnValue( + of({ + loggers: { + main: { + effectiveLevel: 'ERROR' + } + } + }) + ); + + // WHEN + comp.changeLevel('main', 'ERROR'); + + // THEN + expect(service.changeLevel).toHaveBeenCalled(); + expect(service.findAll).toHaveBeenCalled(); + expect(comp.loggers && comp.loggers[0]).toEqual(jasmine.objectContaining(log)); + }); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/admin/logs/logs.service.spec.ts b/borestop/src/test/javascript/spec/app/admin/logs/logs.service.spec.ts new file mode 100644 index 00000000..bccec0db --- /dev/null +++ b/borestop/src/test/javascript/spec/app/admin/logs/logs.service.spec.ts @@ -0,0 +1,44 @@ +import { TestBed } from '@angular/core/testing'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; + +import { LogsService } from 'app/admin/logs/logs.service'; +import { SERVER_API_URL } from 'app/app.constants'; + +describe('Service Tests', () => { + describe('Logs Service', () => { + let service: LogsService; + let httpMock: HttpTestingController; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule] + }); + + service = TestBed.get(LogsService); + httpMock = TestBed.get(HttpTestingController); + }); + + afterEach(() => { + httpMock.verify(); + }); + + describe('Service methods', () => { + it('should call correct URL', () => { + service.findAll().subscribe(); + + const req = httpMock.expectOne({ method: 'GET' }); + const resourceUrl = SERVER_API_URL + 'management/loggers'; + expect(req.request.url).toEqual(resourceUrl); + }); + + it('should change log level', () => { + service.changeLevel('main', 'ERROR').subscribe(); + + const req = httpMock.expectOne({ method: 'POST' }); + const resourceUrl = SERVER_API_URL + 'management/loggers/main'; + expect(req.request.url).toEqual(resourceUrl); + expect(req.request.body).toEqual({ configuredLevel: 'ERROR' }); + }); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/admin/metrics/metrics.component.spec.ts b/borestop/src/test/javascript/spec/app/admin/metrics/metrics.component.spec.ts new file mode 100644 index 00000000..98adcf59 --- /dev/null +++ b/borestop/src/test/javascript/spec/app/admin/metrics/metrics.component.spec.ts @@ -0,0 +1,54 @@ +import { ComponentFixture, TestBed, async } from '@angular/core/testing'; +import { of } from 'rxjs'; + +import { BorestopTestModule } from '../../../test.module'; +import { MetricsComponent } from 'app/admin/metrics/metrics.component'; +import { MetricsService } from 'app/admin/metrics/metrics.service'; + +describe('Component Tests', () => { + describe('MetricsComponent', () => { + let comp: MetricsComponent; + let fixture: ComponentFixture<MetricsComponent>; + let service: MetricsService; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [BorestopTestModule], + declarations: [MetricsComponent] + }) + .overrideTemplate(MetricsComponent, '') + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(MetricsComponent); + comp = fixture.componentInstance; + service = fixture.debugElement.injector.get(MetricsService); + }); + + describe('refresh', () => { + it('should call refresh on init', () => { + // GIVEN + const response = { + timers: { + service: 'test', + unrelatedKey: 'test' + }, + gauges: { + 'jcache.statistics': { + value: 2 + }, + unrelatedKey: 'test' + } + }; + spyOn(service, 'getMetrics').and.returnValue(of(response)); + + // WHEN + comp.ngOnInit(); + + // THEN + expect(service.getMetrics).toHaveBeenCalled(); + }); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/admin/metrics/metrics.service.spec.ts b/borestop/src/test/javascript/spec/app/admin/metrics/metrics.service.spec.ts new file mode 100644 index 00000000..c86b4af4 --- /dev/null +++ b/borestop/src/test/javascript/spec/app/admin/metrics/metrics.service.spec.ts @@ -0,0 +1,68 @@ +import { TestBed } from '@angular/core/testing'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; + +import { MetricsService, Metrics, ThreadDump } from 'app/admin/metrics/metrics.service'; +import { SERVER_API_URL } from 'app/app.constants'; + +describe('Service Tests', () => { + describe('Logs Service', () => { + let service: MetricsService; + let httpMock: HttpTestingController; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule] + }); + service = TestBed.get(MetricsService); + httpMock = TestBed.get(HttpTestingController); + }); + + afterEach(() => { + httpMock.verify(); + }); + + describe('Service methods', () => { + it('should call correct URL', () => { + service.getMetrics().subscribe(); + + const req = httpMock.expectOne({ method: 'GET' }); + const resourceUrl = SERVER_API_URL + 'management/jhimetrics'; + expect(req.request.url).toEqual(resourceUrl); + }); + + it('should return Metrics', () => { + let expectedResult: Metrics | null = null; + const metrics: Metrics = { + jvm: {}, + 'http.server.requests': {}, + cache: {}, + services: {}, + databases: {}, + garbageCollector: {}, + processMetrics: {} + }; + + service.getMetrics().subscribe(received => { + expectedResult = received; + }); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush(metrics); + expect(expectedResult).toEqual(metrics); + }); + + it('should return Thread Dump', () => { + let expectedResult: ThreadDump | null = null; + const dump: ThreadDump = { threads: [{ name: 'test1', threadState: 'RUNNABLE' }] }; + + service.threadDump().subscribe(received => { + expectedResult = received; + }); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush(dump); + expect(expectedResult).toEqual(dump); + }); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/admin/user-management/user-management-delete-dialog.component.spec.ts b/borestop/src/test/javascript/spec/app/admin/user-management/user-management-delete-dialog.component.spec.ts new file mode 100644 index 00000000..bf01424c --- /dev/null +++ b/borestop/src/test/javascript/spec/app/admin/user-management/user-management-delete-dialog.component.spec.ts @@ -0,0 +1,56 @@ +import { ComponentFixture, TestBed, async, inject, fakeAsync, tick } from '@angular/core/testing'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; +import { of } from 'rxjs'; +import { JhiEventManager } from 'ng-jhipster'; + +import { BorestopTestModule } from '../../../test.module'; +import { MockEventManager } from '../../../helpers/mock-event-manager.service'; +import { MockActiveModal } from '../../../helpers/mock-active-modal.service'; +import { UserManagementDeleteDialogComponent } from 'app/admin/user-management/user-management-delete-dialog.component'; +import { UserService } from 'app/core/user/user.service'; + +describe('Component Tests', () => { + describe('User Management Delete Component', () => { + let comp: UserManagementDeleteDialogComponent; + let fixture: ComponentFixture<UserManagementDeleteDialogComponent>; + let service: UserService; + let mockEventManager: MockEventManager; + let mockActiveModal: MockActiveModal; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [BorestopTestModule], + declarations: [UserManagementDeleteDialogComponent] + }) + .overrideTemplate(UserManagementDeleteDialogComponent, '') + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(UserManagementDeleteDialogComponent); + comp = fixture.componentInstance; + service = fixture.debugElement.injector.get(UserService); + mockEventManager = TestBed.get(JhiEventManager); + mockActiveModal = TestBed.get(NgbActiveModal); + }); + + describe('confirmDelete', () => { + it('Should call delete service on confirmDelete', inject( + [], + fakeAsync(() => { + // GIVEN + spyOn(service, 'delete').and.returnValue(of({})); + + // WHEN + comp.confirmDelete('user'); + tick(); + + // THEN + expect(service.delete).toHaveBeenCalledWith('user'); + expect(mockActiveModal.closeSpy).toHaveBeenCalled(); + expect(mockEventManager.broadcastSpy).toHaveBeenCalled(); + }) + )); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/admin/user-management/user-management-detail.component.spec.ts b/borestop/src/test/javascript/spec/app/admin/user-management/user-management-detail.component.spec.ts new file mode 100644 index 00000000..d2ab2b9a --- /dev/null +++ b/borestop/src/test/javascript/spec/app/admin/user-management/user-management-detail.component.spec.ts @@ -0,0 +1,62 @@ +import { ComponentFixture, TestBed, async } from '@angular/core/testing'; +import { ActivatedRoute } from '@angular/router'; +import { of } from 'rxjs'; + +import { Authority } from 'app/shared/constants/authority.constants'; +import { BorestopTestModule } from '../../../test.module'; +import { UserManagementDetailComponent } from 'app/admin/user-management/user-management-detail.component'; +import { User } from 'app/core/user/user.model'; + +describe('Component Tests', () => { + describe('User Management Detail Component', () => { + let comp: UserManagementDetailComponent; + let fixture: ComponentFixture<UserManagementDetailComponent>; + const route: ActivatedRoute = ({ + data: of({ user: new User(1, 'user', 'first', 'last', 'first@last.com', true, 'en', [Authority.USER], 'admin') }) + } as any) as ActivatedRoute; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [BorestopTestModule], + declarations: [UserManagementDetailComponent], + providers: [ + { + provide: ActivatedRoute, + useValue: route + } + ] + }) + .overrideTemplate(UserManagementDetailComponent, '') + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(UserManagementDetailComponent); + comp = fixture.componentInstance; + }); + + describe('OnInit', () => { + it('Should call load all on init', () => { + // GIVEN + + // WHEN + comp.ngOnInit(); + + // THEN + expect(comp.user).toEqual( + jasmine.objectContaining({ + id: 1, + login: 'user', + firstName: 'first', + lastName: 'last', + email: 'first@last.com', + activated: true, + langKey: 'en', + authorities: [Authority.USER], + createdBy: 'admin' + }) + ); + }); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/admin/user-management/user-management-update.component.spec.ts b/borestop/src/test/javascript/spec/app/admin/user-management/user-management-update.component.spec.ts new file mode 100644 index 00000000..66910b8b --- /dev/null +++ b/borestop/src/test/javascript/spec/app/admin/user-management/user-management-update.component.spec.ts @@ -0,0 +1,104 @@ +import { ComponentFixture, TestBed, async, inject, fakeAsync, tick } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { FormBuilder } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { of } from 'rxjs'; + +import { Authority } from 'app/shared/constants/authority.constants'; +import { BorestopTestModule } from '../../../test.module'; +import { UserManagementUpdateComponent } from 'app/admin/user-management/user-management-update.component'; +import { UserService } from 'app/core/user/user.service'; +import { User } from 'app/core/user/user.model'; + +describe('Component Tests', () => { + describe('User Management Update Component', () => { + let comp: UserManagementUpdateComponent; + let fixture: ComponentFixture<UserManagementUpdateComponent>; + let service: UserService; + const route: ActivatedRoute = ({ + data: of({ user: new User(1, 'user', 'first', 'last', 'first@last.com', true, 'en', [Authority.USER], 'admin') }) + } as any) as ActivatedRoute; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [BorestopTestModule], + declarations: [UserManagementUpdateComponent], + providers: [ + FormBuilder, + { + provide: ActivatedRoute, + useValue: route + } + ] + }) + .overrideTemplate(UserManagementUpdateComponent, '') + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(UserManagementUpdateComponent); + comp = fixture.componentInstance; + service = fixture.debugElement.injector.get(UserService); + }); + + describe('OnInit', () => { + it('Should load authorities and language on init', inject( + [], + fakeAsync(() => { + // GIVEN + spyOn(service, 'authorities').and.returnValue(of(['USER'])); + + // WHEN + comp.ngOnInit(); + + // THEN + expect(service.authorities).toHaveBeenCalled(); + expect(comp.authorities).toEqual(['USER']); + }) + )); + }); + + describe('save', () => { + it('Should call update service on save for existing user', inject( + [], + fakeAsync(() => { + // GIVEN + const entity = new User(123); + spyOn(service, 'update').and.returnValue( + of( + new HttpResponse({ + body: entity + }) + ) + ); + comp.user = entity; + comp.editForm.patchValue({ id: entity.id }); + // WHEN + comp.save(); + tick(); // simulate async + + // THEN + expect(service.update).toHaveBeenCalledWith(entity); + expect(comp.isSaving).toEqual(false); + }) + )); + + it('Should call create service on save for new user', inject( + [], + fakeAsync(() => { + // GIVEN + const entity = new User(); + spyOn(service, 'create').and.returnValue(of(new HttpResponse({ body: entity }))); + comp.user = entity; + // WHEN + comp.save(); + tick(); // simulate async + + // THEN + expect(service.create).toHaveBeenCalledWith(entity); + expect(comp.isSaving).toEqual(false); + }) + )); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/admin/user-management/user-management.component.spec.ts b/borestop/src/test/javascript/spec/app/admin/user-management/user-management.component.spec.ts new file mode 100644 index 00000000..97d0c108 --- /dev/null +++ b/borestop/src/test/javascript/spec/app/admin/user-management/user-management.component.spec.ts @@ -0,0 +1,86 @@ +import { ComponentFixture, TestBed, async, inject, fakeAsync, tick } from '@angular/core/testing'; +import { HttpHeaders, HttpResponse } from '@angular/common/http'; +import { of } from 'rxjs'; + +import { BorestopTestModule } from '../../../test.module'; +import { UserManagementComponent } from 'app/admin/user-management/user-management.component'; +import { UserService } from 'app/core/user/user.service'; +import { User } from 'app/core/user/user.model'; + +describe('Component Tests', () => { + describe('User Management Component', () => { + let comp: UserManagementComponent; + let fixture: ComponentFixture<UserManagementComponent>; + let service: UserService; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [BorestopTestModule], + declarations: [UserManagementComponent] + }) + .overrideTemplate(UserManagementComponent, '') + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(UserManagementComponent); + comp = fixture.componentInstance; + service = fixture.debugElement.injector.get(UserService); + }); + + describe('OnInit', () => { + it('Should call load all on init', inject( + [], + fakeAsync(() => { + // GIVEN + const headers = new HttpHeaders().append('link', 'link;link'); + spyOn(service, 'query').and.returnValue( + of( + new HttpResponse({ + body: [new User(123)], + headers + }) + ) + ); + + // WHEN + comp.ngOnInit(); + tick(); // simulate async + + // THEN + expect(service.query).toHaveBeenCalled(); + expect(comp.users && comp.users[0]).toEqual(jasmine.objectContaining({ id: 123 })); + }) + )); + }); + + describe('setActive', () => { + it('Should update user and call load all', inject( + [], + fakeAsync(() => { + // GIVEN + const headers = new HttpHeaders().append('link', 'link;link'); + const user = new User(123); + spyOn(service, 'query').and.returnValue( + of( + new HttpResponse({ + body: [user], + headers + }) + ) + ); + spyOn(service, 'update').and.returnValue(of(new HttpResponse({ status: 200 }))); + + // WHEN + comp.setActive(user, true); + tick(); // simulate async + + // THEN + expect(service.update).toHaveBeenCalledWith({ ...user, activated: true }); + expect(service.query).toHaveBeenCalled(); + expect(comp.users && comp.users[0]).toEqual(jasmine.objectContaining({ id: 123 })); + }) + )); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/core/login/login-modal.service.spec.ts b/borestop/src/test/javascript/spec/app/core/login/login-modal.service.spec.ts new file mode 100644 index 00000000..d0d386ad --- /dev/null +++ b/borestop/src/test/javascript/spec/app/core/login/login-modal.service.spec.ts @@ -0,0 +1,48 @@ +import { TestBed } from '@angular/core/testing'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; + +import { LoginModalService } from 'app/core/login/login-modal.service'; + +// Mock class for NgbModalRef +export class MockNgbModalRef { + result: Promise<any> = new Promise(resolve => resolve('x')); +} + +describe('Service Tests', () => { + describe('Login Modal Service', () => { + let service: LoginModalService; + let modalService: NgbModal; + + beforeEach(() => { + service = TestBed.get(LoginModalService); + modalService = TestBed.get(NgbModal); + }); + + describe('Service methods', () => { + it('Should call open method for NgbModal when open method is called', () => { + // GIVEN + const mockModalRef: MockNgbModalRef = new MockNgbModalRef(); + spyOn(modalService, 'open').and.returnValue(mockModalRef); + + // WHEN + service.open(); + + // THEN + expect(modalService.open).toHaveBeenCalled(); + }); + + it('Should call open method for NgbModal one time when open method is called twice', () => { + // GIVEN + const mockModalRef: MockNgbModalRef = new MockNgbModalRef(); + spyOn(modalService, 'open').and.returnValue(mockModalRef); + + // WHEN + service.open(); + service.open(); + + // THEN + expect(modalService.open).toHaveBeenCalledTimes(1); + }); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/core/user/account.service.spec.ts b/borestop/src/test/javascript/spec/app/core/user/account.service.spec.ts new file mode 100644 index 00000000..f5e11671 --- /dev/null +++ b/borestop/src/test/javascript/spec/app/core/user/account.service.spec.ts @@ -0,0 +1,214 @@ +import { Router } from '@angular/router'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; +import { TestBed } from '@angular/core/testing'; +import { JhiDateUtils, JhiLanguageService } from 'ng-jhipster'; +import { NgxWebstorageModule } from 'ngx-webstorage'; + +import { SERVER_API_URL } from 'app/app.constants'; +import { AccountService } from 'app/core/auth/account.service'; +import { Account } from 'app/core/user/account.model'; +import { Authority } from 'app/shared/constants/authority.constants'; +import { StateStorageService } from 'app/core/auth/state-storage.service'; +import { MockLanguageService } from '../../../helpers/mock-language.service'; +import { MockRouter } from '../../../helpers/mock-route.service'; +import { MockStateStorageService } from '../../../helpers/mock-state-storage.service'; + +function accountWithAuthorities(authorities: string[]): Account { + return { + activated: true, + authorities, + email: '', + firstName: '', + langKey: '', + lastName: '', + login: '', + imageUrl: '' + }; +} + +describe('Service Tests', () => { + describe('Account Service', () => { + let service: AccountService; + let httpMock: HttpTestingController; + let storageService: MockStateStorageService; + let router: MockRouter; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule, NgxWebstorageModule.forRoot()], + providers: [ + JhiDateUtils, + { + provide: JhiLanguageService, + useClass: MockLanguageService + }, + { + provide: StateStorageService, + useClass: MockStateStorageService + }, + { + provide: Router, + useClass: MockRouter + } + ] + }); + + service = TestBed.get(AccountService); + httpMock = TestBed.get(HttpTestingController); + storageService = TestBed.get(StateStorageService); + router = TestBed.get(Router); + }); + + afterEach(() => { + httpMock.verify(); + }); + + describe('authenticate', () => { + it('authenticationState should emit null if input is null', () => { + // GIVEN + let userIdentity: Account | null = accountWithAuthorities([]); + service.getAuthenticationState().subscribe(account => (userIdentity = account)); + + // WHEN + service.authenticate(null); + + // THEN + expect(userIdentity).toBeNull(); + expect(service.isAuthenticated()).toBe(false); + }); + + it('authenticationState should emit the same account as was in input parameter', () => { + // GIVEN + const expectedResult = accountWithAuthorities([]); + let userIdentity: Account | null = null; + service.getAuthenticationState().subscribe(account => (userIdentity = account)); + + // WHEN + service.authenticate(expectedResult); + + // THEN + expect(userIdentity).toEqual(expectedResult); + expect(service.isAuthenticated()).toBe(true); + }); + }); + + describe('identity', () => { + it('should call /account if user is undefined', () => { + service.identity().subscribe(); + const req = httpMock.expectOne({ method: 'GET' }); + const resourceUrl = SERVER_API_URL + 'api/account'; + + expect(req.request.url).toEqual(`${resourceUrl}`); + }); + + it('should call /account only once if not logged out after first authentication and should call /account again if user has logged out', () => { + // Given the user is authenticated + service.identity().subscribe(); + httpMock.expectOne({ method: 'GET' }).flush({}); + + // When I call + service.identity().subscribe(); + + // Then there is no second request + httpMock.expectNone({ method: 'GET' }); + + // When I log out + service.authenticate(null); + // and then call + service.identity().subscribe(); + + // Then there is a new request + httpMock.expectOne({ method: 'GET' }); + }); + + describe('navigateToStoredUrl', () => { + it('should navigate to the previous stored url post successful authentication', () => { + // GIVEN + storageService.setResponse('admin/users?page=0'); + + // WHEN + service.identity().subscribe(); + httpMock.expectOne({ method: 'GET' }).flush({}); + + // THEN + expect(storageService.getUrlSpy).toHaveBeenCalledTimes(1); + expect(storageService.clearUrlSpy).toHaveBeenCalledTimes(1); + expect(router.navigateByUrlSpy).toHaveBeenCalledWith('admin/users?page=0'); + }); + + it('should not navigate to the previous stored url when authentication fails', () => { + // WHEN + service.identity().subscribe(); + httpMock.expectOne({ method: 'GET' }).error(new ErrorEvent('')); + + // THEN + expect(storageService.getUrlSpy).not.toHaveBeenCalled(); + expect(storageService.clearUrlSpy).not.toHaveBeenCalled(); + expect(router.navigateByUrlSpy).not.toHaveBeenCalled(); + }); + + it('should not navigate to the previous stored url when no such url exists post successful authentication', () => { + // GIVEN + storageService.setResponse(null); + + // WHEN + service.identity().subscribe(); + httpMock.expectOne({ method: 'GET' }).flush({}); + + // THEN + expect(storageService.getUrlSpy).toHaveBeenCalledTimes(1); + expect(storageService.clearUrlSpy).not.toHaveBeenCalled(); + expect(router.navigateByUrlSpy).not.toHaveBeenCalled(); + }); + }); + }); + + describe('hasAnyAuthority', () => { + describe('hasAnyAuthority string parameter', () => { + it('should return false if user is not logged', () => { + const hasAuthority = service.hasAnyAuthority(Authority.USER); + expect(hasAuthority).toBe(false); + }); + + it('should return false if user is logged and has not authority', () => { + service.authenticate(accountWithAuthorities([Authority.USER])); + + const hasAuthority = service.hasAnyAuthority(Authority.ADMIN); + + expect(hasAuthority).toBe(false); + }); + + it('should return true if user is logged and has authority', () => { + service.authenticate(accountWithAuthorities([Authority.USER])); + + const hasAuthority = service.hasAnyAuthority(Authority.USER); + + expect(hasAuthority).toBe(true); + }); + }); + + describe('hasAnyAuthority array parameter', () => { + it('should return false if user is not logged', () => { + const hasAuthority = service.hasAnyAuthority([Authority.USER]); + expect(hasAuthority).toBeFalsy(); + }); + + it('should return false if user is logged and has not authority', () => { + service.authenticate(accountWithAuthorities([Authority.USER])); + + const hasAuthority = service.hasAnyAuthority([Authority.ADMIN]); + + expect(hasAuthority).toBe(false); + }); + + it('should return true if user is logged and has authority', () => { + service.authenticate(accountWithAuthorities([Authority.USER])); + + const hasAuthority = service.hasAnyAuthority([Authority.USER, Authority.ADMIN]); + + expect(hasAuthority).toBe(true); + }); + }); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/core/user/user.service.spec.ts b/borestop/src/test/javascript/spec/app/core/user/user.service.spec.ts new file mode 100644 index 00000000..2811acbf --- /dev/null +++ b/borestop/src/test/javascript/spec/app/core/user/user.service.spec.ts @@ -0,0 +1,79 @@ +import { TestBed } from '@angular/core/testing'; +import { HttpErrorResponse } from '@angular/common/http'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; +import { JhiDateUtils } from 'ng-jhipster'; + +import { Authority } from 'app/shared/constants/authority.constants'; +import { UserService } from 'app/core/user/user.service'; +import { User } from 'app/core/user/user.model'; +import { SERVER_API_URL } from 'app/app.constants'; + +describe('Service Tests', () => { + describe('User Service', () => { + let service: UserService; + let httpMock: HttpTestingController; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [JhiDateUtils] + }); + + service = TestBed.get(UserService); + httpMock = TestBed.get(HttpTestingController); + }); + + afterEach(() => { + httpMock.verify(); + }); + + describe('Service methods', () => { + it('should call correct URL', () => { + service.find('user').subscribe(); + + const req = httpMock.expectOne({ method: 'GET' }); + const resourceUrl = SERVER_API_URL + 'api/users'; + expect(req.request.url).toEqual(`${resourceUrl}/user`); + }); + + it('should return User', () => { + let expectedResult: string | undefined; + + service.find('user').subscribe(received => { + expectedResult = received.login; + }); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush(new User(1, 'user')); + expect(expectedResult).toEqual('user'); + }); + + it('should return Authorities', () => { + let expectedResult: string[] = []; + + service.authorities().subscribe(authorities => { + expectedResult = authorities; + }); + const req = httpMock.expectOne({ method: 'GET' }); + + req.flush([Authority.USER, Authority.ADMIN]); + expect(expectedResult).toEqual([Authority.USER, Authority.ADMIN]); + }); + + it('should propagate not found response', () => { + let expectedResult = 0; + + service.find('user').subscribe(null, (error: HttpErrorResponse) => { + expectedResult = error.status; + }); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush('Invalid request parameters', { + status: 404, + statusText: 'Bad Request' + }); + expect(expectedResult).toEqual(404); + }); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/home/home.component.spec.ts b/borestop/src/test/javascript/spec/app/home/home.component.spec.ts new file mode 100644 index 00000000..e1a99ac8 --- /dev/null +++ b/borestop/src/test/javascript/spec/app/home/home.component.spec.ts @@ -0,0 +1,55 @@ +import { ComponentFixture, TestBed, async } from '@angular/core/testing'; + +import { BorestopTestModule } from '../../test.module'; +import { HomeComponent } from 'app/home/home.component'; +import { AccountService } from 'app/core/auth/account.service'; +import { LoginModalService } from 'app/core/login/login-modal.service'; + +describe('Component Tests', () => { + describe('Home Component', () => { + let comp: HomeComponent; + let fixture: ComponentFixture<HomeComponent>; + let accountService: AccountService; + let loginModalService: LoginModalService; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [BorestopTestModule], + declarations: [HomeComponent] + }) + .overrideTemplate(HomeComponent, '') + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HomeComponent); + comp = fixture.componentInstance; + accountService = TestBed.get(AccountService); + loginModalService = TestBed.get(LoginModalService); + }); + + it('Should call accountService.getAuthenticationState on init', () => { + // WHEN + comp.ngOnInit(); + + // THEN + expect(accountService.getAuthenticationState).toHaveBeenCalled(); + }); + + it('Should call accountService.isAuthenticated when it checks authentication', () => { + // WHEN + comp.isAuthenticated(); + + // THEN + expect(accountService.isAuthenticated).toHaveBeenCalled(); + }); + + it('Should call loginModalService.open on login', () => { + // WHEN + comp.login(); + + // THEN + expect(loginModalService.open).toHaveBeenCalled(); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/layouts/main/main.component.spec.ts b/borestop/src/test/javascript/spec/app/layouts/main/main.component.spec.ts new file mode 100644 index 00000000..0d68e74b --- /dev/null +++ b/borestop/src/test/javascript/spec/app/layouts/main/main.component.spec.ts @@ -0,0 +1,183 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { Router, RouterEvent, NavigationEnd } from '@angular/router'; +import { Title } from '@angular/platform-browser'; +import { Subject, of } from 'rxjs'; +import { TranslateModule, TranslateService, LangChangeEvent } from '@ngx-translate/core'; + +import { MainComponent } from 'app/layouts/main/main.component'; +import { BorestopTestModule } from '../../../test.module'; +import { MockRouter } from '../../../helpers/mock-route.service'; + +describe('Component Tests', () => { + describe('MainComponent', () => { + let comp: MainComponent; + let fixture: ComponentFixture<MainComponent>; + let router: MockRouter; + const routerEventsSubject = new Subject<RouterEvent>(); + let titleService: Title; + let translateService: TranslateService; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [BorestopTestModule, TranslateModule.forRoot()], + declarations: [MainComponent], + providers: [Title] + }) + .overrideTemplate(MainComponent, '') + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(MainComponent); + comp = fixture.componentInstance; + router = TestBed.get(Router); + router.setEvents(routerEventsSubject.asObservable()); + titleService = TestBed.get(Title); + translateService = TestBed.get(TranslateService); + }); + + describe('page title', () => { + let routerState: any; + const defaultPageTitle = 'global.title'; + const parentRoutePageTitle = 'parentTitle'; + const childRoutePageTitle = 'childTitle'; + const navigationEnd = new NavigationEnd(1, '', ''); + const langChangeEvent: LangChangeEvent = { lang: 'en', translations: null }; + + beforeEach(() => { + routerState = { snapshot: { root: {} } }; + router.setRouterState(routerState); + spyOn(translateService, 'get').and.callFake((key: string) => { + return of(key + ' translated'); + }); + translateService.currentLang = 'en'; + spyOn(titleService, 'setTitle'); + comp.ngOnInit(); + }); + + describe('navigation end', () => { + it('should set page title to default title if pageTitle is missing on routes', () => { + // WHEN + routerEventsSubject.next(navigationEnd); + + // THEN + expect(translateService.get).toHaveBeenCalledWith(defaultPageTitle); + expect(titleService.setTitle).toHaveBeenCalledWith(defaultPageTitle + ' translated'); + }); + + it('should set page title to root route pageTitle if there is no child routes', () => { + // GIVEN + routerState.snapshot.root.data = { pageTitle: parentRoutePageTitle }; + + // WHEN + routerEventsSubject.next(navigationEnd); + + // THEN + expect(translateService.get).toHaveBeenCalledWith(parentRoutePageTitle); + expect(titleService.setTitle).toHaveBeenCalledWith(parentRoutePageTitle + ' translated'); + }); + + it('should set page title to child route pageTitle if child routes exist and pageTitle is set for child route', () => { + // GIVEN + routerState.snapshot.root.data = { pageTitle: parentRoutePageTitle }; + routerState.snapshot.root.firstChild = { data: { pageTitle: childRoutePageTitle } }; + + // WHEN + routerEventsSubject.next(navigationEnd); + + // THEN + expect(translateService.get).toHaveBeenCalledWith(childRoutePageTitle); + expect(titleService.setTitle).toHaveBeenCalledWith(childRoutePageTitle + ' translated'); + }); + + it('should set page title to parent route pageTitle if child routes exists but pageTitle is not set for child route data', () => { + // GIVEN + routerState.snapshot.root.data = { pageTitle: parentRoutePageTitle }; + routerState.snapshot.root.firstChild = { data: {} }; + + // WHEN + routerEventsSubject.next(navigationEnd); + + // THEN + expect(translateService.get).toHaveBeenCalledWith(parentRoutePageTitle); + expect(titleService.setTitle).toHaveBeenCalledWith(parentRoutePageTitle + ' translated'); + }); + + it('should set page title to parent route pageTitle if child routes exists but data is not set for child route', () => { + // GIVEN + routerState.snapshot.root.data = { pageTitle: parentRoutePageTitle }; + routerState.snapshot.root.firstChild = {}; + + // WHEN + routerEventsSubject.next(navigationEnd); + + // THEN + expect(translateService.get).toHaveBeenCalledWith(parentRoutePageTitle); + expect(titleService.setTitle).toHaveBeenCalledWith(parentRoutePageTitle + ' translated'); + }); + }); + + describe('language change', () => { + it('should set page title to default title if pageTitle is missing on routes', () => { + // WHEN + translateService.onLangChange.emit(langChangeEvent); + + // THEN + expect(translateService.get).toHaveBeenCalledWith(defaultPageTitle); + expect(titleService.setTitle).toHaveBeenCalledWith(defaultPageTitle + ' translated'); + }); + + it('should set page title to root route pageTitle if there is no child routes', () => { + // GIVEN + routerState.snapshot.root.data = { pageTitle: parentRoutePageTitle }; + + // WHEN + translateService.onLangChange.emit(langChangeEvent); + + // THEN + expect(translateService.get).toHaveBeenCalledWith(parentRoutePageTitle); + expect(titleService.setTitle).toHaveBeenCalledWith(parentRoutePageTitle + ' translated'); + }); + + it('should set page title to child route pageTitle if child routes exist and pageTitle is set for child route', () => { + // GIVEN + routerState.snapshot.root.data = { pageTitle: parentRoutePageTitle }; + routerState.snapshot.root.firstChild = { data: { pageTitle: childRoutePageTitle } }; + + // WHEN + translateService.onLangChange.emit(langChangeEvent); + + // THEN + expect(translateService.get).toHaveBeenCalledWith(childRoutePageTitle); + expect(titleService.setTitle).toHaveBeenCalledWith(childRoutePageTitle + ' translated'); + }); + + it('should set page title to parent route pageTitle if child routes exists but pageTitle is not set for child route data', () => { + // GIVEN + routerState.snapshot.root.data = { pageTitle: parentRoutePageTitle }; + routerState.snapshot.root.firstChild = { data: {} }; + + // WHEN + translateService.onLangChange.emit(langChangeEvent); + + // THEN + expect(translateService.get).toHaveBeenCalledWith(parentRoutePageTitle); + expect(titleService.setTitle).toHaveBeenCalledWith(parentRoutePageTitle + ' translated'); + }); + + it('should set page title to parent route pageTitle if child routes exists but data is not set for child route', () => { + // GIVEN + routerState.snapshot.root.data = { pageTitle: parentRoutePageTitle }; + routerState.snapshot.root.firstChild = {}; + + // WHEN + translateService.onLangChange.emit(langChangeEvent); + + // THEN + expect(translateService.get).toHaveBeenCalledWith(parentRoutePageTitle); + expect(titleService.setTitle).toHaveBeenCalledWith(parentRoutePageTitle + ' translated'); + }); + }); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/layouts/navbar/navbar.component.spec.ts b/borestop/src/test/javascript/spec/app/layouts/navbar/navbar.component.spec.ts new file mode 100644 index 00000000..ab8fc448 --- /dev/null +++ b/borestop/src/test/javascript/spec/app/layouts/navbar/navbar.component.spec.ts @@ -0,0 +1,52 @@ +import { ComponentFixture, TestBed, async } from '@angular/core/testing'; +import { of } from 'rxjs'; + +import { BorestopTestModule } from '../../../test.module'; +import { ProfileInfo } from 'app/layouts/profiles/profile-info.model'; +import { NavbarComponent } from 'app/layouts/navbar/navbar.component'; +import { AccountService } from 'app/core/auth/account.service'; +import { ProfileService } from 'app/layouts/profiles/profile.service'; + +describe('Component Tests', () => { + describe('Navbar Component', () => { + let comp: NavbarComponent; + let fixture: ComponentFixture<NavbarComponent>; + let accountService: AccountService; + let profileService: ProfileService; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [BorestopTestModule], + declarations: [NavbarComponent] + }) + .overrideTemplate(NavbarComponent, '') + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(NavbarComponent); + comp = fixture.componentInstance; + accountService = TestBed.get(AccountService); + profileService = TestBed.get(ProfileService); + }); + + it('Should call profileService.getProfileInfo on init', () => { + // GIVEN + spyOn(profileService, 'getProfileInfo').and.returnValue(of(new ProfileInfo())); + + // WHEN + comp.ngOnInit(); + + // THEN + expect(profileService.getProfileInfo).toHaveBeenCalled(); + }); + + it('Should call accountService.isAuthenticated on authentication', () => { + // WHEN + comp.isAuthenticated(); + + // THEN + expect(accountService.isAuthenticated).toHaveBeenCalled(); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/shared/alert/alert-error.component.spec.ts b/borestop/src/test/javascript/spec/app/shared/alert/alert-error.component.spec.ts new file mode 100644 index 00000000..73e58918 --- /dev/null +++ b/borestop/src/test/javascript/spec/app/shared/alert/alert-error.component.spec.ts @@ -0,0 +1,141 @@ +import { ComponentFixture, TestBed, async } from '@angular/core/testing'; +import { HttpErrorResponse, HttpHeaders } from '@angular/common/http'; +import { JhiAlertService, JhiEventManager } from 'ng-jhipster'; +import { TranslateModule } from '@ngx-translate/core'; + +import { BorestopTestModule } from '../../../test.module'; +import { AlertErrorComponent } from 'app/shared/alert/alert-error.component'; +import { MockAlertService } from '../../../helpers/mock-alert.service'; + +describe('Component Tests', () => { + describe('Alert Error Component', () => { + let comp: AlertErrorComponent; + let fixture: ComponentFixture<AlertErrorComponent>; + let eventManager: JhiEventManager; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [BorestopTestModule, TranslateModule.forRoot()], + declarations: [AlertErrorComponent], + providers: [ + JhiEventManager, + { + provide: JhiAlertService, + useClass: MockAlertService + } + ] + }) + .overrideTemplate(AlertErrorComponent, '') + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AlertErrorComponent); + comp = fixture.componentInstance; + eventManager = fixture.debugElement.injector.get(JhiEventManager); + }); + + describe('Error Handling', () => { + it('Should display an alert on status 0', () => { + // GIVEN + eventManager.broadcast({ name: 'borestopApp.httpError', content: { status: 0 } }); + // THEN + expect(comp.alerts.length).toBe(1); + expect(comp.alerts[0].msg).toBe('error.server.not.reachable'); + }); + + it('Should display an alert on status 404', () => { + // GIVEN + eventManager.broadcast({ name: 'borestopApp.httpError', content: { status: 404 } }); + // THEN + expect(comp.alerts.length).toBe(1); + expect(comp.alerts[0].msg).toBe('error.url.not.found'); + }); + + it('Should display an alert on generic error', () => { + // GIVEN + eventManager.broadcast({ name: 'borestopApp.httpError', content: { error: { message: 'Error Message' } } }); + eventManager.broadcast({ name: 'borestopApp.httpError', content: { error: 'Second Error Message' } }); + // THEN + expect(comp.alerts.length).toBe(2); + expect(comp.alerts[0].msg).toBe('Error Message'); + expect(comp.alerts[1].msg).toBe('Second Error Message'); + }); + + it('Should display an alert on status 400 for generic error', () => { + // GIVEN + const response = new HttpErrorResponse({ + url: 'http://localhost:8080/api/foos', + headers: new HttpHeaders(), + status: 400, + statusText: 'Bad Request', + error: { + type: 'https://www.jhipster.tech/problem/constraint-violation', + title: 'Bad Request', + status: 400, + path: '/api/foos', + message: 'error.validation' + } + }); + eventManager.broadcast({ name: 'borestopApp.httpError', content: response }); + // THEN + expect(comp.alerts.length).toBe(1); + expect(comp.alerts[0].msg).toBe('error.validation'); + }); + + it('Should display an alert on status 400 for generic error without message', () => { + // GIVEN + const response = new HttpErrorResponse({ + url: 'http://localhost:8080/api/foos', + headers: new HttpHeaders(), + status: 400, + error: 'Bad Request' + }); + eventManager.broadcast({ name: 'borestopApp.httpError', content: response }); + // THEN + expect(comp.alerts.length).toBe(1); + expect(comp.alerts[0].msg).toBe('Bad Request'); + }); + + it('Should display an alert on status 400 for invalid parameters', () => { + // GIVEN + const response = new HttpErrorResponse({ + url: 'http://localhost:8080/api/foos', + headers: new HttpHeaders(), + status: 400, + statusText: 'Bad Request', + error: { + type: 'https://www.jhipster.tech/problem/constraint-violation', + title: 'Method argument not valid', + status: 400, + path: '/api/foos', + message: 'error.validation', + fieldErrors: [{ objectName: 'foo', field: 'minField', message: 'Min' }] + } + }); + eventManager.broadcast({ name: 'borestopApp.httpError', content: response }); + // THEN + expect(comp.alerts.length).toBe(1); + expect(comp.alerts[0].msg).toBe('error.Size'); + }); + + it('Should display an alert on status 400 for error headers', () => { + // GIVEN + const response = new HttpErrorResponse({ + url: 'http://localhost:8080/api/foos', + headers: new HttpHeaders().append('app-error', 'Error Message').append('app-params', 'foo'), + status: 400, + statusText: 'Bad Request', + error: { + status: 400, + message: 'error.validation' + } + }); + eventManager.broadcast({ name: 'borestopApp.httpError', content: response }); + // THEN + expect(comp.alerts.length).toBe(1); + expect(comp.alerts[0].msg).toBe('Error Message'); + }); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/shared/alert/alert.component.spec.ts b/borestop/src/test/javascript/spec/app/shared/alert/alert.component.spec.ts new file mode 100644 index 00000000..36cdb5f2 --- /dev/null +++ b/borestop/src/test/javascript/spec/app/shared/alert/alert.component.spec.ts @@ -0,0 +1,44 @@ +import { ComponentFixture, TestBed, async } from '@angular/core/testing'; +import { JhiAlertService } from 'ng-jhipster'; + +import { BorestopTestModule } from '../../../test.module'; +import { AlertComponent } from 'app/shared/alert/alert.component'; + +describe('Component Tests', () => { + describe('Alert Component', () => { + let comp: AlertComponent; + let fixture: ComponentFixture<AlertComponent>; + let alertService: JhiAlertService; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [BorestopTestModule], + declarations: [AlertComponent] + }) + .overrideTemplate(AlertComponent, '') + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AlertComponent); + comp = fixture.componentInstance; + alertService = TestBed.get(JhiAlertService); + }); + + it('Should call alertService.get on init', () => { + // WHEN + comp.ngOnInit(); + + // THEN + expect(alertService.get).toHaveBeenCalled(); + }); + + it('Should call alertService.clear on destroy', () => { + // WHEN + comp.ngOnDestroy(); + + // THEN + expect(alertService.clear).toHaveBeenCalled(); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/shared/login/login.component.spec.ts b/borestop/src/test/javascript/spec/app/shared/login/login.component.spec.ts new file mode 100644 index 00000000..96fd89e1 --- /dev/null +++ b/borestop/src/test/javascript/spec/app/shared/login/login.component.spec.ts @@ -0,0 +1,116 @@ +import { ComponentFixture, TestBed, async, inject, fakeAsync, tick } from '@angular/core/testing'; +import { FormBuilder } from '@angular/forms'; +import { Router } from '@angular/router'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +import { LoginService } from 'app/core/login/login.service'; +import { LoginModalComponent } from 'app/shared/login/login.component'; +import { BorestopTestModule } from '../../../test.module'; +import { MockLoginService } from '../../../helpers/mock-login.service'; +import { MockRouter } from '../../../helpers/mock-route.service'; +import { MockActiveModal } from '../../../helpers/mock-active-modal.service'; + +describe('Component Tests', () => { + describe('LoginComponent', () => { + let comp: LoginModalComponent; + let fixture: ComponentFixture<LoginModalComponent>; + let mockLoginService: MockLoginService; + let mockRouter: MockRouter; + let mockActiveModal: MockActiveModal; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [BorestopTestModule], + declarations: [LoginModalComponent], + providers: [ + FormBuilder, + { + provide: LoginService, + useClass: MockLoginService + } + ] + }) + .overrideTemplate(LoginModalComponent, '') + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(LoginModalComponent); + comp = fixture.componentInstance; + mockLoginService = TestBed.get(LoginService); + mockRouter = TestBed.get(Router); + mockActiveModal = TestBed.get(NgbActiveModal); + }); + + it('should authenticate the user', inject( + [], + fakeAsync(() => { + // GIVEN + const credentials = { + username: 'admin', + password: 'admin', + rememberMe: true + }; + + comp.loginForm.patchValue({ + username: 'admin', + password: 'admin', + rememberMe: true + }); + mockLoginService.setResponse({}); + mockRouter.url = '/admin/metrics'; + + // WHEN/ + comp.login(); + tick(); // simulate async + + // THEN + expect(comp.authenticationError).toEqual(false); + expect(mockActiveModal.closeSpy).toHaveBeenCalled(); + expect(mockLoginService.loginSpy).toHaveBeenCalledWith(credentials); + }) + )); + + it('should empty the credentials upon cancel', () => { + // GIVEN + comp.loginForm.patchValue({ + username: 'admin', + password: 'admin' + }); + + const expected = { + username: '', + password: '', + rememberMe: false + }; + + // WHEN + comp.cancel(); + + // THEN + expect(comp.authenticationError).toEqual(false); + expect(comp.loginForm.get('username')!.value).toEqual(expected.username); + expect(comp.loginForm.get('password')!.value).toEqual(expected.password); + expect(comp.loginForm.get('rememberMe')!.value).toEqual(expected.rememberMe); + expect(mockActiveModal.dismissSpy).toHaveBeenCalledWith('cancel'); + }); + + it('should redirect user when register', () => { + // WHEN + comp.register(); + + // THEN + expect(mockActiveModal.dismissSpy).toHaveBeenCalledWith('to state register'); + expect(mockRouter.navigateSpy).toHaveBeenCalledWith(['/account/register']); + }); + + it('should redirect user when request password', () => { + // WHEN + comp.requestResetPassword(); + + // THEN + expect(mockActiveModal.dismissSpy).toHaveBeenCalledWith('to state requestReset'); + expect(mockRouter.navigateSpy).toHaveBeenCalledWith(['/account/reset', 'request']); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/helpers/mock-account.service.ts b/borestop/src/test/javascript/spec/helpers/mock-account.service.ts new file mode 100644 index 00000000..b75655c5 --- /dev/null +++ b/borestop/src/test/javascript/spec/helpers/mock-account.service.ts @@ -0,0 +1,31 @@ +import Spy = jasmine.Spy; +import { of } from 'rxjs'; + +import { SpyObject } from './spyobject'; +import { AccountService } from 'app/core/auth/account.service'; +import { Account } from 'app/core/user/account.model'; + +export class MockAccountService extends SpyObject { + getSpy: Spy; + saveSpy: Spy; + authenticateSpy: Spy; + identitySpy: Spy; + getAuthenticationStateSpy: Spy; + isAuthenticated: Spy; + + constructor() { + super(AccountService); + + this.getSpy = this.spy('get').andReturn(this); + this.saveSpy = this.spy('save').andReturn(this); + this.authenticateSpy = this.spy('authenticate').andReturn(this); + this.identitySpy = this.spy('identity').andReturn(of(null)); + this.getAuthenticationStateSpy = this.spy('getAuthenticationState').andReturn(of(null)); + this.isAuthenticated = this.spy('isAuthenticated').andReturn(true); + } + + setIdentityResponse(account: Account | null): void { + this.identitySpy = this.spy('identity').andReturn(of(account)); + this.getAuthenticationStateSpy = this.spy('getAuthenticationState').andReturn(of(account)); + } +} diff --git a/borestop/src/test/javascript/spec/helpers/mock-active-modal.service.ts b/borestop/src/test/javascript/spec/helpers/mock-active-modal.service.ts new file mode 100644 index 00000000..bd32d740 --- /dev/null +++ b/borestop/src/test/javascript/spec/helpers/mock-active-modal.service.ts @@ -0,0 +1,15 @@ +import Spy = jasmine.Spy; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +import { SpyObject } from './spyobject'; + +export class MockActiveModal extends SpyObject { + dismissSpy: Spy; + closeSpy: Spy; + + constructor() { + super(NgbActiveModal); + this.dismissSpy = this.spy('dismiss').andReturn(this); + this.closeSpy = this.spy('close').andReturn(this); + } +} diff --git a/borestop/src/test/javascript/spec/helpers/mock-alert.service.ts b/borestop/src/test/javascript/spec/helpers/mock-alert.service.ts new file mode 100644 index 00000000..2bf77246 --- /dev/null +++ b/borestop/src/test/javascript/spec/helpers/mock-alert.service.ts @@ -0,0 +1,13 @@ +import { JhiAlertService, JhiAlert } from 'ng-jhipster'; + +import { SpyObject } from './spyobject'; + +export class MockAlertService extends SpyObject { + constructor() { + super(JhiAlertService); + } + + addAlert(alertOptions: JhiAlert): JhiAlert { + return alertOptions; + } +} diff --git a/borestop/src/test/javascript/spec/helpers/mock-event-manager.service.ts b/borestop/src/test/javascript/spec/helpers/mock-event-manager.service.ts new file mode 100644 index 00000000..4a8f56ae --- /dev/null +++ b/borestop/src/test/javascript/spec/helpers/mock-event-manager.service.ts @@ -0,0 +1,13 @@ +import Spy = jasmine.Spy; +import { JhiEventManager } from 'ng-jhipster'; + +import { SpyObject } from './spyobject'; + +export class MockEventManager extends SpyObject { + broadcastSpy: Spy; + + constructor() { + super(JhiEventManager); + this.broadcastSpy = this.spy('broadcast').andReturn(this); + } +} diff --git a/borestop/src/test/javascript/spec/helpers/mock-language.service.ts b/borestop/src/test/javascript/spec/helpers/mock-language.service.ts new file mode 100644 index 00000000..2438a44f --- /dev/null +++ b/borestop/src/test/javascript/spec/helpers/mock-language.service.ts @@ -0,0 +1,14 @@ +import Spy = jasmine.Spy; +import { JhiLanguageService } from 'ng-jhipster'; + +import { SpyObject } from './spyobject'; + +export class MockLanguageService extends SpyObject { + getCurrentLanguageSpy: Spy; + + constructor() { + super(JhiLanguageService); + + this.getCurrentLanguageSpy = this.spy('getCurrentLanguage').andReturn('en'); + } +} diff --git a/borestop/src/test/javascript/spec/helpers/mock-login-modal.service.ts b/borestop/src/test/javascript/spec/helpers/mock-login-modal.service.ts new file mode 100644 index 00000000..1c0f7c35 --- /dev/null +++ b/borestop/src/test/javascript/spec/helpers/mock-login-modal.service.ts @@ -0,0 +1,14 @@ +import Spy = jasmine.Spy; + +import { SpyObject } from './spyobject'; +import { LoginModalService } from 'app/core/login/login-modal.service'; + +export class MockLoginModalService extends SpyObject { + open: Spy; + + constructor() { + super(LoginModalService); + + this.open = this.spy('open'); + } +} diff --git a/borestop/src/test/javascript/spec/helpers/mock-login.service.ts b/borestop/src/test/javascript/spec/helpers/mock-login.service.ts new file mode 100644 index 00000000..a75a8004 --- /dev/null +++ b/borestop/src/test/javascript/spec/helpers/mock-login.service.ts @@ -0,0 +1,27 @@ +import Spy = jasmine.Spy; +import { of } from 'rxjs'; + +import { SpyObject } from './spyobject'; +import { LoginService } from 'app/core/login/login.service'; + +export class MockLoginService extends SpyObject { + loginSpy: Spy; + logoutSpy: Spy; + registerSpy: Spy; + requestResetPasswordSpy: Spy; + cancelSpy: Spy; + + constructor() { + super(LoginService); + + this.loginSpy = this.spy('login').andReturn(of({})); + this.logoutSpy = this.spy('logout').andReturn(this); + this.registerSpy = this.spy('register').andReturn(this); + this.requestResetPasswordSpy = this.spy('requestResetPassword').andReturn(this); + this.cancelSpy = this.spy('cancel').andReturn(this); + } + + setResponse(json: any): void { + this.loginSpy = this.spy('login').andReturn(of(json)); + } +} diff --git a/borestop/src/test/javascript/spec/helpers/mock-route.service.ts b/borestop/src/test/javascript/spec/helpers/mock-route.service.ts new file mode 100644 index 00000000..e0458630 --- /dev/null +++ b/borestop/src/test/javascript/spec/helpers/mock-route.service.ts @@ -0,0 +1,50 @@ +import Spy = jasmine.Spy; +import { ActivatedRoute, Router, RouterEvent, Data, Params } from '@angular/router'; +import { Observable, ReplaySubject } from 'rxjs'; + +import { SpyObject } from './spyobject'; + +export class MockActivatedRoute extends ActivatedRoute { + private queryParamsSubject = new ReplaySubject<Params>(); + private paramSubject = new ReplaySubject<Params>(); + private dataSubject = new ReplaySubject<Data>(); + + constructor(parameters: Params) { + super(); + this.queryParams = this.queryParamsSubject.asObservable(); + this.params = this.paramSubject.asObservable(); + this.data = this.dataSubject.asObservable(); + this.setParameters(parameters); + } + + setParameters(parameters: Params): void { + this.queryParamsSubject.next(parameters); + this.paramSubject.next(parameters); + this.dataSubject.next({ + ...parameters, + defaultSort: 'id,desc' + }); + } +} + +export class MockRouter extends SpyObject { + navigateSpy: Spy; + navigateByUrlSpy: Spy; + events: Observable<RouterEvent> | null = null; + routerState: any; + url = ''; + + constructor() { + super(Router); + this.navigateSpy = this.spy('navigate'); + this.navigateByUrlSpy = this.spy('navigateByUrl'); + } + + setEvents(events: Observable<RouterEvent>): void { + this.events = events; + } + + setRouterState(routerState: any): void { + this.routerState = routerState; + } +} diff --git a/borestop/src/test/javascript/spec/helpers/mock-state-storage.service.ts b/borestop/src/test/javascript/spec/helpers/mock-state-storage.service.ts new file mode 100644 index 00000000..1a23343d --- /dev/null +++ b/borestop/src/test/javascript/spec/helpers/mock-state-storage.service.ts @@ -0,0 +1,21 @@ +import Spy = jasmine.Spy; + +import { SpyObject } from './spyobject'; +import { StateStorageService } from 'app/core/auth/state-storage.service'; + +export class MockStateStorageService extends SpyObject { + getUrlSpy: Spy; + storeUrlSpy: Spy; + clearUrlSpy: Spy; + + constructor() { + super(StateStorageService); + this.getUrlSpy = this.spy('getUrl').andReturn(null); + this.storeUrlSpy = this.spy('storeUrl').andReturn(this); + this.clearUrlSpy = this.spy('clearUrl').andReturn(this); + } + + setResponse(previousUrl: string | null): void { + this.getUrlSpy = this.spy('getUrl').andReturn(previousUrl); + } +} diff --git a/borestop/src/test/javascript/spec/helpers/spyobject.ts b/borestop/src/test/javascript/spec/helpers/spyobject.ts new file mode 100644 index 00000000..eeb221a9 --- /dev/null +++ b/borestop/src/test/javascript/spec/helpers/spyobject.ts @@ -0,0 +1,48 @@ +export interface GuinessCompatibleSpy extends jasmine.Spy { + /** By chaining the spy with and.returnValue, all calls to the function will return a specific + * value. */ + andReturn(val: any): GuinessCompatibleSpy; + /** By chaining the spy with and.callFake, all calls to the spy will delegate to the supplied + * function. */ + andCallFake(fn: Function): GuinessCompatibleSpy; + /** removes all recorded calls */ + reset(): void; +} + +export class SpyObject { + constructor(type?: any) { + if (type) { + Object.keys(type.prototype).forEach(prop => { + let m = null; + try { + m = type.prototype[prop]; + } catch (e) { + // As we are creating spys for abstract classes, + // these classes might have getters that throw when they are accessed. + // As we are only auto creating spys for methods, this + // should not matter. + } + if (typeof m === 'function') { + this.spy(prop); + } + }); + } + } + + spy(name: string): GuinessCompatibleSpy { + if (!this[name]) { + this[name] = this.createGuinnessCompatibleSpy(name); + } + return this[name]; + } + + private createGuinnessCompatibleSpy(name: string): GuinessCompatibleSpy { + const newSpy: GuinessCompatibleSpy = jasmine.createSpy(name) as any; + newSpy.andCallFake = newSpy.and.callFake as any; + newSpy.andReturn = newSpy.and.returnValue as any; + newSpy.reset = newSpy.calls.reset as any; + // revisit return null here (previously needed for rtts_assert). + newSpy.and.returnValue(null); + return newSpy; + } +} diff --git a/borestop/src/test/javascript/spec/test.module.ts b/borestop/src/test/javascript/spec/test.module.ts new file mode 100644 index 00000000..0e044235 --- /dev/null +++ b/borestop/src/test/javascript/spec/test.module.ts @@ -0,0 +1,72 @@ +import { DatePipe } from '@angular/common'; +import { ActivatedRoute, Router } from '@angular/router'; +import { NgModule } from '@angular/core'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { NgbActiveModal, NgbModal } from '@ng-bootstrap/ng-bootstrap'; +import { SessionStorageService, LocalStorageService } from 'ngx-webstorage'; +import { JhiLanguageService, JhiDataUtils, JhiDateUtils, JhiEventManager, JhiAlertService, JhiParseLinks } from 'ng-jhipster'; + +import { MockLanguageService } from './helpers/mock-language.service'; +import { AccountService } from 'app/core/auth/account.service'; +import { LoginModalService } from 'app/core/login/login-modal.service'; +import { MockLoginModalService } from './helpers/mock-login-modal.service'; +import { MockAccountService } from './helpers/mock-account.service'; +import { MockActivatedRoute, MockRouter } from './helpers/mock-route.service'; +import { MockActiveModal } from './helpers/mock-active-modal.service'; +import { MockAlertService } from './helpers/mock-alert.service'; +import { MockEventManager } from './helpers/mock-event-manager.service'; + +@NgModule({ + providers: [ + DatePipe, + JhiDataUtils, + JhiDateUtils, + JhiParseLinks, + { + provide: JhiLanguageService, + useClass: MockLanguageService + }, + { + provide: JhiEventManager, + useClass: MockEventManager + }, + { + provide: NgbActiveModal, + useClass: MockActiveModal + }, + { + provide: ActivatedRoute, + useValue: new MockActivatedRoute({ id: 123 }) + }, + { + provide: Router, + useClass: MockRouter + }, + { + provide: AccountService, + useClass: MockAccountService + }, + { + provide: LoginModalService, + useClass: MockLoginModalService + }, + { + provide: JhiAlertService, + useClass: MockAlertService + }, + { + provide: NgbModal, + useValue: null + }, + { + provide: SessionStorageService, + useValue: null + }, + { + provide: LocalStorageService, + useValue: null + } + ], + imports: [HttpClientTestingModule] +}) +export class BorestopTestModule {} diff --git a/borestop/src/test/resources/config/application-testcontainers.yml b/borestop/src/test/resources/config/application-testcontainers.yml new file mode 100644 index 00000000..81aafc15 --- /dev/null +++ b/borestop/src/test/resources/config/application-testcontainers.yml @@ -0,0 +1,22 @@ +# =================================================================== +# Spring Boot configuration. +# +# This configuration is used for unit/integration tests with testcontainers database containers. +# +# To activate this configuration launch integration tests with the 'testcontainers' profile +# +# More information on database containers: https://www.testcontainers.org/modules/databases/ +# =================================================================== + +spring: + datasource: + type: com.zaxxer.hikari.HikariDataSource + driver-class-name: org.testcontainers.jdbc.ContainerDatabaseDriver + url: jdbc:tc:postgresql:latest:///borestop?TC_TMPFS=/testtmpfs:rw + username: borestop + password: + hikari: + poolName: Hikari + auto-commit: false + jpa: + database-platform: io.github.jhipster.domain.util.FixedPostgreSQL10Dialect diff --git a/borestop/src/test/resources/config/application.yml b/borestop/src/test/resources/config/application.yml new file mode 100644 index 00000000..5eb3945b --- /dev/null +++ b/borestop/src/test/resources/config/application.yml @@ -0,0 +1,117 @@ +# =================================================================== +# Spring Boot configuration. +# +# This configuration is used for unit/integration tests. +# +# More information on profiles: https://www.jhipster.tech/profiles/ +# More information on configuration properties: https://www.jhipster.tech/common-application-properties/ +# =================================================================== + +# =================================================================== +# Standard Spring Boot properties. +# Full reference is available at: +# http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html +# =================================================================== + +spring: + profiles: + # Uncomment the following line to enable tests against production database type rather than H2, using Testcontainers + #active: testcontainers + application: + name: borestop + datasource: + type: com.zaxxer.hikari.HikariDataSource + url: jdbc:h2:mem:borestop;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE + name: + username: + password: + hikari: + auto-commit: false + jackson: + serialization: + write-durations-as-timestamps: false + jpa: + database-platform: io.github.jhipster.domain.util.FixedH2Dialect + open-in-view: false + show-sql: false + hibernate: + ddl-auto: none + naming: + physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy + implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy + properties: + hibernate.id.new_generator_mappings: true + hibernate.connection.provider_disables_autocommit: true + hibernate.cache.use_second_level_cache: false + hibernate.cache.use_query_cache: false + hibernate.generate_statistics: false + hibernate.hbm2ddl.auto: validate + hibernate.jdbc.time_zone: UTC + liquibase: + contexts: test + mail: + host: localhost + main: + allow-bean-definition-overriding: true + messages: + basename: i18n/messages + task: + execution: + thread-name-prefix: borestop-task- + pool: + core-size: 1 + max-size: 50 + queue-capacity: 10000 + scheduling: + thread-name-prefix: borestop-scheduling- + pool: + size: 1 + thymeleaf: + mode: HTML + +server: + port: 10344 + address: localhost + +# =================================================================== +# JHipster specific properties +# +# Full reference is available at: https://www.jhipster.tech/common-application-properties/ +# =================================================================== + +jhipster: + clientApp: + name: 'borestopApp' + logging: + # To test json console appender + use-json-format: false + logstash: + enabled: false + host: localhost + port: 5000 + queue-size: 512 + mail: + from: test@localhost + base-url: http://127.0.0.1:8080 + security: + authentication: + jwt: + # This token must be encoded using Base64 (you can type `echo 'secret-key'|base64` on your command line) + base64-secret: NzdiMjRkMmMxZDNkMGY2ZWIyYTcxYWNhYzM4YTBiZjMzOWQzZDQyM2VjY2UwOGRlZDVjZTNiOTdkMWMzNWEzZGNkNzg4YTk2ZDFhZWYwMjUxZjU1ZWFiY2U1ZjA2ZDI1MzFiNTJmMTk5NzE2ZmIzMTE0YzMwYTMzODliYzhhY2E= + # Token is valid 24 hours + token-validity-in-seconds: 86400 + metrics: + logs: # Reports metrics in the logs + enabled: true + report-frequency: 60 # in seconds + +# =================================================================== +# Application specific properties +# Add your own application properties here, see the ApplicationProperties class +# to have type-safe configuration, like in the JHipsterProperties above +# +# More documentation is available at: +# https://www.jhipster.tech/common-application-properties/ +# =================================================================== + +# application: diff --git a/borestop/src/test/resources/i18n/messages_en.properties b/borestop/src/test/resources/i18n/messages_en.properties new file mode 100644 index 00000000..7b3fbb99 --- /dev/null +++ b/borestop/src/test/resources/i18n/messages_en.properties @@ -0,0 +1,4 @@ +email.test.title=test title +# Value used for English locale unit test in MailServiceIT +# as this file is loaded instead of real file +email.activation.title=borestop account activation diff --git a/borestop/src/test/resources/logback.xml b/borestop/src/test/resources/logback.xml new file mode 100644 index 00000000..8d334f26 --- /dev/null +++ b/borestop/src/test/resources/logback.xml @@ -0,0 +1,47 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE configuration> + +<configuration scan="true"> + <include resource="org/springframework/boot/logging/logback/base.xml"/> + + <logger name="com.ippon.borestop" level="INFO"/> + + <logger name="io.github.jhipster" level="WARN"/> + + <logger name="javax.activation" level="WARN"/> + <logger name="javax.mail" level="WARN"/> + <logger name="javax.xml.bind" level="WARN"/> + <logger name="ch.qos.logback" level="WARN"/> + <logger name="com.ryantenney" level="WARN"/> + <logger name="com.sun" level="WARN"/> + <logger name="com.zaxxer" level="WARN"/> + <logger name="com.github.dockerjava" level="WARN"/> + <logger name="org.testcontainers" level="WARN"/> + <logger name="io.undertow" level="WARN"/> + <logger name="io.undertow.websockets.jsr" level="ERROR"/> + <logger name="org.apache" level="WARN"/> + <logger name="org.apache.catalina.startup.DigesterFactory" level="OFF"/> + <logger name="org.bson" level="WARN"/> + <logger name="org.hibernate.validator" level="WARN"/> + <logger name="org.hibernate" level="WARN"/> + <logger name="org.hibernate.ejb.HibernatePersistence" level="OFF"/> + <logger name="org.postgresql.jdbc" level="WARN"/> + <logger name="org.springframework" level="WARN"/> + <logger name="org.springframework.web" level="WARN"/> + <logger name="org.springframework.security" level="WARN"/> + <logger name="org.springframework.cache" level="WARN"/> + <logger name="org.thymeleaf" level="WARN"/> + <logger name="org.xnio" level="WARN"/> + <logger name="springfox" level="WARN"/> + <logger name="sun.rmi" level="WARN"/> + <logger name="liquibase" level="WARN"/> + <logger name="LiquibaseSchemaResolver" level="INFO"/> + <logger name="sun.rmi.transport" level="WARN"/> + <logger name="com.tngtech.archunit.core.importer" level="ERROR"/> + + <root> + <level>WARN</level> + <appender-ref ref="CONSOLE"/> + </root> + +</configuration> diff --git a/borestop/src/test/resources/templates/mail/testEmail.html b/borestop/src/test/resources/templates/mail/testEmail.html new file mode 100644 index 00000000..a4ca16a7 --- /dev/null +++ b/borestop/src/test/resources/templates/mail/testEmail.html @@ -0,0 +1 @@ +<html xmlns:th="http://www.thymeleaf.org" th:text="|#{email.test.title}, ${baseUrl}, ${user.login}|"></html> diff --git a/borestop/tsconfig.app.json b/borestop/tsconfig.app.json new file mode 100644 index 00000000..5c33c96b --- /dev/null +++ b/borestop/tsconfig.app.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.base.json", + "files": ["src/main/webapp/app/app.main.ts"] +} diff --git a/borestop/tsconfig.base.json b/borestop/tsconfig.base.json new file mode 100644 index 00000000..afc0bb2a --- /dev/null +++ b/borestop/tsconfig.base.json @@ -0,0 +1,31 @@ +{ + "compilerOptions": { + "target": "es6", + "module": "esnext", + "moduleResolution": "node", + "sourceMap": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "strict": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "suppressImplicitAnyIndexErrors": true, + "skipLibCheck": true, + "outDir": "target/classes/static/app", + "lib": ["es7", "dom"], + "baseUrl": "./", + "paths": { + "app/*": ["src/main/webapp/app/*"] + }, + "importHelpers": true, + "downlevelIteration": true, + "declaration": false, + "forceConsistentCasingInFileNames": true + }, + "angularCompilerOptions": { + "strictInjectionParameters": true, + "fullTemplateTypeCheck": true, + "strictTemplates": true, + "preserveWhitespaces": true + } +} diff --git a/borestop/tsconfig.json b/borestop/tsconfig.json new file mode 100644 index 00000000..dda31460 --- /dev/null +++ b/borestop/tsconfig.json @@ -0,0 +1,11 @@ +{ + "files": [], + "references": [ + { + "path": "./tsconfig.app.json" + }, + { + "path": "./tsconfig.e2e.json" + } + ] +} diff --git a/borestop/tslint.json b/borestop/tslint.json new file mode 100644 index 00000000..52fb9250 --- /dev/null +++ b/borestop/tslint.json @@ -0,0 +1,17 @@ +{ + "rulesDirectory": ["node_modules/codelyzer"], + "rules": { + "directive-selector": [true, "attribute", "jhi", "camelCase"], + "component-selector": [true, "element", "jhi", "kebab-case"], + "no-inputs-metadata-property": true, + "no-outputs-metadata-property": true, + "no-host-metadata-property": true, + "no-input-rename": true, + "no-output-rename": true, + "use-lifecycle-interface": true, + "use-pipe-transform-interface": false, + "component-class-suffix": true, + "directive-class-suffix": true, + "typedef": [true, "call-signature"] + } +} diff --git a/borestop/webpack/logo-jhipster.png b/borestop/webpack/logo-jhipster.png new file mode 100755 index 0000000000000000000000000000000000000000..e301aa90f75e3ef8b5c5bf053186f3a02e7605d2 GIT binary patch literal 3326 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 EKQ4Pe<NyEw literal 0 HcmV?d00001 diff --git a/borestop/webpack/utils.js b/borestop/webpack/utils.js new file mode 100644 index 00000000..25620b47 --- /dev/null +++ b/borestop/webpack/utils.js @@ -0,0 +1,39 @@ +const path = require('path'); + +const tsconfig = require('../tsconfig.base.json'); + +module.exports = { + root, + mapTypescriptAliasToWebpackAlias +}; + +const _root = path.resolve(__dirname, '..'); + +function root(args) { + args = Array.prototype.slice.call(arguments, 0); + return path.join.apply(path, [_root].concat(args)); +} + +function mapTypescriptAliasToWebpackAlias(alias = {}) { + const webpackAliases = { ...alias }; + if (!tsconfig.compilerOptions.paths) { + return webpackAliases; + } + Object.entries(tsconfig.compilerOptions.paths) + .filter(([key, value]) => { + // use Typescript alias in Webpack only if this has value + return Boolean(value.length); + }) + .map(([key, value]) => { + // if Typescript alias ends with /* then remove this for Webpack + const regexToReplace = /\/\*$/; + const aliasKey = key.replace(regexToReplace, ''); + const aliasValue = value[0].replace(regexToReplace, ''); + return [aliasKey, root(aliasValue)]; + }) + .reduce((aliases, [key, value]) => { + aliases[key] = value; + return aliases; + }, webpackAliases); + return webpackAliases; +} diff --git a/borestop/webpack/webpack.common.js b/borestop/webpack/webpack.common.js new file mode 100644 index 00000000..5853fa10 --- /dev/null +++ b/borestop/webpack/webpack.common.js @@ -0,0 +1,114 @@ +const webpack = require('webpack'); +const CopyWebpackPlugin = require('copy-webpack-plugin'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); +const AngularCompilerPlugin = require('@ngtools/webpack').AngularCompilerPlugin; +const MergeJsonWebpackPlugin = require('merge-jsons-webpack-plugin'); + +const utils = require('./utils.js'); + +module.exports = options => ({ + resolve: { + extensions: ['.ts', '.js'], + modules: ['node_modules'], + mainFields: ['es2015', 'browser', 'module', 'main'], + alias: utils.mapTypescriptAliasToWebpackAlias() + }, + stats: { + children: false + }, + module: { + rules: [ + { + test: /(?:\.ngfactory\.js|\.ngstyle\.js|\.ts)$/, + loader: '@ngtools/webpack' + }, + { + test: /\.html$/, + loader: 'html-loader', + options: { + minimize: { + caseSensitive: true, + removeAttributeQuotes: false, + minifyJS: false, + minifyCSS: false + } + }, + exclude: utils.root('src/main/webapp/index.html') + }, + { + test: /\.(jpe?g|png|gif|svg|woff2?|ttf|eot)$/i, + loader: 'file-loader', + options: { + digest: 'hex', + hash: 'sha512', + // For fixing src attr of image + // See https://github.com/jhipster/generator-jhipster/issues/11209 + name: 'content/[hash].[ext]', + esModule: false + } + }, + { + test: /manifest.webapp$/, + loader: 'file-loader', + options: { + name: 'manifest.webapp' + } + }, + // Ignore warnings about System.import in Angular + { test: /[\/\\]@angular[\/\\].+\.js$/, parser: { system: true } } + ] + }, + plugins: [ + new webpack.DefinePlugin({ + 'process.env': { + NODE_ENV: `'${options.env}'`, + BUILD_TIMESTAMP: `'${new Date().getTime()}'`, + // APP_VERSION is passed as an environment variable from the Gradle / Maven build tasks. + VERSION: `'${process.env.hasOwnProperty('APP_VERSION') ? process.env.APP_VERSION : 'DEV'}'`, + DEBUG_INFO_ENABLED: options.env === 'development', + // The root URL for API calls, ending with a '/' - for example: `"https://www.jhipster.tech:8081/myservice/"`. + // If this URL is left empty (""), then it will be relative to the current context. + // If you use an API server, in `prod` mode, you will need to enable CORS + // (see the `jhipster.cors` common JHipster property in the `application-*.yml` configurations) + SERVER_API_URL: `''` + } + }), + new CopyWebpackPlugin({ + patterns: [ + { + from: './node_modules/swagger-ui-dist/*.{js,css,html,png}', + to: 'swagger-ui', + flatten: true, + globOptions: { ignore: ['**/index.html'] } + }, + { from: './node_modules/axios/dist/axios.min.js', to: 'swagger-ui' }, + { from: './src/main/webapp/swagger-ui/', to: 'swagger-ui' }, + { from: './src/main/webapp/content/', to: 'content' }, + { from: './src/main/webapp/favicon.ico', to: 'favicon.ico' }, + { from: './src/main/webapp/manifest.webapp', to: 'manifest.webapp' }, + // jhipster-needle-add-assets-to-webpack - JHipster will add/remove third-party resources in this array + { from: './src/main/webapp/robots.txt', to: 'robots.txt' } + ] + }), + new MergeJsonWebpackPlugin({ + output: { + groupBy: [ + { pattern: './src/main/webapp/i18n/en/*.json', fileName: './i18n/en.json' } + // jhipster-needle-i18n-language-webpack - JHipster will add/remove languages in this array + ] + } + }), + new HtmlWebpackPlugin({ + template: './src/main/webapp/index.html', + chunks: ['polyfills', 'main', 'global'], + chunksSortMode: 'manual', + inject: 'body', + base: '/' + }), + new AngularCompilerPlugin({ + mainPath: utils.root('src/main/webapp/app/app.main.ts'), + tsConfigPath: utils.root('tsconfig.app.json'), + sourceMap: true + }) + ] +}); diff --git a/borestop/webpack/webpack.dev.js b/borestop/webpack/webpack.dev.js new file mode 100644 index 00000000..2875825b --- /dev/null +++ b/borestop/webpack/webpack.dev.js @@ -0,0 +1,125 @@ +const webpack = require('webpack'); +const writeFilePlugin = require('write-file-webpack-plugin'); +const webpackMerge = require('webpack-merge'); +const BrowserSyncPlugin = require('browser-sync-webpack-plugin'); +const FriendlyErrorsWebpackPlugin = require('friendly-errors-webpack-plugin'); +const SimpleProgressWebpackPlugin = require('simple-progress-webpack-plugin'); +const WebpackNotifierPlugin = require('webpack-notifier'); +const path = require('path'); +const sass = require('sass'); + +const utils = require('./utils.js'); +const commonConfig = require('./webpack.common.js'); + +const ENV = 'development'; + +module.exports = options => + webpackMerge(commonConfig({ env: ENV }), { + devtool: 'eval-source-map', + devServer: { + contentBase: './target/classes/static/', + proxy: [ + { + context: ['/api', '/services', '/management', '/swagger-resources', '/v2/api-docs', '/h2-console', '/auth'], + target: `http${options.tls ? 's' : ''}://localhost:8080`, + secure: false, + changeOrigin: options.tls + } + ], + stats: options.stats, + watchOptions: { + ignored: /node_modules/ + }, + https: options.tls, + historyApiFallback: true + }, + entry: { + global: './src/main/webapp/content/scss/global.scss', + main: './src/main/webapp/app/app.main' + }, + output: { + path: utils.root('target/classes/static/'), + filename: 'app/[name].bundle.js', + chunkFilename: 'app/[id].chunk.js' + }, + module: { + rules: [ + { + test: /\.(j|t)s$/, + enforce: 'pre', + loader: 'eslint-loader', + exclude: /node_modules/ + }, + { + test: /\.scss$/, + use: [ + 'to-string-loader', + 'css-loader', + 'postcss-loader', + { + loader: 'sass-loader', + options: { implementation: sass } + } + ], + exclude: /(vendor\.scss|global\.scss)/ + }, + { + test: /(vendor\.scss|global\.scss)/, + use: [ + 'style-loader', + 'css-loader', + 'postcss-loader', + { + loader: 'sass-loader', + options: { implementation: sass } + } + ] + } + ] + }, + stats: process.env.JHI_DISABLE_WEBPACK_LOGS ? 'none' : options.stats, + plugins: [ + process.env.JHI_DISABLE_WEBPACK_LOGS + ? null + : new SimpleProgressWebpackPlugin({ + format: options.stats === 'minimal' ? 'compact' : 'expanded' + }), + new FriendlyErrorsWebpackPlugin(), + new BrowserSyncPlugin( + { + https: options.tls, + host: 'localhost', + port: 9000, + proxy: { + target: `http${options.tls ? 's' : ''}://localhost:9060`, + proxyOptions: { + changeOrigin: false //pass the Host header to the backend unchanged https://github.com/Browsersync/browser-sync/issues/430 + } + }, + socket: { + clients: { + heartbeatTimeout: 60000 + } + } + /* + ,ghostMode: { // uncomment this part to disable BrowserSync ghostMode; https://github.com/jhipster/generator-jhipster/issues/11116 + clicks: false, + location: false, + forms: false, + scroll: false + } */ + }, + { + reload: false + } + ), + new webpack.ContextReplacementPlugin(/angular(\\|\/)core(\\|\/)/, path.resolve(__dirname, './src/main/webapp/')), + new writeFilePlugin(), + new webpack.WatchIgnorePlugin([utils.root('src/test')]), + new WebpackNotifierPlugin({ + title: 'JHipster', + contentImage: path.join(__dirname, 'logo-jhipster.png') + }) + ].filter(Boolean), + mode: 'development' + }); diff --git a/borestop/webpack/webpack.prod.js b/borestop/webpack/webpack.prod.js new file mode 100644 index 00000000..219e081f --- /dev/null +++ b/borestop/webpack/webpack.prod.js @@ -0,0 +1,154 @@ +const webpack = require('webpack'); +const webpackMerge = require('webpack-merge'); +const MiniCssExtractPlugin = require('mini-css-extract-plugin'); +const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin'); +const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; +const MomentLocalesPlugin = require('moment-locales-webpack-plugin'); +const TerserPlugin = require('terser-webpack-plugin'); +const WorkboxPlugin = require('workbox-webpack-plugin'); + +const utils = require('./utils.js'); +const commonConfig = require('./webpack.common.js'); + +const ENV = 'production'; +const sass = require('sass'); + +module.exports = webpackMerge(commonConfig({ env: ENV }), { + // Enable source maps. Please note that this will slow down the build. + // You have to enable it in Terser config below and in tsconfig.json as well + // devtool: 'source-map', + entry: { + global: './src/main/webapp/content/scss/global.scss', + main: './src/main/webapp/app/app.main' + }, + output: { + path: utils.root('target/classes/static/'), + filename: 'app/[name].[hash].bundle.js', + chunkFilename: 'app/[id].[hash].chunk.js' + }, + module: { + rules: [ + { + test: /\.scss$/, + use: [ + 'to-string-loader', + 'css-loader', + 'postcss-loader', + { + loader: 'sass-loader', + options: { implementation: sass } + } + ], + exclude: /(vendor\.scss|global\.scss)/ + }, + { + test: /(vendor\.scss|global\.scss)/, + use: [ + { + loader: MiniCssExtractPlugin.loader, + options: { + publicPath: '../' + } + }, + 'css-loader', + 'postcss-loader', + { + loader: 'sass-loader', + options: { implementation: sass } + } + ] + }, + { + test: /\.css$/, + use: ['to-string-loader', 'css-loader'], + exclude: /(vendor\.css|global\.css)/ + }, + { + test: /(vendor\.css|global\.css)/, + use: [ + { + loader: MiniCssExtractPlugin.loader, + options: { + publicPath: '../' + } + }, + 'css-loader', + 'postcss-loader' + ] + } + ] + }, + optimization: { + runtimeChunk: false, + minimizer: [ + new TerserPlugin({ + parallel: true, + cache: true, + // sourceMap: true, // Enable source maps. Please note that this will slow down the build + terserOptions: { + ecma: 6, + ie8: false, + toplevel: true, + module: true, + compress: { + dead_code: true, + warnings: false, + properties: true, + drop_debugger: true, + conditionals: true, + booleans: true, + loops: true, + unused: true, + toplevel: true, + if_return: true, + inline: true, + join_vars: true, + ecma: 6, + module: true + }, + output: { + comments: false, + beautify: false, + indent_level: 2, + ecma: 6 + }, + mangle: { + module: true, + toplevel: true + } + } + }), + new OptimizeCSSAssetsPlugin({}) + ] + }, + plugins: [ + new MiniCssExtractPlugin({ + // Options similar to the same options in webpackOptions.output + // both options are optional + filename: 'content/[name].[contenthash].css', + chunkFilename: 'content/[id].css' + }), + new MomentLocalesPlugin({ + localesToKeep: [ + 'en' + // jhipster-needle-i18n-language-moment-webpack - JHipster will add/remove languages in this array + ] + }), + new BundleAnalyzerPlugin({ + analyzerMode: 'static', + openAnalyzer: false, + // Webpack statistics in target folder + reportFilename: '../stats.html' + }), + new webpack.LoaderOptionsPlugin({ + minimize: true, + debug: false + }), + new WorkboxPlugin.GenerateSW({ + clientsClaim: true, + skipWaiting: true, + exclude: [/swagger-ui/] + }) + ], + mode: 'production' +}); -- GitLab